/ Hex Artifact Content
Login

Artifact 04fe098ffab66d9424ba4e7c0b88ce7c98748cb1:


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 50 65 6e 64 69 6e 67 44  .  int nPendingD
28e0: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
28f0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
2900: 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67 20 64  tes of pending d
2910: 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69 57 72  ata */.  i64 iWr
2920: 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20 20 20  iteRowid;       
2930: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2940: 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20 64 6f  d for current do
2950: 63 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  c being written 
2960: 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 65 74 65  */.  int bDelete
2970: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2980: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2990: 77 72 69 74 65 20 69 73 20 61 20 64 65 6c 65 74  write is a delet
29a0: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72 6f 72  e */..  /* Error
29b0: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 6e 74   state. */.  int
29c0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e0: 43 75 72 72 65 6e 74 20 65 72 72 6f 72 20 63 6f  Current error co
29f0: 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74 61 74  de */..  /* Stat
2a00: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 66 74  e used by the ft
2a10: 73 35 44 61 74 61 58 58 58 28 29 20 66 75 6e 63  s5DataXXX() func
2a20: 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  tions. */.  sqli
2a30: 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65  te3_blob *pReade
2a40: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  r;          /* R
2a50: 4f 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70 65 6e  O incr-blob open
2a60: 20 6f 6e 20 25 5f 64 61 74 61 20 74 61 62 6c 65   on %_data table
2a70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
2a80: 6d 74 20 2a 70 57 72 69 74 65 72 3b 20 20 20 20  mt *pWriter;    
2a90: 20 20 20 20 20 20 2f 2a 20 22 49 4e 53 45 52 54        /* "INSERT
2aa0: 20 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41 4c 55   ... %_data VALU
2ab0: 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71  ES(?,?)" */.  sq
2ac0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c  lite3_stmt *pDel
2ad0: 65 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a  eter;         /*
2ae0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f   "DELETE FROM %_
2af0: 64 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f 20 41  data ... id>=? A
2b00: 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20 20 73  ND id<=?" */.  s
2b10: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64  qlite3_stmt *pId
2b20: 78 57 72 69 74 65 72 3b 20 20 20 20 20 20 20 2f  xWriter;       /
2b30: 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20 25 5f  * "INSERT ... %_
2b40: 69 64 78 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f  idx VALUES(?,?,?
2b50: 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ,?)" */.  sqlite
2b60: 33 5f 73 74 6d 74 20 2a 70 49 64 78 44 65 6c 65  3_stmt *pIdxDele
2b70: 74 65 72 3b 20 20 20 20 20 20 2f 2a 20 22 44 45  ter;      /* "DE
2b80: 4c 45 54 45 20 46 52 4f 4d 20 25 5f 69 64 78 20  LETE FROM %_idx 
2b90: 57 48 45 52 45 20 73 65 67 69 64 3d 3f 20 2a 2f  WHERE segid=? */
2ba0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2bb0: 2a 70 49 64 78 53 65 6c 65 63 74 3b 0a 20 20 69  *pIdxSelect;.  i
2bc0: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2be0: 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
2bf0: 66 20 62 6c 6f 63 6b 73 20 72 65 61 64 20 2a 2f  f blocks read */
2c00: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35  .};..struct Fts5
2c10: 44 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20  DoclistIter {.  
2c20: 75 38 20 2a 61 45 6f 66 3b 20 20 20 20 20 20 20  u8 *aEof;       
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c40: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20  /* Pointer to 1 
2c50: 62 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66  byte past end of
2c60: 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f   doclist */..  /
2c70: 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * Output variabl
2c80: 65 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20  es. aPoslist==0 
2c90: 61 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20  at EOF */.  i64 
2ca0: 69 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50  iRowid;.  u8 *aP
2cb0: 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50  oslist;.  int nP
2cc0: 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 53  oslist;.  int nS
2cd0: 69 7a 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  ize;.};../*.** T
2ce0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2cf0: 68 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72  he "structure" r
2d00: 65 63 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69  ecord for each i
2d10: 6e 64 65 78 20 61 72 65 20 72 65 70 72 65 73 65  ndex are represe
2d20: 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e  nted.** using an
2d30: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 72   Fts5Structure r
2d40: 65 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e  ecord in memory.
2d50: 20 57 68 69 63 68 20 75 73 65 73 20 69 6e 73 74   Which uses inst
2d60: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a  ances of the .**
2d70: 20 6f 74 68 65 72 20 46 74 73 35 53 74 72 75 63   other Fts5Struc
2d80: 74 75 72 65 58 58 58 20 74 79 70 65 73 20 61 73  tureXXX types as
2d90: 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a   components..*/.
2da0: 73 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63  struct Fts5Struc
2db0: 74 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20  tureSegment {.  
2dc0: 69 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20  int iSegid;     
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de0: 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f  /* Segment id */
2df0: 0a 20 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74  .  int pgnoFirst
2e00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e10: 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66     /* First leaf
2e20: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20   page number in 
2e30: 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  segment */.  int
2e40: 20 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20   pgnoLast;      
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e60: 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e  Last leaf page n
2e70: 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74  umber in segment
2e80: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74   */.};.struct Ft
2e90: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
2ea0: 20 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b   {.  int nMerge;
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2ed0: 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e  f segments in in
2ee0: 63 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e  cr-merge */.  in
2ef0: 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20  t nSeg;         
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f10: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
2f20: 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76   segments on lev
2f30: 65 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  el */.  Fts5Stru
2f40: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53  ctureSegment *aS
2f50: 65 67 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79  eg;     /* Array
2f60: 20 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53   of segments. aS
2f70: 65 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e  eg[0] is oldest.
2f80: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74   */.};.struct Ft
2f90: 73 35 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20  s5Structure {.  
2fa0: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 2f 2a 20 4f 62 6a 65 63 74 20 72 65 66 65 72 65  /* Object refere
2fd0: 6e 63 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75  nce count */.  u
2fe0: 36 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  64 nWriteCounter
2ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3000: 2a 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77  * Total leaves w
3010: 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20  ritten to level 
3020: 30 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d  0 */.  int nSegm
3030: 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
3040: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
3050: 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73  segments in this
3060: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
3070: 69 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20  int nLevel;     
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3090: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76  /* Number of lev
30a0: 65 6c 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65  els in this inde
30b0: 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  x */.  Fts5Struc
30c0: 74 75 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c  tureLevel aLevel
30d0: 5b 31 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20  [1];   /* Array 
30e0: 6f 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20  of nLevel level 
30f0: 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f  objects */.};../
3100: 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f  *.** An object o
3110: 66 20 74 79 70 65 20 46 74 73 35 53 65 67 57 72  f type Fts5SegWr
3120: 69 74 65 72 20 69 73 20 75 73 65 64 20 74 6f 20  iter is used to 
3130: 77 72 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74  write to segment
3140: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  s..*/.struct Fts
3150: 35 50 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20  5PageWriter {.  
3160: 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  int pgno;       
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3180: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
3190: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
31a0: 20 20 69 6e 74 20 69 50 72 65 76 50 67 69 64 78    int iPrevPgidx
31b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31c0: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61    /* Previous va
31d0: 6c 75 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  lue written into
31e0: 20 70 67 69 64 78 20 2a 2f 0a 20 20 46 74 73 35   pgidx */.  Fts5
31f0: 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20  Buffer buf;     
3200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
3210: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
3220: 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20   leaf data */.  
3230: 46 74 73 35 42 75 66 66 65 72 20 70 67 69 64 78  Fts5Buffer pgidx
3240: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3250: 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
3260: 6e 69 6e 67 20 70 61 67 65 2d 69 6e 64 65 78 20  ning page-index 
3270: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
3280: 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  term;           
3290: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
32a0: 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f  ontaining previo
32b0: 75 73 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20  us term on page 
32c0: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
32d0: 35 44 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20  5DlidxWriter {. 
32e0: 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20   int pgno;      
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
3310: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
3320: 0a 20 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69  .  int bPrevVali
3330: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
3340: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50     /* True if iP
3350: 72 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  rev is valid */.
3360: 20 20 69 36 34 20 69 50 72 65 76 3b 20 20 20 20    i64 iPrev;    
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3380: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f    /* Previous ro
3390: 77 69 64 20 76 61 6c 75 65 20 77 72 69 74 74 65  wid value writte
33a0: 6e 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46  n to page */.  F
33b0: 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20  ts5Buffer buf;  
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33d0: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
33e0: 69 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f  ing page data */
33f0: 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53  .};.struct Fts5S
3400: 65 67 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74  egWriter {.  int
3410: 20 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20   iSegid;        
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3430: 53 65 67 69 64 20 74 6f 20 77 72 69 74 65 20 74  Segid to write t
3440: 6f 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57  o */.  Fts5PageW
3450: 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20  riter writer;   
3460: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 57 72         /* PageWr
3470: 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  iter object */. 
3480: 20 69 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b   i64 iPrevRowid;
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a0: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77   /* Previous row
34b0: 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75  id written to cu
34c0: 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20  rrent leaf */.  
34d0: 75 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e  u8 bFirstRowidIn
34e0: 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
34f0: 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20  /* True if next 
3500: 72 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69  rowid is first i
3510: 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75  n doclist */.  u
3520: 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  8 bFirstRowidInP
3530: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
3540: 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72  * True if next r
3550: 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e  owid is first in
3560: 20 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20 54 4f   page */.  /* TO
3570: 44 4f 31 3a 20 43 61 6e 20 75 73 65 20 28 77 72  DO1: Can use (wr
3580: 69 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 29  iter.pgidx.n==0)
3590: 20 69 6e 73 74 65 61 64 20 6f 66 20 62 46 69 72   instead of bFir
35a0: 73 74 54 65 72 6d 49 6e 50 61 67 65 20 2a 2f 0a  stTermInPage */.
35b0: 20 20 75 38 20 62 46 69 72 73 74 54 65 72 6d 49    u8 bFirstTermI
35c0: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
35d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78    /* True if nex
35e0: 74 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 66  t term will be f
35f0: 69 72 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f 0a  irst in leaf */.
3600: 20 20 69 6e 74 20 6e 4c 65 61 66 57 72 69 74 74    int nLeafWritt
3610: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
3620: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
3630: 65 61 66 20 70 61 67 65 73 20 77 72 69 74 74 65  eaf pages writte
3640: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74  n */.  int nEmpt
3650: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
3660: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3670: 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 74   of contiguous t
3680: 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a  erm-less nodes *
3690: 2f 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78 3b  /..  int nDlidx;
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b0: 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
36c0: 64 20 73 69 7a 65 20 6f 66 20 61 44 6c 69 64 78  d size of aDlidx
36d0: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74  [] array */.  Ft
36e0: 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61  s5DlidxWriter *a
36f0: 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20 2f 2a  Dlidx;        /*
3700: 20 41 72 72 61 79 20 6f 66 20 46 74 73 35 44 6c   Array of Fts5Dl
3710: 69 64 78 57 72 69 74 65 72 20 6f 62 6a 65 63 74  idxWriter object
3720: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c 75 65  s */..  /* Value
3730: 73 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  s to insert into
3740: 20 74 68 65 20 25 5f 69 64 78 20 74 61 62 6c 65   the %_idx table
3750: 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
3760: 20 62 74 74 65 72 6d 3b 20 20 20 20 20 20 20 20   btterm;        
3770: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 65        /* Next te
3780: 72 6d 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74  rm to insert int
3790: 6f 20 25 5f 69 64 78 20 74 61 62 6c 65 20 2a 2f  o %_idx table */
37a0: 0a 20 20 69 6e 74 20 69 42 74 50 61 67 65 3b 20  .  int iBtPage; 
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c0: 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
37d0: 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  r corresponding 
37e0: 74 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d 3b 0a  to btterm */.};.
37f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
3800: 46 74 73 35 43 52 65 73 75 6c 74 20 46 74 73 35  Fts5CResult Fts5
3810: 43 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20  CResult;.struct 
3820: 46 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20  Fts5CResult {.  
3830: 75 31 36 20 69 46 69 72 73 74 3b 20 20 20 20 20  u16 iFirst;     
3840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3850: 2f 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20  /* aSeg[] index 
3860: 6f 66 20 66 69 72 73 74 65 73 74 20 69 74 65 72  of firstest iter
3870: 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65  ator */.  u8 bTe
3880: 72 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  rmEq;           
3890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
38a0: 65 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 61  e if the terms a
38b0: 72 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a  re equal */.};..
38c0: 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72  /*.** Object for
38d0: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
38e0: 67 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d  gh a single segm
38f0: 65 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61  ent, visiting ea
3900: 63 68 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a  ch term/rowid.**
3910: 20 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67   pair in the seg
3920: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67  ment..**.** pSeg
3930: 3a 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65  :.**   The segme
3940: 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  nt to iterate th
3950: 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65  rough..**.** iLe
3960: 61 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72  afPgno:.**   Cur
3970: 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e  rent leaf page n
3980: 75 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67  umber within seg
3990: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ment..**.** iLea
39a0: 66 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79  fOffset:.**   By
39b0: 74 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  te offset within
39c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
39d0: 66 20 74 68 61 74 20 69 73 20 74 68 65 20 66 69  f that is the fi
39e0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
39f0: 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c  .**   position l
3a00: 69 73 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79  ist data (one by
3a10: 74 65 20 70 61 73 73 65 64 20 74 68 65 20 70 6f  te passed the po
3a20: 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
3a30: 20 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f   field)..**   ro
3a40: 77 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65  wid field of the
3a50: 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
3a60: 55 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20  Usually this is 
3a70: 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f  the size field o
3a80: 66 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74  f the.**   posit
3a90: 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54  ion list data. T
3aa0: 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  he exception is 
3ab0: 69 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72  if the rowid for
3ac0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
3ad0: 72 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20  ry .**   is the 
3ae0: 6c 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68  last thing on th
3af0: 65 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a  e leaf page..**.
3b00: 2a 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42  ** pLeaf:.**   B
3b10: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
3b20: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   current leaf pa
3b30: 67 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20  ge data. Set to 
3b40: 4e 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a  NULL at EOF..**.
3b50: 2a 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  ** iTermLeafPgno
3b60: 2c 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  , iTermLeafOffse
3b70: 74 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67  t:.**   Leaf pag
3b80: 65 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e  e number contain
3b90: 69 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65 72  ing the last ter
3ba0: 6d 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  m read from the 
3bb0: 73 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20  segment. And.** 
3bc0: 20 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d    the offset imm
3bd0: 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
3be0: 6e 67 20 74 68 65 20 74 65 72 6d 20 64 61 74 61  ng the term data
3bf0: 2e 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a  ..**.** flags:.*
3c00: 2a 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35  *   Mask of FTS5
3c10: 5f 53 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c  _SEGITER_XXX val
3c20: 75 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64  ues. Interpreted
3c30: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
3c40: 2a 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45  **   FTS5_SEGITE
3c50: 52 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20  R_ONETERM:.**   
3c60: 20 20 49 66 20 73 65 74 2c 20 73 65 74 20 74 68    If set, set th
3c70: 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f  e iterator to po
3c80: 69 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72  int to EOF after
3c90: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63   the current doc
3ca0: 6c 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73  list .**     has
3cb0: 20 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e   been exhausted.
3cc0: 20 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20   Do not proceed 
3cd0: 74 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d  to the next term
3ce0: 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e   in the segment.
3cf0: 0a 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45  .**.**   FTS5_SE
3d00: 47 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a  GITER_REVERSE:.*
3d10: 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20  *     This flag 
3d20: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74  is only ever set
3d30: 20 69 66 20 46 54 53 35 5f 53 45 47 49 54 45 52   if FTS5_SEGITER
3d40: 5f 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f  _ONETERM is also
3d50: 20 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20   set. If.**     
3d60: 69 74 20 69 73 20 73 65 74 2c 20 69 74 65 72 61  it is set, itera
3d70: 74 65 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64  te through rowid
3d80: 20 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f   in descending o
3d90: 72 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20  rder instead of 
3da0: 74 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75  the.**     defau
3db0: 6c 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  lt ascending ord
3dc0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64  er..**.** iRowid
3dd0: 4f 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66  Offset/nRowidOff
3de0: 73 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74  set/aRowidOffset
3df0: 3a 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61  :.**     These a
3e00: 72 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46  re used if the F
3e10: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
3e20: 52 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e  RSE flag is set.
3e30: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65  .**.**     For e
3e40: 61 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  ach rowid on the
3e50: 20 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64   page correspond
3e60: 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65  ing to the curre
3e70: 6e 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20  nt term, the.** 
3e80: 20 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e      correspondin
3e90: 67 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d  g aRowidOffset[]
3ea0: 20 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f   entry is set to
3eb0: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
3ec0: 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73   of the.**     s
3ed0: 74 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73  tart of the "pos
3ee0: 69 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22  ition-list-size"
3ef0: 20 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68   field within th
3f00: 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 69 54  e page..**.** iT
3f10: 65 72 6d 49 64 78 3a 0a 2a 2a 20 20 20 20 20 49  ermIdx:.**     I
3f20: 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20  ndex of current 
3f30: 74 65 72 6d 20 6f 6e 20 69 54 65 72 6d 4c 65 61  term on iTermLea
3f40: 66 50 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75 63 74  fPgno..*/.struct
3f50: 20 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20   Fts5SegIter {. 
3f60: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
3f70: 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20  gment *pSeg;    
3f80: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69   /* Segment to i
3f90: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a  terate through *
3fa0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20  /.  int flags;  
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fc0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
3fd0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61  onfiguration fla
3fe0: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61  gs */.  int iLea
3ff0: 66 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  fPgno;          
4000: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4010: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  nt leaf page num
4020: 62 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  ber */.  Fts5Dat
4030: 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20  a *pLeaf;       
4040: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4050: 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f  ent leaf data */
4060: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65  .  Fts5Data *pNe
4070: 78 74 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  xtLeaf;         
4080: 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20     /* Leaf page 
4090: 28 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f  (iLeafPgno+1) */
40a0: 0a 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73  .  int iLeafOffs
40b0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
40c0: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
40d0: 74 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74  t within current
40e0: 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 54   leaf */..  /* T
40f0: 68 65 20 70 61 67 65 20 61 6e 64 20 6f 66 66 73  he page and offs
4100: 65 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68  et from which th
4110: 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 77  e current term w
4120: 61 73 20 72 65 61 64 2e 20 54 68 65 20 6f 66 66  as read. The off
4130: 73 65 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65  set .  ** is the
4140: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 66   offset of the f
4150: 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68  irst rowid in th
4160: 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73  e current doclis
4170: 74 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  t.  */.  int iTe
4180: 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e  rmLeafPgno;.  in
4190: 74 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  t iTermLeafOffse
41a0: 74 3b 0a 0a 20 20 69 6e 74 20 69 50 67 69 64 78  t;..  int iPgidx
41b0: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
41c0: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66        /* Next of
41d0: 66 73 65 74 20 69 6e 20 70 67 69 64 78 20 2a 2f  fset in pgidx */
41e0: 0a 20 20 69 6e 74 20 69 45 6e 64 6f 66 44 6f 63  .  int iEndofDoc
41f0: 6c 69 73 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  list;..  /* The 
4200: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 6f 6e  following are on
4210: 6c 79 20 75 73 65 64 20 69 66 20 74 68 65 20 46  ly used if the F
4220: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
4230: 52 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e  RSE flag is set.
4240: 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64   */.  int iRowid
4250: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
4260: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
4270: 20 65 6e 74 72 79 20 69 6e 20 61 52 6f 77 69 64   entry in aRowid
4280: 4f 66 66 73 65 74 5b 5d 20 2a 2f 0a 20 20 69 6e  Offset[] */.  in
4290: 74 20 6e 52 6f 77 69 64 4f 66 66 73 65 74 3b 20  t nRowidOffset; 
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
42b0: 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
42c0: 6f 66 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  of aRowidOffset[
42d0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  ] array */.  int
42e0: 20 2a 61 52 6f 77 69 64 4f 66 66 73 65 74 3b 20   *aRowidOffset; 
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4300: 41 72 72 61 79 20 6f 66 20 6f 66 66 73 65 74 20  Array of offset 
4310: 74 6f 20 72 6f 77 69 64 20 66 69 65 6c 64 73 20  to rowid fields 
4320: 2a 2f 0a 0a 20 20 46 74 73 35 44 6c 69 64 78 49  */..  Fts5DlidxI
4330: 74 65 72 20 2a 70 44 6c 69 64 78 3b 20 20 20 20  ter *pDlidx;    
4340: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
4350: 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69  e is a doclist-i
4360: 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61  ndex */..  /* Va
4370: 72 69 61 62 6c 65 73 20 70 6f 70 75 6c 61 74 65  riables populate
4380: 64 20 62 61 73 65 64 20 6f 6e 20 63 75 72 72 65  d based on curre
4390: 6e 74 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 46  nt entry. */.  F
43a0: 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20  ts5Buffer term; 
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
43c0: 2a 20 43 75 72 72 65 6e 74 20 74 65 72 6d 20 2a  * Current term *
43d0: 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20  /.  i64 iRowid; 
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43f0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72      /* Current r
4400: 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  owid */.  int nP
4410: 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  os;             
4420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4430: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
4440: 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
4450: 20 6c 69 73 74 20 2a 2f 0a 20 20 75 38 20 62 44   list */.  u8 bD
4460: 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
4470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
4480: 75 65 20 69 66 20 74 68 65 20 64 65 6c 65 74 65  ue if the delete
4490: 20 66 6c 61 67 20 69 73 20 73 65 74 20 2a 2f 0a   flag is set */.
44a0: 20 20 2f 2f 20 75 38 20 62 43 6f 6e 74 65 6e 74    // u8 bContent
44b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
44c0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
44d0: 68 61 73 20 63 6f 6e 74 65 6e 74 20 28 64 65 74  has content (det
44e0: 61 69 6c 3d 6e 6f 6e 65 20 6d 6f 64 65 29 20 2a  ail=none mode) *
44f0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  /.};../*.** Argu
4500: 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
4510: 72 20 74 6f 20 61 6e 20 46 74 73 35 44 61 74 61  r to an Fts5Data
4520: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
4530: 63 6f 6e 74 61 69 6e 73 20 61 20 0a 2a 2a 20 6c  contains a .** l
4540: 65 61 66 20 70 61 67 65 2e 0a 2a 2f 0a 23 64 65  eaf page..*/.#de
4550: 66 69 6e 65 20 41 53 53 45 52 54 5f 53 5a 4c 45  fine ASSERT_SZLE
4560: 41 46 5f 4f 4b 28 78 29 20 61 73 73 65 72 74 28  AF_OK(x) assert(
4570: 20 5c 0a 20 20 20 20 28 78 29 2d 3e 73 7a 4c 65   \.    (x)->szLe
4580: 61 66 3d 3d 28 78 29 2d 3e 6e 6e 20 7c 7c 20 28  af==(x)->nn || (
4590: 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d 66 74 73 35  x)->szLeaf==fts5
45a0: 47 65 74 55 31 36 28 26 28 78 29 2d 3e 70 5b 32  GetU16(&(x)->p[2
45b0: 5d 29 20 5c 0a 29 0a 0a 23 64 65 66 69 6e 65 20  ]) \.)..#define 
45c0: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
45d0: 54 45 52 4d 20 30 78 30 31 0a 23 64 65 66 69 6e  TERM 0x01.#defin
45e0: 65 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  e FTS5_SEGITER_R
45f0: 45 56 45 52 53 45 20 30 78 30 32 0a 0a 2f 2a 20  EVERSE 0x02../* 
4600: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 69 73 20  .** Argument is 
4610: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
4620: 46 74 73 35 44 61 74 61 20 73 74 72 75 63 74 75  Fts5Data structu
4630: 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  re that contains
4640: 20 61 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 2e   a leaf.** page.
4650: 20 54 68 69 73 20 6d 61 63 72 6f 20 65 76 61 6c   This macro eval
4660: 75 61 74 65 73 20 74 6f 20 74 72 75 65 20 69 66  uates to true if
4670: 20 74 68 65 20 6c 65 61 66 20 63 6f 6e 74 61 69   the leaf contai
4680: 6e 73 20 6e 6f 20 74 65 72 6d 73 2c 20 6f 72 0a  ns no terms, or.
4690: 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 63  ** false if it c
46a0: 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74  ontains at least
46b0: 20 6f 6e 65 20 74 65 72 6d 2e 0a 2a 2f 0a 23 64   one term..*/.#d
46c0: 65 66 69 6e 65 20 66 74 73 35 4c 65 61 66 49 73  efine fts5LeafIs
46d0: 54 65 72 6d 6c 65 73 73 28 78 29 20 28 28 78 29  Termless(x) ((x)
46e0: 2d 3e 73 7a 4c 65 61 66 20 3e 3d 20 28 78 29 2d  ->szLeaf >= (x)-
46f0: 3e 6e 6e 29 0a 0a 23 64 65 66 69 6e 65 20 66 74  >nn)..#define ft
4700: 73 35 4c 65 61 66 54 65 72 6d 4f 66 66 28 78 2c  s5LeafTermOff(x,
4710: 20 69 29 20 28 66 74 73 35 47 65 74 55 31 36 28   i) (fts5GetU16(
4720: 26 28 78 29 2d 3e 70 5b 28 78 29 2d 3e 73 7a 4c  &(x)->p[(x)->szL
4730: 65 61 66 20 2b 20 28 69 29 2a 32 5d 29 29 0a 0a  eaf + (i)*2]))..
4740: 23 64 65 66 69 6e 65 20 66 74 73 35 4c 65 61 66  #define fts5Leaf
4750: 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 78 29  FirstRowidOff(x)
4760: 20 28 66 74 73 35 47 65 74 55 31 36 28 28 78 29   (fts5GetU16((x)
4770: 2d 3e 70 29 29 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  ->p))../*.** Obj
4780: 65 63 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e  ect for iteratin
4790: 67 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 65  g through the me
47a0: 72 67 65 64 20 72 65 73 75 6c 74 73 20 6f 66 20  rged results of 
47b0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d  one or more segm
47c0: 65 6e 74 73 2c 0a 2a 2a 20 76 69 73 69 74 69 6e  ents,.** visitin
47d0: 67 20 65 61 63 68 20 74 65 72 6d 2f 72 6f 77 69  g each term/rowi
47e0: 64 20 70 61 69 72 20 69 6e 20 74 68 65 20 6d 65  d pair in the me
47f0: 72 67 65 64 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  rged data..**.**
4800: 20 6e 53 65 67 20 69 73 20 61 6c 77 61 79 73 20   nSeg is always 
4810: 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 67  a power of two g
4820: 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
4830: 71 75 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62  qual to the numb
4840: 65 72 20 6f 66 0a 2a 2a 20 73 65 67 6d 65 6e 74  er of.** segment
4850: 73 20 74 68 61 74 20 74 68 69 73 20 6f 62 6a 65  s that this obje
4860: 63 74 20 69 73 20 6d 65 72 67 69 6e 67 20 64 61  ct is merging da
4870: 74 61 20 66 72 6f 6d 2e 20 42 6f 74 68 20 74 68  ta from. Both th
4880: 65 20 61 53 65 67 5b 5d 20 61 6e 64 0a 2a 2a 20  e aSeg[] and.** 
4890: 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 73 20  aFirst[] arrays 
48a0: 61 72 65 20 73 69 7a 65 64 20 61 74 20 6e 53 65  are sized at nSe
48b0: 67 20 65 6e 74 72 69 65 73 2e 20 54 68 65 20 61  g entries. The a
48c0: 53 65 67 5b 5d 20 61 72 72 61 79 20 69 73 20 70  Seg[] array is p
48d0: 61 64 64 65 64 0a 2a 2a 20 77 69 74 68 20 7a 65  added.** with ze
48e0: 72 6f 65 64 20 6f 62 6a 65 63 74 73 20 2d 20 74  roed objects - t
48f0: 68 65 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64  hese are handled
4900: 20 61 73 20 69 66 20 74 68 65 79 20 77 65 72 65   as if they were
4910: 20 69 74 65 72 61 74 6f 72 73 20 6f 70 65 6e 65   iterators opene
4920: 64 0a 2a 2a 20 6f 6e 20 65 6d 70 74 79 20 73 65  d.** on empty se
4930: 67 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  gments..**.** Th
4940: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d  e results of com
4950: 70 61 72 69 6e 67 20 73 65 67 6d 65 6e 74 73 20  paring segments 
4960: 61 53 65 67 5b 4e 5d 20 61 6e 64 20 61 53 65 67  aSeg[N] and aSeg
4970: 5b 4e 2b 31 5d 2c 20 77 68 65 72 65 20 4e 20 69  [N+1], where N i
4980: 73 20 61 6e 0a 2a 2a 20 65 76 65 6e 20 6e 75 6d  s an.** even num
4990: 62 65 72 2c 20 69 73 20 73 74 6f 72 65 64 20 69  ber, is stored i
49a0: 6e 20 61 46 69 72 73 74 5b 28 6e 53 65 67 2b 4e  n aFirst[(nSeg+N
49b0: 29 2f 32 5d 2e 20 54 68 65 20 22 72 65 73 75 6c  )/2]. The "resul
49c0: 74 22 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f  t" of the .** co
49d0: 6d 70 61 72 69 73 6f 6e 20 69 6e 20 74 68 69 73  mparison in this
49e0: 20 63 6f 6e 74 65 78 74 20 69 73 20 74 68 65 20   context is the 
49f0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 69 74 65  index of the ite
4a00: 72 61 74 6f 72 20 74 68 61 74 20 63 75 72 72 65  rator that curre
4a10: 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  ntly.** points t
4a20: 6f 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 74 65  o the smaller te
4a30: 72 6d 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61  rm/rowid combina
4a40: 74 69 6f 6e 2e 20 49 74 65 72 61 74 6f 72 73 20  tion. Iterators 
4a50: 61 74 20 45 4f 46 20 61 72 65 0a 2a 2a 20 63 6f  at EOF are.** co
4a60: 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 67  nsidered to be g
4a70: 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20  reater than all 
4a80: 6f 74 68 65 72 20 69 74 65 72 61 74 6f 72 73 2e  other iterators.
4a90: 0a 2a 2a 0a 2a 2a 20 61 46 69 72 73 74 5b 31 5d  .**.** aFirst[1]
4aa0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e   contains the in
4ab0: 64 65 78 20 69 6e 20 61 53 65 67 5b 5d 20 6f 66  dex in aSeg[] of
4ac0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 68   the iterator th
4ad0: 61 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  at points to.** 
4ae0: 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
4af0: 20 6f 76 65 72 61 6c 6c 2e 20 61 46 69 72 73 74   overall. aFirst
4b00: 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 2e 20 0a  [0] is unused. .
4b10: 2a 2a 0a 2a 2a 20 70 6f 73 6c 69 73 74 3a 0a 2a  **.** poslist:.*
4b20: 2a 20 20 20 55 73 65 64 20 62 79 20 73 71 6c 69  *   Used by sqli
4b30: 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69  te3Fts5IterPosli
4b40: 73 74 28 29 20 77 68 65 6e 20 74 68 65 20 70 6f  st() when the po
4b50: 73 6c 69 73 74 20 6e 65 65 64 73 20 74 6f 20 62  slist needs to b
4b60: 65 20 62 75 66 66 65 72 65 64 2e 0a 2a 2a 20 20  e buffered..**  
4b70: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   There is no way
4b80: 20 74 6f 20 74 65 6c 6c 20 69 66 20 74 68 69 73   to tell if this
4b90: 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72   is populated or
4ba0: 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20   not..*/.struct 
4bb0: 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 7b 0a  Fts5IndexIter {.
4bc0: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49 6e    Fts5Index *pIn
4bd0: 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
4be0: 20 20 2f 2a 20 49 6e 64 65 78 20 74 68 61 74 20    /* Index that 
4bf0: 6f 77 6e 73 20 74 68 69 73 20 69 74 65 72 61 74  owns this iterat
4c00: 6f 72 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  or */.  Fts5Stru
4c10: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 20  cture *pStruct; 
4c20: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
4c30: 61 73 65 20 73 74 72 75 63 74 75 72 65 20 66 6f  ase structure fo
4c40: 72 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20  r this iterator 
4c50: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
4c60: 70 6f 73 6c 69 73 74 3b 20 20 20 20 20 20 20 20  poslist;        
4c70: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
4c80: 6f 6e 74 61 69 6e 69 6e 67 20 63 75 72 72 65 6e  ontaining curren
4c90: 74 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 0a 20 20  t poslist */..  
4ca0: 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20  int nSeg;       
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cc0: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 53 65 67 5b  /* Size of aSeg[
4cd0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  ] array */.  int
4ce0: 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4d00: 54 72 75 65 20 74 6f 20 69 74 65 72 61 74 65 20  True to iterate 
4d10: 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
4d20: 20 2a 2f 0a 20 20 75 38 20 62 53 6b 69 70 45 6d   */.  u8 bSkipEm
4d30: 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  pty;            
4d40: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
4d50: 20 73 6b 69 70 20 64 65 6c 65 74 65 64 20 65 6e   skip deleted en
4d60: 74 72 69 65 73 20 2a 2f 0a 20 20 75 38 20 62 45  tries */.  u8 bE
4d70: 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  of;             
4d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
4d90: 75 65 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 75  ue at EOF */.  u
4da0: 38 20 62 46 69 6c 74 65 72 65 64 3b 20 20 20 20  8 bFiltered;    
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4dc0: 2a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e  * True if column
4dd0: 2d 66 69 6c 74 65 72 20 61 6c 72 65 61 64 79 20  -filter already 
4de0: 61 70 70 6c 69 65 64 20 2a 2f 0a 0a 20 20 69 36  applied */..  i6
4df0: 34 20 69 53 77 69 74 63 68 52 6f 77 69 64 3b 20  4 iSwitchRowid; 
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4e10: 20 46 69 72 73 74 65 73 74 20 72 6f 77 69 64 20   Firstest rowid 
4e20: 6f 66 20 6f 74 68 65 72 20 74 68 61 6e 20 61 46  of other than aF
4e30: 69 72 73 74 5b 31 5d 20 2a 2f 0a 20 20 46 74 73  irst[1] */.  Fts
4e40: 35 43 52 65 73 75 6c 74 20 2a 61 46 69 72 73 74  5CResult *aFirst
4e50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4e60: 43 75 72 72 65 6e 74 20 6d 65 72 67 65 20 73 74  Current merge st
4e70: 61 74 65 20 28 73 65 65 20 61 62 6f 76 65 29 20  ate (see above) 
4e80: 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
4e90: 20 61 53 65 67 5b 31 5d 3b 20 20 20 20 20 20 20   aSeg[1];       
4ea0: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
4eb0: 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f   segment iterato
4ec0: 72 73 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a  rs */.};.../*.**
4ed0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
4ee0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79  the following ty
4ef0: 70 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 74  pe is used to it
4f00: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
4f10: 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
4f20: 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
4f30: 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70   record..**.** p
4f40: 44 61 74 61 3a 0a 2a 2a 20 20 20 52 65 63 6f 72  Data:.**   Recor
4f50: 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  d containing the
4f60: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 64   doclist-index d
4f70: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a  ata..**.** bEof:
4f80: 0a 2a 2a 20 20 20 53 65 74 20 74 6f 20 74 72 75  .**   Set to tru
4f90: 65 20 6f 6e 63 65 20 69 74 65 72 61 74 6f 72 20  e once iterator 
4fa0: 68 61 73 20 72 65 61 63 68 65 64 20 45 4f 46 2e  has reached EOF.
4fb0: 0a 2a 2a 0a 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20  .**.** iOff:.** 
4fc0: 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 75 72    Set to the cur
4fd0: 72 65 6e 74 20 6f 66 66 73 65 74 20 77 69 74 68  rent offset with
4fe0: 69 6e 20 72 65 63 6f 72 64 20 70 44 61 74 61 2e  in record pData.
4ff0: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 44  .*/.struct Fts5D
5000: 6c 69 64 78 4c 76 6c 20 7b 0a 20 20 46 74 73 35  lidxLvl {.  Fts5
5010: 44 61 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20  Data *pData;    
5020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
5030: 61 20 66 6f 72 20 63 75 72 72 65 6e 74 20 70 61  a for current pa
5040: 67 65 20 6f 66 20 74 68 69 73 20 6c 65 76 65 6c  ge of this level
5050: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20   */.  int iOff; 
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5070: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
5080: 66 66 73 65 74 20 69 6e 74 6f 20 70 44 61 74 61  ffset into pData
5090: 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20   */.  int bEof; 
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 20 20 20 20 2f 2a 20 41 74 20 45 4f 46 20 61 6c      /* At EOF al
50c0: 72 65 61 64 79 20 2a 2f 0a 20 20 69 6e 74 20 69  ready */.  int i
50d0: 46 69 72 73 74 4f 66 66 3b 20 20 20 20 20 20 20  FirstOff;       
50e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
50f0: 20 62 79 20 72 65 76 65 72 73 65 20 69 74 65 72   by reverse iter
5100: 61 74 6f 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  ators */..  /* O
5110: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
5120: 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67  */.  int iLeafPg
5130: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
5140: 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
5150: 72 20 6f 66 20 63 75 72 72 65 6e 74 20 6c 65 61  r of current lea
5160: 66 20 70 61 67 65 20 2a 2f 0a 20 20 69 36 34 20  f page */.  i64 
5170: 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  iRowid;         
5180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
5190: 73 74 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66  st rowid on leaf
51a0: 20 69 4c 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b   iLeafPgno */.};
51b0: 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c 69 64  .struct Fts5Dlid
51c0: 78 49 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 4c  xIter {.  int nL
51d0: 76 6c 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64  vl;.  int iSegid
51e0: 3b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c  ;.  Fts5DlidxLvl
51f0: 20 61 4c 76 6c 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74   aLvl[1];.};..st
5200: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 75  atic void fts5Pu
5210: 74 55 31 36 28 75 38 20 2a 61 4f 75 74 2c 20 75  tU16(u8 *aOut, u
5220: 31 36 20 69 56 61 6c 29 7b 0a 20 20 61 4f 75 74  16 iVal){.  aOut
5230: 5b 30 5d 20 3d 20 28 69 56 61 6c 3e 3e 38 29 3b  [0] = (iVal>>8);
5240: 0a 20 20 61 4f 75 74 5b 31 5d 20 3d 20 28 69 56  .  aOut[1] = (iV
5250: 61 6c 26 30 78 46 46 29 3b 0a 7d 0a 0a 73 74 61  al&0xFF);.}..sta
5260: 74 69 63 20 75 31 36 20 66 74 73 35 47 65 74 55  tic u16 fts5GetU
5270: 31 36 28 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e  16(const u8 *aIn
5280: 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75 31  ){.  return ((u1
5290: 36 29 61 49 6e 5b 30 5d 20 3c 3c 20 38 29 20 2b  6)aIn[0] << 8) +
52a0: 20 61 49 6e 5b 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a   aIn[1];.} ../*.
52b0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
52c0: 72 65 74 75 72 6e 20 61 20 62 75 66 66 65 72 20  return a buffer 
52d0: 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62  at least nByte b
52e0: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
52f0: 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  .** If an OOM er
5300: 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
5310: 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  ed, return NULL 
5320: 61 6e 64 20 73 65 74 20 74 68 65 20 65 72 72 6f  and set the erro
5330: 72 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68 65  r code in.** the
5340: 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c   Fts5Index handl
5350: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
5360: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
5370: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
5380: 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46 74  fts5IdxMalloc(Ft
5390: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
53a0: 6e 42 79 74 65 29 7b 0a 20 20 72 65 74 75 72 6e  nByte){.  return
53b0: 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c   sqlite3Fts5Mall
53c0: 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e  ocZero(&p->rc, n
53d0: 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Byte);.}../*.** 
53e0: 43 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74  Compare the cont
53f0: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 4c 65 66  ents of the pLef
5400: 74 20 62 75 66 66 65 72 20 77 69 74 68 20 74 68  t buffer with th
5410: 65 20 70 52 69 67 68 74 2f 6e 52 69 67 68 74 20  e pRight/nRight 
5420: 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  blob..**.** Retu
5430: 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20  rn -ve if pLeft 
5440: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
5450: 70 52 69 67 68 74 2c 20 30 20 69 66 20 74 68 65  pRight, 0 if the
5460: 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a  y are equal or.*
5470: 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68 74 20  * +ve if pRight 
5480: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
5490: 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20  pLeft. In other 
54a0: 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  words:.**.**    
54b0: 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20   res = *pLeft - 
54c0: 2a 70 52 69 67 68 74 0a 2a 2f 0a 23 69 66 64 65  *pRight.*/.#ifde
54d0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
54e0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 75  tatic int fts5Bu
54f0: 66 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28  fferCompareBlob(
5500: 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
5510: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
5520: 20 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20     /* Left hand 
5530: 73 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73  side of comparis
5540: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  on */.  const u8
5550: 20 2a 70 52 69 67 68 74 2c 20 69 6e 74 20 6e 52   *pRight, int nR
5560: 69 67 68 74 20 20 20 20 2f 2a 20 52 69 67 68 74  ight    /* Right
5570: 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63 6f   hand side of co
5580: 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20  mparison */.){. 
5590: 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
55a0: 70 4c 65 66 74 2d 3e 6e 2c 20 6e 52 69 67 68 74  pLeft->n, nRight
55b0: 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d  );.  int res = m
55c0: 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20  emcmp(pLeft->p, 
55d0: 70 52 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20  pRight, nCmp);. 
55e0: 20 72 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20   return (res==0 
55f0: 3f 20 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52  ? (pLeft->n - nR
5600: 69 67 68 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a  ight) : res);.}.
5610: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
5620: 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  mpare the conten
5630: 74 73 20 6f 66 20 74 68 65 20 74 77 6f 20 62 75  ts of the two bu
5640: 66 66 65 72 73 20 75 73 69 6e 67 20 6d 65 6d 63  ffers using memc
5650: 6d 70 28 29 2e 20 49 66 20 6f 6e 65 20 62 75 66  mp(). If one buf
5660: 66 65 72 0a 2a 2a 20 69 73 20 61 20 70 72 65 66  fer.** is a pref
5670: 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c  ix of the other,
5680: 20 69 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65   it is considere
5690: 64 20 74 68 65 20 6c 65 73 73 65 72 2e 0a 2a 2a  d the lesser..**
56a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76 65 20 69  .** Return -ve i
56b0: 66 20 70 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c  f pLeft is small
56c0: 65 72 20 74 68 61 6e 20 70 52 69 67 68 74 2c 20  er than pRight, 
56d0: 30 20 69 66 20 74 68 65 79 20 61 72 65 20 65 71  0 if they are eq
56e0: 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66  ual or.** +ve if
56f0: 20 70 52 69 67 68 74 20 69 73 20 73 6d 61 6c 6c   pRight is small
5700: 65 72 20 74 68 61 6e 20 70 4c 65 66 74 2e 20 49  er than pLeft. I
5710: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a  n other words:.*
5720: 2a 0a 2a 2a 20 20 20 20 20 72 65 73 20 3d 20 2a  *.**     res = *
5730: 70 4c 65 66 74 20 2d 20 2a 70 52 69 67 68 74 0a  pLeft - *pRight.
5740: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
5750: 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28  s5BufferCompare(
5760: 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66  Fts5Buffer *pLef
5770: 74 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  t, Fts5Buffer *p
5780: 52 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 6e 43  Right){.  int nC
5790: 6d 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e  mp = MIN(pLeft->
57a0: 6e 2c 20 70 52 69 67 68 74 2d 3e 6e 29 3b 0a 20  n, pRight->n);. 
57b0: 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d   int res = memcm
57c0: 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67  p(pLeft->p, pRig
57d0: 68 74 2d 3e 70 2c 20 6e 43 6d 70 29 3b 0a 20 20  ht->p, nCmp);.  
57e0: 72 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f  return (res==0 ?
57f0: 20 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 70 52 69   (pLeft->n - pRi
5800: 67 68 74 2d 3e 6e 29 20 3a 20 72 65 73 29 3b 0a  ght->n) : res);.
5810: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
5820: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
5830: 74 20 66 74 73 35 42 6c 6f 62 43 6f 6d 70 61 72  t fts5BlobCompar
5840: 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  e(.  const u8 *p
5850: 4c 65 66 74 2c 20 69 6e 74 20 6e 4c 65 66 74 2c  Left, int nLeft,
5860: 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 52   .  const u8 *pR
5870: 69 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68 74  ight, int nRight
5880: 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d  .){.  int nCmp =
5890: 20 4d 49 4e 28 6e 4c 65 66 74 2c 20 6e 52 69 67   MIN(nLeft, nRig
58a0: 68 74 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d  ht);.  int res =
58b0: 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2c 20 70   memcmp(pLeft, p
58c0: 52 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20  Right, nCmp);.  
58d0: 72 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f  return (res==0 ?
58e0: 20 28 6e 4c 65 66 74 20 2d 20 6e 52 69 67 68 74   (nLeft - nRight
58f0: 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 23 65 6e 64  ) : res);.}.#end
5900: 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  if..static int f
5910: 74 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d  ts5LeafFirstTerm
5920: 4f 66 66 28 46 74 73 35 44 61 74 61 20 2a 70 4c  Off(Fts5Data *pL
5930: 65 61 66 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b  eaf){.  int ret;
5940: 0a 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  .  fts5GetVarint
5950: 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65  32(&pLeaf->p[pLe
5960: 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 72 65 74  af->szLeaf], ret
5970: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b  );.  return ret;
5980: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
5990: 74 68 65 20 72 65 61 64 2d 6f 6e 6c 79 20 62 6c  the read-only bl
59a0: 6f 62 20 68 61 6e 64 6c 65 2c 20 69 66 20 69 74  ob handle, if it
59b0: 20 69 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61   is open..*/.sta
59c0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 6c 6f  tic void fts5Clo
59d0: 73 65 52 65 61 64 65 72 28 46 74 73 35 49 6e 64  seReader(Fts5Ind
59e0: 65 78 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  ex *p){.  if( p-
59f0: 3e 70 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20  >pReader ){.    
5a00: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52  sqlite3_blob *pR
5a10: 65 61 64 65 72 20 3d 20 70 2d 3e 70 52 65 61 64  eader = p->pRead
5a20: 65 72 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 64  er;.    p->pRead
5a30: 65 72 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  er = 0;.    sqli
5a40: 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70  te3_blob_close(p
5a50: 52 65 61 64 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  Reader);.  }.}..
5a60: 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20  ./*.** Retrieve 
5a70: 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  a record from th
5a80: 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a  e %_data table..
5a90: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
5aa0: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
5ab0: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
5ac0: 6e 20 65 72 72 6f 72 20 6c 65 66 74 20 69 6e 20  n error left in 
5ad0: 74 68 65 20 0a 2a 2a 20 46 74 73 35 49 6e 64 65  the .** Fts5Inde
5ae0: 78 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  x object..*/.sta
5af0: 74 69 63 20 46 74 73 35 44 61 74 61 20 2a 66 74  tic Fts5Data *ft
5b00: 73 35 44 61 74 61 52 65 61 64 28 46 74 73 35 49  s5DataRead(Fts5I
5b10: 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f  ndex *p, i64 iRo
5b20: 77 69 64 29 7b 0a 20 20 46 74 73 35 44 61 74 61  wid){.  Fts5Data
5b30: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66   *pRet = 0;.  if
5b40: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
5b50: 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  OK ){.    int rc
5b60: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
5b70: 20 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65     if( p->pReade
5b80: 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  r ){.      /* Th
5b90: 69 73 20 63 61 6c 6c 20 6d 61 79 20 72 65 74 75  is call may retu
5ba0: 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20  rn SQLITE_ABORT 
5bb0: 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65  if there has bee
5bc0: 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 20 20  n a savepoint.  
5bd0: 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
5be0: 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73  since it was las
5bf0: 74 20 75 73 65 64 2e 20 49 6e 20 74 68 69 73 20  t used. In this 
5c00: 63 61 73 65 20 61 20 6e 65 77 20 62 6c 6f 62 20  case a new blob 
5c10: 68 61 6e 64 6c 65 0a 20 20 20 20 20 20 2a 2a 20  handle.      ** 
5c20: 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f  is required.  */
5c30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
5c40: 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 70 2d 3e  lob *pBlob = p->
5c50: 70 52 65 61 64 65 72 3b 0a 20 20 20 20 20 20 70  pReader;.      p
5c60: 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20  ->pReader = 0;. 
5c70: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5c80: 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 42  3_blob_reopen(pB
5c90: 6c 6f 62 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  lob, iRowid);.  
5ca0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
5cb0: 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20  Reader==0 );.   
5cc0: 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20     p->pReader = 
5cd0: 70 42 6c 6f 62 3b 0a 20 20 20 20 20 20 69 66 28  pBlob;.      if(
5ce0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5cf0: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 43 6c  {.        fts5Cl
5d00: 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20  oseReader(p);.  
5d10: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
5d20: 72 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54  rc==SQLITE_ABORT
5d30: 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
5d40: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
5d50: 20 49 66 20 74 68 65 20 62 6c 6f 62 20 68 61 6e   If the blob han
5d60: 64 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  dle is not open 
5d70: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f  at this point, o
5d80: 70 65 6e 20 69 74 20 61 6e 64 20 73 65 65 6b 20  pen it and seek 
5d90: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 72  .    ** to the r
5da0: 65 71 75 65 73 74 65 64 20 65 6e 74 72 79 2e 20  equested entry. 
5db0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   */.    if( p->p
5dc0: 52 65 61 64 65 72 3d 3d 30 20 26 26 20 72 63 3d  Reader==0 && rc=
5dd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5de0: 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a      Fts5Config *
5df0: 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
5e00: 6e 66 69 67 3b 0a 20 20 20 20 20 20 72 63 20 3d  nfig;.      rc =
5e10: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70   sqlite3_blob_op
5e20: 65 6e 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20  en(pConfig->db, 
5e30: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66  .          pConf
5e40: 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74  ig->zDb, p->zDat
5e50: 61 54 62 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20 69  aTbl, "block", i
5e60: 52 6f 77 69 64 2c 20 30 2c 20 26 70 2d 3e 70 52  Rowid, 0, &p->pR
5e70: 65 61 64 65 72 0a 20 20 20 20 20 20 29 3b 0a 20  eader.      );. 
5e80: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
5e90: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 71  either of the sq
5ea0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28  lite3_blob_open(
5eb0: 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 6c 6f  ) or sqlite3_blo
5ec0: 62 5f 72 65 6f 70 65 6e 28 29 20 63 61 6c 6c 73  b_reopen() calls
5ed0: 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 72 65  .    ** above re
5ee0: 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 45 52  turned SQLITE_ER
5ef0: 52 4f 52 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ROR, return SQLI
5f00: 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 20  TE_CORRUPT_VTAB 
5f10: 69 6e 73 74 65 61 64 2e 0a 20 20 20 20 2a 2a 20  instead..    ** 
5f20: 41 6c 6c 20 74 68 65 20 72 65 61 73 6f 6e 73 20  All the reasons 
5f30: 74 68 6f 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  those functions 
5f40: 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c  might return SQL
5f50: 49 54 45 5f 45 52 52 4f 52 20 2d 20 6d 69 73 73  ITE_ERROR - miss
5f60: 69 6e 67 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  ing.    ** table
5f70: 2c 20 6d 69 73 73 69 6e 67 20 72 6f 77 2c 20 6e  , missing row, n
5f80: 6f 6e 2d 62 6c 6f 62 2f 74 65 78 74 20 69 6e 20  on-blob/text in 
5f90: 62 6c 6f 63 6b 20 63 6f 6c 75 6d 6e 20 2d 20 69  block column - i
5fa0: 6e 64 69 63 61 74 65 20 0a 20 20 20 20 2a 2a 20  ndicate .    ** 
5fb0: 62 61 63 6b 69 6e 67 20 73 74 6f 72 65 20 63 6f  backing store co
5fc0: 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  rruption.  */.  
5fd0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5fe0: 5f 45 52 52 4f 52 20 29 20 72 63 20 3d 20 46 54  _ERROR ) rc = FT
5ff0: 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20  S5_CORRUPT;..   
6000: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6010: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  OK ){.      u8 *
6020: 61 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  aOut = 0;       
6030: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
6040: 62 6c 6f 62 20 64 61 74 61 20 69 6e 74 6f 20 74  blob data into t
6050: 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  his buffer */.  
6060: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
6070: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74  sqlite3_blob_byt
6080: 65 73 28 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a  es(p->pReader);.
6090: 20 20 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63        int nAlloc
60a0: 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 44 61   = sizeof(Fts5Da
60b0: 74 61 29 20 2b 20 6e 42 79 74 65 20 2b 20 46 54  ta) + nByte + FT
60c0: 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 3b  S5_DATA_PADDING;
60d0: 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 28 46  .      pRet = (F
60e0: 74 73 35 44 61 74 61 2a 29 73 71 6c 69 74 65 33  ts5Data*)sqlite3
60f0: 5f 6d 61 6c 6c 6f 63 28 6e 41 6c 6c 6f 63 29 3b  _malloc(nAlloc);
6100: 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20  .      if( pRet 
6110: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  ){.        pRet-
6120: 3e 6e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20  >nn = nByte;.   
6130: 20 20 20 20 20 61 4f 75 74 20 3d 20 70 52 65 74       aOut = pRet
6140: 2d 3e 70 20 3d 20 28 75 38 2a 29 26 70 52 65 74  ->p = (u8*)&pRet
6150: 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  [1];.      }else
6160: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
6170: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
6180: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
6190: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
61a0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
61b0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28  lite3_blob_read(
61c0: 70 2d 3e 70 52 65 61 64 65 72 2c 20 61 4f 75 74  p->pReader, aOut
61d0: 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 20  , nByte, 0);.   
61e0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
61f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
6200: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
6210: 66 72 65 65 28 70 52 65 74 29 3b 0a 20 20 20 20  free(pRet);.    
6220: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
6230: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6240: 20 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 46 69 78     /* TODO1: Fix
6250: 20 74 68 69 73 20 2a 2f 0a 20 20 20 20 20 20 20   this */.       
6260: 20 70 52 65 74 2d 3e 73 7a 4c 65 61 66 20 3d 20   pRet->szLeaf = 
6270: 66 74 73 35 47 65 74 55 31 36 28 26 70 52 65 74  fts5GetU16(&pRet
6280: 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ->p[2]);.      }
6290: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63  .    }.    p->rc
62a0: 20 3d 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52   = rc;.    p->nR
62b0: 65 61 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 61 73  ead++;.  }..  as
62c0: 73 65 72 74 28 20 28 70 52 65 74 3d 3d 30 29 3d  sert( (pRet==0)=
62d0: 3d 28 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  =(p->rc!=SQLITE_
62e0: 4f 4b 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  OK) );.  return 
62f0: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
6300: 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e  elease a referen
6310: 63 65 20 74 6f 20 64 61 74 61 20 72 65 63 6f 72  ce to data recor
6320: 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  d returned by an
6330: 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
6340: 0a 2a 2a 20 66 74 73 35 44 61 74 61 52 65 61 64  .** fts5DataRead
6350: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
6360: 69 64 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  id fts5DataRelea
6370: 73 65 28 46 74 73 35 44 61 74 61 20 2a 70 44 61  se(Fts5Data *pDa
6380: 74 61 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ta){.  sqlite3_f
6390: 72 65 65 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 73  ree(pData);.}..s
63a0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
63b0: 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 0a  dexPrepareStmt(.
63c0: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a    Fts5Index *p,.
63d0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
63e0: 2a 70 70 53 74 6d 74 2c 0a 20 20 63 68 61 72 20  *ppStmt,.  char 
63f0: 2a 7a 53 71 6c 0a 29 7b 0a 20 20 69 66 28 20 70  *zSql.){.  if( p
6400: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
6410: 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 20  ){.    if( zSql 
6420: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
6430: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
6440: 5f 76 32 28 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  _v2(p->pConfig->
6450: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70  db, zSql, -1, pp
6460: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65  Stmt, 0);.    }e
6470: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  lse{.      p->rc
6480: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
6490: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
64a0: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
64b0: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b  .  return p->rc;
64c0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53 45 52  .}.../*.** INSER
64d0: 54 20 4f 52 20 52 45 50 4c 41 43 45 20 61 20 72  T OR REPLACE a r
64e0: 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 25  ecord into the %
64f0: 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a  _data table..*/.
6500: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
6510: 44 61 74 61 57 72 69 74 65 28 46 74 73 35 49 6e  DataWrite(Fts5In
6520: 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77  dex *p, i64 iRow
6530: 69 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 44  id, const u8 *pD
6540: 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b  ata, int nData){
6550: 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51  .  if( p->rc!=SQ
6560: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
6570: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 72 69  ;..  if( p->pWri
6580: 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74  ter==0 ){.    Ft
6590: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
65a0: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
65b0: 20 20 20 20 66 74 73 35 49 6e 64 65 78 50 72 65      fts5IndexPre
65c0: 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e  pareStmt(p, &p->
65d0: 70 57 72 69 74 65 72 2c 20 73 71 6c 69 74 65 33  pWriter, sqlite3
65e0: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
65f0: 20 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54      "REPLACE INT
6600: 4f 20 27 25 71 27 2e 27 25 71 5f 64 61 74 61 27  O '%q'.'%q_data'
6610: 28 69 64 2c 20 62 6c 6f 63 6b 29 20 56 41 4c 55  (id, block) VALU
6620: 45 53 28 3f 2c 3f 29 22 2c 20 0a 20 20 20 20 20  ES(?,?)", .     
6630: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
6640: 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  b, pConfig->zNam
6650: 65 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 69 66  e.    ));.    if
6660: 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
6670: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
6680: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70  _bind_int64(p->p
6690: 57 72 69 74 65 72 2c 20 31 2c 20 69 52 6f 77 69  Writer, 1, iRowi
66a0: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  d);.  sqlite3_bi
66b0: 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 57 72 69 74  nd_blob(p->pWrit
66c0: 65 72 2c 20 32 2c 20 70 44 61 74 61 2c 20 6e 44  er, 2, pData, nD
66d0: 61 74 61 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  ata, SQLITE_STAT
66e0: 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  IC);.  sqlite3_s
66f0: 74 65 70 28 70 2d 3e 70 57 72 69 74 65 72 29 3b  tep(p->pWriter);
6700: 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74  .  p->rc = sqlit
6710: 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 57 72 69  e3_reset(p->pWri
6720: 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  ter);.}../*.** E
6730: 78 65 63 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f  xecute the follo
6740: 77 69 6e 67 20 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20  wing SQL:.**.** 
6750: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
6760: 25 5f 64 61 74 61 20 57 48 45 52 45 20 69 64 20  %_data WHERE id 
6770: 42 45 54 57 45 45 4e 20 24 69 46 69 72 73 74 20  BETWEEN $iFirst 
6780: 41 4e 44 20 24 69 4c 61 73 74 0a 2a 2f 0a 73 74  AND $iLast.*/.st
6790: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61  atic void fts5Da
67a0: 74 61 44 65 6c 65 74 65 28 46 74 73 35 49 6e 64  taDelete(Fts5Ind
67b0: 65 78 20 2a 70 2c 20 69 36 34 20 69 46 69 72 73  ex *p, i64 iFirs
67c0: 74 2c 20 69 36 34 20 69 4c 61 73 74 29 7b 0a 20  t, i64 iLast){. 
67d0: 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
67e0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a  TE_OK ) return;.
67f0: 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 6c 65 74  .  if( p->pDelet
6800: 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  er==0 ){.    int
6810: 20 72 63 3b 0a 20 20 20 20 46 74 73 35 43 6f 6e   rc;.    Fts5Con
6820: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
6830: 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 63  ->pConfig;.    c
6840: 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69  har *zSql = sqli
6850: 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
6860: 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
6870: 4d 20 27 25 71 27 2e 27 25 71 5f 64 61 74 61 27  M '%q'.'%q_data'
6880: 20 57 48 45 52 45 20 69 64 3e 3d 3f 20 41 4e 44   WHERE id>=? AND
6890: 20 69 64 3c 3d 3f 22 2c 20 0a 20 20 20 20 20 20   id<=?", .      
68a0: 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62      pConfig->zDb
68b0: 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65  , pConfig->zName
68c0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
68d0: 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
68e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
68f0: 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
6900: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6910: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 43 6f  3_prepare_v2(pCo
6920: 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  nfig->db, zSql, 
6930: 2d 31 2c 20 26 70 2d 3e 70 44 65 6c 65 74 65 72  -1, &p->pDeleter
6940: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
6950: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
6960: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
6970: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
6980: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
6990: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
69a0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
69b0: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
69c0: 2d 3e 70 44 65 6c 65 74 65 72 2c 20 31 2c 20 69  ->pDeleter, 1, i
69d0: 46 69 72 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  First);.  sqlite
69e0: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e  3_bind_int64(p->
69f0: 70 44 65 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61  pDeleter, 2, iLa
6a00: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  st);.  sqlite3_s
6a10: 74 65 70 28 70 2d 3e 70 44 65 6c 65 74 65 72 29  tep(p->pDeleter)
6a20: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69  ;.  p->rc = sqli
6a30: 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44 65  te3_reset(p->pDe
6a40: 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  leter);.}../*.**
6a50: 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 63 6f   Remove all reco
6a60: 72 64 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  rds associated w
6a70: 69 74 68 20 73 65 67 6d 65 6e 74 20 69 53 65 67  ith segment iSeg
6a80: 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  id..*/.static vo
6a90: 69 64 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76  id fts5DataRemov
6aa0: 65 53 65 67 6d 65 6e 74 28 46 74 73 35 49 6e 64  eSegment(Fts5Ind
6ab0: 65 78 20 2a 70 2c 20 69 6e 74 20 69 53 65 67 69  ex *p, int iSegi
6ac0: 64 29 7b 0a 20 20 69 36 34 20 69 46 69 72 73 74  d){.  i64 iFirst
6ad0: 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
6ae0: 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30 29  ROWID(iSegid, 0)
6af0: 3b 0a 20 20 69 36 34 20 69 4c 61 73 74 20 3d 20  ;.  i64 iLast = 
6b00: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
6b10: 49 44 28 69 53 65 67 69 64 2b 31 2c 20 30 29 2d  ID(iSegid+1, 0)-
6b20: 31 3b 0a 20 20 66 74 73 35 44 61 74 61 44 65 6c  1;.  fts5DataDel
6b30: 65 74 65 28 70 2c 20 69 46 69 72 73 74 2c 20 69  ete(p, iFirst, i
6b40: 4c 61 73 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Last);.  if( p->
6b50: 70 49 64 78 44 65 6c 65 74 65 72 3d 3d 30 20 29  pIdxDeleter==0 )
6b60: 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  {.    Fts5Config
6b70: 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
6b80: 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35  Config;.    fts5
6b90: 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74  IndexPrepareStmt
6ba0: 28 70 2c 20 26 70 2d 3e 70 49 64 78 44 65 6c 65  (p, &p->pIdxDele
6bb0: 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72  ter, sqlite3_mpr
6bc0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
6bd0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71  "DELETE FROM '%q
6be0: 27 2e 27 25 71 5f 69 64 78 27 20 57 48 45 52 45  '.'%q_idx' WHERE
6bf0: 20 73 65 67 69 64 3d 3f 22 2c 0a 20 20 20 20 20   segid=?",.     
6c00: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
6c10: 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  b, pConfig->zNam
6c20: 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20  e.    ));.  }.  
6c30: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
6c40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
6c50: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e  te3_bind_int(p->
6c60: 70 49 64 78 44 65 6c 65 74 65 72 2c 20 31 2c 20  pIdxDeleter, 1, 
6c70: 69 53 65 67 69 64 29 3b 0a 20 20 20 20 73 71 6c  iSegid);.    sql
6c80: 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64  ite3_step(p->pId
6c90: 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 70  xDeleter);.    p
6ca0: 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  ->rc = sqlite3_r
6cb0: 65 73 65 74 28 70 2d 3e 70 49 64 78 44 65 6c 65  eset(p->pIdxDele
6cc0: 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ter);.  }.}../*.
6cd0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66  ** Release a ref
6ce0: 65 72 65 6e 63 65 20 74 6f 20 61 6e 20 46 74 73  erence to an Fts
6cf0: 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63  5Structure objec
6d00: 74 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  t returned by an
6d10: 20 65 61 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c   earlier .** cal
6d20: 6c 20 74 6f 20 66 74 73 35 53 74 72 75 63 74 75  l to fts5Structu
6d30: 72 65 52 65 61 64 28 29 20 6f 72 20 66 74 73 35  reRead() or fts5
6d40: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
6d50: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
6d60: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  d fts5StructureR
6d70: 65 6c 65 61 73 65 28 46 74 73 35 53 74 72 75 63  elease(Fts5Struc
6d80: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
6d90: 20 20 69 66 28 20 70 53 74 72 75 63 74 20 26 26    if( pStruct &&
6da0: 20 30 3e 3d 28 2d 2d 70 53 74 72 75 63 74 2d 3e   0>=(--pStruct->
6db0: 6e 52 65 66 29 20 29 7b 0a 20 20 20 20 69 6e 74  nRef) ){.    int
6dc0: 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   i;.    assert( 
6dd0: 70 53 74 72 75 63 74 2d 3e 6e 52 65 66 3d 3d 30  pStruct->nRef==0
6de0: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
6df0: 20 69 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76   i<pStruct->nLev
6e00: 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  el; i++){.      
6e10: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74  sqlite3_free(pSt
6e20: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  ruct->aLevel[i].
6e30: 61 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  aSeg);.    }.   
6e40: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
6e50: 74 72 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  truct);.  }.}..s
6e60: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
6e70: 74 72 75 63 74 75 72 65 52 65 66 28 46 74 73 35  tructureRef(Fts5
6e80: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
6e90: 63 74 29 7b 0a 20 20 70 53 74 72 75 63 74 2d 3e  ct){.  pStruct->
6ea0: 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nRef++;.}../*.**
6eb0: 20 44 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64   Deserialize and
6ec0: 20 72 65 74 75 72 6e 20 74 68 65 20 73 74 72 75   return the stru
6ed0: 63 74 75 72 65 20 72 65 63 6f 72 64 20 63 75 72  cture record cur
6ee0: 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
6ef0: 20 73 65 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66   serialized.** f
6f00: 6f 72 6d 20 77 69 74 68 69 6e 20 62 75 66 66 65  orm within buffe
6f10: 72 20 70 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a  r pData/nData..*
6f20: 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72  *.** The Fts5Str
6f30: 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20  ucture.aLevel[] 
6f40: 61 6e 64 20 65 61 63 68 20 46 74 73 35 53 74 72  and each Fts5Str
6f50: 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67  uctureLevel.aSeg
6f60: 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20  [] array.** are 
6f70: 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62  over-allocated b
6f80: 79 20 6f 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73  y one slot. This
6f90: 20 61 6c 6c 6f 77 73 20 74 68 65 20 73 74 72 75   allows the stru
6fa0: 63 74 75 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  cture contents.*
6fb0: 2a 20 74 6f 20 62 65 20 6d 6f 72 65 20 65 61 73  * to be more eas
6fc0: 69 6c 79 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a  ily edited..**.*
6fd0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
6fe0: 63 75 72 73 2c 20 2a 70 70 4f 75 74 20 69 73 20  curs, *ppOut is 
6ff0: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
7000: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
7010: 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64  code.** returned
7020: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 2a 70 70  . Otherwise, *pp
7030: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Out is set to po
7040: 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f  int to the new o
7050: 62 6a 65 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c  bject and.** SQL
7060: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
7070: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
7080: 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f  ts5StructureDeco
7090: 64 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  de(.  const u8 *
70a0: 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  pData,          
70b0: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
70c0: 63 6f 6e 74 61 69 6e 69 6e 67 20 73 65 72 69 61  containing seria
70d0: 6c 69 7a 65 64 20 73 74 72 75 63 74 75 72 65 20  lized structure 
70e0: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20  */.  int nData, 
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7100: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
7110: 62 75 66 66 65 72 20 70 44 61 74 61 20 69 6e 20  buffer pData in 
7120: 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  bytes */.  int *
7130: 70 69 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20  piCookie,       
7140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
7150: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b  nfiguration cook
7160: 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74  ie value */.  Ft
7170: 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
7180: 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Out           /*
7190: 20 4f 55 54 3a 20 44 65 73 65 72 69 61 6c 69 7a   OUT: Deserializ
71a0: 65 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  ed object */.){.
71b0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
71c0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20  E_OK;.  int i = 
71d0: 30 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20  0;.  int iLvl;. 
71e0: 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b   int nLevel = 0;
71f0: 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20  .  int nSegment 
7200: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  = 0;.  int nByte
7210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7220: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
7230: 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  of space to allo
7240: 63 61 74 65 20 61 74 20 70 52 65 74 20 2a 2f 0a  cate at pRet */.
7250: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
7260: 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20  *pRet = 0;      
7270: 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f    /* Structure o
7280: 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20  bject to return 
7290: 2a 2f 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68  */..  /* Grab th
72a0: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a  e cookie value *
72b0: 2f 0a 20 20 69 66 28 20 70 69 43 6f 6f 6b 69 65  /.  if( piCookie
72c0: 20 29 20 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73   ) *piCookie = s
72d0: 71 6c 69 74 65 33 46 74 73 35 47 65 74 33 32 28  qlite3Fts5Get32(
72e0: 70 44 61 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b  pData);.  i = 4;
72f0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
7300: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
7310: 6c 65 76 65 6c 73 20 61 6e 64 20 73 65 67 6d 65  levels and segme
7320: 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  nts from the sta
7330: 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  rt of the.  ** s
7340: 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e  tructure record.
7350: 20 20 2a 2f 0a 20 20 69 20 2b 3d 20 66 74 73 35    */.  i += fts5
7360: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
7370: 74 61 5b 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a  ta[i], nLevel);.
7380: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
7390: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
73a0: 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 6e  , nSegment);.  n
73b0: 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20 73  Byte = (.      s
73c0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
73d0: 75 72 65 29 20 2b 20 20 20 20 20 20 20 20 20 20  ure) +          
73e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69            /* Mai
73f0: 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  n structure */. 
7400: 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
7410: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20  StructureLevel) 
7420: 2a 20 28 6e 4c 65 76 65 6c 2d 31 29 20 20 20 20  * (nLevel-1)    
7430: 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61  /* aLevel[] arra
7440: 79 20 2a 2f 0a 20 20 29 3b 0a 20 20 70 52 65 74  y */.  );.  pRet
7450: 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72   = (Fts5Structur
7460: 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  e*)sqlite3Fts5Ma
7470: 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42  llocZero(&rc, nB
7480: 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 52 65  yte);..  if( pRe
7490: 74 20 29 7b 0a 20 20 20 20 70 52 65 74 2d 3e 6e  t ){.    pRet->n
74a0: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 52 65  Ref = 1;.    pRe
74b0: 74 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 4c 65 76  t->nLevel = nLev
74c0: 65 6c 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 53  el;.    pRet->nS
74d0: 65 67 6d 65 6e 74 20 3d 20 6e 53 65 67 6d 65 6e  egment = nSegmen
74e0: 74 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69  t;.    i += sqli
74f0: 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
7500: 28 26 70 44 61 74 61 5b 69 5d 2c 20 26 70 52 65  (&pData[i], &pRe
7510: 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  t->nWriteCounter
7520: 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c  );..    for(iLvl
7530: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
7540: 4b 20 26 26 20 69 4c 76 6c 3c 6e 4c 65 76 65 6c  K && iLvl<nLevel
7550: 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
7560: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
7570: 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 52 65  vel *pLvl = &pRe
7580: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
7590: 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 74 61  .      int nTota
75a0: 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65  l;.      int iSe
75b0: 67 3b 0a 0a 20 20 20 20 20 20 69 20 2b 3d 20 66  g;..      i += f
75c0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
75d0: 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e  pData[i], pLvl->
75e0: 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 69  nMerge);.      i
75f0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
7600: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e  t32(&pData[i], n
7610: 54 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 61 73  Total);.      as
7620: 73 65 72 74 28 20 6e 54 6f 74 61 6c 3e 3d 70 4c  sert( nTotal>=pL
7630: 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 3b 0a 20 20  vl->nMerge );.  
7640: 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d      pLvl->aSeg =
7650: 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53   (Fts5StructureS
7660: 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46  egment*)sqlite3F
7670: 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
7680: 63 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6e 54  c, .          nT
7690: 6f 74 61 6c 20 2a 20 73 69 7a 65 6f 66 28 46 74  otal * sizeof(Ft
76a0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
76b0: 6e 74 29 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20  nt).      );..  
76c0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
76d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
76e0: 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 54   pLvl->nSeg = nT
76f0: 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f  otal;.        fo
7700: 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 6e  r(iSeg=0; iSeg<n
7710: 54 6f 74 61 6c 3b 20 69 53 65 67 2b 2b 29 7b 0a  Total; iSeg++){.
7720: 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66            i += f
7730: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
7740: 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e  pData[i], pLvl->
7750: 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69  aSeg[iSeg].iSegi
7760: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  d);.          i 
7770: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
7780: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c  32(&pData[i], pL
7790: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70  vl->aSeg[iSeg].p
77a0: 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20  gnoFirst);.     
77b0: 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65       i += fts5Ge
77c0: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
77d0: 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  [i], pLvl->aSeg[
77e0: 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b  iSeg].pgnoLast);
77f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7800: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7810: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
7820: 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20  ease(pRet);.    
7830: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
7840: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7850: 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 52 65 74  .  *ppOut = pRet
7860: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
7870: 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  ../*.**.*/.stati
7880: 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63  c void fts5Struc
7890: 74 75 72 65 41 64 64 4c 65 76 65 6c 28 69 6e 74  tureAddLevel(int
78a0: 20 2a 70 52 63 2c 20 46 74 73 35 53 74 72 75 63   *pRc, Fts5Struc
78b0: 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 29  ture **ppStruct)
78c0: 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  {.  if( *pRc==SQ
78d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
78e0: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
78f0: 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
7900: 74 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 76 65  t;.    int nLeve
7910: 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  l = pStruct->nLe
7920: 76 65 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79  vel;.    int nBy
7930: 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20 73  te = (.        s
7940: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
7950: 75 72 65 29 20 2b 20 20 20 20 20 20 20 20 20 20  ure) +          
7960: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20          /* Main 
7970: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
7980: 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
7990: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20  StructureLevel) 
79a0: 2a 20 28 6e 4c 65 76 65 6c 2b 31 29 20 20 2f 2a  * (nLevel+1)  /*
79b0: 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20   aLevel[] array 
79c0: 2a 2f 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 70  */.    );..    p
79d0: 53 74 72 75 63 74 20 3d 20 73 71 6c 69 74 65 33  Struct = sqlite3
79e0: 5f 72 65 61 6c 6c 6f 63 28 70 53 74 72 75 63 74  _realloc(pStruct
79f0: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  , nByte);.    if
7a00: 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20  ( pStruct ){.   
7a10: 20 20 20 6d 65 6d 73 65 74 28 26 70 53 74 72 75     memset(&pStru
7a20: 63 74 2d 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76 65  ct->aLevel[nLeve
7a30: 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  l], 0, sizeof(Ft
7a40: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7a50: 29 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63  ));.      pStruc
7a60: 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20  t->nLevel++;.   
7a70: 20 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70     *ppStruct = p
7a80: 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 65 6c 73  Struct;.    }els
7a90: 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  e{.      *pRc = 
7aa0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
7ab0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
7ac0: 20 45 78 74 65 6e 64 20 6c 65 76 65 6c 20 69 4c   Extend level iL
7ad0: 76 6c 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  vl so that there
7ae0: 20 69 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20   is room for at 
7af0: 6c 65 61 73 74 20 6e 45 78 74 72 61 20 6d 6f 72  least nExtra mor
7b00: 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 2e 0a 2a  e.** segments..*
7b10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
7b20: 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e  s5StructureExten
7b30: 64 4c 65 76 65 6c 28 0a 20 20 69 6e 74 20 2a 70  dLevel(.  int *p
7b40: 52 63 2c 20 0a 20 20 46 74 73 35 53 74 72 75 63  Rc, .  Fts5Struc
7b50: 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 0a  ture *pStruct, .
7b60: 20 20 69 6e 74 20 69 4c 76 6c 2c 20 0a 20 20 69    int iLvl, .  i
7b70: 6e 74 20 6e 45 78 74 72 61 2c 20 0a 20 20 69 6e  nt nExtra, .  in
7b80: 74 20 62 49 6e 73 65 72 74 0a 29 7b 0a 20 20 69  t bInsert.){.  i
7b90: 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
7ba0: 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74  OK ){.    Fts5St
7bb0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
7bc0: 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
7bd0: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20  Level[iLvl];.   
7be0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
7bf0: 67 6d 65 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20  gment *aNew;.   
7c00: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20   int nByte;..   
7c10: 20 6e 42 79 74 65 20 3d 20 28 70 4c 76 6c 2d 3e   nByte = (pLvl->
7c20: 6e 53 65 67 20 2b 20 6e 45 78 74 72 61 29 20 2a  nSeg + nExtra) *
7c30: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
7c40: 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20  ctureSegment);. 
7c50: 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65     aNew = sqlite
7c60: 33 5f 72 65 61 6c 6c 6f 63 28 70 4c 76 6c 2d 3e  3_realloc(pLvl->
7c70: 61 53 65 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20  aSeg, nByte);.  
7c80: 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20    if( aNew ){.  
7c90: 20 20 20 20 69 66 28 20 62 49 6e 73 65 72 74 3d      if( bInsert=
7ca0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =0 ){.        me
7cb0: 6d 73 65 74 28 26 61 4e 65 77 5b 70 4c 76 6c 2d  mset(&aNew[pLvl-
7cc0: 3e 6e 53 65 67 5d 2c 20 30 2c 20 73 69 7a 65 6f  >nSeg], 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 65 6c 73 65 7b 0a  );.      }else{.
7d00: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76          int nMov
7d10: 65 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a  e = pLvl->nSeg *
7d20: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
7d30: 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20  ctureSegment);. 
7d40: 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26         memmove(&
7d50: 61 4e 65 77 5b 6e 45 78 74 72 61 5d 2c 20 61 4e  aNew[nExtra], aN
7d60: 65 77 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20  ew, nMove);.    
7d70: 20 20 20 20 6d 65 6d 73 65 74 28 61 4e 65 77 2c      memset(aNew,
7d80: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
7d90: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
7da0: 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20   * nExtra);.    
7db0: 20 20 7d 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e    }.      pLvl->
7dc0: 61 53 65 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20  aSeg = aNew;.   
7dd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
7de0: 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
7df0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  M;.    }.  }.}..
7e00: 2f 2a 0a 2a 2a 20 52 65 61 64 2c 20 64 65 73 65  /*.** Read, dese
7e10: 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75  rialize and retu
7e20: 72 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  rn the structure
7e30: 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 54   record..**.** T
7e40: 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65  he Fts5Structure
7e50: 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61  .aLevel[] and ea
7e60: 63 68 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ch Fts5Structure
7e70: 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72  Level.aSeg[] arr
7e80: 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61  ay.** are over-a
7e90: 6c 6c 6f 63 61 74 65 64 20 61 73 20 64 65 73 63  llocated as desc
7ea0: 72 69 62 65 64 20 66 6f 72 20 66 75 6e 63 74 69  ribed for functi
7eb0: 6f 6e 20 66 74 73 35 53 74 72 75 63 74 75 72 65  on fts5Structure
7ec0: 44 65 63 6f 64 65 28 29 20 0a 2a 2a 20 61 62 6f  Decode() .** abo
7ed0: 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ve..**.** If an 
7ee0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
7ef0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
7f00: 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
7f10: 20 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20   left in the.** 
7f20: 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65  Fts5Index handle
7f30: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
7f40: 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
7f50: 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
7f60: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
7f70: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
7f80: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73  p..*/.static Fts
7f90: 35 53 74 72 75 63 74 75 72 65 20 2a 66 74 73 35  5Structure *fts5
7fa0: 53 74 72 75 63 74 75 72 65 52 65 61 64 28 46 74  StructureRead(Ft
7fb0: 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46  s5Index *p){.  F
7fc0: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
7fd0: 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
7fe0: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
7ff0: 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20   *pRet = 0;     
8000: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20     /* Object to 
8010: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
8020: 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20  iCookie;        
8030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
8040: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f  onfiguration coo
8050: 6b 69 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  kie */.  Fts5Dat
8060: 61 20 2a 70 44 61 74 61 3b 0a 0a 20 20 70 44 61  a *pData;..  pDa
8070: 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
8080: 64 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54  d(p, FTS5_STRUCT
8090: 55 52 45 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66  URE_ROWID);.  if
80a0: 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
80b0: 20 30 3b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 44   0;.  /* TODO: D
80c0: 6f 20 77 65 20 6e 65 65 64 20 74 68 69 73 20 69  o we need this i
80d0: 66 20 74 68 65 20 6c 65 61 66 2d 69 6e 64 65 78  f the leaf-index
80e0: 20 69 73 20 61 70 70 65 6e 64 65 64 3f 20 50 72   is appended? Pr
80f0: 6f 62 61 62 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 6d  obably... */.  m
8100: 65 6d 73 65 74 28 26 70 44 61 74 61 2d 3e 70 5b  emset(&pData->p[
8110: 70 44 61 74 61 2d 3e 6e 6e 5d 2c 20 30 2c 20 46  pData->nn], 0, F
8120: 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
8130: 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 66 74 73  );.  p->rc = fts
8140: 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65  5StructureDecode
8150: 28 70 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61  (pData->p, pData
8160: 2d 3e 6e 6e 2c 20 26 69 43 6f 6f 6b 69 65 2c 20  ->nn, &iCookie, 
8170: 26 70 52 65 74 29 3b 0a 20 20 69 66 28 20 70 2d  &pRet);.  if( p-
8180: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
8190: 26 20 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b  & pConfig->iCook
81a0: 69 65 21 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20  ie!=iCookie ){. 
81b0: 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
81c0: 65 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64  e3Fts5ConfigLoad
81d0: 28 70 43 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69  (pConfig, iCooki
81e0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44  e);.  }..  fts5D
81f0: 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61  ataRelease(pData
8200: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  );.  if( p->rc!=
8210: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8220: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
8230: 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20  lease(pRet);.   
8240: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20   pRet = 0;.  }. 
8250: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
8260: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
8270: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
8280: 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e  f segments in in
8290: 64 65 78 20 73 74 72 75 63 74 75 72 65 20 70 53  dex structure pS
82a0: 74 72 75 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66  truct. This.** f
82b0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
82c0: 65 76 65 72 20 75 73 65 64 20 61 73 20 70 61 72  ever used as par
82d0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 63 6f  t of assert() co
82e0: 6e 64 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66  nditions..*/.#if
82f0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
8300: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
8310: 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65  StructureCountSe
8320: 67 6d 65 6e 74 73 28 46 74 73 35 53 74 72 75 63  gments(Fts5Struc
8330: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
8340: 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d    int nSegment =
8350: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8360: 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
8370: 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f  r of segments */
8380: 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29  .  if( pStruct )
8390: 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20  {.    int iLvl; 
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83b0: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
83c0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c  terate through l
83d0: 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 66 6f 72  evels */.    for
83e0: 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
83f0: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
8400: 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 53  Lvl++){.      nS
8410: 65 67 6d 65 6e 74 20 2b 3d 20 70 53 74 72 75 63  egment += pStruc
8420: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
8430: 6e 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nSeg;.    }.  }.
8440: 0a 20 20 72 65 74 75 72 6e 20 6e 53 65 67 6d 65  .  return nSegme
8450: 6e 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64  nt;.}.#endif..#d
8460: 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72  efine fts5Buffer
8470: 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70  SafeAppendBlob(p
8480: 42 75 66 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f  Buf, pBlob, nBlo
8490: 62 29 20 7b 20 20 20 20 20 5c 0a 20 20 61 73 73  b) {     \.  ass
84a0: 65 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 53 70  ert( (pBuf)->nSp
84b0: 61 63 65 3e 3d 28 28 70 42 75 66 29 2d 3e 6e 2b  ace>=((pBuf)->n+
84c0: 6e 42 6c 6f 62 29 20 29 3b 20 20 20 20 20 20 20  nBlob) );       
84d0: 20 20 20 20 20 20 5c 0a 20 20 6d 65 6d 63 70 79        \.  memcpy
84e0: 28 26 28 70 42 75 66 29 2d 3e 70 5b 28 70 42 75  (&(pBuf)->p[(pBu
84f0: 66 29 2d 3e 6e 5d 2c 20 70 42 6c 6f 62 2c 20 6e  f)->n], pBlob, n
8500: 42 6c 6f 62 29 3b 20 20 20 20 20 20 20 20 20 20  Blob);          
8510: 20 20 20 5c 0a 20 20 28 70 42 75 66 29 2d 3e 6e     \.  (pBuf)->n
8520: 20 2b 3d 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20   += nBlob;      
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74 73  \.}..#define fts
8560: 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
8570: 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69 56  dVarint(pBuf, iV
8580: 61 6c 29 20 7b 20 20 20 20 20 20 20 20 20 20 20  al) {           
8590: 20 20 20 20 20 5c 0a 20 20 28 70 42 75 66 29 2d       \.  (pBuf)-
85a0: 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  >n += sqlite3Fts
85b0: 35 50 75 74 56 61 72 69 6e 74 28 26 28 70 42 75  5PutVarint(&(pBu
85c0: 66 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e 5d  f)->p[(pBuf)->n]
85d0: 2c 20 28 69 56 61 6c 29 29 3b 20 20 5c 0a 20 20  , (iVal));  \.  
85e0: 61 73 73 65 72 74 28 20 28 70 42 75 66 29 2d 3e  assert( (pBuf)->
85f0: 6e 53 70 61 63 65 3e 3d 28 70 42 75 66 29 2d 3e  nSpace>=(pBuf)->
8600: 6e 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  n );            
8610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
8620: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 72 69 61 6c  }.../*.** Serial
8630: 69 7a 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ize and store th
8640: 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65  e "structure" re
8650: 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  cord..**.** If a
8660: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
8670: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63  leave an error c
8680: 6f 64 65 20 69 6e 20 74 68 65 20 46 74 73 35 49  ode in the Fts5I
8690: 6e 64 65 78 20 6f 62 6a 65 63 74 2e 20 49 66 20  ndex object. If 
86a0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 68 61 73 20  an.** error has 
86b0: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
86c0: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
86d0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
86e0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
86f0: 74 72 75 63 74 75 72 65 57 72 69 74 65 28 46 74  tructureWrite(Ft
8700: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
8710: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
8720: 63 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ct){.  if( p->rc
8730: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8740: 20 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75     Fts5Buffer bu
8750: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
8760: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 73 65   /* Buffer to se
8770: 72 69 61 6c 69 7a 65 20 72 65 63 6f 72 64 20 69  rialize record i
8780: 6e 74 6f 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  nto */.    int i
8790: 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Lvl;            
87a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
87b0: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
87c0: 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20  ugh levels */.  
87d0: 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20    int iCookie;  
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87f0: 2f 2a 20 43 6f 6f 6b 69 65 20 76 61 6c 75 65 20  /* Cookie value 
8800: 74 6f 20 73 74 6f 72 65 20 2a 2f 0a 0a 20 20 20  to store */..   
8810: 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74   assert( pStruct
8820: 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35  ->nSegment==fts5
8830: 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65  StructureCountSe
8840: 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29 20  gments(pStruct) 
8850: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 62  );.    memset(&b
8860: 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  uf, 0, sizeof(Ft
8870: 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20  s5Buffer));..   
8880: 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 63   /* Append the c
8890: 75 72 72 65 6e 74 20 63 6f 6e 66 69 67 75 72 61  urrent configura
88a0: 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20  tion cookie */. 
88b0: 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 2d 3e     iCookie = p->
88c0: 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65  pConfig->iCookie
88d0: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6f 6b 69  ;.    if( iCooki
88e0: 65 3c 30 20 29 20 69 43 6f 6f 6b 69 65 20 3d 20  e<0 ) iCookie = 
88f0: 30 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 73  0;..    if( 0==s
8900: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
8910: 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 62 75  Size(&p->rc, &bu
8920: 66 2c 20 34 2b 39 2b 39 2b 39 29 20 29 7b 0a 20  f, 4+9+9+9) ){. 
8930: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
8940: 50 75 74 33 32 28 62 75 66 2e 70 2c 20 69 43 6f  Put32(buf.p, iCo
8950: 6f 6b 69 65 29 3b 0a 20 20 20 20 20 20 62 75 66  okie);.      buf
8960: 2e 6e 20 3d 20 34 3b 0a 20 20 20 20 20 20 66 74  .n = 4;.      ft
8970: 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
8980: 6e 64 56 61 72 69 6e 74 28 26 62 75 66 2c 20 70  ndVarint(&buf, p
8990: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b  Struct->nLevel);
89a0: 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
89b0: 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
89c0: 74 28 26 62 75 66 2c 20 70 53 74 72 75 63 74 2d  t(&buf, pStruct-
89d0: 3e 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20  >nSegment);.    
89e0: 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
89f0: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62 75  AppendVarint(&bu
8a00: 66 2c 20 28 69 36 34 29 70 53 74 72 75 63 74 2d  f, (i64)pStruct-
8a10: 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29 3b  >nWriteCounter);
8a20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
8a30: 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
8a40: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
8a50: 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  vl++){.      int
8a60: 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   iSeg;          
8a70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
8a80: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
8a90: 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a  rough segments *
8aa0: 2f 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  /.      Fts5Stru
8ab0: 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
8ac0: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
8ad0: 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20  vel[iLvl];.     
8ae0: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
8af0: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
8b00: 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72  &buf, pLvl->nMer
8b10: 67 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  ge);.      fts5B
8b20: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
8b30: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
8b40: 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a 20 20 20  pLvl->nSeg);.   
8b50: 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d     assert( pLvl-
8b60: 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e  >nMerge<=pLvl->n
8b70: 53 65 67 20 29 3b 0a 0a 20 20 20 20 20 20 66 6f  Seg );..      fo
8b80: 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70  r(iSeg=0; iSeg<p
8b90: 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b  Lvl->nSeg; iSeg+
8ba0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  +){.        fts5
8bb0: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
8bc0: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
8bd0: 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67   pLvl->aSeg[iSeg
8be0: 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20  ].iSegid);.     
8bf0: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
8c00: 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
8c10: 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53  , &buf, pLvl->aS
8c20: 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72  eg[iSeg].pgnoFir
8c30: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  st);.        fts
8c40: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
8c50: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
8c60: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
8c70: 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20  g].pgnoLast);.  
8c80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
8c90: 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
8ca0: 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45  , FTS5_STRUCTURE
8cb0: 5f 52 4f 57 49 44 2c 20 62 75 66 2e 70 2c 20 62  _ROWID, buf.p, b
8cc0: 75 66 2e 6e 29 3b 0a 20 20 20 20 66 74 73 35 42  uf.n);.    fts5B
8cd0: 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b  ufferFree(&buf);
8ce0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73 74  .  }.}..#if 0.st
8cf0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
8d00: 62 75 67 53 74 72 75 63 74 75 72 65 28 69 6e 74  bugStructure(int
8d10: 2a 2c 46 74 73 35 42 75 66 66 65 72 2a 2c 46 74  *,Fts5Buffer*,Ft
8d20: 73 35 53 74 72 75 63 74 75 72 65 2a 29 3b 0a 73  s5Structure*);.s
8d30: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50  tatic void fts5P
8d40: 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 63 6f  rintStructure(co
8d50: 6e 73 74 20 63 68 61 72 20 2a 7a 43 61 70 74 69  nst char *zCapti
8d60: 6f 6e 2c 20 46 74 73 35 53 74 72 75 63 74 75 72  on, Fts5Structur
8d70: 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
8d80: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
8d90: 4b 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  K;.  Fts5Buffer 
8da0: 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62  buf;.  memset(&b
8db0: 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62 75  uf, 0, sizeof(bu
8dc0: 66 29 29 3b 0a 20 20 66 74 73 35 44 65 62 75 67  f));.  fts5Debug
8dd0: 53 74 72 75 63 74 75 72 65 28 26 72 63 2c 20 26  Structure(&rc, &
8de0: 62 75 66 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  buf, pStruct);. 
8df0: 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c   fprintf(stdout,
8e00: 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20 7a 43 61   "%s: %s\n", zCa
8e10: 70 74 69 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a 20  ption, buf.p);. 
8e20: 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
8e30: 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
8e40: 65 28 26 62 75 66 29 3b 0a 7d 0a 23 65 6c 73 65  e(&buf);.}.#else
8e50: 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 50 72  .# define fts5Pr
8e60: 69 6e 74 53 74 72 75 63 74 75 72 65 28 78 2c 79  intStructure(x,y
8e70: 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63  ).#endif..static
8e80: 20 69 6e 74 20 66 74 73 35 53 65 67 6d 65 6e 74   int fts5Segment
8e90: 53 69 7a 65 28 46 74 73 35 53 74 72 75 63 74 75  Size(Fts5Structu
8ea0: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 29  reSegment *pSeg)
8eb0: 7b 0a 20 20 72 65 74 75 72 6e 20 31 20 2b 20 70  {.  return 1 + p
8ec0: 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20  Seg->pgnoLast - 
8ed0: 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b  pSeg->pgnoFirst;
8ee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
8ef0: 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 64 65 78   a copy of index
8f00: 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
8f10: 63 74 2e 20 45 78 63 65 70 74 2c 20 70 72 6f 6d  ct. Except, prom
8f20: 6f 74 65 20 61 73 20 6d 61 6e 79 20 0a 2a 2a 20  ote as many .** 
8f30: 73 65 67 6d 65 6e 74 73 20 61 73 20 70 6f 73 73  segments as poss
8f40: 69 62 6c 65 20 74 6f 20 6c 65 76 65 6c 20 69 50  ible to level iP
8f50: 72 6f 6d 6f 74 65 2e 20 49 66 20 61 6e 20 4f 4f  romote. If an OO
8f60: 4d 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  M occurs, NULL i
8f70: 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  s .** returned..
8f80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
8f90: 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d  ts5StructureProm
8fa0: 6f 74 65 54 6f 28 0a 20 20 46 74 73 35 49 6e 64  oteTo(.  Fts5Ind
8fb0: 65 78 20 2a 70 2c 0a 20 20 69 6e 74 20 69 50 72  ex *p,.  int iPr
8fc0: 6f 6d 6f 74 65 2c 0a 20 20 69 6e 74 20 73 7a 50  omote,.  int szP
8fd0: 72 6f 6d 6f 74 65 2c 0a 20 20 46 74 73 35 53 74  romote,.  Fts5St
8fe0: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
8ff0: 0a 29 7b 0a 20 20 69 6e 74 20 69 6c 2c 20 69 73  .){.  int il, is
9000: 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
9010: 65 4c 65 76 65 6c 20 2a 70 4f 75 74 20 3d 20 26  eLevel *pOut = &
9020: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
9030: 69 50 72 6f 6d 6f 74 65 5d 3b 0a 0a 20 20 69 66  iPromote];..  if
9040: 28 20 70 4f 75 74 2d 3e 6e 4d 65 72 67 65 3d 3d  ( pOut->nMerge==
9050: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 6c 3d  0 ){.    for(il=
9060: 69 50 72 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c 70  iPromote+1; il<p
9070: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
9080: 69 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73  il++){.      Fts
9090: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
90a0: 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74  *pLvl = &pStruct
90b0: 2d 3e 61 4c 65 76 65 6c 5b 69 6c 5d 3b 0a 20 20  ->aLevel[il];.  
90c0: 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d      if( pLvl->nM
90d0: 65 72 67 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  erge ) return;. 
90e0: 20 20 20 20 20 66 6f 72 28 69 73 3d 70 4c 76 6c       for(is=pLvl
90f0: 2d 3e 6e 53 65 67 2d 31 3b 20 69 73 3e 3d 30 3b  ->nSeg-1; is>=0;
9100: 20 69 73 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20   is--){.        
9110: 69 6e 74 20 73 7a 20 3d 20 66 74 73 35 53 65 67  int sz = fts5Seg
9120: 6d 65 6e 74 53 69 7a 65 28 26 70 4c 76 6c 2d 3e  mentSize(&pLvl->
9130: 61 53 65 67 5b 69 73 5d 29 3b 0a 20 20 20 20 20  aSeg[is]);.     
9140: 20 20 20 69 66 28 20 73 7a 3e 73 7a 50 72 6f 6d     if( sz>szProm
9150: 6f 74 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ote ) return;.  
9160: 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
9170: 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26  ureExtendLevel(&
9180: 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20  p->rc, pStruct, 
9190: 69 50 72 6f 6d 6f 74 65 2c 20 31 2c 20 31 29 3b  iPromote, 1, 1);
91a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
91b0: 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  rc ) return;.   
91c0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75 74       memcpy(pOut
91d0: 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61  ->aSeg, &pLvl->a
91e0: 53 65 67 5b 69 73 5d 2c 20 73 69 7a 65 6f 66 28  Seg[is], sizeof(
91f0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
9200: 6d 65 6e 74 29 29 3b 0a 20 20 20 20 20 20 20 20  ment));.        
9210: 70 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20  pOut->nSeg++;.  
9220: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67        pLvl->nSeg
9230: 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
9240: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
9250: 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 68 61 73   new segment has
9260: 20 6a 75 73 74 20 62 65 65 6e 20 77 72 69 74 74   just been writt
9270: 65 6e 20 74 6f 20 6c 65 76 65 6c 20 69 4c 76 6c  en to level iLvl
9280: 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75 63 74   of index struct
9290: 75 72 65 0a 2a 2a 20 70 53 74 72 75 63 74 2e 20  ure.** pStruct. 
92a0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
92b0: 74 65 72 6d 69 6e 65 73 20 69 66 20 61 6e 79 20  termines if any 
92c0: 73 65 67 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  segments should 
92d0: 62 65 20 70 72 6f 6d 6f 74 65 64 0a 2a 2a 20 61  be promoted.** a
92e0: 73 20 61 20 72 65 73 75 6c 74 2e 20 53 65 67 6d  s a result. Segm
92f0: 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74 65  ents are promote
9300: 64 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69  d in two scenari
9310: 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 49  os:.**.**   a) I
9320: 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6a 75  f the segment ju
9330: 73 74 20 77 72 69 74 74 65 6e 20 69 73 20 73 6d  st written is sm
9340: 61 6c 6c 65 72 20 74 68 61 6e 20 6f 6e 65 20 6f  aller than one o
9350: 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 0a  r more segments.
9360: 2a 2a 20 20 20 20 20 20 77 69 74 68 69 6e 20 74  **      within t
9370: 68 65 20 70 72 65 76 69 6f 75 73 20 70 6f 70 75  he previous popu
9380: 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 69 74 20  lated level, it 
9390: 69 73 20 70 72 6f 6d 6f 74 65 64 20 74 6f 20 74  is promoted to t
93a0: 68 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 20  he previous.**  
93b0: 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 6c 65      populated le
93c0: 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20  vel..**.**   b) 
93d0: 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6a  If the segment j
93e0: 75 73 74 20 77 72 69 74 74 65 6e 20 69 73 20 6c  ust written is l
93f0: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6e  arger than the n
9400: 65 77 65 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e  ewest segment on
9410: 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 6e 65 78  .**      the nex
9420: 74 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65  t populated leve
9430: 6c 2c 20 74 68 65 6e 20 74 68 61 74 20 73 65 67  l, then that seg
9440: 6d 65 6e 74 2c 20 61 6e 64 20 61 6e 79 20 6f 74  ment, and any ot
9450: 68 65 72 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20  her adjacent.** 
9460: 20 20 20 20 20 73 65 67 6d 65 6e 74 73 20 74 68       segments th
9470: 61 74 20 61 72 65 20 61 6c 73 6f 20 73 6d 61 6c  at are also smal
9480: 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65  ler than the one
9490: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 61   just written, a
94a0: 72 65 20 0a 2a 2a 20 20 20 20 20 20 70 72 6f 6d  re .**      prom
94b0: 6f 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  oted. .**.** If 
94c0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d  one or more segm
94d0: 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74 65  ents are promote
94e0: 64 2c 20 74 68 65 20 73 74 72 75 63 74 75 72 65  d, the structure
94f0: 20 6f 62 6a 65 63 74 20 69 73 20 75 70 64 61 74   object is updat
9500: 65 64 0a 2a 2a 20 74 6f 20 72 65 66 6c 65 63 74  ed.** to reflect
9510: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
9520: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
9530: 75 72 65 50 72 6f 6d 6f 74 65 28 0a 20 20 46 74  urePromote(.  Ft
9540: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
9550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9560: 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
9570: 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ject */.  int iL
9580: 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  vl,             
9590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
95a0: 65 78 20 6c 65 76 65 6c 20 6a 75 73 74 20 75 70  ex level just up
95b0: 64 61 74 65 64 20 2a 2f 0a 20 20 46 74 73 35 53  dated */.  Fts5S
95c0: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
95d0: 74 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  t          /* In
95e0: 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f  dex structure */
95f0: 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  .){.  if( p->rc=
9600: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9610: 20 20 69 6e 74 20 69 54 73 74 3b 0a 20 20 20 20    int iTst;.    
9620: 69 6e 74 20 69 50 72 6f 6d 6f 74 65 20 3d 20 2d  int iPromote = -
9630: 31 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 72 6f  1;.    int szPro
9640: 6d 6f 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20  mote = 0;       
9650: 20 20 20 20 20 2f 2a 20 50 72 6f 6d 6f 74 65 20       /* Promote 
9660: 61 6e 79 74 68 69 6e 67 20 74 68 69 73 20 73 69  anything this si
9670: 7a 65 20 6f 72 20 73 6d 61 6c 6c 65 72 20 2a 2f  ze or smaller */
9680: 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
9690: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b  reSegment *pSeg;
96a0: 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 6a 75     /* Segment ju
96b0: 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  st written */.  
96c0: 20 20 69 6e 74 20 73 7a 53 65 67 3b 20 20 20 20    int szSeg;    
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96e0: 2f 2a 20 53 69 7a 65 20 6f 66 20 73 65 67 6d 65  /* Size of segme
96f0: 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  nt just written 
9700: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 67 20  */.    int nSeg 
9710: 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  = pStruct->aLeve
9720: 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 0a 20  l[iLvl].nSeg;.. 
9730: 20 20 20 69 66 28 20 6e 53 65 67 3d 3d 30 20 29     if( nSeg==0 )
9740: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 53 65   return;.    pSe
9750: 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  g = &pStruct->aL
9760: 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b  evel[iLvl].aSeg[
9770: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
9780: 69 4c 76 6c 5d 2e 6e 53 65 67 2d 31 5d 3b 0a 20  iLvl].nSeg-1];. 
9790: 20 20 20 73 7a 53 65 67 20 3d 20 28 31 20 2b 20     szSeg = (1 + 
97a0: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d  pSeg->pgnoLast -
97b0: 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
97c0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
97d0: 20 66 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 28   for condition (
97e0: 61 29 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 54  a) */.    for(iT
97f0: 73 74 3d 69 4c 76 6c 2d 31 3b 20 69 54 73 74 3e  st=iLvl-1; iTst>
9800: 3d 30 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61  =0 && pStruct->a
9810: 4c 65 76 65 6c 5b 69 54 73 74 5d 2e 6e 53 65 67  Level[iTst].nSeg
9820: 3d 3d 30 3b 20 69 54 73 74 2d 2d 29 3b 0a 20 20  ==0; iTst--);.  
9830: 20 20 69 66 28 20 69 54 73 74 3e 3d 30 20 29 7b    if( iTst>=0 ){
9840: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
9850: 20 20 20 20 69 6e 74 20 73 7a 4d 61 78 20 3d 20      int szMax = 
9860: 30 3b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  0;.      Fts5Str
9870: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 54 73  uctureLevel *pTs
9880: 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  t = &pStruct->aL
9890: 65 76 65 6c 5b 69 54 73 74 5d 3b 0a 20 20 20 20  evel[iTst];.    
98a0: 20 20 61 73 73 65 72 74 28 20 70 54 73 74 2d 3e    assert( pTst->
98b0: 6e 4d 65 72 67 65 3d 3d 30 20 29 3b 0a 20 20 20  nMerge==0 );.   
98c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
98d0: 73 74 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a  st->nSeg; i++){.
98e0: 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d          int sz =
98f0: 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70   pTst->aSeg[i].p
9900: 67 6e 6f 4c 61 73 74 20 2d 20 70 54 73 74 2d 3e  gnoLast - pTst->
9910: 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 46 69 72 73  aSeg[i].pgnoFirs
9920: 74 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 69  t + 1;.        i
9930: 66 28 20 73 7a 3e 73 7a 4d 61 78 20 29 20 73 7a  f( sz>szMax ) sz
9940: 4d 61 78 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  Max = sz;.      
9950: 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 61  }.      if( szMa
9960: 78 3e 3d 73 7a 53 65 67 20 29 7b 0a 20 20 20 20  x>=szSeg ){.    
9970: 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e      /* Condition
9980: 20 28 61 29 20 69 73 20 74 72 75 65 2e 20 50 72   (a) is true. Pr
9990: 6f 6d 6f 74 65 20 74 68 65 20 6e 65 77 65 73 74  omote the newest
99a0: 20 73 65 67 6d 65 6e 74 20 6f 6e 20 6c 65 76 65   segment on leve
99b0: 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 4c  l .        ** iL
99c0: 76 6c 20 74 6f 20 6c 65 76 65 6c 20 69 54 73 74  vl to level iTst
99d0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 50  .  */.        iP
99e0: 72 6f 6d 6f 74 65 20 3d 20 69 54 73 74 3b 0a 20  romote = iTst;. 
99f0: 20 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65         szPromote
9a00: 20 3d 20 73 7a 4d 61 78 3b 0a 20 20 20 20 20 20   = szMax;.      
9a10: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
9a20: 49 66 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29  If condition (a)
9a30: 20 69 73 20 6e 6f 74 20 6d 65 74 2c 20 61 73 73   is not met, ass
9a40: 75 6d 65 20 28 62 29 20 69 73 20 74 72 75 65 2e  ume (b) is true.
9a50: 20 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74   StructurePromot
9a60: 65 54 6f 28 29 0a 20 20 20 20 2a 2a 20 69 73 20  eTo().    ** is 
9a70: 61 20 6e 6f 2d 6f 70 20 69 66 20 69 74 20 69 73  a no-op if it is
9a80: 20 6e 6f 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66   not.  */.    if
9a90: 28 20 69 50 72 6f 6d 6f 74 65 3c 30 20 29 7b 0a  ( iPromote<0 ){.
9aa0: 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d        iPromote =
9ab0: 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 73 7a 50   iLvl;.      szP
9ac0: 72 6f 6d 6f 74 65 20 3d 20 73 7a 53 65 67 3b 0a  romote = szSeg;.
9ad0: 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74      }.    fts5St
9ae0: 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f  ructurePromoteTo
9af0: 28 70 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 73 7a  (p, iPromote, sz
9b00: 50 72 6f 6d 6f 74 65 2c 20 70 53 74 72 75 63 74  Promote, pStruct
9b10: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
9b20: 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65   Advance the ite
9b30: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
9b40: 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
9b50: 74 2e 20 49 66 20 74 68 65 20 65 6e 64 20 6f 66  t. If the end of
9b60: 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73 74   the .** doclist
9b70: 2d 69 6e 64 65 78 20 70 61 67 65 20 69 73 20 72  -index page is r
9b80: 65 61 63 68 65 64 2c 20 72 65 74 75 72 6e 20 6e  eached, return n
9b90: 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  on-zero..*/.stat
9ba0: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
9bb0: 4c 76 6c 4e 65 78 74 28 46 74 73 35 44 6c 69 64  LvlNext(Fts5Dlid
9bc0: 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20 46  xLvl *pLvl){.  F
9bd0: 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 20 3d  ts5Data *pData =
9be0: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 3b 0a 0a 20   pLvl->pData;.. 
9bf0: 20 69 66 28 20 70 4c 76 6c 2d 3e 69 4f 66 66 3d   if( pLvl->iOff=
9c00: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
9c10: 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20  ( pLvl->bEof==0 
9c20: 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66  );.    pLvl->iOf
9c30: 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c 76 6c 2d  f = 1;.    pLvl-
9c40: 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74  >iOff += fts5Get
9c50: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 2d  Varint32(&pData-
9c60: 3e 70 5b 31 5d 2c 20 70 4c 76 6c 2d 3e 69 4c 65  >p[1], pLvl->iLe
9c70: 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 76  afPgno);.    pLv
9c80: 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47  l->iOff += fts5G
9c90: 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d  etVarint(&pData-
9ca0: 3e 70 5b 70 4c 76 6c 2d 3e 69 4f 66 66 5d 2c 20  >p[pLvl->iOff], 
9cb0: 28 75 36 34 2a 29 26 70 4c 76 6c 2d 3e 69 52 6f  (u64*)&pLvl->iRo
9cc0: 77 69 64 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  wid);.    pLvl->
9cd0: 69 46 69 72 73 74 4f 66 66 20 3d 20 70 4c 76 6c  iFirstOff = pLvl
9ce0: 2d 3e 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65 7b  ->iOff;.  }else{
9cf0: 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20  .    int iOff;. 
9d00: 20 20 20 66 6f 72 28 69 4f 66 66 3d 70 4c 76 6c     for(iOff=pLvl
9d10: 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70 44 61  ->iOff; iOff<pDa
9d20: 74 61 2d 3e 6e 6e 3b 20 69 4f 66 66 2b 2b 29 7b  ta->nn; iOff++){
9d30: 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61  .      if( pData
9d40: 2d 3e 70 5b 69 4f 66 66 5d 20 29 20 62 72 65 61  ->p[iOff] ) brea
9d50: 6b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  k; .    }..    i
9d60: 66 28 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e  f( iOff<pData->n
9d70: 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69  n ){.      i64 i
9d80: 56 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d  Val;.      pLvl-
9d90: 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20 28 69  >iLeafPgno += (i
9da0: 4f 66 66 20 2d 20 70 4c 76 6c 2d 3e 69 4f 66 66  Off - pLvl->iOff
9db0: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 69 4f 66  ) + 1;.      iOf
9dc0: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
9dd0: 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66  nt(&pData->p[iOf
9de0: 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29  f], (u64*)&iVal)
9df0: 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69 52  ;.      pLvl->iR
9e00: 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20  owid += iVal;.  
9e10: 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d      pLvl->iOff =
9e20: 20 69 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65   iOff;.    }else
9e30: 7b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62 45  {.      pLvl->bE
9e40: 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  of = 1;.    }.  
9e50: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 76 6c  }..  return pLvl
9e60: 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->bEof;.}../*.**
9e70: 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65   Advance the ite
9e80: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
9e90: 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
9ea0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
9eb0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
9ec0: 78 74 52 28 46 74 73 35 49 6e 64 65 78 20 2a 70  xtR(Fts5Index *p
9ed0: 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  , Fts5DlidxIter 
9ee0: 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4c 76 6c  *pIter, int iLvl
9ef0: 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c 76  ){.  Fts5DlidxLv
9f00: 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72  l *pLvl = &pIter
9f10: 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20  ->aLvl[iLvl];.. 
9f20: 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 49   assert( iLvl<pI
9f30: 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69  ter->nLvl );.  i
9f40: 66 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e  f( fts5DlidxLvlN
9f50: 65 78 74 28 70 4c 76 6c 29 20 29 7b 0a 20 20 20  ext(pLvl) ){.   
9f60: 20 69 66 28 20 28 69 4c 76 6c 2b 31 29 20 3c 20   if( (iLvl+1) < 
9f70: 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20  pIter->nLvl ){. 
9f80: 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
9f90: 65 72 4e 65 78 74 52 28 70 2c 20 70 49 74 65 72  erNextR(p, pIter
9fa0: 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20 20 20  , iLvl+1);.     
9fb0: 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f   if( pLvl[1].bEo
9fc0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
9fd0: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
9fe0: 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20  pLvl->pData);.  
9ff0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c 76        memset(pLv
a000: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  l, 0, sizeof(Fts
a010: 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20  5DlidxLvl));.   
a020: 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61       pLvl->pData
a030: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
a040: 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  p, .            
a050: 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44  FTS5_DLIDX_ROWID
a060: 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  (pIter->iSegid, 
a070: 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c  iLvl, pLvl[1].iL
a080: 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20 20  eafPgno).       
a090: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
a0a0: 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 20 66 74  pLvl->pData ) ft
a0b0: 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70  s5DlidxLvlNext(p
a0c0: 4c 76 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Lvl);.      }.  
a0d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
a0e0: 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  n pIter->aLvl[0]
a0f0: 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63 20  .bEof;.}.static 
a100: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65  int fts5DlidxIte
a110: 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 20  rNext(Fts5Index 
a120: 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65  *p, Fts5DlidxIte
a130: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74  r *pIter){.  ret
a140: 75 72 6e 20 66 74 73 35 44 6c 69 64 78 49 74 65  urn fts5DlidxIte
a150: 72 4e 65 78 74 52 28 70 2c 20 70 49 74 65 72 2c  rNextR(p, pIter,
a160: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   0);.}../*.** Th
a170: 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
a180: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
a190: 72 67 75 6d 65 6e 74 20 68 61 73 20 74 68 65 20  rgument has the 
a1a0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
a1b0: 20 73 65 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f   set.** as follo
a1c0: 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ws. This functio
a1d0: 6e 20 73 65 74 73 20 75 70 20 74 68 65 20 72 65  n sets up the re
a1e0: 73 74 20 6f 66 20 74 68 65 20 69 74 65 72 61 74  st of the iterat
a1f0: 6f 72 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a  or so that it.**
a200: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
a210: 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68  irst rowid in th
a220: 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e  e doclist-index.
a230: 0a 2a 2a 0a 2a 2a 20 20 20 70 44 61 74 61 3a 0a  .**.**   pData:.
a240: 2a 2a 20 20 20 20 20 70 6f 69 6e 74 65 72 20 74  **     pointer t
a250: 6f 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  o doclist-index 
a260: 72 65 63 6f 72 64 2c 20 0a 2a 2a 0a 2a 2a 20 57  record, .**.** W
a270: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
a280: 6e 20 69 73 20 63 61 6c 6c 65 64 20 70 49 74 65  n is called pIte
a290: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 69 73 20  r->iLeafPgno is 
a2a0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
a2b0: 74 68 65 0a 2a 2a 20 64 6f 63 6c 69 73 74 20 69  the.** doclist i
a2c0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
a2d0: 68 20 28 74 68 65 20 6f 6e 65 20 66 65 61 74 75  h (the one featu
a2e0: 72 69 6e 67 20 74 68 65 20 74 65 72 6d 29 2e 0a  ring the term)..
a2f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
a300: 73 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74  s5DlidxIterFirst
a310: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
a320: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pIter){.  int i;
a330: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
a340: 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b  ter->nLvl; i++){
a350: 0a 20 20 20 20 66 74 73 35 44 6c 69 64 78 4c 76  .    fts5DlidxLv
a360: 6c 4e 65 78 74 28 26 70 49 74 65 72 2d 3e 61 4c  lNext(&pIter->aL
a370: 76 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65  vl[i]);.  }.  re
a380: 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c  turn pIter->aLvl
a390: 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 0a 73 74  [0].bEof;.}...st
a3a0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
a3b0: 64 78 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e  dxIterEof(Fts5In
a3c0: 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64  dex *p, Fts5Dlid
a3d0: 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
a3e0: 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 21 3d 53   return p->rc!=S
a3f0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65  QLITE_OK || pIte
a400: 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b  r->aLvl[0].bEof;
a410: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
a420: 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61 73  fts5DlidxIterLas
a430: 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  t(Fts5Index *p, 
a440: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
a450: 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Iter){.  int i;.
a460: 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 65 61  .  /* Advance ea
a470: 63 68 20 6c 65 76 65 6c 20 74 6f 20 74 68 65 20  ch level to the 
a480: 6c 61 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68  last entry on th
a490: 65 20 6c 61 73 74 20 70 61 67 65 20 2a 2f 0a 20  e last page */. 
a4a0: 20 66 6f 72 28 69 3d 70 49 74 65 72 2d 3e 6e 4c   for(i=pIter->nL
a4b0: 76 6c 2d 31 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c  vl-1; p->rc==SQL
a4c0: 49 54 45 5f 4f 4b 20 26 26 20 69 3e 3d 30 3b 20  ITE_OK && i>=0; 
a4d0: 69 2d 2d 29 7b 0a 20 20 20 20 46 74 73 35 44 6c  i--){.    Fts5Dl
a4e0: 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26  idxLvl *pLvl = &
a4f0: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a  pIter->aLvl[i];.
a500: 20 20 20 20 77 68 69 6c 65 28 20 66 74 73 35 44      while( fts5D
a510: 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c  lidxLvlNext(pLvl
a520: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76 6c  )==0 );.    pLvl
a530: 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 0a 20 20 20  ->bEof = 0;..   
a540: 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20   if( i>0 ){.    
a550: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a    Fts5DlidxLvl *
a560: 70 43 68 69 6c 64 20 3d 20 26 70 4c 76 6c 5b 2d  pChild = &pLvl[-
a570: 31 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61  1];.      fts5Da
a580: 74 61 52 65 6c 65 61 73 65 28 70 43 68 69 6c 64  taRelease(pChild
a590: 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->pData);.      
a5a0: 6d 65 6d 73 65 74 28 70 43 68 69 6c 64 2c 20 30  memset(pChild, 0
a5b0: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  , sizeof(Fts5Dli
a5c0: 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 70  dxLvl));.      p
a5d0: 43 68 69 6c 64 2d 3e 70 44 61 74 61 20 3d 20 66  Child->pData = f
a5e0: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a  ts5DataRead(p, .
a5f0: 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44            FTS5_D
a600: 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65 72  LIDX_ROWID(pIter
a610: 2d 3e 69 53 65 67 69 64 2c 20 69 2d 31 2c 20 70  ->iSegid, i-1, p
a620: 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a  Lvl->iLeafPgno).
a630: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
a640: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65   }.}../*.** Move
a650: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
a660: 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
a670: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
a680: 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 2e   previous entry.
a690: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
a6a0: 74 73 35 44 6c 69 64 78 4c 76 6c 50 72 65 76 28  ts5DlidxLvlPrev(
a6b0: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c  Fts5DlidxLvl *pL
a6c0: 76 6c 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20  vl){.  int iOff 
a6d0: 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 0a 20  = pLvl->iOff;.. 
a6e0: 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 62   assert( pLvl->b
a6f0: 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Eof==0 );.  if( 
a700: 69 4f 66 66 3c 3d 70 4c 76 6c 2d 3e 69 46 69 72  iOff<=pLvl->iFir
a710: 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 70 4c 76  stOff ){.    pLv
a720: 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d  l->bEof = 1;.  }
a730: 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a 61 20  else{.    u8 *a 
a740: 3d 20 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70  = pLvl->pData->p
a750: 3b 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a  ;.    i64 iVal;.
a760: 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a      int iLimit;.
a770: 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
a780: 69 6e 74 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 0a  int nZero = 0;..
a790: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79      /* Currently
a7a0: 20 69 4f 66 66 20 70 6f 69 6e 74 73 20 74 6f 20   iOff points to 
a7b0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
a7c0: 66 20 61 20 76 61 72 69 6e 74 2e 20 54 68 69 73  f a varint. This
a7d0: 20 62 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 64   block .    ** d
a7e0: 65 63 72 65 6d 65 6e 74 73 20 69 4f 66 66 20 75  ecrements iOff u
a7f0: 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74  ntil it points t
a800: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
a810: 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73   of the previous
a820: 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e   .    ** varint.
a830: 20 54 61 6b 69 6e 67 20 63 61 72 65 20 6e 6f 74   Taking care not
a840: 20 74 6f 20 72 65 61 64 20 61 6e 79 20 6d 65 6d   to read any mem
a850: 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 74 68  ory locations th
a860: 61 74 20 6f 63 63 75 72 0a 20 20 20 20 2a 2a 20  at occur.    ** 
a870: 62 65 66 6f 72 65 20 74 68 65 20 62 75 66 66 65  before the buffe
a880: 72 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 2a 2f  r in memory.  */
a890: 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 28 69  .    iLimit = (i
a8a0: 4f 66 66 3e 39 20 3f 20 69 4f 66 66 2d 39 20 3a  Off>9 ? iOff-9 :
a8b0: 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66   0);.    for(iOf
a8c0: 66 2d 2d 3b 20 69 4f 66 66 3e 69 4c 69 6d 69 74  f--; iOff>iLimit
a8d0: 3b 20 69 4f 66 66 2d 2d 29 7b 0a 20 20 20 20 20  ; iOff--){.     
a8e0: 20 69 66 28 20 28 61 5b 69 4f 66 66 2d 31 5d 20   if( (a[iOff-1] 
a8f0: 26 20 30 78 38 30 29 3d 3d 30 20 29 20 62 72 65  & 0x80)==0 ) bre
a900: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  ak;.    }..    f
a910: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b  ts5GetVarint(&a[
a920: 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56  iOff], (u64*)&iV
a930: 61 6c 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69  al);.    pLvl->i
a940: 52 6f 77 69 64 20 2d 3d 20 69 56 61 6c 3b 0a 20  Rowid -= iVal;. 
a950: 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67     pLvl->iLeafPg
a960: 6e 6f 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b  no--;..    /* Sk
a970: 69 70 20 62 61 63 6b 77 61 72 64 73 20 70 61 73  ip backwards pas
a980: 74 20 61 6e 79 20 30 78 30 30 20 76 61 72 69 6e  t any 0x00 varin
a990: 74 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ts. */.    for(i
a9a0: 69 3d 69 4f 66 66 2d 31 3b 20 69 69 3e 3d 70 4c  i=iOff-1; ii>=pL
a9b0: 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 26 26  vl->iFirstOff &&
a9c0: 20 61 5b 69 69 5d 3d 3d 30 78 30 30 3b 20 69 69   a[ii]==0x00; ii
a9d0: 2d 2d 29 7b 0a 20 20 20 20 20 20 6e 5a 65 72 6f  --){.      nZero
a9e0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
a9f0: 28 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72  ( ii>=pLvl->iFir
aa00: 73 74 4f 66 66 20 26 26 20 28 61 5b 69 69 5d 20  stOff && (a[ii] 
aa10: 26 20 30 78 38 30 29 20 29 7b 0a 20 20 20 20 20  & 0x80) ){.     
aa20: 20 2f 2a 20 54 68 65 20 62 79 74 65 20 69 6d 6d   /* The byte imm
aa30: 65 64 69 61 74 65 6c 79 20 62 65 66 6f 72 65 20  ediately before 
aa40: 74 68 65 20 6c 61 73 74 20 30 78 30 30 20 62 79  the last 0x00 by
aa50: 74 65 20 68 61 73 20 74 68 65 20 30 78 38 30 20  te has the 0x80 
aa60: 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  bit.      ** set
aa70: 2e 20 53 6f 20 74 68 65 20 6c 61 73 74 20 30 78  . So the last 0x
aa80: 30 30 20 69 73 20 6f 6e 6c 79 20 61 20 76 61 72  00 is only a var
aa90: 69 6e 74 20 30 20 69 66 20 74 68 65 72 65 20 61  int 0 if there a
aaa0: 72 65 20 38 20 6d 6f 72 65 20 30 78 38 30 0a 20  re 8 more 0x80. 
aab0: 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 62 65       ** bytes be
aac0: 66 6f 72 65 20 61 5b 69 69 5d 2e 20 2a 2f 0a 20  fore a[ii]. */. 
aad0: 20 20 20 20 20 69 6e 74 20 62 5a 65 72 6f 20 3d       int bZero =
aae0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
aaf0: 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 61 73 74   /* True if last
ab00: 20 30 78 30 30 20 63 6f 75 6e 74 73 20 2a 2f 0a   0x00 counts */.
ab10: 20 20 20 20 20 20 69 66 28 20 28 69 69 2d 38 29        if( (ii-8)
ab20: 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66  >=pLvl->iFirstOf
ab30: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  f ){.        int
ab40: 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   j;.        for(
ab50: 6a 3d 31 3b 20 6a 3c 3d 38 20 26 26 20 28 61 5b  j=1; j<=8 && (a[
ab60: 69 69 2d 6a 5d 20 26 20 30 78 38 30 29 3b 20 6a  ii-j] & 0x80); j
ab70: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 62 5a 65  ++);.        bZe
ab80: 72 6f 20 3d 20 28 6a 3e 38 29 3b 0a 20 20 20 20  ro = (j>8);.    
ab90: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62 5a    }.      if( bZ
aba0: 65 72 6f 3d 3d 30 20 29 20 6e 5a 65 72 6f 2d 2d  ero==0 ) nZero--
abb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 76 6c  ;.    }.    pLvl
abc0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2d 3d 20 6e  ->iLeafPgno -= n
abd0: 5a 65 72 6f 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  Zero;.    pLvl->
abe0: 69 4f 66 66 20 3d 20 69 4f 66 66 20 2d 20 6e 5a  iOff = iOff - nZ
abf0: 65 72 6f 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ero;.  }..  retu
ac00: 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d  rn pLvl->bEof;.}
ac10: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
ac20: 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 52 28  5DlidxIterPrevR(
ac30: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
ac40: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
ac50: 65 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20  er, int iLvl){. 
ac60: 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70   Fts5DlidxLvl *p
ac70: 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c  Lvl = &pIter->aL
ac80: 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73  vl[iLvl];..  ass
ac90: 65 72 74 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d  ert( iLvl<pIter-
aca0: 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20 66  >nLvl );.  if( f
acb0: 74 73 35 44 6c 69 64 78 4c 76 6c 50 72 65 76 28  ts5DlidxLvlPrev(
acc0: 70 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69 66 28  pLvl) ){.    if(
acd0: 20 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65   (iLvl+1) < pIte
ace0: 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20  r->nLvl ){.     
acf0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72   fts5DlidxIterPr
ad00: 65 76 52 28 70 2c 20 70 49 74 65 72 2c 20 69 4c  evR(p, pIter, iL
ad10: 76 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28  vl+1);.      if(
ad20: 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30   pLvl[1].bEof==0
ad30: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
ad40: 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c  DataRelease(pLvl
ad50: 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->pData);.      
ad60: 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30    memset(pLvl, 0
ad70: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  , sizeof(Fts5Dli
ad80: 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 20  dxLvl));.       
ad90: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66   pLvl->pData = f
ada0: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a  ts5DataRead(p, .
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 46 54 53 35              FTS5
adc0: 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74  _DLIDX_ROWID(pIt
add0: 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c  er->iSegid, iLvl
ade0: 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50  , pLvl[1].iLeafP
adf0: 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  gno).        );.
ae00: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c          if( pLvl
ae10: 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20  ->pData ){.     
ae20: 20 20 20 20 20 77 68 69 6c 65 28 20 66 74 73 35       while( fts5
ae30: 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76  DlidxLvlNext(pLv
ae40: 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  l)==0 );.       
ae50: 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20     pLvl->bEof = 
ae60: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
ae70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
ae80: 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
ae90: 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a  aLvl[0].bEof;.}.
aea0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
aeb0: 6c 69 64 78 49 74 65 72 50 72 65 76 28 46 74 73  lidxIterPrev(Fts
aec0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44  5Index *p, Fts5D
aed0: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
aee0: 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 44  {.  return fts5D
aef0: 6c 69 64 78 49 74 65 72 50 72 65 76 52 28 70 2c  lidxIterPrevR(p,
af00: 20 70 49 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f   pIter, 0);.}../
af10: 2a 0a 2a 2a 20 46 72 65 65 20 61 20 64 6f 63 6c  *.** Free a docl
af20: 69 73 74 2d 69 6e 64 65 78 20 69 74 65 72 61 74  ist-index iterat
af30: 6f 72 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61  or object alloca
af40: 74 65 64 20 62 79 20 66 74 73 35 44 6c 69 64 78  ted by fts5Dlidx
af50: 49 74 65 72 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73  IterInit()..*/.s
af60: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
af70: 6c 69 64 78 49 74 65 72 46 72 65 65 28 46 74 73  lidxIterFree(Fts
af80: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
af90: 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20  r){.  if( pIter 
afa0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
afb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
afc0: 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a  er->nLvl; i++){.
afd0: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
afe0: 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 61 4c 76  lease(pIter->aLv
aff0: 6c 5b 69 5d 2e 70 44 61 74 61 29 3b 0a 20 20 20  l[i].pData);.   
b000: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
b010: 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a  ree(pIter);.  }.
b020: 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 44 6c  }..static Fts5Dl
b030: 69 64 78 49 74 65 72 20 2a 66 74 73 35 44 6c 69  idxIter *fts5Dli
b040: 64 78 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74  dxIterInit(.  Ft
b050: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
b060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b070: 20 46 74 73 35 20 42 61 63 6b 65 6e 64 20 74 6f   Fts5 Backend to
b080: 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20   iterate within 
b090: 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20  */.  int bRev,  
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0b0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
b0c0: 20 4f 52 44 45 52 20 42 59 20 41 53 43 20 2a 2f   ORDER BY ASC */
b0d0: 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20  .  int iSegid,  
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0f0: 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64     /* Segment id
b100: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50   */.  int iLeafP
b110: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
b120: 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61        /* Leaf pa
b130: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 61  ge number to loa
b140: 64 20 64 6c 69 64 78 20 66 6f 72 20 2a 2f 0a 29  d dlidx for */.)
b150: 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65  {.  Fts5DlidxIte
b160: 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20 20  r *pIter = 0;.  
b170: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 44 6f  int i;.  int bDo
b180: 6e 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69  ne = 0;..  for(i
b190: 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  =0; p->rc==SQLIT
b1a0: 45 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d 30  E_OK && bDone==0
b1b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
b1c0: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46  nByte = sizeof(F
b1d0: 74 73 35 44 6c 69 64 78 49 74 65 72 29 20 2b 20  ts5DlidxIter) + 
b1e0: 69 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 44  i * sizeof(Fts5D
b1f0: 6c 69 64 78 4c 76 6c 29 3b 0a 20 20 20 20 46 74  lidxLvl);.    Ft
b200: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 4e 65  s5DlidxIter *pNe
b210: 77 3b 0a 0a 20 20 20 20 70 4e 65 77 20 3d 20 28  w;..    pNew = (
b220: 46 74 73 35 44 6c 69 64 78 49 74 65 72 2a 29 73  Fts5DlidxIter*)s
b230: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
b240: 49 74 65 72 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Iter, nByte);.  
b250: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
b260: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  .      p->rc = S
b270: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
b280: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36   }else{.      i6
b290: 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f  4 iRowid = FTS5_
b2a0: 44 4c 49 44 58 5f 52 4f 57 49 44 28 69 53 65 67  DLIDX_ROWID(iSeg
b2b0: 69 64 2c 20 69 2c 20 69 4c 65 61 66 50 67 29 3b  id, i, iLeafPg);
b2c0: 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64 78  .      Fts5Dlidx
b2d0: 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 4e 65  Lvl *pLvl = &pNe
b2e0: 77 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20  w->aLvl[i];.    
b2f0: 20 20 70 49 74 65 72 20 3d 20 70 4e 65 77 3b 0a    pIter = pNew;.
b300: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c 76        memset(pLv
b310: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  l, 0, sizeof(Fts
b320: 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20  5DlidxLvl));.   
b330: 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d     pLvl->pData =
b340: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
b350: 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20   iRowid);.      
b360: 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20  if( pLvl->pData 
b370: 26 26 20 28 70 4c 76 6c 2d 3e 70 44 61 74 61 2d  && (pLvl->pData-
b380: 3e 70 5b 30 5d 20 26 20 30 78 30 30 30 31 29 3d  >p[0] & 0x0001)=
b390: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 44  =0 ){.        bD
b3a0: 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  one = 1;.      }
b3b0: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 4c  .      pIter->nL
b3c0: 76 6c 20 3d 20 69 2b 31 3b 0a 20 20 20 20 7d 0a  vl = i+1;.    }.
b3d0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
b3e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b3f0: 20 20 20 70 49 74 65 72 2d 3e 69 53 65 67 69 64     pIter->iSegid
b400: 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20 69   = iSegid;.    i
b410: 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20  f( bRev==0 ){.  
b420: 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
b430: 72 46 69 72 73 74 28 70 49 74 65 72 29 3b 0a 20  rFirst(pIter);. 
b440: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b450: 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61 73  fts5DlidxIterLas
b460: 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  t(p, pIter);.   
b470: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d   }.  }..  if( p-
b480: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
b490: 7b 0a 20 20 20 20 66 74 73 35 44 6c 69 64 78 49  {.    fts5DlidxI
b4a0: 74 65 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a  terFree(pIter);.
b4b0: 20 20 20 20 70 49 74 65 72 20 3d 20 30 3b 0a 20      pIter = 0;. 
b4c0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74   }..  return pIt
b4d0: 65 72 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36  er;.}..static i6
b4e0: 34 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 52  4 fts5DlidxIterR
b4f0: 6f 77 69 64 28 46 74 73 35 44 6c 69 64 78 49 74  owid(Fts5DlidxIt
b500: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
b510: 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c  turn pIter->aLvl
b520: 5b 30 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 73 74  [0].iRowid;.}.st
b530: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
b540: 64 78 49 74 65 72 50 67 6e 6f 28 46 74 73 35 44  dxIterPgno(Fts5D
b550: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
b560: 7b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  {.  return pIter
b570: 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 4c 65 61 66 50  ->aLvl[0].iLeafP
b580: 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  gno;.}../*.** Lo
b590: 61 64 20 74 68 65 20 6e 65 78 74 20 6c 65 61 66  ad the next leaf
b5a0: 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 73   page into the s
b5b0: 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 2e  egment iterator.
b5c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b5d0: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
b5e0: 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  age(.  Fts5Index
b5f0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
b600: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
b610: 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
b620: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
b630: 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20  pIter           
b640: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
b650: 6f 20 61 64 76 61 6e 63 65 20 74 6f 20 6e 65 78  o advance to nex
b660: 74 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 46  t page */.){.  F
b670: 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a  ts5Data *pLeaf;.
b680: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
b690: 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70  egment *pSeg = p
b6a0: 49 74 65 72 2d 3e 70 53 65 67 3b 0a 20 20 66 74  Iter->pSeg;.  ft
b6b0: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
b6c0: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70  ter->pLeaf);.  p
b6d0: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b  Iter->iLeafPgno+
b6e0: 2b 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  +;.  if( pIter->
b6f0: 70 4e 65 78 74 4c 65 61 66 20 29 7b 0a 20 20 20  pNextLeaf ){.   
b700: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
b710: 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66  pIter->pNextLeaf
b720: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4e 65  ;.    pIter->pNe
b730: 78 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d 65  xtLeaf = 0;.  }e
b740: 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 69  lse if( pIter->i
b750: 4c 65 61 66 50 67 6e 6f 3c 3d 70 53 65 67 2d 3e  LeafPgno<=pSeg->
b760: 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20  pgnoLast ){.    
b770: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 66  pIter->pLeaf = f
b780: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a  ts5DataRead(p, .
b790: 20 20 20 20 20 20 20 20 46 54 53 35 5f 53 45 47          FTS5_SEG
b7a0: 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
b7b0: 3e 69 53 65 67 69 64 2c 20 70 49 74 65 72 2d 3e  >iSegid, pIter->
b7c0: 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 29  iLeafPgno).    )
b7d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
b7e0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
b7f0: 0a 20 20 7d 0a 20 20 70 4c 65 61 66 20 3d 20 70  .  }.  pLeaf = p
b800: 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 0a 20 20  Iter->pLeaf;..  
b810: 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20  if( pLeaf ){.   
b820: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
b830: 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  f = pLeaf->szLea
b840: 66 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35 4c  f;.    if( fts5L
b850: 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c  eafIsTermless(pL
b860: 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 70 49  eaf) ){.      pI
b870: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
b880: 73 74 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e 2b 31  st = pLeaf->nn+1
b890: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
b8a0: 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78     pIter->iPgidx
b8b0: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
b8c0: 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70  rint32(&pLeaf->p
b8d0: 5b 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66  [pIter->iPgidxOf
b8e0: 66 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 70 49  f],.          pI
b8f0: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
b900: 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  st.      );.    
b910: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
b920: 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73  rgument p points
b930: 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
b940: 74 61 69 6e 69 6e 67 20 61 20 76 61 72 69 6e 74  taining a varint
b950: 20 74 6f 20 62 65 20 69 6e 74 65 72 70 72 65 74   to be interpret
b960: 65 64 20 61 73 20 61 0a 2a 2a 20 70 6f 73 69 74  ed as a.** posit
b970: 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20 66 69  ion list size fi
b980: 65 6c 64 2e 20 52 65 61 64 20 74 68 65 20 76 61  eld. Read the va
b990: 72 69 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20  rint and return 
b9a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
b9b0: 74 65 73 0a 2a 2a 20 72 65 61 64 2e 20 42 65 66  tes.** read. Bef
b9c0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 73  ore returning, s
b9d0: 65 74 20 2a 70 6e 53 7a 20 74 6f 20 74 68 65 20  et *pnSz to the 
b9e0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
b9f0: 69 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 0a  in the position.
ba00: 2a 2a 20 6c 69 73 74 2c 20 61 6e 64 20 2a 70 62  ** list, and *pb
ba10: 44 65 6c 20 74 6f 20 74 72 75 65 20 69 66 20 74  Del to true if t
ba20: 68 65 20 64 65 6c 65 74 65 20 66 6c 61 67 20 69  he delete flag i
ba30: 73 20 73 65 74 2c 20 6f 72 20 66 61 6c 73 65 20  s set, or false 
ba40: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
ba50: 61 74 69 63 20 69 6e 74 20 66 74 73 35 47 65 74  atic int fts5Get
ba60: 50 6f 73 6c 69 73 74 53 69 7a 65 28 63 6f 6e 73  PoslistSize(cons
ba70: 74 20 75 38 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  t u8 *p, int *pn
ba80: 53 7a 2c 20 69 6e 74 20 2a 70 62 44 65 6c 29 7b  Sz, int *pbDel){
ba90: 0a 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 69 6e  .  int nSz;.  in
baa0: 74 20 6e 20 3d 20 30 3b 0a 20 20 66 74 73 35 46  t n = 0;.  fts5F
bab0: 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70  astGetVarint32(p
bac0: 2c 20 6e 2c 20 6e 53 7a 29 3b 0a 20 20 61 73 73  , n, nSz);.  ass
bad0: 65 72 74 5f 6e 63 28 20 6e 53 7a 3e 3d 30 20 29  ert_nc( nSz>=0 )
bae0: 3b 0a 20 20 2a 70 6e 53 7a 20 3d 20 6e 53 7a 2f  ;.  *pnSz = nSz/
baf0: 32 3b 0a 20 20 2a 70 62 44 65 6c 20 3d 20 6e 53  2;.  *pbDel = nS
bb00: 7a 20 26 20 30 78 30 30 30 31 3b 0a 20 20 72 65  z & 0x0001;.  re
bb10: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
bb20: 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65   Fts5SegIter.iLe
bb30: 61 66 4f 66 66 73 65 74 20 63 75 72 72 65 6e 74  afOffset current
bb40: 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ly points to the
bb50: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
bb60: 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  .** position-lis
bb70: 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 52 65  t size field. Re
bb80: 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ad the value of 
bb90: 74 68 65 20 66 69 65 6c 64 20 61 6e 64 20 73 74  the field and st
bba0: 6f 72 65 20 69 74 0a 2a 2a 20 69 6e 20 74 68 65  ore it.** in the
bbb0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
bbc0: 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74  bles:.**.**   Ft
bbd0: 73 35 53 65 67 49 74 65 72 2e 6e 50 6f 73 0a 2a  s5SegIter.nPos.*
bbe0: 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e  *   Fts5SegIter.
bbf0: 62 44 65 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61 76 65  bDel.**.** Leave
bc00: 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65   Fts5SegIter.iLe
bc10: 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 69 6e  afOffset pointin
bc20: 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  g to the first b
bc30: 79 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  yte of the .** p
bc40: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  osition list con
bc50: 74 65 6e 74 20 28 69 66 20 61 6e 79 29 2e 0a 2a  tent (if any)..*
bc60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
bc70: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
bc80: 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  s(Fts5Index *p, 
bc90: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
bca0: 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  er){.  if( p->rc
bcb0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
bcc0: 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49     int iOff = pI
bcd0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
bce0: 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20  ;  /* Offset to 
bcf0: 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 20 20 41  read at */.    A
bd00: 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28  SSERT_SZLEAF_OK(
bd10: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
bd20: 20 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69     if( p->pConfi
bd30: 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  g->eDetail==FTS5
bd40: 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a  _DETAIL_NONE ){.
bd50: 20 20 20 20 20 20 69 6e 74 20 69 45 6f 64 20 3d        int iEod =
bd60: 20 4d 49 4e 28 70 49 74 65 72 2d 3e 69 45 6e 64   MIN(pIter->iEnd
bd70: 6f 66 44 6f 63 6c 69 73 74 2c 20 70 49 74 65 72  ofDoclist, pIter
bd80: 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 29  ->pLeaf->szLeaf)
bd90: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62  ;.      pIter->b
bda0: 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Del = 0;.      p
bdb0: 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 31 3b 0a  Iter->nPos = 1;.
bdc0: 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 69        if( iOff<i
bdd0: 45 6f 64 20 26 26 20 70 49 74 65 72 2d 3e 70 4c  Eod && pIter->pL
bde0: 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 3d 3d 30 20  eaf->p[iOff]==0 
bdf0: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  ){.        pIter
be00: 2d 3e 62 44 65 6c 20 3d 20 31 3b 0a 20 20 20 20  ->bDel = 1;.    
be10: 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20      iOff++;.    
be20: 20 20 20 20 69 66 28 20 69 4f 66 66 3c 69 45 6f      if( iOff<iEo
be30: 64 20 26 26 20 70 49 74 65 72 2d 3e 70 4c 65 61  d && pIter->pLea
be40: 66 2d 3e 70 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b  f->p[iOff]==0 ){
be50: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
be60: 2d 3e 6e 50 6f 73 20 3d 20 31 3b 0a 20 20 20 20  ->nPos = 1;.    
be70: 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20        iOff++;.  
be80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
be90: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50         pIter->nP
bea0: 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  os = 0;.        
beb0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
bec0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
bed0: 53 7a 3b 0a 20 20 20 20 20 20 66 74 73 35 46 61  Sz;.      fts5Fa
bee0: 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70 49  stGetVarint32(pI
bef0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 2c 20 69  ter->pLeaf->p, i
bf00: 4f 66 66 2c 20 6e 53 7a 29 3b 0a 20 20 20 20 20  Off, nSz);.     
bf10: 20 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 28   pIter->bDel = (
bf20: 6e 53 7a 20 26 20 30 78 30 30 30 31 29 3b 0a 20  nSz & 0x0001);. 
bf30: 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73       pIter->nPos
bf40: 20 3d 20 6e 53 7a 3e 3e 31 3b 0a 20 20 20 20 20   = nSz>>1;.     
bf50: 20 61 73 73 65 72 74 5f 6e 63 28 20 70 49 74 65   assert_nc( pIte
bf60: 72 2d 3e 6e 50 6f 73 3e 3d 30 20 29 3b 0a 20 20  r->nPos>=0 );.  
bf70: 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69    }.    pIter->i
bf80: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
bf90: 66 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  f;.  }.}..static
bfa0: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
bfb0: 72 4c 6f 61 64 52 6f 77 69 64 28 46 74 73 35 49  rLoadRowid(Fts5I
bfc0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
bfd0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
bfe0: 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
bff0: 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20 20 20 20  Leaf->p;        
c000: 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65 61  /* Buffer to rea
c010: 64 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20  d data from */. 
c020: 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65   int iOff = pIte
c030: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a  r->iLeafOffset;.
c040: 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46  .  ASSERT_SZLEAF
c050: 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  _OK(pIter->pLeaf
c060: 29 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e 3d 70  );.  if( iOff>=p
c070: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
c080: 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 53  eaf ){.    fts5S
c090: 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70  egIterNextPage(p
c0a0: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66  , pIter);.    if
c0b0: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
c0c0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
c0d0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
c0e0: 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43  ) p->rc = FTS5_C
c0f0: 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 72 65  ORRUPT;.      re
c100: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
c110: 69 4f 66 66 20 3d 20 34 3b 0a 20 20 20 20 61 20  iOff = 4;.    a 
c120: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
c130: 70 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 20 2b 3d  p;.  }.  iOff +=
c140: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
c150: 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20  arint(&a[iOff], 
c160: 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
c170: 6f 77 69 64 29 3b 0a 20 20 70 49 74 65 72 2d 3e  owid);.  pIter->
c180: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
c190: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73  ff;.}../*.** Fts
c1a0: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
c1b0: 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70  fset currently p
c1c0: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
c1d0: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a  st byte of the .
c1e0: 2a 2a 20 22 6e 53 75 66 66 69 78 22 20 66 69 65  ** "nSuffix" fie
c1f0: 6c 64 20 6f 66 20 61 20 74 65 72 6d 2e 20 46 75  ld of a term. Fu
c200: 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  nction parameter
c210: 20 6e 4b 65 65 70 20 63 6f 6e 74 61 69 6e 73 20   nKeep contains 
c220: 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  the value.** of 
c230: 74 68 65 20 22 6e 50 72 65 66 69 78 22 20 66 69  the "nPrefix" fi
c240: 65 6c 64 20 28 69 66 20 74 68 65 72 65 20 77 61  eld (if there wa
c250: 73 20 6f 6e 65 20 2d 20 69 74 20 69 73 20 70 61  s one - it is pa
c260: 73 73 65 64 20 30 20 69 66 20 74 68 69 73 20 69  ssed 0 if this i
c270: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  s.** the first t
c280: 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65  erm in the segme
c290: 6e 74 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nt)..**.** This 
c2a0: 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74  function populat
c2b0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35  es:.**.**   Fts5
c2c0: 53 65 67 49 74 65 72 2e 74 65 72 6d 0a 2a 2a 20  SegIter.term.** 
c2d0: 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 72 6f    Fts5SegIter.ro
c2e0: 77 69 64 0a 2a 2a 0a 2a 2a 20 61 63 63 6f 72 64  wid.**.** accord
c2f0: 69 6e 67 6c 79 20 61 6e 64 20 6c 65 61 76 65 73  ingly and leaves
c300: 20 28 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c   (Fts5SegIter.iL
c310: 65 61 66 4f 66 66 73 65 74 29 20 73 65 74 20 74  eafOffset) set t
c320: 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  o the content of
c330: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 6f  .** the first po
c340: 73 69 74 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65  sition list. The
c350: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 62   position list b
c360: 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 64 6f 63 75  elonging to docu
c370: 6d 65 6e 74 20 0a 2a 2a 20 28 46 74 73 35 53 65  ment .** (Fts5Se
c380: 67 49 74 65 72 2e 69 52 6f 77 69 64 29 2e 0a 2a  gIter.iRowid)..*
c390: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
c3a0: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72  s5SegIterLoadTer
c3b0: 6d 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  m(Fts5Index *p, 
c3c0: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
c3d0: 65 72 2c 20 69 6e 74 20 6e 4b 65 65 70 29 7b 0a  er, int nKeep){.
c3e0: 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d    u8 *a = pIter-
c3f0: 3e 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20 20  >pLeaf->p;      
c400: 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 72    /* Buffer to r
c410: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f  ead data from */
c420: 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49  .  int iOff = pI
c430: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
c440: 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20  ;  /* Offset to 
c450: 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 69 6e 74  read at */.  int
c460: 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20   nNew;          
c470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c480: 42 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61 74  Bytes of new dat
c490: 61 20 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d 20  a */..  iOff += 
c4a0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
c4b0: 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b  &a[iOff], nNew);
c4c0: 0a 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e  .  pIter->term.n
c4d0: 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 66 74 73 35   = nKeep;.  fts5
c4e0: 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
c4f0: 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d  (&p->rc, &pIter-
c500: 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b  >term, nNew, &a[
c510: 69 4f 66 66 5d 29 3b 0a 20 20 69 4f 66 66 20 2b  iOff]);.  iOff +
c520: 3d 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d  = nNew;.  pIter-
c530: 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74  >iTermLeafOffset
c540: 20 3d 20 69 4f 66 66 3b 0a 20 20 70 49 74 65 72   = iOff;.  pIter
c550: 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20  ->iTermLeafPgno 
c560: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  = pIter->iLeafPg
c570: 6e 6f 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65  no;.  pIter->iLe
c580: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
c590: 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69  ..  if( pIter->i
c5a0: 50 67 69 64 78 4f 66 66 3e 3d 70 49 74 65 72 2d  PgidxOff>=pIter-
c5b0: 3e 70 4c 65 61 66 2d 3e 6e 6e 20 29 7b 0a 20 20  >pLeaf->nn ){.  
c5c0: 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
c5d0: 6f 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e  oclist = pIter->
c5e0: 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d  pLeaf->nn+1;.  }
c5f0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45  else{.    int nE
c600: 78 74 72 61 3b 0a 20 20 20 20 70 49 74 65 72 2d  xtra;.    pIter-
c610: 3e 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74  >iPgidxOff += ft
c620: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
c630: 5b 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66  [pIter->iPgidxOf
c640: 66 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 20  f], nExtra);.   
c650: 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
c660: 63 6c 69 73 74 20 2b 3d 20 6e 45 78 74 72 61 3b  clist += nExtra;
c670: 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49  .  }..  fts5SegI
c680: 74 65 72 4c 6f 61 64 52 6f 77 69 64 28 70 2c 20  terLoadRowid(p, 
c690: 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pIter);.}../*.**
c6a0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
c6b0: 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
c6c0: 70 49 74 65 72 20 74 6f 20 69 74 65 72 61 74 65  pIter to iterate
c6d0: 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 6e 74   through the ent
c6e0: 72 69 65 73 20 69 6e 0a 2a 2a 20 73 65 67 6d 65  ries in.** segme
c6f0: 6e 74 20 70 53 65 67 2e 20 54 68 65 20 69 74 65  nt pSeg. The ite
c700: 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  rator is left po
c710: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
c720: 72 73 74 20 65 6e 74 72 79 20 77 68 65 6e 20 0a  rst entry when .
c730: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
c740: 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20   returns..**.** 
c750: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
c760: 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63  rs, Fts5Index.rc
c770: 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70   is set to an ap
c780: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
c790: 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20  code. If .** an 
c7a0: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
c7b0: 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
c7c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
c7d0: 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
c7e0: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
c7f0: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
c800: 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e  erInit(.  Fts5In
c810: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
c820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
c830: 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f   index object */
c840: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
c850: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20  Segment *pSeg,  
c860: 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
c870: 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  n of segment */.
c880: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
c890: 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  Iter            
c8a0: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70    /* Object to p
c8b0: 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20  opulate */.){.  
c8c0: 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69  if( pSeg->pgnoFi
c8d0: 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  rst==0 ){.    /*
c8e0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66   This happens if
c8f0: 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69 73 20   the segment is 
c900: 62 65 69 6e 67 20 75 73 65 64 20 61 73 20 61 6e  being used as an
c910: 20 69 6e 70 75 74 20 74 6f 20 61 6e 20 69 6e 63   input to an inc
c920: 72 65 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a 20  remental.    ** 
c930: 6d 65 72 67 65 20 61 6e 64 20 61 6c 6c 20 64 61  merge and all da
c940: 74 61 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ta has already b
c950: 65 65 6e 20 22 74 72 69 6d 6d 65 64 22 2e 20 53  een "trimmed". S
c960: 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  ee function.    
c970: 2a 2a 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65  ** fts5TrimSegme
c980: 6e 74 73 28 29 20 66 6f 72 20 64 65 74 61 69 6c  nts() for detail
c990: 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
c9a0: 6c 65 61 76 65 20 74 68 65 20 69 74 65 72 61 74  leave the iterat
c9b0: 6f 72 20 65 6d 70 74 79 2e 0a 20 20 20 20 2a 2a  or empty..    **
c9c0: 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
c9d0: 20 73 65 65 20 74 68 65 20 28 70 49 74 65 72 2d   see the (pIter-
c9e0: 3e 70 4c 65 61 66 3d 3d 30 29 20 61 6e 64 20 61  >pLeaf==0) and a
c9f0: 73 73 75 6d 65 20 74 68 65 20 69 74 65 72 61 74  ssume the iterat
ca00: 6f 72 20 69 73 0a 20 20 20 20 2a 2a 20 61 74 20  or is.    ** at 
ca10: 45 4f 46 20 61 6c 72 65 61 64 79 2e 20 2a 2f 0a  EOF already. */.
ca20: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
ca30: 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a 20  r->pLeaf==0 );. 
ca40: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
ca50: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
ca60: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 65  ITE_OK ){.    me
ca70: 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73  mset(pIter, 0, s
ca80: 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a  izeof(*pIter));.
ca90: 20 20 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20      pIter->pSeg 
caa0: 3d 20 70 53 65 67 3b 0a 20 20 20 20 70 49 74 65  = pSeg;.    pIte
cab0: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70  r->iLeafPgno = p
cac0: 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31  Seg->pgnoFirst-1
cad0: 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  ;.    fts5SegIte
cae0: 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74  rNextPage(p, pIt
caf0: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  er);.  }..  if( 
cb00: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
cb10: 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   ){.    pIter->i
cb20: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 34 3b 0a  LeafOffset = 4;.
cb30: 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70      assert_nc( p
cb40: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3e  Iter->pLeaf->nn>
cb50: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
cb60: 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65   fts5LeafFirstTe
cb70: 72 6d 4f 66 66 28 70 49 74 65 72 2d 3e 70 4c 65  rmOff(pIter->pLe
cb80: 61 66 29 3d 3d 34 20 29 3b 0a 20 20 20 20 70 49  af)==4 );.    pI
cb90: 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d  ter->iPgidxOff =
cba0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73   pIter->pLeaf->s
cbb0: 7a 4c 65 61 66 2b 31 3b 0a 20 20 20 20 66 74 73  zLeaf+1;.    fts
cbc0: 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d  5SegIterLoadTerm
cbd0: 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20  (p, pIter, 0);. 
cbe0: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
cbf0: 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
cc00: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
cc10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
cc20: 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64  only ever called
cc30: 20 6f 6e 20 69 74 65 72 61 74 6f 72 73 20 63 72   on iterators cr
cc40: 65 61 74 65 64 20 62 79 20 63 61 6c 6c 73 20 74  eated by calls t
cc50: 6f 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 51 75  o.** Fts5IndexQu
cc60: 65 72 79 28 29 20 77 69 74 68 20 74 68 65 20 46  ery() with the F
cc70: 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
cc80: 45 53 43 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ESC flag set..**
cc90: 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72  .** The iterator
cca0: 20 69 73 20 69 6e 20 61 6e 20 75 6e 75 73 75 61   is in an unusua
ccb0: 6c 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  l state when thi
ccc0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
ccd0: 6c 6c 65 64 3a 20 74 68 65 0a 2a 2a 20 46 74 73  lled: the.** Fts
cce0: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
ccf0: 66 73 65 74 20 76 61 72 69 61 62 6c 65 20 69 73  fset variable is
cd00: 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
cd10: 65 74 20 6f 66 20 74 68 65 20 73 74 61 72 74 20  et of the start 
cd20: 6f 66 0a 2a 2a 20 74 68 65 20 70 6f 73 69 74 69  of.** the positi
cd30: 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
cd40: 6c 64 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ld for the first
cd50: 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20   relevant rowid 
cd60: 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  on the page..** 
cd70: 46 74 73 35 53 65 67 49 74 65 72 2e 72 6f 77 69  Fts5SegIter.rowi
cd80: 64 20 69 73 20 73 65 74 2c 20 62 75 74 20 6e 50  d is set, but nP
cd90: 6f 73 20 61 6e 64 20 62 44 65 6c 20 61 72 65 20  os and bDel are 
cda0: 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  not..**.** This 
cdb0: 66 75 6e 63 74 69 6f 6e 20 61 64 76 61 6e 63 65  function advance
cdc0: 73 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73  s the iterator s
cdd0: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
cde0: 20 74 6f 20 74 68 65 20 6c 61 73 74 20 0a 2a 2a   to the last .**
cdf0: 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20   relevant rowid 
ce00: 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 2c  on the page and,
ce10: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 69   if necessary, i
ce20: 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 0a  nitializes the .
ce30: 2a 2a 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  ** aRowidOffset[
ce40: 5d 20 61 6e 64 20 69 52 6f 77 69 64 4f 66 66 73  ] and iRowidOffs
ce50: 65 74 20 76 61 72 69 61 62 6c 65 73 2e 20 41 74  et variables. At
ce60: 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
ce70: 69 74 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69  iterator.** is i
ce80: 6e 20 69 74 73 20 72 65 67 75 6c 61 72 20 73 74  n its regular st
ce90: 61 74 65 20 2d 20 46 74 73 35 53 65 67 49 74 65  ate - Fts5SegIte
cea0: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f  r.iLeafOffset po
ceb0: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
cec0: 74 0a 2a 2a 20 62 79 74 65 20 6f 66 20 74 68 65  t.** byte of the
ced0: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63   position list c
cee0: 6f 6e 74 65 6e 74 20 61 73 73 6f 63 69 61 74 65  ontent associate
cef0: 64 20 77 69 74 68 20 73 61 69 64 20 72 6f 77 69  d with said rowi
cf00: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
cf10: 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76  d fts5SegIterRev
cf20: 65 72 73 65 49 6e 69 74 50 61 67 65 28 46 74 73  erseInitPage(Fts
cf30: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
cf40: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
cf50: 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20    int eDetail = 
cf60: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
cf70: 61 69 6c 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70  ail;.  int n = p
cf80: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
cf90: 65 61 66 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  eaf;.  int i = p
cfa0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
cfb0: 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74  t;.  u8 *a = pIt
cfc0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
cfd0: 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 73 65 74  int iRowidOffset
cfe0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3e 70   = 0;..  if( n>p
cff0: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
d000: 69 73 74 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  ist ){.    n = p
d010: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
d020: 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 41 53 53 45  ist;.  }..  ASSE
d030: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74  RT_SZLEAF_OK(pIt
d040: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 77 68  er->pLeaf);.  wh
d050: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36  ile( 1 ){.    i6
d060: 34 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 0a 20  4 iDelta = 0;.. 
d070: 20 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d     if( eDetail==
d080: 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
d090: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74 6f 64   ){.      /* tod
d0a0: 6f 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  o */.      if( i
d0b0: 3c 6e 20 26 26 20 61 5b 69 5d 3d 3d 30 20 29 7b  <n && a[i]==0 ){
d0c0: 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
d0d0: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 20 26 26        if( i<n &&
d0e0: 20 61 5b 69 5d 3d 3d 30 20 29 20 69 2b 2b 3b 0a   a[i]==0 ) i++;.
d0f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
d100: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 6f  e{.      int nPo
d110: 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 75  s;.      int bDu
d120: 6d 6d 79 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20  mmy;.      i += 
d130: 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69  fts5GetPoslistSi
d140: 7a 65 28 26 61 5b 69 5d 2c 20 26 6e 50 6f 73 2c  ze(&a[i], &nPos,
d150: 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20   &bDummy);.     
d160: 20 69 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20   i += nPos;.    
d170: 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 20 29  }.    if( i>=n )
d180: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 20 2b 3d   break;.    i +=
d190: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
d1a0: 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  a[i], (u64*)&iDe
d1b0: 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  lta);.    pIter-
d1c0: 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74  >iRowid += iDelt
d1d0: 61 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65  a;..    /* If ne
d1e0: 63 65 73 73 61 72 79 2c 20 67 72 6f 77 20 74 68  cessary, grow th
d1f0: 65 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f  e pIter->aRowidO
d200: 66 66 73 65 74 5b 5d 20 61 72 72 61 79 2e 20 2a  ffset[] array. *
d210: 2f 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  /.    if( iRowid
d220: 4f 66 66 73 65 74 3e 3d 70 49 74 65 72 2d 3e 6e  Offset>=pIter->n
d230: 52 6f 77 69 64 4f 66 66 73 65 74 20 29 7b 0a 20  RowidOffset ){. 
d240: 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20       int nNew = 
d250: 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66  pIter->nRowidOff
d260: 73 65 74 20 2b 20 38 3b 0a 20 20 20 20 20 20 69  set + 8;.      i
d270: 6e 74 20 2a 61 4e 65 77 20 3d 20 28 69 6e 74 2a  nt *aNew = (int*
d280: 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
d290: 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66  (pIter->aRowidOf
d2a0: 66 73 65 74 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f  fset, nNew*sizeo
d2b0: 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 69  f(int));.      i
d2c0: 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
d2d0: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
d2e0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
d2f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d300: 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e   }.      pIter->
d310: 61 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 61  aRowidOffset = a
d320: 4e 65 77 3b 0a 20 20 20 20 20 20 70 49 74 65 72  New;.      pIter
d330: 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 3d  ->nRowidOffset =
d340: 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a 0a 20 20   nNew;.    }..  
d350: 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f    pIter->aRowidO
d360: 66 66 73 65 74 5b 69 52 6f 77 69 64 4f 66 66 73  ffset[iRowidOffs
d370: 65 74 2b 2b 5d 20 3d 20 70 49 74 65 72 2d 3e 69  et++] = pIter->i
d380: 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20  LeafOffset;.    
d390: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
d3a0: 65 74 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 70 49  et = i;.  }.  pI
d3b0: 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65  ter->iRowidOffse
d3c0: 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 73 65 74  t = iRowidOffset
d3d0: 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4c  ;.  fts5SegIterL
d3e0: 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72  oadNPos(p, pIter
d3f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73  );.}../*.**.*/.s
d400: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
d410: 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65 77  egIterReverseNew
d420: 50 61 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a  Page(Fts5Index *
d430: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
d440: 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74  pIter){.  assert
d450: 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
d460: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
d470: 56 45 52 53 45 20 29 3b 0a 20 20 61 73 73 65 72  VERSE );.  asser
d480: 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  t( pIter->flags 
d490: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  & FTS5_SEGITER_O
d4a0: 4e 45 54 45 52 4d 20 29 3b 0a 0a 20 20 66 74 73  NETERM );..  fts
d4b0: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
d4c0: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49  er->pLeaf);.  pI
d4d0: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
d4e0: 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
d4f0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74  SQLITE_OK && pIt
d500: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e 70 49  er->iLeafPgno>pI
d510: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
d520: 6e 6f 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61  no ){.    Fts5Da
d530: 74 61 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 49  ta *pNew;.    pI
d540: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d  ter->iLeafPgno--
d550: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 66 74 73  ;.    pNew = fts
d560: 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53  5DataRead(p, FTS
d570: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
d580: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
d590: 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  ->pSeg->iSegid, 
d5a0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
d5b0: 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 69 66 28  .    ));.    if(
d5c0: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 2f   pNew ){.      /
d5d0: 2a 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  * iTermLeafOffse
d5e0: 74 20 6d 61 79 20 62 65 20 65 71 75 61 6c 20 74  t may be equal t
d5f0: 6f 20 73 7a 4c 65 61 66 20 69 66 20 74 68 65 20  o szLeaf if the 
d600: 74 65 72 6d 20 69 73 20 74 68 65 20 6c 61 73 74  term is the last
d610: 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 6e 67 20  .      ** thing 
d620: 6f 6e 20 74 68 65 20 70 61 67 65 20 2d 20 69 2e  on the page - i.
d630: 65 2e 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  e. the first row
d640: 69 64 20 69 73 20 6f 6e 20 74 68 65 20 66 6f 6c  id is on the fol
d650: 6c 6f 77 69 6e 67 20 70 61 67 65 2e 0a 20 20 20  lowing page..   
d660: 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
d670: 73 65 20 6c 65 61 76 65 20 70 49 74 65 72 2d 3e  se leave pIter->
d680: 70 4c 65 61 66 3d 3d 30 2c 20 74 68 69 73 20 69  pLeaf==0, this i
d690: 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45 4f  terator is at EO
d6a0: 46 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  F. */.      if( 
d6b0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
d6c0: 3d 3d 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  ==pIter->iTermLe
d6d0: 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  afPgno ){.      
d6e0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
d6f0: 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20  >pLeaf==0 );.   
d700: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
d710: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3c  iTermLeafOffset<
d720: 70 4e 65 77 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  pNew->szLeaf ){.
d730: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
d740: 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20  >pLeaf = pNew;. 
d750: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
d760: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49  iLeafOffset = pI
d770: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66  ter->iTermLeafOf
d780: 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  fset;.        }.
d790: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d7a0: 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f       int iRowidO
d7b0: 66 66 3b 0a 20 20 20 20 20 20 20 20 69 52 6f 77  ff;.        iRow
d7c0: 69 64 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66  idOff = fts5Leaf
d7d0: 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4e  FirstRowidOff(pN
d7e0: 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
d7f0: 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20   iRowidOff ){.  
d800: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
d810: 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Leaf = pNew;.   
d820: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
d830: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 52 6f 77  eafOffset = iRow
d840: 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 7d  idOff;.        }
d850: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
d860: 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
d870: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   ){.        u8 *
d880: 61 20 3d 20 26 70 49 74 65 72 2d 3e 70 4c 65 61  a = &pIter->pLea
d890: 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4c 65 61  f->p[pIter->iLea
d8a0: 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 20 20  fOffset];.      
d8b0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
d8c0: 66 73 65 74 20 2b 3d 20 66 74 73 35 47 65 74 56  fset += fts5GetV
d8d0: 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26  arint(a, (u64*)&
d8e0: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
d8f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d900: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d910: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
d920: 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ase(pNew);.     
d930: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
d940: 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
d950: 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   ){.    pIter->i
d960: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70  EndofDoclist = p
d970: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b  Iter->pLeaf->nn+
d980: 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  1;.    fts5SegIt
d990: 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
d9a0: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d  e(p, pIter);.  }
d9b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
d9c0: 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74 65   true if the ite
d9d0: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
d9e0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
d9f0: 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  ent currently.**
da00: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 64 65 6c   points to a del
da10: 65 74 65 20 6d 61 72 6b 65 72 2e 20 41 20 64 65  ete marker. A de
da20: 6c 65 74 65 20 6d 61 72 6b 65 72 20 69 73 20 61  lete marker is a
da30: 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 20 30  n entry with a 0
da40: 20 62 79 74 65 0a 2a 2a 20 70 6f 73 69 74 69 6f   byte.** positio
da50: 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  n-list..*/.stati
da60: 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49  c int fts5MultiI
da70: 74 65 72 49 73 45 6d 70 74 79 28 46 74 73 35 49  terIsEmpty(Fts5I
da80: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49 6e 64  ndex *p, Fts5Ind
da90: 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  exIter *pIter){.
daa0: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
dab0: 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  Seg = &pIter->aS
dac0: 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74  eg[pIter->aFirst
dad0: 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20 72  [1].iFirst];.  r
dae0: 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51  eturn (p->rc==SQ
daf0: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 65 67 2d  LITE_OK && pSeg-
db00: 3e 70 4c 65 61 66 20 26 26 20 70 53 65 67 2d 3e  >pLeaf && pSeg->
db10: 6e 50 6f 73 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a  nPos==0);.}../*.
db20: 2a 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72 61  ** Advance itera
db30: 74 6f 72 20 70 49 74 65 72 20 74 6f 20 74 68 65  tor pIter to the
db40: 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a   next entry. .**
db50: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
db60: 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65  occurs, Fts5Inde
db70: 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61  x.rc is set to a
db80: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
db90: 72 6f 72 20 63 6f 64 65 2e 20 49 74 20 0a 2a 2a  ror code. It .**
dba0: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
dbb0: 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ed an error if t
dbc0: 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 63  he iterator reac
dbd0: 68 65 73 20 45 4f 46 2e 20 49 66 20 61 6e 20 65  hes EOF. If an e
dbe0: 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72  rror has .** alr
dbf0: 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68  eady occurred wh
dc00: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
dc10: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
dc20: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
dc30: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
dc40: 67 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73  gIterNext(.  Fts
dc50: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dc70: 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
dc80: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
dc90: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
dca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
dcb0: 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
dcc0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77 54  */.  int *pbNewT
dcd0: 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
dce0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74       /* OUT: Set
dcf0: 20 66 6f 72 20 6e 65 77 20 74 65 72 6d 20 2a 2f   for new term */
dd00: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 62  .){.  assert( pb
dd10: 4e 65 77 54 65 72 6d 3d 3d 30 20 7c 7c 20 2a 70  NewTerm==0 || *p
dd20: 62 4e 65 77 54 65 72 6d 3d 3d 30 20 29 3b 0a 20  bNewTerm==0 );. 
dd30: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
dd40: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
dd50: 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
dd60: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
dd70: 45 52 53 45 20 29 7b 0a 20 20 20 20 20 20 61 73  ERSE ){.      as
dd80: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4e 65  sert( pIter->pNe
dd90: 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20  xtLeaf==0 );.   
dda0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 52     if( pIter->iR
ddb0: 6f 77 69 64 4f 66 66 73 65 74 3e 30 20 29 7b 0a  owidOffset>0 ){.
ddc0: 20 20 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20          u8 *a = 
ddd0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
dde0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
ddf0: 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  f;.        int n
de00: 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Pos;.        int
de10: 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20   bDummy;.       
de20: 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20   i64 iDelta;..  
de30: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f        pIter->iRo
de40: 77 69 64 4f 66 66 73 65 74 2d 2d 3b 0a 20 20 20  widOffset--;.   
de50: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
de60: 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d  fOffset = pIter-
de70: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 70 49  >aRowidOffset[pI
de80: 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65  ter->iRowidOffse
de90: 74 5d 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  t];.        fts5
dea0: 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
deb0: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
dec0: 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d     iOff = pIter-
ded0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
dee0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 43 6f        if( p->pCo
def0: 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46  nfig->eDetail!=F
df00: 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
df10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66  ){.          iOf
df20: 66 20 2b 3d 20 70 49 74 65 72 2d 3e 6e 50 6f 73  f += pIter->nPos
df30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
df40: 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e      fts5GetVarin
df50: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
df60: 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
df70: 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
df80: 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20  d -= iDelta;.   
df90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dfa0: 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
dfb0: 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70  erseNewPage(p, p
dfc0: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
dfd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dfe0: 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20  Fts5Data *pLeaf 
dff0: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a  = pIter->pLeaf;.
e000: 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a        int iOff;.
e010: 20 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65        int bNewTe
e020: 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  rm = 0;.      in
e030: 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20 20  t nKeep = 0;..  
e040: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
e050: 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
e060: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 77   position list w
e070: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
e080: 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  t page. */.     
e090: 20 75 38 20 2a 61 20 3d 20 70 4c 65 61 66 2d 3e   u8 *a = pLeaf->
e0a0: 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  p;.      int n =
e0b0: 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a   pLeaf->szLeaf;.
e0c0: 0a 20 20 20 20 20 20 41 53 53 45 52 54 5f 53 5a  .      ASSERT_SZ
e0d0: 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a  LEAF_OK(pLeaf);.
e0e0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 43 6f        if( p->pCo
e0f0: 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46  nfig->eDetail==F
e100: 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
e110: 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ){.        iOff 
e120: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
e130: 66 73 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  fset;.      }els
e140: 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  e{.        iOff 
e150: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
e160: 66 73 65 74 20 2b 20 70 49 74 65 72 2d 3e 6e 50  fset + pIter->nP
e170: 6f 73 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  os;.      }..   
e180: 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b     if( iOff<n ){
e190: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
e1a0: 6e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e  next entry is on
e1b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
e1c0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  e. */.        as
e1d0: 73 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c 3d 70  sert_nc( iOff<=p
e1e0: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
e1f0: 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ist );.        i
e200: 66 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  f( iOff>=pIter->
e210: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b  iEndofDoclist ){
e220: 0a 20 20 20 20 20 20 20 20 20 20 62 4e 65 77 54  .          bNewT
e230: 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
e240: 20 20 20 69 66 28 20 69 4f 66 66 21 3d 66 74 73     if( iOff!=fts
e250: 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66  5LeafFirstTermOf
e260: 66 28 70 4c 65 61 66 29 20 29 7b 0a 20 20 20 20  f(pLeaf) ){.    
e270: 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
e280: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
e290: 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29  &a[iOff], nKeep)
e2a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
e2b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e2c0: 20 20 20 20 20 20 20 75 36 34 20 69 44 65 6c 74         u64 iDelt
e2d0: 61 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66  a;.          iOf
e2e0: 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  f += sqlite3Fts5
e2f0: 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  GetVarint(&a[iOf
e300: 66 5d 2c 20 26 69 44 65 6c 74 61 29 3b 0a 20 20  f], &iDelta);.  
e310: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
e320: 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
e330: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
e340: 74 5f 6e 63 28 20 69 44 65 6c 74 61 3e 30 20 29  t_nc( iDelta>0 )
e350: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e360: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
e370: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a  Offset = iOff;..
e380: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e390: 70 49 74 65 72 2d 3e 70 53 65 67 3d 3d 30 20 29  pIter->pSeg==0 )
e3a0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
e3b0: 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20  u8 *pList = 0;. 
e3c0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
e3d0: 72 20 2a 7a 54 65 72 6d 20 3d 20 30 3b 0a 20 20  r *zTerm = 0;.  
e3e0: 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 20        int nList 
e3f0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 73 73  = 0;.        ass
e400: 65 72 74 28 20 28 70 49 74 65 72 2d 3e 66 6c 61  ert( (pIter->fla
e410: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
e420: 52 5f 4f 4e 45 54 45 52 4d 29 20 7c 7c 20 70 62  R_ONETERM) || pb
e430: 4e 65 77 54 65 72 6d 20 29 3b 0a 20 20 20 20 20  NewTerm );.     
e440: 20 20 20 69 66 28 20 30 3d 3d 28 70 49 74 65 72     if( 0==(pIter
e450: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
e460: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 20  EGITER_ONETERM) 
e470: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
e480: 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
e490: 4e 65 78 74 28 70 2d 3e 70 48 61 73 68 29 3b 0a  Next(p->pHash);.
e4a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e4b0: 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74  3Fts5HashScanEnt
e4c0: 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26 7a 54  ry(p->pHash, &zT
e4d0: 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c  erm, &pList, &nL
e4e0: 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ist);.        }.
e4f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 69 73          if( pLis
e500: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
e510: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
e520: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
e530: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
e540: 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  ->pLeaf = 0;.   
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 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
e570: 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69  af->p = (u8*)pLi
e580: 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  st;.          pI
e590: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 3d  ter->pLeaf->nn =
e5a0: 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20   nList;.        
e5b0: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e    pIter->pLeaf->
e5c0: 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a  szLeaf = nList;.
e5d0: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
e5e0: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
e5f0: 20 6e 4c 69 73 74 2b 31 3b 0a 20 20 20 20 20 20   nList+1;.      
e600: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
e610: 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
e620: 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 28   &pIter->term, (
e630: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d  int)strlen(zTerm
e640: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
e650: 20 28 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20   (u8*)zTerm);.  
e660: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
e670: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73  LeafOffset = fts
e680: 35 47 65 74 56 61 72 69 6e 74 28 70 4c 69 73 74  5GetVarint(pList
e690: 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
e6a0: 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
e6b0: 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20     *pbNewTerm = 
e6c0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
e6d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e6e0: 20 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20    iOff = 0;.    
e6f0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72      /* Next entr
e700: 79 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20  y is not on the 
e710: 63 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a  current page */.
e720: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69          while( i
e730: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Off==0 ){.      
e740: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
e750: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
e760: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65  );.          pLe
e770: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
e780: 66 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  f;.          if(
e790: 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61   pLeaf==0 ) brea
e7a0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 41 53 53  k;.          ASS
e7b0: 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c  ERT_SZLEAF_OK(pL
e7c0: 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eaf);.          
e7d0: 69 66 28 20 28 69 4f 66 66 20 3d 20 66 74 73 35  if( (iOff = fts5
e7e0: 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
e7f0: 66 28 70 4c 65 61 66 29 29 20 26 26 20 69 4f 66  f(pLeaf)) && iOf
e800: 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  f<pLeaf->szLeaf 
e810: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
e820: 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  Off += sqlite3Ft
e830: 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65  s5GetVarint(&pLe
e840: 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  af->p[iOff], (u6
e850: 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
e860: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
e870: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e880: 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20 20  et = iOff;..    
e890: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
e8a0: 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c  f->nn>pLeaf->szL
e8b0: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
e8c0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69       pIter->iPgi
e8d0: 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73  dxOff = pLeaf->s
e8e0: 7a 4c 65 61 66 20 2b 20 66 74 73 35 47 65 74 56  zLeaf + fts5GetV
e8f0: 61 72 69 6e 74 33 32 28 0a 20 20 20 20 20 20 20  arint32(.       
e900: 20 20 20 20 20 20 20 20 20 20 20 26 70 4c 65 61             &pLea
e910: 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65  f->p[pLeaf->szLe
e920: 61 66 5d 2c 20 70 49 74 65 72 2d 3e 69 45 6e 64  af], pIter->iEnd
e930: 6f 66 44 6f 63 6c 69 73 74 0a 20 20 20 20 20 20  ofDoclist.      
e940: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
e950: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
e960: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
e970: 65 6c 73 65 20 69 66 28 20 70 4c 65 61 66 2d 3e  else if( pLeaf->
e980: 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  nn>pLeaf->szLeaf
e990: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
e9a0: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
e9b0: 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66   = pLeaf->szLeaf
e9c0: 20 2b 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   + fts5GetVarint
e9d0: 33 32 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  32(.            
e9e0: 20 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70 4c      &pLeaf->p[pL
e9f0: 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 69 4f  eaf->szLeaf], iO
ea00: 66 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  ff.            )
ea10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
ea20: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
ea30: 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20   = iOff;.       
ea40: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64       pIter->iEnd
ea50: 6f 66 44 6f 63 6c 69 73 74 20 3d 20 69 4f 66 66  ofDoclist = iOff
ea60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 4e  ;.            bN
ea70: 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  ewTerm = 1;.    
ea80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ea90: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66    assert_nc( iOf
eaa0: 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  f<pLeaf->szLeaf 
eab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eac0: 20 20 20 7c 7c 20 70 2d 3e 70 43 6f 6e 66 69 67     || p->pConfig
ead0: 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
eae0: 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 0a 20 20 20  DETAIL_NONE .   
eaf0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
eb00: 20 20 20 20 69 66 28 20 69 4f 66 66 3e 70 4c 65      if( iOff>pLe
eb10: 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
eb20: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
eb30: 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
eb50: 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rn;.          }.
eb60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
eb70: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  }..      /* Chec
eb80: 6b 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  k if the iterato
eb90: 72 20 69 73 20 6e 6f 77 20 61 74 20 45 4f 46 2e  r is now at EOF.
eba0: 20 49 66 20 73 6f 2c 20 72 65 74 75 72 6e 20 65   If so, return e
ebb0: 61 72 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69  arly. */.      i
ebc0: 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  f( pIter->pLeaf 
ebd0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  ){.        if( b
ebe0: 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  NewTerm ){.     
ebf0: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
ec00: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
ec10: 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 7b 0a  ITER_ONETERM ){.
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
ec30: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
ec40: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  r->pLeaf);.     
ec50: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c         pIter->pL
ec60: 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  eaf = 0;.       
ec70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ec80: 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
ec90: 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74  rLoadTerm(p, pIt
eca0: 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  er, nKeep);.    
ecb0: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
ecc0: 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
ecd0: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Iter);.         
ece0: 20 20 20 69 66 28 20 70 62 4e 65 77 54 65 72 6d     if( pbNewTerm
ecf0: 20 29 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20   ) *pbNewTerm = 
ed00: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
ed10: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ed20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
ed30: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 75 6c 64 20 62  ollowing could b
ed40: 65 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e  e done by callin
ed50: 67 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61  g fts5SegIterLoa
ed60: 64 4e 50 6f 73 28 29 2e 20 42 75 74 0a 20 20 20  dNPos(). But.   
ed70: 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 62         ** this b
ed80: 6c 6f 63 6b 20 69 73 20 70 61 72 74 69 63 75 6c  lock is particul
ed90: 61 72 6c 79 20 70 65 72 66 6f 72 6d 61 6e 63 65  arly performance
eda0: 20 63 72 69 74 69 63 61 6c 2c 20 73 6f 20 65 71   critical, so eq
edb0: 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20 20  uivalent.       
edc0: 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 69 6e     ** code is in
edd0: 6c 69 6e 65 64 2e 20 0a 20 20 20 20 20 20 20 20  lined. .        
ede0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
edf0: 2a 20 4c 61 74 65 72 3a 20 53 77 69 74 63 68 65  * Later: Switche
ee00: 64 20 62 61 63 6b 20 74 6f 20 66 74 73 35 53 65  d back to fts5Se
ee10: 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 29 20  gIterLoadNPos() 
ee20: 62 65 63 61 75 73 65 20 69 74 20 73 75 70 70 6f  because it suppo
ee30: 72 74 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rts.          **
ee40: 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 6d 6f 64   detail=none mod
ee50: 65 2e 20 4e 6f 74 20 69 64 65 61 6c 2e 0a 20 20  e. Not ideal..  
ee60: 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 20 30          */.#if 0
ee70: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
ee80: 53 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  Sz;.          as
ee90: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
eea0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
eeb0: 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56      fts5FastGetV
eec0: 61 72 69 6e 74 33 32 28 70 49 74 65 72 2d 3e 70  arint32(pIter->p
eed0: 4c 65 61 66 2d 3e 70 2c 20 70 49 74 65 72 2d 3e  Leaf->p, pIter->
eee0: 69 4c 65 61 66 4f 66 66 73 65 74 2c 20 6e 53 7a  iLeafOffset, nSz
eef0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  );.          pIt
ef00: 65 72 2d 3e 62 44 65 6c 20 3d 20 28 6e 53 7a 20  er->bDel = (nSz 
ef10: 26 20 30 78 30 30 30 31 29 3b 0a 20 20 20 20 20  & 0x0001);.     
ef20: 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73       pIter->nPos
ef30: 20 3d 20 6e 53 7a 3e 3e 31 3b 0a 20 20 20 20 20   = nSz>>1;.     
ef40: 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
ef50: 70 49 74 65 72 2d 3e 6e 50 6f 73 3e 3d 30 20 29  pIter->nPos>=0 )
ef60: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
ef70: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
ef80: 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
ef90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
efa0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
efb0: 0a 23 64 65 66 69 6e 65 20 53 57 41 50 56 41 4c  .#define SWAPVAL
efc0: 28 54 2c 20 61 2c 20 62 29 20 7b 20 54 20 74 6d  (T, a, b) { T tm
efd0: 70 3b 20 74 6d 70 3d 61 3b 20 61 3d 62 3b 20 62  p; tmp=a; a=b; b
efe0: 3d 74 6d 70 3b 20 7d 0a 0a 23 64 65 66 69 6e 65  =tmp; }..#define
eff0: 20 66 74 73 35 49 6e 64 65 78 53 6b 69 70 56 61   fts5IndexSkipVa
f000: 72 69 6e 74 28 61 2c 20 69 4f 66 66 29 20 7b 20  rint(a, iOff) { 
f010: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69             \.  i
f020: 6e 74 20 69 45 6e 64 20 3d 20 69 4f 66 66 2b 39  nt iEnd = iOff+9
f030: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
f050: 0a 20 20 77 68 69 6c 65 28 20 28 61 5b 69 4f 66  .  while( (a[iOf
f060: 66 2b 2b 5d 20 26 20 30 78 38 30 29 20 26 26 20  f++] & 0x80) && 
f070: 69 4f 66 66 3c 69 45 6e 64 20 29 3b 20 20 20 20  iOff<iEnd );    
f080: 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74     \.}../*.** It
f090: 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75 72  erator pIter cur
f0a0: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
f0b0: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
f0c0: 20 69 6e 20 61 20 64 6f 63 6c 69 73 74 2e 20 54   in a doclist. T
f0d0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
f0e0: 73 65 74 73 20 74 68 65 20 69 74 65 72 61 74 6f  sets the iterato
f0f0: 72 20 75 70 20 73 6f 20 74 68 61 74 20 69 74 65  r up so that ite
f100: 72 61 74 65 73 20 69 6e 20 72 65 76 65 72 73 65  rates in reverse
f110: 20 6f 72 64 65 72 20 74 68 72 6f 75 67 68 0a 2a   order through.*
f120: 2a 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 0a 2a  * the doclist..*
f130: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
f140: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
f150: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
f160: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
f170: 72 29 7b 0a 20 20 69 6e 74 20 65 44 65 74 61 69  r){.  int eDetai
f180: 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  l = p->pConfig->
f190: 65 44 65 74 61 69 6c 3b 0a 20 20 46 74 73 35 44  eDetail;.  Fts5D
f1a0: 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
f1b0: 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78   = pIter->pDlidx
f1c0: 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c  ;.  Fts5Data *pL
f1d0: 61 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70  ast = 0;.  int p
f1e0: 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 0a 20 20  gnoLast = 0;..  
f1f0: 69 66 28 20 70 44 6c 69 64 78 20 29 7b 0a 20 20  if( pDlidx ){.  
f200: 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 70    int iSegid = p
f210: 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67  Iter->pSeg->iSeg
f220: 69 64 3b 0a 20 20 20 20 70 67 6e 6f 4c 61 73 74  id;.    pgnoLast
f230: 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
f240: 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20  Pgno(pDlidx);.  
f250: 20 20 70 4c 61 73 74 20 3d 20 66 74 73 35 44 61    pLast = fts5Da
f260: 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53  taRead(p, FTS5_S
f270: 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65  EGMENT_ROWID(iSe
f280: 67 69 64 2c 20 70 67 6e 6f 4c 61 73 74 29 29 3b  gid, pgnoLast));
f290: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74  .  }else{.    Ft
f2a0: 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20  s5Data *pLeaf = 
f2b0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20 20 20  pIter->pLeaf;   
f2c0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
f2d0: 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20   leaf data */.. 
f2e0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 2c     /* Currently,
f2f0: 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65   Fts5SegIter.iLe
f300: 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 73 20  afOffset points 
f310: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
f320: 65 20 6f 66 0a 20 20 20 20 2a 2a 20 70 6f 73 69  e of.    ** posi
f330: 74 69 6f 6e 2d 6c 69 73 74 20 63 6f 6e 74 65 6e  tion-list conten
f340: 74 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  t for the curren
f350: 74 20 72 6f 77 69 64 2e 20 42 61 63 6b 20 69 74  t rowid. Back it
f360: 20 75 70 20 73 6f 20 74 68 61 74 20 69 74 0a 20   up so that it. 
f370: 20 20 20 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20     ** points to 
f380: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
f390: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
f3a0: 69 7a 65 20 66 69 65 6c 64 2e 20 2a 2f 0a 23 69  ize field. */.#i
f3b0: 66 20 30 0a 20 20 20 20 69 66 28 20 65 44 65 74  f 0.    if( eDet
f3c0: 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail!=FTS5_DETAIL
f3d0: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70  _NONE ){.      p
f3e0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
f3f0: 74 20 2d 3d 20 73 71 6c 69 74 65 33 46 74 73 35  t -= sqlite3Fts5
f400: 47 65 74 56 61 72 69 6e 74 4c 65 6e 28 70 49 74  GetVarintLen(pIt
f410: 65 72 2d 3e 6e 50 6f 73 2a 32 2b 70 49 74 65 72  er->nPos*2+pIter
f420: 2d 3e 62 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 23  ->bDel);.    }.#
f430: 65 6c 73 65 0a 20 20 20 20 69 6e 74 20 69 50 6f  else.    int iPo
f440: 73 6c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70  slist;.    if( p
f450: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
f460: 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65 61  gno==pIter->iLea
f470: 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 69  fPgno ){.      i
f480: 50 6f 73 6c 69 73 74 20 3d 20 70 49 74 65 72 2d  Poslist = pIter-
f490: 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74  >iTermLeafOffset
f4a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f4b0: 20 20 20 69 50 6f 73 6c 69 73 74 20 3d 20 34 3b     iPoslist = 4;
f4c0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 49  .    }.    fts5I
f4d0: 6e 64 65 78 53 6b 69 70 56 61 72 69 6e 74 28 70  ndexSkipVarint(p
f4e0: 4c 65 61 66 2d 3e 70 2c 20 69 50 6f 73 6c 69 73  Leaf->p, iPoslis
f4f0: 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t);.    assert( 
f500: 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
f510: 54 41 49 4c 5f 4e 4f 4e 45 20 7c 7c 20 69 50 6f  TAIL_NONE || iPo
f520: 73 6c 69 73 74 3d 3d 28 0a 20 20 20 20 20 20 20  slist==(.       
f530: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
f540: 73 65 74 20 2d 20 73 71 6c 69 74 65 33 46 74 73  set - sqlite3Fts
f550: 35 47 65 74 56 61 72 69 6e 74 4c 65 6e 28 70 49  5GetVarintLen(pI
f560: 74 65 72 2d 3e 6e 50 6f 73 2a 32 2b 70 49 74 65  ter->nPos*2+pIte
f570: 72 2d 3e 62 44 65 6c 29 0a 20 20 20 20 29 29 3b  r->bDel).    ));
f580: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
f590: 66 4f 66 66 73 65 74 20 3d 20 69 50 6f 73 6c 69  fOffset = iPosli
f5a0: 73 74 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  st;.#endif..    
f5b0: 2f 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 64 69  /* If this condi
f5c0: 74 69 6f 6e 20 69 73 20 74 72 75 65 20 74 68 65  tion is true the
f5d0: 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  n the largest ro
f5e0: 77 69 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  wid for the curr
f5f0: 65 6e 74 0a 20 20 20 20 2a 2a 20 74 65 72 6d 20  ent.    ** term 
f600: 6d 61 79 20 6e 6f 74 20 62 65 20 73 74 6f 72 65  may not be store
f610: 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  d on the current
f620: 20 70 61 67 65 2e 20 53 6f 20 73 65 61 72 63 68   page. So search
f630: 20 66 6f 72 77 61 72 64 20 74 6f 0a 20 20 20 20   forward to.    
f640: 2a 2a 20 73 65 65 20 77 68 65 72 65 20 73 61 69  ** see where sai
f650: 64 20 72 6f 77 69 64 20 72 65 61 6c 6c 79 20 69  d rowid really i
f660: 73 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  s.  */.    if( p
f670: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
f680: 69 73 74 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65  ist>=pLeaf->szLe
f690: 61 66 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  af ){.      int 
f6a0: 70 67 6e 6f 3b 0a 20 20 20 20 20 20 46 74 73 35  pgno;.      Fts5
f6b0: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
f6c0: 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d 3e   *pSeg = pIter->
f6d0: 70 53 65 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  pSeg;..      /* 
f6e0: 54 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20 69  The last rowid i
f6f0: 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20 6d 61  n the doclist ma
f700: 79 20 6e 6f 74 20 62 65 20 6f 6e 20 74 68 65 20  y not be on the 
f710: 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 53 65  current page. Se
f720: 61 72 63 68 0a 20 20 20 20 20 20 2a 2a 20 66 6f  arch.      ** fo
f730: 72 77 61 72 64 20 74 6f 20 66 69 6e 64 20 74 68  rward to find th
f740: 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  e page containin
f750: 67 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64  g the last rowid
f760: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  .  */.      for(
f770: 70 67 6e 6f 3d 70 49 74 65 72 2d 3e 69 4c 65 61  pgno=pIter->iLea
f780: 66 50 67 6e 6f 2b 31 3b 20 21 70 2d 3e 72 63 20  fPgno+1; !p->rc 
f790: 26 26 20 70 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70  && pgno<=pSeg->p
f7a0: 67 6e 6f 4c 61 73 74 3b 20 70 67 6e 6f 2b 2b 29  gnoLast; pgno++)
f7b0: 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 41  {.        i64 iA
f7c0: 62 73 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  bs = FTS5_SEGMEN
f7d0: 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53  T_ROWID(pSeg->iS
f7e0: 65 67 69 64 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  egid, pgno);.   
f7f0: 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70       Fts5Data *p
f800: 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61 52 65  New = fts5DataRe
f810: 61 64 28 70 2c 20 69 41 62 73 29 3b 0a 20 20 20  ad(p, iAbs);.   
f820: 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
f830: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
f840: 52 6f 77 69 64 2c 20 62 54 65 72 6d 6c 65 73 73  Rowid, bTermless
f850: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 77  ;.          iRow
f860: 69 64 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72  id = fts5LeafFir
f870: 73 74 52 6f 77 69 64 4f 66 66 28 70 4e 65 77 29  stRowidOff(pNew)
f880: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 54 65 72  ;.          bTer
f890: 6d 6c 65 73 73 20 3d 20 66 74 73 35 4c 65 61 66  mless = fts5Leaf
f8a0: 49 73 54 65 72 6d 6c 65 73 73 28 70 4e 65 77 29  IsTermless(pNew)
f8b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
f8c0: 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  iRowid ){.      
f8d0: 20 20 20 20 20 20 53 57 41 50 56 41 4c 28 46 74        SWAPVAL(Ft
f8e0: 73 35 44 61 74 61 2a 2c 20 70 4e 65 77 2c 20 70  s5Data*, pNew, p
f8f0: 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Last);.         
f900: 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67     pgnoLast = pg
f910: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  no;.          }.
f920: 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61            fts5Da
f930: 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77 29 3b  taRelease(pNew);
f940: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 62  .          if( b
f950: 54 65 72 6d 6c 65 73 73 3d 3d 30 20 29 20 62 72  Termless==0 ) br
f960: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
f970: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f980: 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 61 73 74 20  ..  /* If pLast 
f990: 69 73 20 4e 55 4c 4c 20 61 74 20 74 68 69 73 20  is NULL at this 
f9a0: 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 65 20  point, then the 
f9b0: 6c 61 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74  last rowid for t
f9c0: 68 69 73 20 64 6f 63 6c 69 73 74 0a 20 20 2a 2a  his doclist.  **
f9d0: 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67   lies on the pag
f9e0: 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 64 69  e currently indi
f9f0: 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65  cated by the ite
fa00: 72 61 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63  rator. In this c
fa10: 61 73 65 20 0a 20 20 2a 2a 20 70 49 74 65 72 2d  ase .  ** pIter-
fa20: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 69 73 20  >iLeafOffset is 
fa30: 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 70  already set to p
fa40: 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 6f 73 69  oint to the posi
fa50: 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 20  tion-list size. 
fa60: 20 2a 2a 20 66 69 65 6c 64 20 61 73 73 6f 63 69   ** field associ
fa70: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
fa80: 72 73 74 20 72 65 6c 65 76 61 6e 74 20 72 6f 77  rst relevant row
fa90: 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  id on the page..
faa0: 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69 66    **.  ** Or, if
fab0: 20 70 4c 61 73 74 20 69 73 20 6e 6f 6e 2d 4e 55   pLast is non-NU
fac0: 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  LL, then it is t
fad0: 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
fae0: 74 61 69 6e 73 20 74 68 65 20 6c 61 73 74 0a 20  tains the last. 
faf0: 20 2a 2a 20 72 6f 77 69 64 2e 20 49 6e 20 74 68   ** rowid. In th
fb00: 69 73 20 63 61 73 65 20 63 6f 6e 66 69 67 75 72  is case configur
fb10: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73  e the iterator s
fb20: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
fb30: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69 72   to the.  ** fir
fb40: 73 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 69 73  st rowid on this
fb50: 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
fb60: 28 20 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 69  ( pLast ){.    i
fb70: 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 66 74 73  nt iOff;.    fts
fb80: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
fb90: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20  er->pLeaf);.    
fba0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
fbb0: 4c 61 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d  Last;.    pIter-
fbc0: 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 67 6e  >iLeafPgno = pgn
fbd0: 6f 4c 61 73 74 3b 0a 20 20 20 20 69 4f 66 66 20  oLast;.    iOff 
fbe0: 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  = fts5LeafFirstR
fbf0: 6f 77 69 64 4f 66 66 28 70 4c 61 73 74 29 3b 0a  owidOff(pLast);.
fc00: 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
fc10: 47 65 74 56 61 72 69 6e 74 28 26 70 4c 61 73 74  GetVarint(&pLast
fc20: 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  ->p[iOff], (u64*
fc30: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
fc40: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
fc50: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
fc60: 0a 0a 20 20 20 20 69 66 28 20 66 74 73 35 4c 65  ..    if( fts5Le
fc70: 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 61  afIsTermless(pLa
fc80: 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70 49 74  st) ){.      pIt
fc90: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
fca0: 74 20 3d 20 70 4c 61 73 74 2d 3e 6e 6e 2b 31 3b  t = pLast->nn+1;
fcb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
fcc0: 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
fcd0: 6f 63 6c 69 73 74 20 3d 20 66 74 73 35 4c 65 61  oclist = fts5Lea
fce0: 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70 4c  fFirstTermOff(pL
fcf0: 61 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  ast);.    }..  }
fd00: 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 52  ..  fts5SegIterR
fd10: 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70  everseInitPage(p
fd20: 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pIter);.}../*.
fd30: 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65  ** Iterator pIte
fd40: 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
fd50: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
fd60: 72 6f 77 69 64 20 6f 66 20 61 20 64 6f 63 6c 69  rowid of a docli
fd70: 73 74 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  st..** There is 
fd80: 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
fd90: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
fda0: 74 68 65 20 66 69 6e 61 6c 20 74 65 72 6d 20 6f  the final term o
fdb0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 2a  n the current .*
fdc0: 2a 20 70 61 67 65 2e 20 49 66 20 74 68 65 20 63  * page. If the c
fdd0: 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20 74  urrent term is t
fde0: 68 65 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20  he last term on 
fdf0: 74 68 65 20 70 61 67 65 2c 20 6c 6f 61 64 20 74  the page, load t
fe00: 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69  he .** doclist-i
fe10: 6e 64 65 78 20 66 72 6f 6d 20 64 69 73 6b 20 61  ndex from disk a
fe20: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e  nd initialize an
fe30: 20 69 74 65 72 61 74 6f 72 20 61 74 20 28 70 49   iterator at (pI
fe40: 74 65 72 2d 3e 70 44 6c 69 64 78 29 2e 0a 2a 2f  ter->pDlidx)..*/
fe50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
fe60: 35 53 65 67 49 74 65 72 4c 6f 61 64 44 6c 69 64  5SegIterLoadDlid
fe70: 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  x(Fts5Index *p, 
fe80: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
fe90: 65 72 29 7b 0a 20 20 69 6e 74 20 69 53 65 67 20  er){.  int iSeg 
fea0: 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69  = pIter->pSeg->i
feb0: 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 62 52 65  Segid;.  int bRe
fec0: 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67  v = (pIter->flag
fed0: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
fee0: 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73  _REVERSE);.  Fts
fef0: 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70  5Data *pLeaf = p
ff00: 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20 2f 2a 20  Iter->pLeaf; /* 
ff10: 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74  Current leaf dat
ff20: 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  a */..  assert( 
ff30: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
ff40: 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
ff50: 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ERM );.  assert(
ff60: 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3d 3d   pIter->pDlidx==
ff70: 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  0 );..  /* Check
ff80: 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
ff90: 64 6f 63 6c 69 73 74 20 65 6e 64 73 20 6f 6e 20  doclist ends on 
ffa0: 74 68 69 73 20 70 61 67 65 2e 20 49 66 20 69 74  this page. If it
ffb0: 20 64 6f 65 73 2c 20 72 65 74 75 72 6e 0a 20 20   does, return.  
ffc0: 2a 2a 20 65 61 72 6c 79 20 77 69 74 68 6f 75 74  ** early without
ffd0: 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 6f 63   loading the doc
ffe0: 6c 69 73 74 2d 69 6e 64 65 78 20 28 61 73 20 69  list-index (as i
fff0: 74 20 62 65 6c 6f 6e 67 73 20 74 6f 20 61 20 64  t belongs to a d
10000 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a 20 74 65  ifferent.  ** te
10010 72 6d 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 74  rm. */.  if( pIt
10020 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  er->iTermLeafPgn
10030 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  o==pIter->iLeafP
10040 67 6e 6f 20 0a 20 20 20 26 26 20 70 49 74 65 72  gno .   && pIter
10050 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3c  ->iEndofDoclist<
10060 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 0a 20  pLeaf->szLeaf . 
10070 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
10080 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 70 44    }..  pIter->pD
10090 6c 69 64 78 20 3d 20 66 74 73 35 44 6c 69 64 78  lidx = fts5Dlidx
100a0 49 74 65 72 49 6e 69 74 28 70 2c 20 62 52 65 76  IterInit(p, bRev
100b0 2c 20 69 53 65 67 2c 20 70 49 74 65 72 2d 3e 69  , iSeg, pIter->i
100c0 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a 7d  TermLeafPgno);.}
100d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72  ../*.** The iter
100e0 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ator object pass
100f0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
10100 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65 6e   argument curren
10110 74 6c 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  tly contains.** 
10120 6e 6f 20 76 61 6c 69 64 20 76 61 6c 75 65 73 20  no valid values 
10130 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20 46  except for the F
10140 74 73 35 53 65 67 49 74 65 72 2e 70 4c 65 61 66  ts5SegIter.pLeaf
10150 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
10160 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
10170 6f 6e 20 73 65 61 72 63 68 65 73 20 74 68 65 20  on searches the 
10180 6c 65 61 66 20 70 61 67 65 20 66 6f 72 20 61 20  leaf page for a 
10190 74 65 72 6d 20 6d 61 74 63 68 69 6e 67 20 28 70  term matching (p
101a0 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 2a 2a 0a  Term/nTerm)..**.
101b0 2a 2a 20 49 66 20 74 68 65 20 73 70 65 63 69 66  ** If the specif
101c0 69 65 64 20 74 65 72 6d 20 69 73 20 66 6f 75 6e  ied term is foun
101d0 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74  d on the page, t
101e0 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 6f 72  hen the iterator
101f0 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e   is left.** poin
10200 74 69 6e 67 20 74 6f 20 69 74 2e 20 49 66 20 61  ting to it. If a
10210 72 67 75 6d 65 6e 74 20 62 47 65 20 69 73 20 7a  rgument bGe is z
10220 65 72 6f 20 61 6e 64 20 74 68 65 20 74 65 72 6d  ero and the term
10230 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 0a 2a   is not found,.*
10240 2a 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  * the iterator i
10250 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
10260 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66  at EOF..**.** If
10270 20 62 47 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f   bGe is non-zero
10280 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69   and the specifi
10290 65 64 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 66  ed term is not f
102a0 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a  ound, then the.*
102b0 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65  * iterator is le
102c0 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ft pointing to t
102d0 68 65 20 73 6d 61 6c 6c 65 73 74 20 74 65 72 6d  he smallest term
102e0 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20   in the segment 
102f0 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67 65  that.** is large
10300 72 20 74 68 61 6e 20 74 68 65 20 73 70 65 63 69  r than the speci
10310 66 69 65 64 20 74 65 72 6d 2c 20 65 76 65 6e 20  fied term, even 
10320 69 66 20 74 68 69 73 20 74 65 72 6d 20 69 73 20  if this term is 
10330 6e 6f 74 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75  not on the.** cu
10340 72 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2f 0a 73  rrent page..*/.s
10350 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4c  tatic void fts5L
10360 65 61 66 53 65 65 6b 28 0a 20 20 46 74 73 35 49  eafSeek(.  Fts5I
10370 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
10380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
10390 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 63 6f  ave any error co
103a0 64 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  de here */.  int
103b0 20 62 47 65 2c 20 20 20 20 20 20 20 20 20 20 20   bGe,           
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
103d0 54 72 75 65 20 66 6f 72 20 61 20 3e 3d 20 73 65  True for a >= se
103e0 61 72 63 68 20 2a 2f 0a 20 20 46 74 73 35 53 65  arch */.  Fts5Se
103f0 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  gIter *pIter,   
10400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
10410 72 61 74 6f 72 20 74 6f 20 73 65 65 6b 20 2a 2f  rator to seek */
10420 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65  .  const u8 *pTe
10430 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20 20  rm, int nTerm   
10440 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65     /* Term to se
10450 61 72 63 68 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20  arch for */.){. 
10460 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 63 6f 6e   int iOff;.  con
10470 73 74 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72  st u8 *a = pIter
10480 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 69 6e  ->pLeaf->p;.  in
10490 74 20 73 7a 4c 65 61 66 20 3d 20 70 49 74 65 72  t szLeaf = pIter
104a0 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b  ->pLeaf->szLeaf;
104b0 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72  .  int n = pIter
104c0 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a 20 20  ->pLeaf->nn;..  
104d0 69 6e 74 20 6e 4d 61 74 63 68 20 3d 20 30 3b 0a  int nMatch = 0;.
104e0 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b    int nKeep = 0;
104f0 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b  .  int nNew = 0;
10500 0a 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 3b  .  int iTermOff;
10510 0a 20 20 69 6e 74 20 69 50 67 69 64 78 3b 20 20  .  int iPgidx;  
10520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10530 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66     /* Current of
10540 66 73 65 74 20 69 6e 20 70 67 69 64 78 20 2a 2f  fset in pgidx */
10550 0a 20 20 69 6e 74 20 62 45 6e 64 4f 66 50 61 67  .  int bEndOfPag
10560 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
10570 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
10580 4f 4b 20 29 3b 0a 0a 20 20 69 50 67 69 64 78 20  OK );..  iPgidx 
10590 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 69 50 67 69  = szLeaf;.  iPgi
105a0 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  dx += fts5GetVar
105b0 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 5d  int32(&a[iPgidx]
105c0 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20 69  , iTermOff);.  i
105d0 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a  Off = iTermOff;.
105e0 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a  .  while( 1 ){..
105f0 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
10600 74 20 68 6f 77 20 6d 61 6e 79 20 6e 65 77 20 62  t how many new b
10610 79 74 65 73 20 61 72 65 20 69 6e 20 74 68 69 73  ytes are in this
10620 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 66 74 73   term */.    fts
10630 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32  5FastGetVarint32
10640 28 61 2c 20 69 4f 66 66 2c 20 6e 4e 65 77 29 3b  (a, iOff, nNew);
10650 0a 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3c 6e  .    if( nKeep<n
10660 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 67  Match ){.      g
10670 6f 74 6f 20 73 65 61 72 63 68 5f 66 61 69 6c 65  oto search_faile
10680 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  d;.    }..    as
10690 73 65 72 74 28 20 6e 4b 65 65 70 3e 3d 6e 4d 61  sert( nKeep>=nMa
106a0 74 63 68 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  tch );.    if( n
106b0 4b 65 65 70 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a  Keep==nMatch ){.
106c0 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a        int nCmp;.
106d0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
106e0 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4e     nCmp = MIN(nN
106f0 65 77 2c 20 6e 54 65 72 6d 2d 6e 4d 61 74 63 68  ew, nTerm-nMatch
10700 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
10710 3b 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a  ; i<nCmp; i++){.
10720 20 20 20 20 20 20 20 20 69 66 28 20 61 5b 69 4f          if( a[iO
10730 66 66 2b 69 5d 21 3d 70 54 65 72 6d 5b 6e 4d 61  ff+i]!=pTerm[nMa
10740 74 63 68 2b 69 5d 20 29 20 62 72 65 61 6b 3b 0a  tch+i] ) break;.
10750 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4d        }.      nM
10760 61 74 63 68 20 2b 3d 20 69 3b 0a 0a 20 20 20 20  atch += i;..    
10770 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 6e 4d 61    if( nTerm==nMa
10780 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69  tch ){.        i
10790 66 28 20 69 3d 3d 6e 4e 65 77 20 29 7b 0a 20 20  f( i==nNew ){.  
107a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61          goto sea
107b0 72 63 68 5f 73 75 63 63 65 73 73 3b 0a 20 20 20  rch_success;.   
107c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
107d0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63        goto searc
107e0 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  h_failed;.      
107f0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
10800 69 66 28 20 69 3c 6e 4e 65 77 20 26 26 20 61 5b  if( i<nNew && a[
10810 69 4f 66 66 2b 69 5d 3e 70 54 65 72 6d 5b 6e 4d  iOff+i]>pTerm[nM
10820 61 74 63 68 5d 20 29 7b 0a 20 20 20 20 20 20 20  atch] ){.       
10830 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61 69   goto search_fai
10840 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  led;.      }.   
10850 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 50 67 69   }..    if( iPgi
10860 64 78 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 62  dx>=n ){.      b
10870 45 6e 64 4f 66 50 61 67 65 20 3d 20 31 3b 0a 20  EndOfPage = 1;. 
10880 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10890 7d 0a 0a 20 20 20 20 69 50 67 69 64 78 20 2b 3d  }..    iPgidx +=
108a0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
108b0 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 6e 4b 65  (&a[iPgidx], nKe
108c0 65 70 29 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66  ep);.    iTermOf
108d0 66 20 2b 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20  f += nKeep;.    
108e0 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
108f0 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
10900 65 20 6e 4b 65 65 70 20 66 69 65 6c 64 20 6f 66  e nKeep field of
10910 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 2e 20   the next term. 
10920 2a 2f 0a 20 20 20 20 66 74 73 35 46 61 73 74 47  */.    fts5FastG
10930 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20 69 4f  etVarint32(a, iO
10940 66 66 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 7d 0a  ff, nKeep);.  }.
10950 0a 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3a  . search_failed:
10960 0a 20 20 69 66 28 20 62 47 65 3d 3d 30 20 29 7b  .  if( bGe==0 ){
10970 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
10980 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
10990 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  f);.    pIter->p
109a0 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 72 65  Leaf = 0;.    re
109b0 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  turn;.  }else if
109c0 28 20 62 45 6e 64 4f 66 50 61 67 65 20 29 7b 0a  ( bEndOfPage ){.
109d0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 66      do {.      f
109e0 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
109f0 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
10a00 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
10a10 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e  Leaf==0 ) return
10a20 3b 0a 20 20 20 20 20 20 61 20 3d 20 70 49 74 65  ;.      a = pIte
10a30 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20  r->pLeaf->p;.   
10a40 20 20 20 69 66 28 20 66 74 73 35 4c 65 61 66 49     if( fts5LeafI
10a50 73 54 65 72 6d 6c 65 73 73 28 70 49 74 65 72 2d  sTermless(pIter-
10a60 3e 70 4c 65 61 66 29 3d 3d 30 20 29 7b 0a 20 20  >pLeaf)==0 ){.  
10a70 20 20 20 20 20 20 69 50 67 69 64 78 20 3d 20 70        iPgidx = p
10a80 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
10a90 65 61 66 3b 0a 20 20 20 20 20 20 20 20 69 50 67  eaf;.        iPg
10aa0 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61  idx += fts5GetVa
10ab0 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 70  rint32(&pIter->p
10ac0 4c 65 61 66 2d 3e 70 5b 69 50 67 69 64 78 5d 2c  Leaf->p[iPgidx],
10ad0 20 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20   iOff);.        
10ae0 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20 69 4f  if( iOff<4 || iO
10af0 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66  ff>=pIter->pLeaf
10b00 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
10b10 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
10b20 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
10b30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10b40 20 20 20 20 20 6e 4b 65 65 70 20 3d 20 30 3b 0a       nKeep = 0;.
10b50 20 20 20 20 20 20 20 20 20 20 69 54 65 72 6d 4f            iTermO
10b60 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  ff = iOff;.     
10b70 20 20 20 20 20 6e 20 3d 20 70 49 74 65 72 2d 3e       n = pIter->
10b80 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 20 20 20 20 20  pLeaf->nn;.     
10b90 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
10ba0 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
10bb0 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20  iOff], nNew);.  
10bc0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10bd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10be0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 31 20 29  .    }while( 1 )
10bf0 3b 0a 20 20 7d 0a 0a 20 73 65 61 72 63 68 5f 73  ;.  }.. search_s
10c00 75 63 63 65 73 73 3a 0a 0a 20 20 70 49 74 65 72  uccess:..  pIter
10c10 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
10c20 69 4f 66 66 20 2b 20 6e 4e 65 77 3b 0a 20 20 70  iOff + nNew;.  p
10c30 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f  Iter->iTermLeafO
10c40 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 69  ffset = pIter->i
10c50 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 70 49  LeafOffset;.  pI
10c60 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
10c70 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  no = pIter->iLea
10c80 66 50 67 6e 6f 3b 0a 0a 20 20 66 74 73 35 42 75  fPgno;..  fts5Bu
10c90 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
10ca0 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4b  &pIter->term, nK
10cb0 65 65 70 2c 20 70 54 65 72 6d 29 3b 0a 20 20 66  eep, pTerm);.  f
10cc0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
10cd0 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 49 74  lob(&p->rc, &pIt
10ce0 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20  er->term, nNew, 
10cf0 26 61 5b 69 4f 66 66 5d 29 3b 0a 0a 20 20 69 66  &a[iOff]);..  if
10d00 28 20 69 50 67 69 64 78 3e 3d 6e 20 29 7b 0a 20  ( iPgidx>=n ){. 
10d10 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
10d20 44 6f 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d  Doclist = pIter-
10d30 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20  >pLeaf->nn+1;.  
10d40 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
10d50 45 78 74 72 61 3b 0a 20 20 20 20 69 50 67 69 64  Extra;.    iPgid
10d60 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  x += fts5GetVari
10d70 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 5d 2c  nt32(&a[iPgidx],
10d80 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 70 49   nExtra);.    pI
10d90 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
10da0 73 74 20 3d 20 69 54 65 72 6d 4f 66 66 20 2b 20  st = iTermOff + 
10db0 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 20 20 70 49  nExtra;.  }.  pI
10dc0 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d  ter->iPgidxOff =
10dd0 20 69 50 67 69 64 78 3b 0a 0a 20 20 66 74 73 35   iPgidx;..  fts5
10de0 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64  SegIterLoadRowid
10df0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 66 74  (p, pIter);.  ft
10e00 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
10e10 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a  s(p, pIter);.}..
10e20 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
10e30 20 74 68 65 20 6f 62 6a 65 63 74 20 70 49 74 65   the object pIte
10e40 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 65  r to point to te
10e50 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 77  rm pTerm/nTerm w
10e60 69 74 68 69 6e 20 73 65 67 6d 65 6e 74 0a 2a 2a  ithin segment.**
10e70 20 70 53 65 67 2e 20 49 66 20 74 68 65 72 65 20   pSeg. If there 
10e80 69 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20  is no such term 
10e90 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68  in the index, th
10ea0 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 73 65  e iterator is se
10eb0 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20  t to EOF..**.** 
10ec0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
10ed0 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63  rs, Fts5Index.rc
10ee0 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70   is set to an ap
10ef0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
10f00 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20  code. If .** an 
10f10 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
10f20 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
10f30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
10f40 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
10f50 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
10f60 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
10f70 65 72 53 65 65 6b 49 6e 69 74 28 0a 20 20 46 74  erSeekInit(.  Ft
10f80 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10fa0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f   FTS5 backend */
10fb0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
10fc0 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
10fd0 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
10fe0 75 73 65 20 66 6f 72 20 6c 6f 61 64 69 6e 67 20  use for loading 
10ff0 70 61 67 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  pages */.  const
11000 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
11010 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65  nTerm,     /* Te
11020 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f  rm to seek to */
11030 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
11040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11050 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54     /* Mask of FT
11060 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67  S5INDEX_XXX flag
11070 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  s */.  Fts5Struc
11080 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
11090 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  g,     /* Descri
110a0 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74  ption of segment
110b0 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
110c0 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20  r *pIter        
110d0 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20        /* Object 
110e0 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29  to populate */.)
110f0 7b 0a 20 20 69 6e 74 20 69 50 67 20 3d 20 31 3b  {.  int iPg = 1;
11100 0a 20 20 69 6e 74 20 62 47 65 20 3d 20 28 66 6c  .  int bGe = (fl
11110 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
11120 51 55 45 52 59 5f 53 43 41 4e 29 3b 0a 20 20 69  QUERY_SCAN);.  i
11130 6e 74 20 62 44 6c 69 64 78 20 3d 20 30 3b 20 20  nt bDlidx = 0;  
11140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11150 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20  * True if there 
11160 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  is a doclist-ind
11170 65 78 20 2a 2f 0a 0a 20 20 73 74 61 74 69 63 20  ex */..  static 
11180 69 6e 74 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a 20  int nCall = 0;. 
11190 20 6e 43 61 6c 6c 2b 2b 3b 0a 0a 20 20 61 73 73   nCall++;..  ass
111a0 65 72 74 28 20 62 47 65 3d 3d 30 20 7c 7c 20 28  ert( bGe==0 || (
111b0 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
111c0 58 5f 51 55 45 52 59 5f 44 45 53 43 29 3d 3d 30  X_QUERY_DESC)==0
111d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
111e0 65 72 6d 20 26 26 20 6e 54 65 72 6d 20 29 3b 0a  erm && nTerm );.
111f0 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
11200 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72  0, sizeof(*pIter
11210 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 53 65  ));.  pIter->pSe
11220 67 20 3d 20 70 53 65 67 3b 0a 0a 20 20 2f 2a 20  g = pSeg;..  /* 
11230 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 74 73 20  This block sets 
11240 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20 69  stack variable i
11250 50 67 20 74 6f 20 74 68 65 20 6c 65 61 66 20 70  Pg to the leaf p
11260 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20  age number that 
11270 6d 61 79 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  may.  ** contain
11280 20 74 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65   term (pTerm/nTe
11290 72 6d 29 2c 20 69 66 20 69 74 20 69 73 20 70 72  rm), if it is pr
112a0 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73 65 67  esent in the seg
112b0 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ment. */.  if( p
112c0 2d 3e 70 49 64 78 53 65 6c 65 63 74 3d 3d 30 20  ->pIdxSelect==0 
112d0 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69  ){.    Fts5Confi
112e0 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
112f0 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73  pConfig;.    fts
11300 35 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d  5IndexPrepareStm
11310 74 28 70 2c 20 26 70 2d 3e 70 49 64 78 53 65 6c  t(p, &p->pIdxSel
11320 65 63 74 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72  ect, sqlite3_mpr
11330 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
11340 22 53 45 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f  "SELECT pgno FRO
11350 4d 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27 20  M '%q'.'%q_idx' 
11360 57 48 45 52 45 20 22 0a 20 20 20 20 20 20 20 20  WHERE ".        
11370 20 20 22 73 65 67 69 64 3d 3f 20 41 4e 44 20 74    "segid=? AND t
11380 65 72 6d 3c 3d 3f 20 4f 52 44 45 52 20 42 59 20  erm<=? ORDER BY 
11390 74 65 72 6d 20 44 45 53 43 20 4c 49 4d 49 54 20  term DESC LIMIT 
113a0 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43  1",.          pC
113b0 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e  onfig->zDb, pCon
113c0 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  fig->zName.    )
113d0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
113e0 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  rc ) return;.  s
113f0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
11400 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 2c 20 31  p->pIdxSelect, 1
11410 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 29 3b  , pSeg->iSegid);
11420 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
11430 62 6c 6f 62 28 70 2d 3e 70 49 64 78 53 65 6c 65  blob(p->pIdxSele
11440 63 74 2c 20 32 2c 20 70 54 65 72 6d 2c 20 6e 54  ct, 2, pTerm, nT
11450 65 72 6d 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  erm, SQLITE_STAT
11460 49 43 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  IC);.  if( SQLIT
11470 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
11480 74 65 70 28 70 2d 3e 70 49 64 78 53 65 6c 65 63  tep(p->pIdxSelec
11490 74 29 20 29 7b 0a 20 20 20 20 69 36 34 20 76 61  t) ){.    i64 va
114a0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
114b0 6d 6e 5f 69 6e 74 28 70 2d 3e 70 49 64 78 53 65  mn_int(p->pIdxSe
114c0 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 50  lect, 0);.    iP
114d0 67 20 3d 20 28 69 6e 74 29 28 76 61 6c 3e 3e 31  g = (int)(val>>1
114e0 29 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20  );.    bDlidx = 
114f0 28 76 61 6c 20 26 20 30 78 30 30 30 31 29 3b 0a  (val & 0x0001);.
11500 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71    }.  p->rc = sq
11510 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70  lite3_reset(p->p
11520 49 64 78 53 65 6c 65 63 74 29 3b 0a 0a 20 20 69  IdxSelect);..  i
11530 66 28 20 69 50 67 3c 70 53 65 67 2d 3e 70 67 6e  f( iPg<pSeg->pgn
11540 6f 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69 50  oFirst ){.    iP
11550 67 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69  g = pSeg->pgnoFi
11560 72 73 74 3b 0a 20 20 20 20 62 44 6c 69 64 78 20  rst;.    bDlidx 
11570 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65  = 0;.  }..  pIte
11580 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69  r->iLeafPgno = i
11590 50 67 20 2d 20 31 3b 0a 20 20 66 74 73 35 53 65  Pg - 1;.  fts5Se
115a0 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
115b0 20 70 49 74 65 72 29 3b 0a 0a 20 20 69 66 28 20   pIter);..  if( 
115c0 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a  pIter->pLeaf ){.
115d0 20 20 20 20 66 74 73 35 4c 65 61 66 53 65 65 6b      fts5LeafSeek
115e0 28 70 2c 20 62 47 65 2c 20 70 49 74 65 72 2c 20  (p, bGe, pIter, 
115f0 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  pTerm, nTerm);. 
11600 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
11610 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 47  =SQLITE_OK && bG
11620 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 74 65  e==0 ){.    pIte
11630 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35  r->flags |= FTS5
11640 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
11650 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
11660 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  >pLeaf ){.      
11670 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35  if( flags & FTS5
11680 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
11690 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65   ){.        pIte
116a0 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35  r->flags |= FTS5
116b0 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
116c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
116d0 69 66 28 20 62 44 6c 69 64 78 20 29 7b 0a 20 20  if( bDlidx ){.  
116e0 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
116f0 72 4c 6f 61 64 44 6c 69 64 78 28 70 2c 20 70 49  rLoadDlidx(p, pI
11700 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
11710 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
11720 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
11730 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20  DESC ){.        
11740 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
11750 73 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  se(p, pIter);.  
11760 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11770 0a 20 20 2f 2a 20 45 69 74 68 65 72 3a 0a 20 20  .  /* Either:.  
11780 2a 2a 0a 20 20 2a 2a 20 20 20 31 29 20 61 6e 20  **.  **   1) an 
11790 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
117a0 65 64 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 32 29  ed, or.  **   2)
117b0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f   the iterator po
117c0 69 6e 74 73 20 74 6f 20 45 4f 46 2c 20 6f 72 0a  ints to EOF, or.
117d0 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20 69 74    **   3) the it
117e0 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f  erator points to
117f0 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 74   an entry with t
11800 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d  erm (pTerm/nTerm
11810 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 34 29 20  ), or.  **   4) 
11820 74 68 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55  the FTS5INDEX_QU
11830 45 52 59 5f 53 43 41 4e 20 66 6c 61 67 20 77 61  ERY_SCAN flag wa
11840 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 69 74  s set and the it
11850 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 0a 20 20  erator points.  
11860 2a 2a 20 20 20 20 20 20 74 6f 20 61 6e 20 65 6e  **      to an en
11870 74 72 79 20 77 69 74 68 20 61 20 74 65 72 6d 20  try with a term 
11880 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
11890 65 71 75 61 6c 20 74 6f 20 28 70 54 65 72 6d 2f  equal to (pTerm/
118a0 6e 54 65 72 6d 29 2e 0a 20 20 2a 2f 0a 20 20 61  nTerm)..  */.  a
118b0 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
118c0 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20  LITE_OK         
118d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118f0 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 7c 7c 20 70   /* 1 */.   || p
11900 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 20  Iter->pLeaf==0  
11910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11940 32 20 2a 2f 0a 20 20 20 7c 7c 20 66 74 73 35 42  2 */.   || fts5B
11950 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62  ufferCompareBlob
11960 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70  (&pIter->term, p
11970 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3d 3d 30 20  Term, nTerm)==0 
11980 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20 2a 2f           /* 3 */
11990 0a 20 20 20 7c 7c 20 28 62 47 65 20 26 26 20 66  .   || (bGe && f
119a0 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65  ts5BufferCompare
119b0 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e 74 65 72  Blob(&pIter->ter
119c0 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29  m, pTerm, nTerm)
119d0 3e 30 29 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 29  >0)  /* 4 */.  )
119e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
119f0 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74  alize the object
11a00 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
11a10 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54  to term pTerm/nT
11a20 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 0a 2a  erm within the.*
11a30 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  * in-memory hash
11a40 20 74 61 62 6c 65 2e 20 49 66 20 74 68 65 72 65   table. If there
11a50 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d   is no such term
11a60 20 69 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62   in the hash-tab
11a70 6c 65 2c 20 74 68 65 20 0a 2a 2a 20 69 74 65 72  le, the .** iter
11a80 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45  ator is set to E
11a90 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  OF..**.** If an 
11aa0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74  error occurs, Ft
11ab0 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65  s5Index.rc is se
11ac0 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69  t to an appropri
11ad0 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ate error code. 
11ae0 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  If .** an error 
11af0 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
11b00 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
11b10 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
11b20 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
11b30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11b40 20 66 74 73 35 53 65 67 49 74 65 72 48 61 73 68   fts5SegIterHash
11b50 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Init(.  Fts5Inde
11b60 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
11b70 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
11b80 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e  backend */.  con
11b90 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e  st u8 *pTerm, in
11ba0 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20  t nTerm,     /* 
11bb0 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20  Term to seek to 
11bc0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
11bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11be0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
11bf0 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c  FTS5INDEX_XXX fl
11c00 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ags */.  Fts5Seg
11c10 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
11c20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
11c30 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a  ct to populate *
11c40 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20  /.){.  const u8 
11c50 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e  *pList = 0;.  in
11c60 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63  t nList = 0;.  c
11c70 6f 6e 73 74 20 75 38 20 2a 7a 20 3d 20 30 3b 0a  onst u8 *z = 0;.
11c80 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a 20 20    int n = 0;..  
11c90 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68  assert( p->pHash
11ca0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
11cb0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
11cc0 3b 0a 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d  ;..  if( pTerm==
11cd0 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54  0 || (flags & FT
11ce0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
11cf0 41 4e 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  AN) ){.    p->rc
11d00 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61   = sqlite3Fts5Ha
11d10 73 68 53 63 61 6e 49 6e 69 74 28 70 2d 3e 70 48  shScanInit(p->pH
11d20 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  ash, (const char
11d30 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  *)pTerm, nTerm);
11d40 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
11d50 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d  HashScanEntry(p-
11d60 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63  >pHash, (const c
11d70 68 61 72 2a 2a 29 26 7a 2c 20 26 70 4c 69 73 74  har**)&z, &pList
11d80 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 6e  , &nList);.    n
11d90 20 3d 20 28 7a 20 3f 20 28 69 6e 74 29 73 74 72   = (z ? (int)str
11da0 6c 65 6e 28 28 63 6f 6e 73 74 20 63 68 61 72 2a  len((const char*
11db0 29 7a 29 20 3a 20 30 29 3b 0a 20 20 7d 65 6c 73  )z) : 0);.  }els
11dc0 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c  e{.    pIter->fl
11dd0 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49  ags |= FTS5_SEGI
11de0 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20  TER_ONETERM;.   
11df0 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
11e00 51 75 65 72 79 28 70 2d 3e 70 48 61 73 68 2c 20  Query(p->pHash, 
11e10 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 65  (const char*)pTe
11e20 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 70 4c 69 73  rm, nTerm, &pLis
11e30 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20  t, &nList);.    
11e40 7a 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 6e  z = pTerm;.    n
11e50 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 7d 0a 0a 20   = nTerm;.  }.. 
11e60 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
11e70 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
11e80 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  f;.    sqlite3Ft
11e90 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
11ea0 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d  rc, &pIter->term
11eb0 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 70 4c 65  , n, z);.    pLe
11ec0 61 66 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c  af = fts5IdxMall
11ed0 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73  oc(p, sizeof(Fts
11ee0 35 44 61 74 61 29 29 3b 0a 20 20 20 20 69 66 28  5Data));.    if(
11ef0 20 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75   pLeaf==0 ) retu
11f00 72 6e 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 70  rn;.    pLeaf->p
11f10 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20   = (u8*)pList;. 
11f20 20 20 20 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 70     pLeaf->nn = p
11f30 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e  Leaf->szLeaf = n
11f40 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d  List;.    pIter-
11f50 3e 70 4c 65 61 66 20 3d 20 70 4c 65 61 66 3b 0a  >pLeaf = pLeaf;.
11f60 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
11f70 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74  Offset = fts5Get
11f80 56 61 72 69 6e 74 28 70 4c 65 61 66 2d 3e 70 2c  Varint(pLeaf->p,
11f90 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
11fa0 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 49 74 65  Rowid);.    pIte
11fb0 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
11fc0 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a   = pLeaf->nn+1;.
11fd0 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
11fe0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
11ff0 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 70  _DESC ){.      p
12000 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46  Iter->flags |= F
12010 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
12020 52 53 45 3b 0a 20 20 20 20 20 20 66 74 73 35 53  RSE;.      fts5S
12030 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69  egIterReverseIni
12040 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
12050 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12060 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
12070 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
12080 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
12090 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20 69 74 65  .** Zero the ite
120a0 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
120b0 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
120c0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
120d0 64 20 66 74 73 35 53 65 67 49 74 65 72 43 6c 65  d fts5SegIterCle
120e0 61 72 28 46 74 73 35 53 65 67 49 74 65 72 20 2a  ar(Fts5SegIter *
120f0 70 49 74 65 72 29 7b 0a 20 20 66 74 73 35 42 75  pIter){.  fts5Bu
12100 66 66 65 72 46 72 65 65 28 26 70 49 74 65 72 2d  fferFree(&pIter-
12110 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 44 61  >term);.  fts5Da
12120 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
12130 3e 70 4c 65 61 66 29 3b 0a 20 20 66 74 73 35 44  >pLeaf);.  fts5D
12140 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
12150 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20  ->pNextLeaf);.  
12160 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
12170 65 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29  e(pIter->pDlidx)
12180 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
12190 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66  (pIter->aRowidOf
121a0 66 73 65 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28  fset);.  memset(
121b0 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
121c0 28 46 74 73 35 53 65 67 49 74 65 72 29 29 3b 0a  (Fts5SegIter));.
121d0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
121e0 5f 44 45 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54 68  _DEBUG../*.** Th
121f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
12200 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  sed as part of t
12210 68 65 20 62 69 67 20 61 73 73 65 72 74 28 29 20  he big assert() 
12220 70 72 6f 63 65 64 75 72 65 20 69 6d 70 6c 65 6d  procedure implem
12230 65 6e 74 65 64 20 62 79 0a 2a 2a 20 66 74 73 35  ented by.** fts5
12240 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53  AssertMultiIterS
12250 65 74 75 70 28 29 2e 20 49 74 20 65 6e 73 75 72  etup(). It ensur
12260 65 73 20 74 68 61 74 20 74 68 65 20 72 65 73 75  es that the resu
12270 6c 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  lt currently sto
12280 72 65 64 0a 2a 2a 20 69 6e 20 2a 70 52 65 73 20  red.** in *pRes 
12290 69 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  is the correct r
122a0 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
122b0 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ng the current p
122c0 6f 73 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a  ositions of the.
122d0 2a 2a 20 74 77 6f 20 69 74 65 72 61 74 6f 72 73  ** two iterators
122e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
122f0 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61   fts5AssertCompa
12300 72 69 73 6f 6e 52 65 73 75 6c 74 28 0a 20 20 46  risonResult(.  F
12310 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
12320 74 65 72 2c 20 0a 20 20 46 74 73 35 53 65 67 49  ter, .  Fts5SegI
12330 74 65 72 20 2a 70 31 2c 0a 20 20 46 74 73 35 53  ter *p1,.  Fts5S
12340 65 67 49 74 65 72 20 2a 70 32 2c 0a 20 20 46 74  egIter *p2,.  Ft
12350 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 0a  s5CResult *pRes.
12360 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 70 31  ){.  int i1 = p1
12370 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a   - pIter->aSeg;.
12380 20 20 69 6e 74 20 69 32 20 3d 20 70 32 20 2d 20    int i2 = p2 - 
12390 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a 0a 20 20  pIter->aSeg;..  
123a0 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 20 7c 7c  if( p1->pLeaf ||
123b0 20 70 32 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20   p2->pLeaf ){.  
123c0 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 3d    if( p1->pLeaf=
123d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
123e0 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74  rt( pRes->iFirst
123f0 3d 3d 69 32 20 29 3b 0a 20 20 20 20 7d 65 6c 73  ==i2 );.    }els
12400 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d  e if( p2->pLeaf=
12410 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
12420 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74  rt( pRes->iFirst
12430 3d 3d 69 31 20 29 3b 0a 20 20 20 20 7d 65 6c 73  ==i1 );.    }els
12440 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 69  e{.      int nMi
12450 6e 20 3d 20 4d 49 4e 28 70 31 2d 3e 74 65 72 6d  n = MIN(p1->term
12460 2e 6e 2c 20 70 32 2d 3e 74 65 72 6d 2e 6e 29 3b  .n, p2->term.n);
12470 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d  .      int res =
12480 20 6d 65 6d 63 6d 70 28 70 31 2d 3e 74 65 72 6d   memcmp(p1->term
12490 2e 70 2c 20 70 32 2d 3e 74 65 72 6d 2e 70 2c 20  .p, p2->term.p, 
124a0 6e 4d 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  nMin);.      if(
124b0 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20   res==0 ) res = 
124c0 70 31 2d 3e 74 65 72 6d 2e 6e 20 2d 20 70 32 2d  p1->term.n - p2-
124d0 3e 74 65 72 6d 2e 6e 3b 0a 0a 20 20 20 20 20 20  >term.n;..      
124e0 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
124f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
12500 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 31 20 29  es->bTermEq==1 )
12510 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
12520 28 20 70 31 2d 3e 69 52 6f 77 69 64 21 3d 70 32  ( p1->iRowid!=p2
12530 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  ->iRowid );.    
12540 20 20 20 20 72 65 73 20 3d 20 28 28 70 31 2d 3e      res = ((p1->
12550 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f  iRowid > p2->iRo
12560 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65  wid)==pIter->bRe
12570 76 29 20 3f 20 2d 31 20 3a 20 31 3b 0a 20 20 20  v) ? -1 : 1;.   
12580 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12590 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
125a0 62 54 65 72 6d 45 71 3d 3d 30 20 29 3b 0a 20 20  bTermEq==0 );.  
125b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
125c0 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20   res<0 ){.      
125d0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
125e0 69 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20  iFirst==i1 );.  
125f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12600 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
12610 3e 69 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a 20  >iFirst==i2 );. 
12620 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
12630 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
12640 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
12650 6f 70 20 75 6e 6c 65 73 73 20 53 51 4c 49 54 45  op unless SQLITE
12660 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  _DEBUG is define
12670 64 20 77 68 65 6e 20 74 68 69 73 20 6d 6f 64 75  d when this modu
12680 6c 65 0a 2a 2a 20 69 73 20 63 6f 6d 70 69 6c 65  le.** is compile
12690 64 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  d. In that case,
126a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
126b0 73 20 65 73 73 65 6e 74 69 61 6c 6c 79 20 61 6e  s essentially an
126c0 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74   assert() .** st
126d0 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20  atement used to 
126e0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
126f0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
12700 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 5d 20  pIter->aFirst[] 
12710 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 63 6f 72  array.** are cor
12720 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rect..*/.static 
12730 76 6f 69 64 20 66 74 73 35 41 73 73 65 72 74 4d  void fts5AssertM
12740 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 46 74  ultiIterSetup(Ft
12750 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
12760 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
12770 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
12780 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12790 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 46   Fts5SegIter *pF
127a0 69 72 73 74 20 3d 20 26 70 49 74 65 72 2d 3e 61  irst = &pIter->a
127b0 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
127c0 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
127d0 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
127e0 61 73 73 65 72 74 28 20 28 70 46 69 72 73 74 2d  assert( (pFirst-
127f0 3e 70 4c 65 61 66 3d 3d 30 29 3d 3d 70 49 74 65  >pLeaf==0)==pIte
12800 72 2d 3e 62 45 6f 66 20 29 3b 0a 0a 20 20 20 20  r->bEof );..    
12810 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 70 49  /* Check that pI
12820 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
12830 64 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74  d is set correct
12840 6c 79 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ly. */.    for(i
12850 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65  =0; i<pIter->nSe
12860 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46  g; i++){.      F
12870 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d  ts5SegIter *p1 =
12880 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d   &pIter->aSeg[i]
12890 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
128a0 70 31 3d 3d 70 46 69 72 73 74 20 0a 20 20 20 20  p1==pFirst .    
128b0 20 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e 70 4c         || p1->pL
128c0 65 61 66 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  eaf==0 .        
128d0 20 20 20 7c 7c 20 66 74 73 35 42 75 66 66 65 72     || fts5Buffer
128e0 43 6f 6d 70 61 72 65 28 26 70 46 69 72 73 74 2d  Compare(&pFirst-
128f0 3e 74 65 72 6d 2c 20 26 70 31 2d 3e 74 65 72 6d  >term, &p1->term
12900 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
12910 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 49 74   p1->iRowid==pIt
12920 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
12930 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
12940 70 31 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65 72  p1->iRowid<pIter
12950 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d  ->iSwitchRowid)=
12960 3d 70 49 74 65 72 2d 3e 62 52 65 76 0a 20 20 20  =pIter->bRev.   
12970 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
12980 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
12990 72 2d 3e 6e 53 65 67 3b 20 69 2b 3d 32 29 7b 0a  r->nSeg; i+=2){.
129a0 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
129b0 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e  r *p1 = &pIter->
129c0 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20 46  aSeg[i];.      F
129d0 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d  ts5SegIter *p2 =
129e0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 2b   &pIter->aSeg[i+
129f0 31 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 43 52  1];.      Fts5CR
12a00 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70  esult *pRes = &p
12a10 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 28 70 49  Iter->aFirst[(pI
12a20 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69 29 20 2f  ter->nSeg + i) /
12a30 20 32 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 41   2];.      fts5A
12a40 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52  ssertComparisonR
12a50 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31 2c  esult(pIter, p1,
12a60 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20 20   p2, pRes);.    
12a70 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  }..    for(i=1; 
12a80 69 3c 28 70 49 74 65 72 2d 3e 6e 53 65 67 20 2f  i<(pIter->nSeg /
12a90 20 32 29 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20   2); i+=2){.    
12aa0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
12ab0 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  1 = &pIter->aSeg
12ac0 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
12ad0 69 2a 32 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  i*2].iFirst ];. 
12ae0 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72       Fts5SegIter
12af0 20 2a 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61   *p2 = &pIter->a
12b00 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
12b10 73 74 5b 69 2a 32 2b 31 5d 2e 69 46 69 72 73 74  st[i*2+1].iFirst
12b20 20 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 43 52   ];.      Fts5CR
12b30 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70  esult *pRes = &p
12b40 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d 3b  Iter->aFirst[i];
12b50 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65 72  .      fts5Asser
12b60 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c  tComparisonResul
12b70 74 28 70 49 74 65 72 2c 20 70 31 2c 20 70 32 2c  t(pIter, p1, p2,
12b80 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20   pRes);.    }.  
12b90 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
12ba0 6e 65 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c  ne fts5AssertMul
12bb0 74 69 49 74 65 72 53 65 74 75 70 28 78 2c 79 29  tiIterSetup(x,y)
12bc0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
12bd0 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
12be0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 70 6f   necessary to po
12bf0 70 75 6c 61 74 65 20 70 49 74 65 72 2d 3e 61 46  pulate pIter->aF
12c00 69 72 73 74 5b 69 4f 75 74 5d 2e 0a 2a 2a 0a 2a  irst[iOut]..**.*
12c10 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65  * If the returne
12c20 64 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a  d value is non-z
12c30 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ero, then it is 
12c40 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 6e 20  the index of an 
12c50 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 74 68 65 20  entry.** in the 
12c60 70 49 74 65 72 2d 3e 61 53 65 67 5b 5d 20 61 72  pIter->aSeg[] ar
12c70 72 61 79 20 74 68 61 74 20 69 73 20 28 61 29 20  ray that is (a) 
12c80 6e 6f 74 20 61 74 20 45 4f 46 2c 20 61 6e 64 20  not at EOF, and 
12c90 28 62 29 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  (b) pointing.** 
12ca0 74 6f 20 61 20 6b 65 79 20 74 68 61 74 20 69 73  to a key that is
12cb0 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
12cc0 61 6e 6f 74 68 65 72 2c 20 68 69 67 68 65 72 20  another, higher 
12cd0 70 72 69 6f 72 69 74 79 2c 20 0a 2a 2a 20 73 65  priority, .** se
12ce0 67 6d 65 6e 74 2d 69 74 65 72 61 74 6f 72 20 69  gment-iterator i
12cf0 6e 20 74 68 65 20 70 53 65 67 2d 3e 61 53 65 67  n the pSeg->aSeg
12d00 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
12d10 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74  tic int fts5Mult
12d20 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 46  iIterDoCompare(F
12d30 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
12d40 74 65 72 2c 20 69 6e 74 20 69 4f 75 74 29 7b 0a  ter, int iOut){.
12d50 20 20 69 6e 74 20 69 31 3b 20 20 20 20 20 20 20    int i1;       
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d70 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6c 65    /* Index of le
12d80 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49  ft-hand Fts5SegI
12d90 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 32 3b  ter */.  int i2;
12da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12db0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
12dc0 78 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20  x of right-hand 
12dd0 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20  Fts5SegIter */. 
12de0 20 69 6e 74 20 69 52 65 73 3b 0a 20 20 46 74 73   int iRes;.  Fts
12df0 35 53 65 67 49 74 65 72 20 2a 70 31 3b 20 20 20  5SegIter *p1;   
12e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12e10 4c 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65  Left-hand Fts5Se
12e20 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 53  gIter */.  Fts5S
12e30 65 67 49 74 65 72 20 2a 70 32 3b 20 20 20 20 20  egIter *p2;     
12e40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
12e50 67 68 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67  ght-hand Fts5Seg
12e60 49 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 52  Iter */.  Fts5CR
12e70 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70  esult *pRes = &p
12e80 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75  Iter->aFirst[iOu
12e90 74 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  t];..  assert( i
12ea0 4f 75 74 3c 70 49 74 65 72 2d 3e 6e 53 65 67 20  Out<pIter->nSeg 
12eb0 26 26 20 69 4f 75 74 3e 30 20 29 3b 0a 20 20 61  && iOut>0 );.  a
12ec0 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 52  ssert( pIter->bR
12ed0 65 76 3d 3d 30 20 7c 7c 20 70 49 74 65 72 2d 3e  ev==0 || pIter->
12ee0 62 52 65 76 3d 3d 31 20 29 3b 0a 0a 20 20 69 66  bRev==1 );..  if
12ef0 28 20 69 4f 75 74 3e 3d 28 70 49 74 65 72 2d 3e  ( iOut>=(pIter->
12f00 6e 53 65 67 2f 32 29 20 29 7b 0a 20 20 20 20 69  nSeg/2) ){.    i
12f10 31 20 3d 20 28 69 4f 75 74 20 2d 20 70 49 74 65  1 = (iOut - pIte
12f20 72 2d 3e 6e 53 65 67 2f 32 29 20 2a 20 32 3b 0a  r->nSeg/2) * 2;.
12f30 20 20 20 20 69 32 20 3d 20 69 31 20 2b 20 31 3b      i2 = i1 + 1;
12f40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 31  .  }else{.    i1
12f50 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74   = pIter->aFirst
12f60 5b 69 4f 75 74 2a 32 5d 2e 69 46 69 72 73 74 3b  [iOut*2].iFirst;
12f70 0a 20 20 20 20 69 32 20 3d 20 70 49 74 65 72 2d  .    i2 = pIter-
12f80 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a 32 2b 31  >aFirst[iOut*2+1
12f90 5d 2e 69 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20  ].iFirst;.  }.  
12fa0 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p1 = &pIter->aSe
12fb0 67 5b 69 31 5d 3b 0a 20 20 70 32 20 3d 20 26 70  g[i1];.  p2 = &p
12fc0 49 74 65 72 2d 3e 61 53 65 67 5b 69 32 5d 3b 0a  Iter->aSeg[i2];.
12fd0 0a 20 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71  .  pRes->bTermEq
12fe0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 31 2d 3e   = 0;.  if( p1->
12ff0 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20  pLeaf==0 ){     
13000 20 20 20 20 20 20 2f 2a 20 49 66 20 70 31 20 69        /* If p1 i
13010 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20  s at EOF */.    
13020 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 7d 65 6c  iRes = i2;.  }el
13030 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66  se if( p2->pLeaf
13040 3d 3d 30 20 29 7b 20 20 20 20 20 2f 2a 20 49 66  ==0 ){     /* If
13050 20 70 32 20 69 73 20 61 74 20 45 4f 46 20 2a 2f   p2 is at EOF */
13060 0a 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a  .    iRes = i1;.
13070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
13080 20 72 65 73 20 3d 20 66 74 73 35 42 75 66 66 65   res = fts5Buffe
13090 72 43 6f 6d 70 61 72 65 28 26 70 31 2d 3e 74 65  rCompare(&p1->te
130a0 72 6d 2c 20 26 70 32 2d 3e 74 65 72 6d 29 3b 0a  rm, &p2->term);.
130b0 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
130c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
130d0 69 32 3e 69 31 20 29 3b 0a 20 20 20 20 20 20 61  i2>i1 );.      a
130e0 73 73 65 72 74 28 20 69 32 21 3d 30 20 29 3b 0a  ssert( i2!=0 );.
130f0 20 20 20 20 20 20 70 52 65 73 2d 3e 62 54 65 72        pRes->bTer
13100 6d 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  mEq = 1;.      i
13110 66 28 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70  f( p1->iRowid==p
13120 32 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20  2->iRowid ){.   
13130 20 20 20 20 20 70 31 2d 3e 62 44 65 6c 20 3d 20       p1->bDel = 
13140 70 32 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20 20  p2->bDel;.      
13150 20 20 72 65 74 75 72 6e 20 69 32 3b 0a 20 20 20    return i2;.   
13160 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d     }.      res =
13170 20 28 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20   ((p1->iRowid > 
13180 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74  p2->iRowid)==pIt
13190 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a  er->bRev) ? -1 :
131a0 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   +1;.    }.    a
131b0 73 73 65 72 74 28 20 72 65 73 21 3d 30 20 29 3b  ssert( res!=0 );
131c0 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29  .    if( res<0 )
131d0 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69  {.      iRes = i
131e0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
131f0 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20      iRes = i2;. 
13200 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 65 73     }.  }..  pRes
13210 2d 3e 69 46 69 72 73 74 20 3d 20 28 75 31 36 29  ->iFirst = (u16)
13220 69 52 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 30  iRes;.  return 0
13230 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
13240 74 68 65 20 73 65 67 2d 69 74 65 72 20 73 6f 20  the seg-iter so 
13250 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
13260 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69  o the first rowi
13270 64 20 6f 6e 20 70 61 67 65 20 69 4c 65 61 66 50  d on page iLeafP
13280 67 6e 6f 2e 0a 2a 2a 20 49 74 20 69 73 20 61 6e  gno..** It is an
13290 20 65 72 72 6f 72 20 69 66 20 6c 65 61 66 20 69   error if leaf i
132a0 4c 65 61 66 50 67 6e 6f 20 64 6f 65 73 20 6e 6f  LeafPgno does no
132b0 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61  t exist or conta
132c0 69 6e 73 20 6e 6f 20 72 6f 77 69 64 73 2e 0a 2a  ins no rowids..*
132d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
132e0 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67  s5SegIterGotoPag
132f0 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
13300 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
13310 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
13320 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
13330 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
13340 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
13350 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
13360 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74  advance */.  int
13370 20 69 4c 65 61 66 50 67 6e 6f 0a 29 7b 0a 20 20   iLeafPgno.){.  
13380 61 73 73 65 72 74 28 20 69 4c 65 61 66 50 67 6e  assert( iLeafPgn
13390 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  o>pIter->iLeafPg
133a0 6e 6f 20 29 3b 0a 0a 20 20 69 66 28 20 69 4c 65  no );..  if( iLe
133b0 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 70 53  afPgno>pIter->pS
133c0 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a  eg->pgnoLast ){.
133d0 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
133e0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73  _CORRUPT;.  }els
133f0 65 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52  e{.    fts5DataR
13400 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4e  elease(pIter->pN
13410 65 78 74 4c 65 61 66 29 3b 0a 20 20 20 20 70 49  extLeaf);.    pI
13420 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d  ter->pNextLeaf =
13430 20 30 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   0;.    pIter->i
13440 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66  LeafPgno = iLeaf
13450 50 67 6e 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35  Pgno-1;.    fts5
13460 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
13470 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61  p, pIter);.    a
13480 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
13490 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72  LITE_OK || pIter
134a0 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 69 4c 65  ->iLeafPgno==iLe
134b0 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69  afPgno );..    i
134c0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
134d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
134e0 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 75 38 20   iOff;.      u8 
134f0 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
13500 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  f->p;.      int 
13510 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  n = pIter->pLeaf
13520 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20 20 20 20  ->szLeaf;..     
13530 20 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66   iOff = fts5Leaf
13540 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 49  FirstRowidOff(pI
13550 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
13560 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c     if( iOff<4 ||
13570 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20   iOff>=n ){.    
13580 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
13590 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
135a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
135b0 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
135c0 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28  rint(&a[iOff], (
135d0 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
135e0 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 70 49  wid);.        pI
135f0 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
13600 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20   = iOff;.       
13610 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
13620 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
13630 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13640 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  }.}../*.** Advan
13650 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ce the iterator 
13660 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
13670 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 75 6e  cond argument un
13680 74 69 6c 20 69 74 20 69 73 20 61 74 20 6f 72 20  til it is at or 
13690 0a 2a 2a 20 70 61 73 74 20 72 6f 77 69 64 20 69  .** past rowid i
136a0 46 72 6f 6d 2e 20 52 65 67 61 72 64 6c 65 73 73  From. Regardless
136b0 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   of the value of
136c0 20 69 46 72 6f 6d 2c 20 74 68 65 20 69 74 65 72   iFrom, the iter
136d0 61 74 6f 72 20 69 73 0a 2a 2a 20 61 6c 77 61 79  ator is.** alway
136e0 73 20 61 64 76 61 6e 63 65 64 20 61 74 20 6c 65  s advanced at le
136f0 61 73 74 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61  ast once..*/.sta
13700 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
13710 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20  IterNextFrom(.  
13720 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
13730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13740 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
13750 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
13760 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
13770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13780 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
13790 63 65 20 2a 2f 0a 20 20 69 36 34 20 69 4d 61 74  ce */.  i64 iMat
137a0 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ch              
137b0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e          /* Advan
137c0 63 65 20 69 74 65 72 61 74 6f 72 20 61 74 20 6c  ce iterator at l
137d0 65 61 73 74 20 74 68 69 73 20 66 61 72 20 2a 2f  east this far */
137e0 0a 29 7b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d  .){.  int bRev =
137f0 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26   (pIter->flags &
13800 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
13810 56 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44 6c  VERSE);.  Fts5Dl
13820 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20  idxIter *pDlidx 
13830 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b  = pIter->pDlidx;
13840 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
13850 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50   = pIter->iLeafP
13860 67 6e 6f 3b 0a 20 20 69 6e 74 20 62 4d 6f 76 65  gno;.  int bMove
13870 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 1;..  assert(
13880 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
13890 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
138a0 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74  TERM );.  assert
138b0 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20  ( pIter->pDlidx 
138c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
138d0 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20  er->pLeaf );..  
138e0 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20  if( bRev==0 ){. 
138f0 20 20 20 77 68 69 6c 65 28 20 21 66 74 73 35 44     while( !fts5D
13900 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
13910 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74 63 68  Dlidx) && iMatch
13920 3e 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f  >fts5DlidxIterRo
13930 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b 0a 20  wid(pDlidx) ){. 
13940 20 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d       iLeafPgno =
13950 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
13960 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  no(pDlidx);.    
13970 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e    fts5DlidxIterN
13980 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a  ext(p, pDlidx);.
13990 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
139a0 5f 6e 63 28 20 69 4c 65 61 66 50 67 6e 6f 3e 3d  _nc( iLeafPgno>=
139b0 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
139c0 20 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a 20 20 20   || p->rc );.   
139d0 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70   if( iLeafPgno>p
139e0 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
139f0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  ){.      fts5Seg
13a00 49 74 65 72 47 6f 74 6f 50 61 67 65 28 70 2c 20  IterGotoPage(p, 
13a10 70 49 74 65 72 2c 20 69 4c 65 61 66 50 67 6e 6f  pIter, iLeafPgno
13a20 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d  );.      bMove =
13a30 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
13a40 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
13a50 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3d  Iter->pNextLeaf=
13a60 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
13a70 28 20 69 4d 61 74 63 68 3c 70 49 74 65 72 2d 3e  ( iMatch<pIter->
13a80 69 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 77 68  iRowid );.    wh
13a90 69 6c 65 28 20 21 66 74 73 35 44 6c 69 64 78 49  ile( !fts5DlidxI
13aa0 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78  terEof(p, pDlidx
13ab0 29 20 26 26 20 69 4d 61 74 63 68 3c 66 74 73 35  ) && iMatch<fts5
13ac0 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70  DlidxIterRowid(p
13ad0 44 6c 69 64 78 29 20 29 7b 0a 20 20 20 20 20 20  Dlidx) ){.      
13ae0 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65  fts5DlidxIterPre
13af0 76 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20 20  v(p, pDlidx);.  
13b00 20 20 7d 0a 20 20 20 20 69 4c 65 61 66 50 67 6e    }.    iLeafPgn
13b10 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  o = fts5DlidxIte
13b20 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a  rPgno(pDlidx);..
13b30 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35      assert( fts5
13b40 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
13b50 70 44 6c 69 64 78 29 20 7c 7c 20 69 4c 65 61 66  pDlidx) || iLeaf
13b60 50 67 6e 6f 3c 3d 70 49 74 65 72 2d 3e 69 4c 65  Pgno<=pIter->iLe
13b70 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69  afPgno );..    i
13b80 66 28 20 69 4c 65 61 66 50 67 6e 6f 3c 70 49 74  f( iLeafPgno<pIt
13b90 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b  er->iLeafPgno ){
13ba0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  .      pIter->iL
13bb0 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50  eafPgno = iLeafP
13bc0 67 6e 6f 2b 31 3b 0a 20 20 20 20 20 20 66 74 73  gno+1;.      fts
13bd0 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e  5SegIterReverseN
13be0 65 77 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  ewPage(p, pIter)
13bf0 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20  ;.      bMove = 
13c00 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
13c10 64 6f 7b 0a 20 20 20 20 69 66 28 20 62 4d 6f 76  do{.    if( bMov
13c20 65 20 29 20 66 74 73 35 53 65 67 49 74 65 72 4e  e ) fts5SegIterN
13c30 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 29  ext(p, pIter, 0)
13c40 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
13c50 3e 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61  >pLeaf==0 ) brea
13c60 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d  k;.    if( bRev=
13c70 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f  =0 && pIter->iRo
13c80 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72  wid>=iMatch ) br
13c90 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65  eak;.    if( bRe
13ca0 76 21 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69  v!=0 && pIter->i
13cb0 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20  Rowid<=iMatch ) 
13cc0 62 72 65 61 6b 3b 0a 20 20 20 20 62 4d 6f 76 65  break;.    bMove
13cd0 20 3d 20 31 3b 0a 20 20 7d 77 68 69 6c 65 28 20   = 1;.  }while( 
13ce0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
13cf0 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72   );.}.../*.** Fr
13d00 65 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ee the iterator 
13d10 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
13d20 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
13d30 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
13d40 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
13d50 65 72 46 72 65 65 28 46 74 73 35 49 6e 64 65 78  erFree(Fts5Index
13d60 20 2a 70 2c 20 46 74 73 35 49 6e 64 65 78 49 74   *p, Fts5IndexIt
13d70 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66  er *pIter){.  if
13d80 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69  ( pIter ){.    i
13d90 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
13da0 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67  0; i<pIter->nSeg
13db0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74  ; i++){.      ft
13dc0 73 35 53 65 67 49 74 65 72 43 6c 65 61 72 28 26  s5SegIterClear(&
13dd0 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29 3b  pIter->aSeg[i]);
13de0 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53  .    }.    fts5S
13df0 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
13e00 70 49 74 65 72 2d 3e 70 53 74 72 75 63 74 29 3b  pIter->pStruct);
13e10 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
13e20 72 65 65 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c  ree(&pIter->posl
13e30 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
13e40 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20  3_free(pIter);. 
13e50 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
13e60 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41  d fts5MultiIterA
13e70 64 76 61 6e 63 65 64 28 0a 20 20 46 74 73 35 49  dvanced(.  Fts5I
13e80 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
13e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
13ea0 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
13eb0 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
13ec0 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
13ed0 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
13ee0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
13ef0 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d   update aFirst[]
13f00 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20   array for */.  
13f10 69 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20 20  int iChanged,   
13f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f30 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d  /* Index of sub-
13f40 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64  iterator just ad
13f50 76 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20  vanced */.  int 
13f60 69 4d 69 6e 73 65 74 20 20 20 20 20 20 20 20 20  iMinset         
13f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
13f80 69 6e 69 6d 75 6d 20 65 6e 74 72 79 20 69 6e 20  inimum entry in 
13f90 61 46 69 72 73 74 5b 5d 20 74 6f 20 73 65 74 20  aFirst[] to set 
13fa0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
13fb0 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e   for(i=(pIter->n
13fc0 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b  Seg+iChanged)/2;
13fd0 20 69 3e 3d 69 4d 69 6e 73 65 74 20 26 26 20 70   i>=iMinset && p
13fe0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  ->rc==SQLITE_OK;
13ff0 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 69 6e 74   i=i/2){.    int
14000 20 69 45 71 3b 0a 20 20 20 20 69 66 28 20 28 69   iEq;.    if( (i
14010 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  Eq = fts5MultiIt
14020 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 49 74 65  erDoCompare(pIte
14030 72 2c 20 69 29 29 20 29 7b 0a 20 20 20 20 20 20  r, i)) ){.      
14040 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
14050 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b  p, &pIter->aSeg[
14060 69 45 71 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  iEq], 0);.      
14070 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67 20  i = pIter->nSeg 
14080 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d  + iEq;.    }.  }
14090 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 2d 69 74  .}../*.** Sub-it
140a0 65 72 61 74 6f 72 20 69 43 68 61 6e 67 65 64 20  erator iChanged 
140b0 6f 66 20 69 74 65 72 61 74 6f 72 20 70 49 74 65  of iterator pIte
140c0 72 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  r has just been 
140d0 61 64 76 61 6e 63 65 64 2e 20 49 74 20 73 74 69  advanced. It sti
140e0 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  ll.** points to 
140f0 74 68 65 20 73 61 6d 65 20 74 65 72 6d 20 74 68  the same term th
14100 6f 75 67 68 20 2d 20 6a 75 73 74 20 61 20 64 69  ough - just a di
14110 66 66 65 72 65 6e 74 20 72 6f 77 69 64 2e 20 54  fferent rowid. T
14120 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
14130 61 74 74 65 6d 70 74 73 20 74 6f 20 75 70 64 61  attempts to upda
14140 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
14150 6f 66 20 74 68 65 20 70 49 74 65 72 2d 3e 61 46  of the pIter->aF
14160 69 72 73 74 5b 5d 20 61 63 63 6f 72 64 69 6e 67  irst[] according
14170 6c 79 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65  ly..** If it doe
14180 73 20 73 6f 20 73 75 63 63 65 73 73 66 75 6c 6c  s so successfull
14190 79 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  y, 0 is returned
141a0 2e 20 4f 74 68 65 72 77 69 73 65 20 31 2e 0a 2a  . Otherwise 1..*
141b0 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f  *.** If non-zero
141c0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
141d0 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  e caller should 
141e0 63 61 6c 6c 20 66 74 73 35 4d 75 6c 74 69 49 74  call fts5MultiIt
141f0 65 72 41 64 76 61 6e 63 65 64 28 29 0a 2a 2a 20  erAdvanced().** 
14200 6f 6e 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  on the iterator 
14210 69 6e 73 74 65 61 64 2e 20 54 68 61 74 20 66 75  instead. That fu
14220 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20  nction does the 
14230 73 61 6d 65 20 61 73 20 74 68 69 73 20 6f 6e 65  same as this one
14240 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74  , except.** that
14250 20 69 74 20 64 65 61 6c 73 20 77 69 74 68 20 6d   it deals with m
14260 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 20  ore complicated 
14270 63 61 73 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a  cases as well..*
14280 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  / .static int ft
14290 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e  s5MultiIterAdvan
142a0 63 65 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49  ceRowid(.  Fts5I
142b0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
142c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
142d0 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
142e0 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
142f0 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
14300 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
14310 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
14320 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d   update aFirst[]
14330 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20   array for */.  
14340 69 6e 74 20 69 43 68 61 6e 67 65 64 20 20 20 20  int iChanged    
14350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14360 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d  /* Index of sub-
14370 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64  iterator just ad
14380 76 61 6e 63 65 64 20 2a 2f 0a 29 7b 0a 20 20 46  vanced */.){.  F
14390 74 73 35 53 65 67 49 74 65 72 20 2a 70 4e 65 77  ts5SegIter *pNew
143a0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
143b0 69 43 68 61 6e 67 65 64 5d 3b 0a 0a 20 20 69 66  iChanged];..  if
143c0 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d 3d  ( pNew->iRowid==
143d0 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
143e0 77 69 64 0a 20 20 20 7c 7c 20 28 70 4e 65 77 2d  wid.   || (pNew-
143f0 3e 69 52 6f 77 69 64 3c 70 49 74 65 72 2d 3e 69  >iRowid<pIter->i
14400 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d 70 49  SwitchRowid)==pI
14410 74 65 72 2d 3e 62 52 65 76 0a 20 20 29 7b 0a 20  ter->bRev.  ){. 
14420 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 46 74     int i;.    Ft
14430 73 35 53 65 67 49 74 65 72 20 2a 70 4f 74 68 65  s5SegIter *pOthe
14440 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  r = &pIter->aSeg
14450 5b 69 43 68 61 6e 67 65 64 20 5e 20 30 78 30 30  [iChanged ^ 0x00
14460 30 31 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  01];.    pIter->
14470 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70  iSwitchRowid = p
14480 49 74 65 72 2d 3e 62 52 65 76 20 3f 20 53 4d 41  Iter->bRev ? SMA
14490 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 4c 41  LLEST_INT64 : LA
144a0 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 20  RGEST_INT64;.   
144b0 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e   for(i=(pIter->n
144c0 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b  Seg+iChanged)/2;
144d0 20 31 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20   1; i=i/2){.    
144e0 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
144f0 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46  Res = &pIter->aF
14500 69 72 73 74 5b 69 5d 3b 0a 0a 20 20 20 20 20 20  irst[i];..      
14510 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 4c  assert( pNew->pL
14520 65 61 66 20 29 3b 0a 20 20 20 20 20 20 61 73 73  eaf );.      ass
14530 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d  ert( pRes->bTerm
14540 45 71 3d 3d 30 20 7c 7c 20 70 4f 74 68 65 72 2d  Eq==0 || pOther-
14550 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 20 20 20  >pLeaf );..     
14560 20 69 66 28 20 70 52 65 73 2d 3e 62 54 65 72 6d   if( pRes->bTerm
14570 45 71 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  Eq ){.        if
14580 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d 3d  ( pNew->iRowid==
14590 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 20 29  pOther->iRowid )
145a0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
145b0 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  rn 1;.        }e
145c0 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65 72 2d  lse if( (pOther-
145d0 3e 69 52 6f 77 69 64 3e 70 4e 65 77 2d 3e 69 52  >iRowid>pNew->iR
145e0 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
145f0 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
14600 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
14610 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69 52  wid = pOther->iR
14620 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20  owid;.          
14630 70 4e 65 77 20 3d 20 70 4f 74 68 65 72 3b 0a 20  pNew = pOther;. 
14640 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
14650 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64   (pOther->iRowid
14660 3e 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52  >pIter->iSwitchR
14670 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
14680 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
14690 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
146a0 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69 52  wid = pOther->iR
146b0 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  owid;.        }.
146c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 52        }.      pR
146d0 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 28 75 31  es->iFirst = (u1
146e0 36 29 28 70 4e 65 77 20 2d 20 70 49 74 65 72 2d  6)(pNew - pIter-
146f0 3e 61 53 65 67 29 3b 0a 20 20 20 20 20 20 69 66  >aSeg);.      if
14700 28 20 69 3d 3d 31 20 29 20 62 72 65 61 6b 3b 0a  ( i==1 ) break;.
14710 0a 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20  .      pOther = 
14720 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
14730 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 20 5e 20  ter->aFirst[i ^ 
14740 30 78 30 30 30 31 5d 2e 69 46 69 72 73 74 20 5d  0x0001].iFirst ]
14750 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
14760 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
14770 2a 20 53 65 74 20 74 68 65 20 70 49 74 65 72 2d  * Set the pIter-
14780 3e 62 45 6f 66 20 76 61 72 69 61 62 6c 65 20 62  >bEof variable b
14790 61 73 65 64 20 6f 6e 20 74 68 65 20 73 74 61 74  ased on the stat
147a0 65 20 6f 66 20 74 68 65 20 73 75 62 2d 69 74 65  e of the sub-ite
147b0 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  rators..*/.stati
147c0 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
147d0 49 74 65 72 53 65 74 45 6f 66 28 46 74 73 35 49  IterSetEof(Fts5I
147e0 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29  ndexIter *pIter)
147f0 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  {.  Fts5SegIter 
14800 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
14810 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
14820 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
14830 0a 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d  .  pIter->bEof =
14840 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 3b   pSeg->pLeaf==0;
14850 0a 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63  .  pIter->iSwitc
14860 68 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69  hRowid = pSeg->i
14870 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
14880 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74 6f  Move the iterato
14890 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
148a0 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  try. .**.** If a
148b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
148c0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
148d0 20 6c 65 66 74 20 69 6e 20 46 74 73 35 49 6e 64   left in Fts5Ind
148e0 65 78 2e 72 63 2e 20 49 74 20 69 73 20 6e 6f 74  ex.rc. It is not
148f0 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20   .** considered 
14900 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
14910 69 74 65 72 61 74 6f 72 20 72 65 61 63 68 65 73  iterator reaches
14920 20 45 4f 46 2c 20 6f 72 20 69 66 20 69 74 20 69   EOF, or if it i
14930 73 20 61 6c 72 65 61 64 79 20 61 74 20 0a 2a 2a  s already at .**
14940 20 45 4f 46 20 77 68 65 6e 20 74 68 69 73 20 66   EOF when this f
14950 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
14960 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
14970 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  d fts5MultiIterN
14980 65 78 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ext(.  Fts5Index
14990 20 2a 70 2c 20 0a 20 20 46 74 73 35 49 6e 64 65   *p, .  Fts5Inde
149a0 78 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20  xIter *pIter,.  
149b0 69 6e 74 20 62 46 72 6f 6d 2c 20 20 20 20 20 20  int bFrom,      
149c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149d0 2f 2a 20 54 72 75 65 20 69 66 20 61 72 67 75 6d  /* True if argum
149e0 65 6e 74 20 69 46 72 6f 6d 20 69 73 20 76 61 6c  ent iFrom is val
149f0 69 64 20 2a 2f 0a 20 20 69 36 34 20 69 46 72 6f  id */.  i64 iFro
14a00 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
14a10 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e          /* Advan
14a20 63 65 20 61 74 20 6c 65 61 73 74 20 61 73 20 66  ce at least as f
14a30 61 72 20 61 73 20 74 68 69 73 20 2a 2f 0a 29 7b  ar as this */.){
14a40 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
14a50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
14a60 6e 74 20 62 55 73 65 46 72 6f 6d 20 3d 20 62 46  nt bUseFrom = bF
14a70 72 6f 6d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  rom;.    do {.  
14a80 20 20 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d      int iFirst =
14a90 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
14aa0 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20 20 20 20  ].iFirst;.      
14ab0 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30  int bNewTerm = 0
14ac0 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  ;.      Fts5SegI
14ad0 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
14ae0 65 72 2d 3e 61 53 65 67 5b 69 46 69 72 73 74 5d  er->aSeg[iFirst]
14af0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14b00 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
14b10 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 55   );.      if( bU
14b20 73 65 46 72 6f 6d 20 26 26 20 70 53 65 67 2d 3e  seFrom && pSeg->
14b30 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20  pDlidx ){.      
14b40 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
14b50 74 46 72 6f 6d 28 70 2c 20 70 53 65 67 2c 20 69  tFrom(p, pSeg, i
14b60 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  From);.      }el
14b70 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
14b80 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20 70  SegIterNext(p, p
14b90 53 65 67 2c 20 26 62 4e 65 77 54 65 72 6d 29 3b  Seg, &bNewTerm);
14ba0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
14bb0 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d  if( pSeg->pLeaf=
14bc0 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d 20 0a  =0 || bNewTerm .
14bd0 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35 4d 75         || fts5Mu
14be0 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f  ltiIterAdvanceRo
14bf0 77 69 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46  wid(p, pIter, iF
14c00 69 72 73 74 29 0a 20 20 20 20 20 20 29 7b 0a 20  irst).      ){. 
14c10 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
14c20 49 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20  IterAdvanced(p, 
14c30 70 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20 31  pIter, iFirst, 1
14c40 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  );.        fts5M
14c50 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 70  ultiIterSetEof(p
14c60 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
14c70 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74 4d       fts5AssertM
14c80 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 70 2c  ultiIterSetup(p,
14c90 20 70 49 74 65 72 29 3b 0a 0a 20 20 20 20 20 20   pIter);..      
14ca0 62 55 73 65 46 72 6f 6d 20 3d 20 30 3b 0a 20 20  bUseFrom = 0;.  
14cb0 20 20 7d 77 68 69 6c 65 28 20 70 49 74 65 72 2d    }while( pIter-
14cc0 3e 62 53 6b 69 70 45 6d 70 74 79 20 26 26 20 66  >bSkipEmpty && f
14cd0 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d  ts5MultiIterIsEm
14ce0 70 74 79 28 70 2c 20 70 49 74 65 72 29 20 29 3b  pty(p, pIter) );
14cf0 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
14d00 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
14d10 72 4e 65 78 74 32 28 0a 20 20 46 74 73 35 49 6e  rNext2(.  Fts5In
14d20 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49  dex *p, .  Fts5I
14d30 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c  ndexIter *pIter,
14d40 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72  .  int *pbNewTer
14d50 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
14d60 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20     /* OUT: True 
14d70 69 66 20 2a 6d 69 67 68 74 2a 20 62 65 20 6e 65  if *might* be ne
14d80 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 61  w term */.){.  a
14d90 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 53  ssert( pIter->bS
14da0 6b 69 70 45 6d 70 74 79 20 29 3b 0a 20 20 69 66  kipEmpty );.  if
14db0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
14dc0 4f 4b 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  OK ){.    do {. 
14dd0 20 20 20 20 20 69 6e 74 20 69 46 69 72 73 74 20       int iFirst 
14de0 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  = pIter->aFirst[
14df0 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20 20 20  1].iFirst;.     
14e00 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
14e10 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
14e20 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20  g[iFirst];.     
14e30 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20   int bNewTerm = 
14e40 30 3b 0a 0a 20 20 20 20 20 20 66 74 73 35 53 65  0;..      fts5Se
14e50 67 49 74 65 72 4e 65 78 74 28 70 2c 20 70 53 65  gIterNext(p, pSe
14e60 67 2c 20 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20  g, &bNewTerm);. 
14e70 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70       if( pSeg->p
14e80 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e 65 77 54  Leaf==0 || bNewT
14e90 65 72 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20 66  erm .       || f
14ea0 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
14eb0 6e 63 65 52 6f 77 69 64 28 70 2c 20 70 49 74 65  nceRowid(p, pIte
14ec0 72 2c 20 69 46 69 72 73 74 29 0a 20 20 20 20 20  r, iFirst).     
14ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
14ee0 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
14ef0 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72  d(p, pIter, iFir
14f00 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  st, 1);.        
14f10 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74  fts5MultiIterSet
14f20 45 6f 66 28 70 49 74 65 72 29 3b 0a 20 20 20 20  Eof(pIter);.    
14f30 20 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d      *pbNewTerm =
14f40 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
14f50 0a 20 20 20 20 20 20 20 20 2a 70 62 4e 65 77 54  .        *pbNewT
14f60 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  erm = 0;.      }
14f70 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65 72  .      fts5Asser
14f80 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28  tMultiIterSetup(
14f90 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 20 20  p, pIter);..    
14fa0 7d 77 68 69 6c 65 28 20 66 74 73 35 4d 75 6c 74  }while( fts5Mult
14fb0 69 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20  iIterIsEmpty(p, 
14fc0 70 49 74 65 72 29 20 29 3b 0a 20 20 7d 0a 7d 0a  pIter) );.  }.}.
14fd0 0a 0a 73 74 61 74 69 63 20 46 74 73 35 49 6e 64  ..static Fts5Ind
14fe0 65 78 49 74 65 72 20 2a 66 74 73 35 4d 75 6c 74  exIter *fts5Mult
14ff0 69 49 74 65 72 41 6c 6c 6f 63 28 0a 20 20 46 74  iIterAlloc(.  Ft
15000 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
15010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15020 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f   FTS5 backend to
15030 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20   iterate within 
15040 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 0a 29 7b  */.  int nSeg.){
15050 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
15060 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 53   *pNew;.  int nS
15070 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  lot;            
15080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 77            /* Pow
15090 65 72 20 6f 66 20 74 77 6f 20 3e 3d 20 6e 53 65  er of two >= nSe
150a0 67 20 2a 2f 0a 0a 20 20 66 6f 72 28 6e 53 6c 6f  g */..  for(nSlo
150b0 74 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65 67 3b  t=2; nSlot<nSeg;
150c0 20 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32 29 3b   nSlot=nSlot*2);
150d0 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35 49 64  .  pNew = fts5Id
150e0 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20 20 20 20  xMalloc(p, .    
150f0 20 20 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64    sizeof(Fts5Ind
15100 65 78 49 74 65 72 29 20 2b 20 20 20 20 20 20 20  exIter) +       
15110 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 20 2a 2f        /* pNew */
15120 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74  .      sizeof(Ft
15130 73 35 53 65 67 49 74 65 72 29 20 2a 20 28 6e 53  s5SegIter) * (nS
15140 6c 6f 74 2d 31 29 20 2b 20 20 20 2f 2a 20 70 4e  lot-1) +   /* pN
15150 65 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a 20 20  ew->aSeg[] */.  
15160 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 43      sizeof(Fts5C
15170 52 65 73 75 6c 74 29 20 2a 20 6e 53 6c 6f 74 20  Result) * nSlot 
15180 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 2d          /* pNew-
15190 3e 61 46 69 72 73 74 5b 5d 20 2a 2f 0a 20 20 29  >aFirst[] */.  )
151a0 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
151b0 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67 20 3d      pNew->nSeg =
151c0 20 6e 53 6c 6f 74 3b 0a 20 20 20 20 70 4e 65 77   nSlot;.    pNew
151d0 2d 3e 61 46 69 72 73 74 20 3d 20 28 46 74 73 35  ->aFirst = (Fts5
151e0 43 52 65 73 75 6c 74 2a 29 26 70 4e 65 77 2d 3e  CResult*)&pNew->
151f0 61 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 20  aSeg[nSlot];.   
15200 20 70 4e 65 77 2d 3e 70 49 6e 64 65 78 20 3d 20   pNew->pIndex = 
15210 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
15220 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pNew;.}../*.** A
15230 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 46 74  llocate a new Ft
15240 73 35 49 6e 64 65 78 49 74 65 72 20 6f 62 6a 65  s5IndexIter obje
15250 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ct..**.** The ne
15260 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65  w object will be
15270 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
15280 20 74 68 72 6f 75 67 68 20 64 61 74 61 20 69 6e   through data in
15290 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
152a0 63 74 2e 0a 2a 2a 20 49 66 20 69 4c 65 76 65 6c  ct..** If iLevel
152b0 20 69 73 20 2d 76 65 2c 20 74 68 65 6e 20 61 6c   is -ve, then al
152c0 6c 20 64 61 74 61 20 69 6e 20 61 6c 6c 20 73 65  l data in all se
152d0 67 6d 65 6e 74 73 20 69 73 20 6d 65 72 67 65 64  gments is merged
152e0 2e 20 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c 0a  . Or, if iLevel.
152f0 2a 2a 20 69 73 20 7a 65 72 6f 20 6f 72 20 67 72  ** is zero or gr
15300 65 61 74 65 72 2c 20 64 61 74 61 20 66 72 6f 6d  eater, data from
15310 20 74 68 65 20 66 69 72 73 74 20 6e 53 65 67 6d   the first nSegm
15320 65 6e 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20  ent segments on 
15330 6c 65 76 65 6c 20 69 4c 65 76 65 6c 0a 2a 2a 20  level iLevel.** 
15340 69 73 20 6d 65 72 67 65 64 2e 0a 2a 2a 0a 2a 2a  is merged..**.**
15350 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69 6e   The iterator in
15360 69 74 69 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  itially points t
15370 6f 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  o the first term
15380 2f 72 6f 77 69 64 20 65 6e 74 72 79 20 69 6e 20  /rowid entry in 
15390 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74 65 64  the .** iterated
153a0 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
153b0 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
153c0 74 65 72 4e 65 77 28 0a 20 20 46 74 73 35 49 6e  terNew(.  Fts5In
153d0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
153e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
153f0 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65  5 backend to ite
15400 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20  rate within */. 
15410 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
15420 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 20  pStruct,        
15430 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f 66   /* Structure of
15440 20 73 70 65 63 69 66 69 63 20 69 6e 64 65 78 20   specific index 
15450 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 45 6d  */.  int bSkipEm
15460 70 74 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  pty,            
15470 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
15480 69 67 6e 6f 72 65 20 64 65 6c 65 74 65 2d 6b 65  ignore delete-ke
15490 79 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ys */.  int flag
154a0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
154b0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 49          /* FTS5I
154c0 4e 44 45 58 5f 51 55 45 52 59 5f 58 58 58 20 66  NDEX_QUERY_XXX f
154d0 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lags */.  const 
154e0 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e  u8 *pTerm, int n
154f0 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72  Term,     /* Ter
15500 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f 72  m to seek to (or
15510 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69 6e   NULL/0) */.  in
15520 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  t iLevel,       
15530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15540 20 4c 65 76 65 6c 20 74 6f 20 69 74 65 72 61 74   Level to iterat
15550 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20 2a  e (-1 for all) *
15560 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74  /.  int nSegment
15570 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15580 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15590 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72   segments to mer
155a0 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20 2a  ge (iLevel>=0) *
155b0 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  /.  Fts5IndexIte
155c0 72 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20  r **ppOut       
155d0 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63      /* New objec
155e0 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53  t */.){.  int nS
155f0 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
15600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
15610 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 2d 69  ber of segment-i
15620 74 65 72 73 20 69 6e 20 75 73 65 20 2a 2f 0a 20  ters in use */. 
15630 20 69 6e 74 20 69 49 74 65 72 20 3d 20 30 3b 20   int iIter = 0; 
15640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15650 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65   /* */.  int iSe
15660 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
15670 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
15680 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
15690 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  ugh segments */.
156a0 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
156b0 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20   = {0,0,0};     
156c0 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64    /* Buffer used
156d0 20 62 79 20 66 74 73 35 53 65 67 49 74 65 72 53   by fts5SegIterS
156e0 65 65 6b 49 6e 69 74 28 29 20 2a 2f 0a 20 20 46  eekInit() */.  F
156f0 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
15700 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46 74 73 35 49  l *pLvl;.  Fts5I
15710 6e 64 65 78 49 74 65 72 20 2a 70 4e 65 77 3b 0a  ndexIter *pNew;.
15720 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72  .  assert( (pTer
15730 6d 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30  m==0 && nTerm==0
15740 29 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b  ) || iLevel<0 );
15750 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
15760 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  space for the ne
15770 77 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65 72  w multi-seg-iter
15780 61 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ator. */.  if( p
15790 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
157a0 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 65 76 65  ){.    if( iLeve
157b0 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  l<0 ){.      ass
157c0 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53  ert( pStruct->nS
157d0 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75  egment==fts5Stru
157e0 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e  ctureCountSegmen
157f0 74 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20  ts(pStruct) );. 
15800 20 20 20 20 20 6e 53 65 67 20 3d 20 70 53 74 72       nSeg = pStr
15810 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20  uct->nSegment;. 
15820 20 20 20 20 20 6e 53 65 67 20 2b 3d 20 28 70 2d       nSeg += (p-
15830 3e 70 48 61 73 68 20 3f 20 31 20 3a 20 30 29 3b  >pHash ? 1 : 0);
15840 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15850 20 20 6e 53 65 67 20 3d 20 4d 49 4e 28 70 53 74    nSeg = MIN(pSt
15860 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65  ruct->aLevel[iLe
15870 76 65 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65 67 6d  vel].nSeg, nSegm
15880 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
15890 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77 20    *ppOut = pNew 
158a0 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41  = fts5MultiIterA
158b0 6c 6c 6f 63 28 70 2c 20 6e 53 65 67 29 3b 0a 20  lloc(p, nSeg);. 
158c0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
158d0 65 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e 62  eturn;.  pNew->b
158e0 52 65 76 20 3d 20 28 30 21 3d 28 66 6c 61 67 73  Rev = (0!=(flags
158f0 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
15900 52 59 5f 44 45 53 43 29 29 3b 0a 20 20 70 4e 65  RY_DESC));.  pNe
15910 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 3d 20  w->bSkipEmpty = 
15920 28 75 38 29 62 53 6b 69 70 45 6d 70 74 79 3b 0a  (u8)bSkipEmpty;.
15930 20 20 70 4e 65 77 2d 3e 70 53 74 72 75 63 74 20    pNew->pStruct 
15940 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 66 74 73  = pStruct;.  fts
15950 35 53 74 72 75 63 74 75 72 65 52 65 66 28 70 53  5StructureRef(pS
15960 74 72 75 63 74 29 3b 0a 0a 20 20 2f 2a 20 49 6e  truct);..  /* In
15970 69 74 69 61 6c 69 7a 65 20 65 61 63 68 20 6f 66  itialize each of
15980 20 74 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 73   the component s
15990 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73  egment iterators
159a0 2e 20 2a 2f 0a 20 20 69 66 28 20 69 4c 65 76 65  . */.  if( iLeve
159b0 6c 3c 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53  l<0 ){.    Fts5S
159c0 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
159d0 45 6e 64 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  End = &pStruct->
159e0 61 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e  aLevel[pStruct->
159f0 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 69 66 28  nLevel];.    if(
15a00 20 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20 20   p->pHash ){.   
15a10 20 20 20 2f 2a 20 41 64 64 20 61 20 73 65 67 6d     /* Add a segm
15a20 65 6e 74 20 69 74 65 72 61 74 6f 72 20 66 6f 72  ent iterator for
15a30 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
15a40 74 65 6e 74 73 20 6f 66 20 74 68 65 20 68 61 73  tents of the has
15a50 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  h table. */.    
15a60 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
15a70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53  Iter = &pNew->aS
15a80 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20  eg[iIter++];.   
15a90 20 20 20 66 74 73 35 53 65 67 49 74 65 72 48 61     fts5SegIterHa
15aa0 73 68 49 6e 69 74 28 70 2c 20 70 54 65 72 6d 2c  shInit(p, pTerm,
15ab0 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70   nTerm, flags, p
15ac0 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Iter);.    }.   
15ad0 20 66 6f 72 28 70 4c 76 6c 3d 26 70 53 74 72 75   for(pLvl=&pStru
15ae0 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b 20 70  ct->aLevel[0]; p
15af0 4c 76 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c 2b 2b  Lvl<pEnd; pLvl++
15b00 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65  ){.      for(iSe
15b10 67 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20  g=pLvl->nSeg-1; 
15b20 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29  iSeg>=0; iSeg--)
15b30 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 53 74  {.        Fts5St
15b40 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
15b50 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53  pSeg = &pLvl->aS
15b60 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20  eg[iSeg];.      
15b70 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
15b80 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53  Iter = &pNew->aS
15b90 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20  eg[iIter++];.   
15ba0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
15bb0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  0 ){.          f
15bc0 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28 70  ts5SegIterInit(p
15bd0 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a  , pSeg, pIter);.
15be0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
15bf0 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
15c00 49 74 65 72 53 65 65 6b 49 6e 69 74 28 70 2c 20  IterSeekInit(p, 
15c10 26 62 75 66 2c 20 70 54 65 72 6d 2c 20 6e 54 65  &buf, pTerm, nTe
15c20 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53 65 67 2c  rm, flags, pSeg,
15c30 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20   pIter);.       
15c40 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
15c50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c  .  }else{.    pL
15c60 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
15c70 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b 0a 20  Level[iLevel];. 
15c80 20 20 20 66 6f 72 28 69 53 65 67 3d 6e 53 65 67     for(iSeg=nSeg
15c90 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65  -1; iSeg>=0; iSe
15ca0 67 2d 2d 29 7b 0a 20 20 20 20 20 20 66 74 73 35  g--){.      fts5
15cb0 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20 26  SegIterInit(p, &
15cc0 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
15cd0 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49  , &pNew->aSeg[iI
15ce0 74 65 72 2b 2b 5d 29 3b 0a 20 20 20 20 7d 0a 20  ter++]);.    }. 
15cf0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 49 74   }.  assert( iIt
15d00 65 72 3d 3d 6e 53 65 67 20 29 3b 0a 0a 20 20 2f  er==nSeg );..  /
15d10 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 77  * If the above w
15d20 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 65  as successful, e
15d30 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 69 74  ach component it
15d40 65 72 61 74 6f 72 73 20 6e 6f 77 20 70 6f 69 6e  erators now poin
15d50 74 73 20 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ts .  ** to the 
15d60 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 69  first entry in i
15d70 74 73 20 73 65 67 6d 65 6e 74 2e 20 49 6e 20 74  ts segment. In t
15d80 68 69 73 20 63 61 73 65 20 69 6e 69 74 69 61 6c  his case initial
15d90 69 7a 65 20 74 68 65 20 0a 20 20 2a 2a 20 61 46  ize the .  ** aF
15da0 69 72 73 74 5b 5d 20 61 72 72 61 79 2e 20 4f 72  irst[] array. Or
15db0 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61  , if an error ha
15dc0 73 20 6f 63 63 75 72 72 65 64 2c 20 66 72 65 65  s occurred, free
15dd0 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 20 20   the iterator.  
15de0 2a 2a 20 6f 62 6a 65 63 74 20 61 6e 64 20 73 65  ** object and se
15df0 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
15e00 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e 20 20  iable to NULL.  
15e10 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  */.  if( p->rc==
15e20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15e30 20 66 6f 72 28 69 49 74 65 72 3d 70 4e 65 77 2d   for(iIter=pNew-
15e40 3e 6e 53 65 67 2d 31 3b 20 69 49 74 65 72 3e 30  >nSeg-1; iIter>0
15e50 3b 20 69 49 74 65 72 2d 2d 29 7b 0a 20 20 20 20  ; iIter--){.    
15e60 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 20    int iEq;.     
15e70 20 69 66 28 20 28 69 45 71 20 3d 20 66 74 73 35   if( (iEq = fts5
15e80 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61  MultiIterDoCompa
15e90 72 65 28 70 4e 65 77 2c 20 69 49 74 65 72 29 29  re(pNew, iIter))
15ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
15eb0 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20 26  SegIterNext(p, &
15ec0 70 4e 65 77 2d 3e 61 53 65 67 5b 69 45 71 5d 2c  pNew->aSeg[iEq],
15ed0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73   0);.        fts
15ee0 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
15ef0 65 64 28 70 2c 20 70 4e 65 77 2c 20 69 45 71 2c  ed(p, pNew, iEq,
15f00 20 69 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   iIter);.      }
15f10 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d  .    }.    fts5M
15f20 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 70  ultiIterSetEof(p
15f30 4e 65 77 29 3b 0a 20 20 20 20 66 74 73 35 41 73  New);.    fts5As
15f40 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
15f50 75 70 28 70 2c 20 70 4e 65 77 29 3b 0a 0a 20 20  up(p, pNew);..  
15f60 20 20 69 66 28 20 70 4e 65 77 2d 3e 62 53 6b 69    if( pNew->bSki
15f70 70 45 6d 70 74 79 20 26 26 20 66 74 73 35 4d 75  pEmpty && fts5Mu
15f80 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70  ltiIterIsEmpty(p
15f90 2c 20 70 4e 65 77 29 20 29 7b 0a 20 20 20 20 20  , pNew) ){.     
15fa0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
15fb0 78 74 28 70 2c 20 70 4e 65 77 2c 20 30 2c 20 30  xt(p, pNew, 0, 0
15fc0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
15fd0 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  {.    fts5MultiI
15fe0 74 65 72 46 72 65 65 28 70 2c 20 70 4e 65 77 29  terFree(p, pNew)
15ff0 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 30  ;.    *ppOut = 0
16000 3b 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66  ;.  }.  fts5Buff
16010 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a  erFree(&buf);.}.
16020 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e  ./*.** Create an
16030 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 74   Fts5IndexIter t
16040 68 61 74 20 69 74 65 72 61 74 65 73 20 74 68 72  hat iterates thr
16050 6f 75 67 68 20 74 68 65 20 64 6f 63 6c 69 73 74  ough the doclist
16060 20 70 72 6f 76 69 64 65 64 0a 2a 2a 20 61 73 20   provided.** as 
16070 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
16080 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
16090 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
160a0 72 4e 65 77 32 28 0a 20 20 46 74 73 35 49 6e 64  rNew2(.  Fts5Ind
160b0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
160c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
160d0 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72   backend to iter
160e0 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20  ate within */.  
160f0 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 2c  Fts5Data *pData,
16100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16110 2f 2a 20 44 6f 63 6c 69 73 74 20 74 6f 20 69 74  /* Doclist to it
16120 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f  erate through */
16130 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 20 20 20  .  int bDesc,   
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16150 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 64     /* True for d
16160 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20  escending rowid 
16170 6f 72 64 65 72 20 2a 2f 0a 20 20 46 74 73 35 49  order */.  Fts5I
16180 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 4f 75 74  ndexIter **ppOut
16190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
161a0 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  w object */.){. 
161b0 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
161c0 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 66  pNew;.  pNew = f
161d0 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f  ts5MultiIterAllo
161e0 63 28 70 2c 20 32 29 3b 0a 20 20 69 66 28 20 70  c(p, 2);.  if( p
161f0 4e 65 77 20 29 7b 0a 20 20 20 20 46 74 73 35 53  New ){.    Fts5S
16200 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  egIter *pIter = 
16210 26 70 4e 65 77 2d 3e 61 53 65 67 5b 31 5d 3b 0a  &pNew->aSeg[1];.
16220 0a 20 20 20 20 70 4e 65 77 2d 3e 62 46 69 6c 74  .    pNew->bFilt
16230 65 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 49  ered = 1;.    pI
16240 74 65 72 2d 3e 66 6c 61 67 73 20 3d 20 46 54 53  ter->flags = FTS
16250 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
16260 4d 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61  M;.    if( pData
16270 2d 3e 73 7a 4c 65 61 66 3e 30 20 29 7b 0a 20 20  ->szLeaf>0 ){.  
16280 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
16290 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20   = pData;.      
162a0 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
162b0 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72 69  et = fts5GetVari
162c0 6e 74 28 70 44 61 74 61 2d 3e 70 2c 20 28 75 36  nt(pData->p, (u6
162d0 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
162e0 64 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  d);.      pIter-
162f0 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
16300 20 70 44 61 74 61 2d 3e 6e 6e 3b 0a 20 20 20 20   pData->nn;.    
16310 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 31    pNew->aFirst[1
16320 5d 2e 69 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  ].iFirst = 1;.  
16330 20 20 20 20 69 66 28 20 62 44 65 73 63 20 29 7b      if( bDesc ){
16340 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 62  .        pNew->b
16350 52 65 76 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Rev = 1;.       
16360 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d   pIter->flags |=
16370 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
16380 56 45 52 53 45 3b 0a 20 20 20 20 20 20 20 20 66  VERSE;.        f
16390 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
163a0 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74  eInitPage(p, pIt
163b0 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  er);.      }else
163c0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  {.        fts5Se
163d0 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
163e0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   pIter);.      }
163f0 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 30  .      pData = 0
16400 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16410 20 20 20 70 4e 65 77 2d 3e 62 45 6f 66 20 3d 20     pNew->bEof = 
16420 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a 70  1;.    }..    *p
16430 70 4f 75 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  pOut = pNew;.  }
16440 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ..  fts5DataRele
16450 61 73 65 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f  ase(pData);.}../
16460 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
16470 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   if the iterator
16480 20 69 73 20 61 74 20 45 4f 46 20 6f 72 20 69 66   is at EOF or if
16490 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   an error has oc
164a0 63 75 72 72 65 64 2e 20 0a 2a 2a 20 46 61 6c 73  curred. .** Fals
164b0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
164c0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d  static int fts5M
164d0 75 6c 74 69 49 74 65 72 45 6f 66 28 46 74 73 35  ultiIterEof(Fts5
164e0 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49 6e  Index *p, Fts5In
164f0 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  dexIter *pIter){
16500 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
16510 20 0a 20 20 20 20 20 20 7c 7c 20 28 70 49 74 65   .      || (pIte
16520 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
16530 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
16540 20 5d 2e 70 4c 65 61 66 3d 3d 30 29 3d 3d 70 49   ].pLeaf==0)==pI
16550 74 65 72 2d 3e 62 45 6f 66 20 0a 20 20 29 3b 0a  ter->bEof .  );.
16560 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 20    return (p->rc 
16570 7c 7c 20 70 49 74 65 72 2d 3e 62 45 6f 66 29 3b  || pIter->bEof);
16580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
16590 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
165a0 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
165b0 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e   iterator curren
165c0 74 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  tly points.** to
165d0 2e 20 49 66 20 74 68 65 20 69 74 65 72 61 74 6f  . If the iterato
165e0 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46 20  r points to EOF 
165f0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
16600 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  on is called the
16610 0a 2a 2a 20 72 65 73 75 6c 74 73 20 61 72 65 20  .** results are 
16620 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
16630 61 74 69 63 20 69 36 34 20 66 74 73 35 4d 75 6c  atic i64 fts5Mul
16640 74 69 49 74 65 72 52 6f 77 69 64 28 46 74 73 35  tiIterRowid(Fts5
16650 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
16660 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
16670 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
16680 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
16690 74 20 5d 2e 70 4c 65 61 66 20 29 3b 0a 20 20 72  t ].pLeaf );.  r
166a0 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 53 65  eturn pIter->aSe
166b0 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
166c0 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 69 52 6f  [1].iFirst ].iRo
166d0 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  wid;.}../*.** Mo
166e0 76 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ve the iterator 
166f0 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
16700 79 20 61 74 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e  y at or followin
16710 67 20 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61  g iMatch..*/.sta
16720 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
16730 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a  tiIterNextFrom(.
16740 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
16750 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
16760 20 2a 70 49 74 65 72 2c 20 0a 20 20 69 36 34 20   *pIter, .  i64 
16770 69 4d 61 74 63 68 0a 29 7b 0a 20 20 77 68 69 6c  iMatch.){.  whil
16780 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36 34 20  e( 1 ){.    i64 
16790 69 52 6f 77 69 64 3b 0a 20 20 20 20 66 74 73 35  iRowid;.    fts5
167a0 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
167b0 20 70 49 74 65 72 2c 20 31 2c 20 69 4d 61 74 63   pIter, 1, iMatc
167c0 68 29 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35  h);.    if( fts5
167d0 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
167e0 70 49 74 65 72 29 20 29 20 62 72 65 61 6b 3b 0a  pIter) ) break;.
167f0 20 20 20 20 69 52 6f 77 69 64 20 3d 20 66 74 73      iRowid = fts
16800 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28  5MultiIterRowid(
16810 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  pIter);.    if( 
16820 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20 26  pIter->bRev==0 &
16830 26 20 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68  & iRowid>=iMatch
16840 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
16850 28 20 70 49 74 65 72 2d 3e 62 52 65 76 21 3d 30  ( pIter->bRev!=0
16860 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4d 61 74   && iRowid<=iMat
16870 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ch ) break;.  }.
16880 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
16890 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62  a pointer to a b
168a0 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
168b0 20 74 68 65 20 74 65 72 6d 20 61 73 73 6f 63 69   the term associ
168c0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 0a 2a  ated with the .*
168d0 2a 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  * entry that the
168e0 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e   iterator curren
168f0 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  tly points to..*
16900 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
16910 38 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65 72  8 *fts5MultiIter
16920 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78 49 74  Term(Fts5IndexIt
16930 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a  er *pIter, int *
16940 70 6e 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74  pn){.  Fts5SegIt
16950 65 72 20 2a 70 20 3d 20 26 70 49 74 65 72 2d 3e  er *p = &pIter->
16960 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
16970 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
16980 0a 20 20 2a 70 6e 20 3d 20 70 2d 3e 74 65 72 6d  .  *pn = p->term
16990 2e 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  .n;.  return p->
169a0 74 65 72 6d 2e 70 3b 0a 7d 0a 0a 73 74 61 74 69  term.p;.}..stati
169b0 63 20 76 6f 69 64 20 66 74 73 35 43 68 75 6e 6b  c void fts5Chunk
169c0 49 74 65 72 61 74 65 28 0a 20 20 46 74 73 35 49  Iterate(.  Fts5I
169d0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
169e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
169f0 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dex object */.  
16a00 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
16a10 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
16a20 2f 2a 20 50 6f 73 6c 69 73 74 20 6f 66 20 74 68  /* Poslist of th
16a30 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  is iterator */. 
16a40 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20   void *pCtx,    
16a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a60 20 2f 2a 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e   /* Context poin
16a70 74 65 72 20 66 6f 72 20 78 43 68 75 6e 6b 20 63  ter for xChunk c
16a80 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69  allback */.  voi
16a90 64 20 28 2a 78 43 68 75 6e 6b 29 28 46 74 73 35  d (*xChunk)(Fts5
16aa0 49 6e 64 65 78 2a 2c 20 76 6f 69 64 2a 2c 20 63  Index*, void*, c
16ab0 6f 6e 73 74 20 75 38 2a 2c 20 69 6e 74 29 0a 29  onst u8*, int).)
16ac0 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70  {.  int nRem = p
16ad0 53 65 67 2d 3e 6e 50 6f 73 3b 20 20 20 20 20 20  Seg->nPos;      
16ae0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
16af0 20 62 79 74 65 73 20 73 74 69 6c 6c 20 74 6f 20   bytes still to 
16b00 63 6f 6d 65 20 2a 2f 0a 20 20 46 74 73 35 44 61  come */.  Fts5Da
16b10 74 61 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20  ta *pData = 0;. 
16b20 20 75 38 20 2a 70 43 68 75 6e 6b 20 3d 20 26 70   u8 *pChunk = &p
16b30 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53  Seg->pLeaf->p[pS
16b40 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d  eg->iLeafOffset]
16b50 3b 0a 20 20 69 6e 74 20 6e 43 68 75 6e 6b 20 3d  ;.  int nChunk =
16b60 20 4d 49 4e 28 6e 52 65 6d 2c 20 70 53 65 67 2d   MIN(nRem, pSeg-
16b70 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2d  >pLeaf->szLeaf -
16b80 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73   pSeg->iLeafOffs
16b90 65 74 29 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 20  et);.  int pgno 
16ba0 3d 20 70 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e  = pSeg->iLeafPgn
16bb0 6f 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 53 61 76  o;.  int pgnoSav
16bc0 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69  e = 0;..  /* Thi
16bd0 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
16be0 6e 6f 74 6d 77 6f 72 6b 20 77 69 74 68 20 64 65  notmwork with de
16bf0 74 61 69 6c 3d 6e 6f 6e 65 20 64 61 74 61 62 61  tail=none databa
16c00 73 65 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ses. */.  assert
16c10 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  ( p->pConfig->eD
16c20 65 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41  etail!=FTS5_DETA
16c30 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 69 66  IL_NONE );..  if
16c40 28 20 28 70 53 65 67 2d 3e 66 6c 61 67 73 20 26  ( (pSeg->flags &
16c50 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
16c60 56 45 52 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20  VERSE)==0 ){.   
16c70 20 70 67 6e 6f 53 61 76 65 20 3d 20 70 67 6e 6f   pgnoSave = pgno
16c80 2b 31 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  +1;.  }..  while
16c90 28 20 31 20 29 7b 0a 20 20 20 20 78 43 68 75 6e  ( 1 ){.    xChun
16ca0 6b 28 70 2c 20 70 43 74 78 2c 20 70 43 68 75 6e  k(p, pCtx, pChun
16cb0 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20 20 20 20  k, nChunk);.    
16cc0 6e 52 65 6d 20 2d 3d 20 6e 43 68 75 6e 6b 3b 0a  nRem -= nChunk;.
16cd0 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
16ce0 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20  ase(pData);.    
16cf0 69 66 28 20 6e 52 65 6d 3c 3d 30 20 29 7b 0a 20  if( nRem<=0 ){. 
16d00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16d10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 67 6e  }else{.      pgn
16d20 6f 2b 2b 3b 0a 20 20 20 20 20 20 70 44 61 74 61  o++;.      pData
16d30 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
16d40 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  p, FTS5_SEGMENT_
16d50 52 4f 57 49 44 28 70 53 65 67 2d 3e 70 53 65 67  ROWID(pSeg->pSeg
16d60 2d 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f 29 29  ->iSegid, pgno))
16d70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74  ;.      if( pDat
16d80 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  a==0 ) break;.  
16d90 20 20 20 20 70 43 68 75 6e 6b 20 3d 20 26 70 44      pChunk = &pD
16da0 61 74 61 2d 3e 70 5b 34 5d 3b 0a 20 20 20 20 20  ata->p[4];.     
16db0 20 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52   nChunk = MIN(nR
16dc0 65 6d 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61  em, pData->szLea
16dd0 66 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 69 66  f - 4);.      if
16de0 28 20 70 67 6e 6f 3d 3d 70 67 6e 6f 53 61 76 65  ( pgno==pgnoSave
16df0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
16e00 72 74 28 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c  rt( pSeg->pNextL
16e10 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  eaf==0 );.      
16e20 20 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61    pSeg->pNextLea
16e30 66 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 20  f = pData;.     
16e40 20 20 20 70 44 61 74 61 20 3d 20 30 3b 0a 20 20     pData = 0;.  
16e50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
16e60 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }..../*.** Alloc
16e70 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e  ate a new segmen
16e80 74 2d 69 64 20 66 6f 72 20 74 68 65 20 73 74 72  t-id for the str
16e90 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 20  ucture pStruct. 
16ea0 54 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 0a  The new segment.
16eb0 2a 2a 20 69 64 20 6d 75 73 74 20 62 65 20 62 65  ** id must be be
16ec0 74 77 65 65 6e 20 31 20 61 6e 64 20 36 35 33 33  tween 1 and 6533
16ed0 35 20 69 6e 63 6c 75 73 69 76 65 2c 20 61 6e 64  5 inclusive, and
16ee0 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 75 73 65   must not be use
16ef0 64 20 62 79 20 0a 2a 2a 20 61 6e 79 20 63 75 72  d by .** any cur
16f00 72 65 6e 74 6c 79 20 65 78 69 73 74 69 6e 67 20  rently existing 
16f10 73 65 67 6d 65 6e 74 2e 20 49 66 20 61 20 66 72  segment. If a fr
16f20 65 65 20 73 65 67 6d 65 6e 74 20 69 64 20 63 61  ee segment id ca
16f30 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 0a 2a  nnot be found,.*
16f40 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 69 73  * SQLITE_FULL is
16f50 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
16f60 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
16f70 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
16f80 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
16f90 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 30 20 69   is a no-op. 0 i
16fa0 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69  s .** returned i
16fb0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
16fc0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 41  static int fts5A
16fd0 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 46 74 73  llocateSegid(Fts
16fe0 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
16ff0 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
17000 74 29 7b 0a 20 20 69 6e 74 20 69 53 65 67 69 64  t){.  int iSegid
17010 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   = 0;..  if( p->
17020 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17030 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74  .    if( pStruct
17040 2d 3e 6e 53 65 67 6d 65 6e 74 3e 3d 46 54 53 35  ->nSegment>=FTS5
17050 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20 29 7b 0a  _MAX_SEGMENT ){.
17060 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
17070 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
17080 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 68 69 6c  else{.      whil
17090 65 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a  e( iSegid==0 ){.
170a0 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c          int iLvl
170b0 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 20 20  , iSeg;.        
170c0 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
170d0 73 73 28 73 69 7a 65 6f 66 28 75 33 32 29 2c 20  ss(sizeof(u32), 
170e0 28 76 6f 69 64 2a 29 26 69 53 65 67 69 64 29 3b  (void*)&iSegid);
170f0 0a 20 20 20 20 20 20 20 20 69 53 65 67 69 64 20  .        iSegid 
17100 3d 20 69 53 65 67 69 64 20 26 20 28 28 31 20 3c  = iSegid & ((1 <
17110 3c 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42  < FTS5_DATA_ID_B
17120 29 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  )-1);.        fo
17130 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
17140 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
17150 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iLvl++){.       
17160 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
17170 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65  Seg<pStruct->aLe
17180 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20  vel[iLvl].nSeg; 
17190 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
171a0 20 20 20 20 20 69 66 28 20 69 53 65 67 69 64 3d       if( iSegid=
171b0 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  =pStruct->aLevel
171c0 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67  [iLvl].aSeg[iSeg
171d0 5d 2e 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20  ].iSegid ){.    
171e0 20 20 20 20 20 20 20 20 20 20 69 53 65 67 69 64            iSegid
171f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
17200 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
17210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17220 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
17230 65 74 75 72 6e 20 69 53 65 67 69 64 3b 0a 7d 0a  eturn iSegid;.}.
17240 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61  ./*.** Discard a
17250 6c 6c 20 64 61 74 61 20 63 75 72 72 65 6e 74 6c  ll data currentl
17260 79 20 63 61 63 68 65 64 20 69 6e 20 74 68 65 20  y cached in the 
17270 68 61 73 68 2d 74 61 62 6c 65 73 2e 0a 2a 2f 0a  hash-tables..*/.
17280 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
17290 49 6e 64 65 78 44 69 73 63 61 72 64 44 61 74 61  IndexDiscardData
172a0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
172b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61    assert( p->pHa
172c0 73 68 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e  sh || p->nPendin
172d0 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66  gData==0 );.  if
172e0 28 20 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20  ( p->pHash ){.  
172f0 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
17300 68 43 6c 65 61 72 28 70 2d 3e 70 48 61 73 68 29  hClear(p->pHash)
17310 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e  ;.    p->nPendin
17320 67 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d  gData = 0;.  }.}
17330 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
17340 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  he size of the p
17350 72 65 66 69 78 2c 20 69 6e 20 62 79 74 65 73 2c  refix, in bytes,
17360 20 74 68 61 74 20 62 75 66 66 65 72 20 28 6e 4e   that buffer (nN
17370 65 77 2f 70 4e 65 77 29 20 73 68 61 72 65 73 0a  ew/pNew) shares.
17380 2a 2a 20 77 69 74 68 20 62 75 66 66 65 72 20 28  ** with buffer (
17390 6e 4f 6c 64 2f 70 4f 6c 64 29 2e 0a 2a 2f 0a 73  nOld/pOld)..*/.s
173a0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 72  tatic int fts5Pr
173b0 65 66 69 78 43 6f 6d 70 72 65 73 73 28 0a 20 20  efixCompress(.  
173c0 69 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20  int nOld, const 
173d0 75 38 20 2a 70 4f 6c 64 2c 0a 20 20 69 6e 74 20  u8 *pOld,.  int 
173e0 6e 4e 65 77 2c 20 63 6f 6e 73 74 20 75 38 20 2a  nNew, const u8 *
173f0 70 4e 65 77 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  pNew.){.  int i;
17400 0a 20 20 61 73 73 65 72 74 28 20 66 74 73 35 42  .  assert( fts5B
17410 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4f 6c 64 2c  lobCompare(pOld,
17420 20 6e 4f 6c 64 2c 20 70 4e 65 77 2c 20 6e 4e 65   nOld, pNew, nNe
17430 77 29 3c 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  w)<0 );.  for(i=
17440 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
17450 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 5b 69 5d  .    if( pOld[i]
17460 21 3d 70 4e 65 77 5b 69 5d 20 29 20 62 72 65 61  !=pNew[i] ) brea
17470 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
17480 69 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  i;.}..static voi
17490 64 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78  d fts5WriteDlidx
174a0 43 6c 65 61 72 28 0a 20 20 46 74 73 35 49 6e 64  Clear(.  Fts5Ind
174b0 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65  ex *p, .  Fts5Se
174c0 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
174d0 2c 0a 20 20 69 6e 74 20 62 46 6c 75 73 68 20 20  ,.  int bFlush  
174e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174f0 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
17500 77 72 69 74 65 20 64 6c 69 64 78 20 74 6f 20 64  write dlidx to d
17510 69 73 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  isk */.){.  int 
17520 69 3b 0a 20 20 61 73 73 65 72 74 28 20 62 46 6c  i;.  assert( bFl
17530 75 73 68 3d 3d 30 20 7c 7c 20 28 70 57 72 69 74  ush==0 || (pWrit
17540 65 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20  er->nDlidx>0 && 
17550 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
17560 30 5d 2e 62 75 66 2e 6e 3e 30 29 20 29 3b 0a 20  0].buf.n>0) );. 
17570 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69   for(i=0; i<pWri
17580 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b  ter->nDlidx; i++
17590 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78  ){.    Fts5Dlidx
175a0 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  Writer *pDlidx =
175b0 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64   &pWriter->aDlid
175c0 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  x[i];.    if( pD
175d0 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29  lidx->buf.n==0 )
175e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
175f0 62 46 6c 75 73 68 20 29 7b 0a 20 20 20 20 20 20  bFlush ){.      
17600 61 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e  assert( pDlidx->
17610 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20 20  pgno!=0 );.     
17620 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
17630 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46 54 53  , .          FTS
17640 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 57  5_DLIDX_ROWID(pW
17650 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69  riter->iSegid, i
17660 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c  , pDlidx->pgno),
17670 0a 20 20 20 20 20 20 20 20 20 20 70 44 6c 69 64  .          pDlid
17680 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64 78  x->buf.p, pDlidx
17690 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b  ->buf.n.      );
176a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
176b0 65 33 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f  e3Fts5BufferZero
176c0 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a  (&pDlidx->buf);.
176d0 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65      pDlidx->bPre
176e0 76 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a  vValid = 0;.  }.
176f0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 72 6f 77 20 74 68  }../*.** Grow th
17700 65 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  e pWriter->aDlid
17710 78 5b 5d 20 61 72 72 61 79 20 74 6f 20 61 74 20  x[] array to at 
17720 6c 65 61 73 74 20 6e 4c 76 6c 20 65 6c 65 6d 65  least nLvl eleme
17730 6e 74 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20  nts in size..** 
17740 41 6e 79 20 6e 65 77 20 61 72 72 61 79 20 65 6c  Any new array el
17750 65 6d 65 6e 74 73 20 61 72 65 20 7a 65 72 6f 65  ements are zeroe
17760 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
17770 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
17780 74 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78  t fts5WriteDlidx
17790 47 72 6f 77 28 0a 20 20 46 74 73 35 49 6e 64 65  Grow(.  Fts5Inde
177a0 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 65 67 57  x *p,.  Fts5SegW
177b0 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a  riter *pWriter,.
177c0 20 20 69 6e 74 20 6e 4c 76 6c 0a 29 7b 0a 20 20    int nLvl.){.  
177d0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
177e0 45 5f 4f 4b 20 26 26 20 6e 4c 76 6c 3e 3d 70 57  E_OK && nLvl>=pW
177f0 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 20 29 7b  riter->nDlidx ){
17800 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 57 72  .    Fts5DlidxWr
17810 69 74 65 72 20 2a 61 44 6c 69 64 78 20 3d 20 28  iter *aDlidx = (
17820 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 2a  Fts5DlidxWriter*
17830 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
17840 28 0a 20 20 20 20 20 20 20 20 70 57 72 69 74 65  (.        pWrite
17850 72 2d 3e 61 44 6c 69 64 78 2c 20 73 69 7a 65 6f  r->aDlidx, sizeo
17860 66 28 46 74 73 35 44 6c 69 64 78 57 72 69 74 65  f(Fts5DlidxWrite
17870 72 29 20 2a 20 6e 4c 76 6c 0a 20 20 20 20 29 3b  r) * nLvl.    );
17880 0a 20 20 20 20 69 66 28 20 61 44 6c 69 64 78 3d  .    if( aDlidx=
17890 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  =0 ){.      p->r
178a0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
178b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
178c0 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
178d0 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 57  izeof(Fts5DlidxW
178e0 72 69 74 65 72 29 20 2a 20 28 6e 4c 76 6c 20 2d  riter) * (nLvl -
178f0 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78   pWriter->nDlidx
17900 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
17910 26 61 44 6c 69 64 78 5b 70 57 72 69 74 65 72 2d  &aDlidx[pWriter-
17920 3e 6e 44 6c 69 64 78 5d 2c 20 30 2c 20 6e 42 79  >nDlidx], 0, nBy
17930 74 65 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74  te);.      pWrit
17940 65 72 2d 3e 61 44 6c 69 64 78 20 3d 20 61 44 6c  er->aDlidx = aDl
17950 69 64 78 3b 0a 20 20 20 20 20 20 70 57 72 69 74  idx;.      pWrit
17960 65 72 2d 3e 6e 44 6c 69 64 78 20 3d 20 6e 4c 76  er->nDlidx = nLv
17970 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  l;.    }.  }.  r
17980 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a  eturn p->rc;.}..
17990 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  /*.** If the cur
179a0 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64  rent doclist-ind
179b0 65 78 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20  ex accumulating 
179c0 69 6e 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  in pWriter->aDli
179d0 64 78 5b 5d 20 69 73 20 6c 61 72 67 65 0a 2a 2a  dx[] is large.**
179e0 20 65 6e 6f 75 67 68 2c 20 66 6c 75 73 68 20 69   enough, flush i
179f0 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 72 65  t to disk and re
17a00 74 75 72 6e 20 31 2e 20 4f 74 68 65 72 77 69 73  turn 1. Otherwis
17a10 65 20 64 69 73 63 61 72 64 20 69 74 20 61 6e 64  e discard it and
17a20 20 72 65 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f 2e   return.** zero.
17a30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
17a40 74 73 35 57 72 69 74 65 46 6c 75 73 68 44 6c 69  ts5WriteFlushDli
17a50 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  dx(Fts5Index *p,
17a60 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
17a70 70 57 72 69 74 65 72 29 7b 0a 20 20 69 6e 74 20  pWriter){.  int 
17a80 62 46 6c 61 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a  bFlag = 0;..  /*
17a90 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 46   If there were F
17aa0 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49  TS5_MIN_DLIDX_SI
17ab0 5a 45 20 6f 72 20 6d 6f 72 65 20 65 6d 70 74 79  ZE or more empty
17ac0 20 6c 65 61 66 20 70 61 67 65 73 20 77 72 69 74   leaf pages writ
17ad0 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
17ae0 64 61 74 61 62 61 73 65 2c 20 61 6c 73 6f 20 77  database, also w
17af0 72 69 74 65 20 74 68 65 20 64 6f 63 6c 69 73 74  rite the doclist
17b00 2d 69 6e 64 65 78 20 74 6f 20 64 69 73 6b 2e 20  -index to disk. 
17b10 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65   */.  if( pWrite
17b20 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66  r->aDlidx[0].buf
17b30 2e 6e 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d  .n>0 && pWriter-
17b40 3e 6e 45 6d 70 74 79 3e 3d 46 54 53 35 5f 4d 49  >nEmpty>=FTS5_MI
17b50 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 29 7b 0a  N_DLIDX_SIZE ){.
17b60 20 20 20 20 62 46 6c 61 67 20 3d 20 31 3b 0a 20      bFlag = 1;. 
17b70 20 7d 0a 20 20 66 74 73 35 57 72 69 74 65 44 6c   }.  fts5WriteDl
17b80 69 64 78 43 6c 65 61 72 28 70 2c 20 70 57 72 69  idxClear(p, pWri
17b90 74 65 72 2c 20 62 46 6c 61 67 29 3b 0a 20 20 70  ter, bFlag);.  p
17ba0 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d  Writer->nEmpty =
17bb0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 62 46 6c   0;.  return bFl
17bc0 61 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ag;.}../*.** Thi
17bd0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
17be0 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 70 72  lled whenever pr
17bf0 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20  ocessing of the 
17c00 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65 20  doclist for the 
17c10 0a 2a 2a 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e  .** last term on
17c20 20 6c 65 61 66 20 70 61 67 65 20 28 70 57 72 69   leaf page (pWri
17c30 74 65 72 2d 3e 69 42 74 50 61 67 65 29 20 69 73  ter->iBtPage) is
17c40 20 63 6f 6d 70 6c 65 74 65 64 2e 20 0a 2a 2a 0a   completed. .**.
17c50 2a 2a 20 54 68 65 20 64 6f 63 6c 69 73 74 2d 69  ** The doclist-i
17c60 6e 64 65 78 20 66 6f 72 20 74 68 61 74 20 74 65  ndex for that te
17c70 72 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  rm is currently 
17c80 73 74 6f 72 65 64 20 69 6e 2d 6d 65 6d 6f 72 79  stored in-memory
17c90 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 46   within the.** F
17ca0 74 73 35 53 65 67 57 72 69 74 65 72 2e 61 44 6c  ts5SegWriter.aDl
17cb0 69 64 78 5b 5d 20 61 72 72 61 79 2e 20 49 66 20  idx[] array. If 
17cc0 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  it is large enou
17cd0 67 68 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  gh, this functio
17ce0 6e 0a 2a 2a 20 77 72 69 74 65 73 20 69 74 20 6f  n.** writes it o
17cf0 75 74 20 74 6f 20 64 69 73 6b 2e 20 4f 72 2c 20  ut to disk. Or, 
17d00 69 66 20 69 74 20 69 73 20 74 6f 6f 20 73 6d 61  if it is too sma
17d10 6c 6c 20 74 6f 20 62 6f 74 68 65 72 20 77 69 74  ll to bother wit
17d20 68 2c 20 64 69 73 63 61 72 64 73 0a 2a 2a 20 69  h, discards.** i
17d30 74 2e 0a 2a 2a 0a 2a 2a 20 46 74 73 35 53 65 67  t..**.** Fts5Seg
17d40 57 72 69 74 65 72 2e 62 74 74 65 72 6d 20 63 75  Writer.btterm cu
17d50 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73  rrently contains
17d60 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
17d70 6f 6e 20 70 61 67 65 20 69 42 74 50 61 67 65 2e  on page iBtPage.
17d80 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17d90 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 42 74  fts5WriteFlushBt
17da0 72 65 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ree(Fts5Index *p
17db0 2c 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20  , Fts5SegWriter 
17dc0 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 69 6e 74  *pWriter){.  int
17dd0 20 62 46 6c 61 67 3b 0a 0a 20 20 61 73 73 65 72   bFlag;..  asser
17de0 74 28 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50  t( pWriter->iBtP
17df0 61 67 65 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e  age || pWriter->
17e00 6e 45 6d 70 74 79 3d 3d 30 20 29 3b 0a 20 20 69  nEmpty==0 );.  i
17e10 66 28 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50  f( pWriter->iBtP
17e20 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  age==0 ) return;
17e30 0a 20 20 62 46 6c 61 67 20 3d 20 66 74 73 35 57  .  bFlag = fts5W
17e40 72 69 74 65 46 6c 75 73 68 44 6c 69 64 78 28 70  riteFlushDlidx(p
17e50 2c 20 70 57 72 69 74 65 72 29 3b 0a 0a 20 20 69  , pWriter);..  i
17e60 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
17e70 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  _OK ){.    const
17e80 20 63 68 61 72 20 2a 7a 20 3d 20 28 70 57 72 69   char *z = (pWri
17e90 74 65 72 2d 3e 62 74 74 65 72 6d 2e 6e 3e 30 3f  ter->btterm.n>0?
17ea0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 57 72  (const char*)pWr
17eb0 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e 70 3a 22  iter->btterm.p:"
17ec0 22 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  ");.    /* The f
17ed0 6f 6c 6c 6f 77 69 6e 67 20 77 61 73 20 61 6c 72  ollowing was alr
17ee0 65 61 64 79 20 64 6f 6e 65 20 69 6e 20 66 74 73  eady done in fts
17ef0 35 57 72 69 74 65 49 6e 69 74 28 29 3a 20 2a 2f  5WriteInit(): */
17f00 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
17f10 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78  bind_int(p->pIdx
17f20 57 72 69 74 65 72 2c 20 31 2c 20 70 57 72 69 74  Writer, 1, pWrit
17f30 65 72 2d 3e 69 53 65 67 69 64 29 3b 20 2a 2f 0a  er->iSegid); */.
17f40 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
17f50 5f 62 6c 6f 62 28 70 2d 3e 70 49 64 78 57 72 69  _blob(p->pIdxWri
17f60 74 65 72 2c 20 32 2c 20 7a 2c 20 70 57 72 69 74  ter, 2, z, pWrit
17f70 65 72 2d 3e 62 74 74 65 72 6d 2e 6e 2c 20 53 51  er->btterm.n, SQ
17f80 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
17f90 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
17fa0 6e 74 36 34 28 70 2d 3e 70 49 64 78 57 72 69 74  nt64(p->pIdxWrit
17fb0 65 72 2c 20 33 2c 20 62 46 6c 61 67 20 2b 20 28  er, 3, bFlag + (
17fc0 28 69 36 34 29 70 57 72 69 74 65 72 2d 3e 69 42  (i64)pWriter->iB
17fd0 74 50 61 67 65 3c 3c 31 29 29 3b 0a 20 20 20 20  tPage<<1));.    
17fe0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e  sqlite3_step(p->
17ff0 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20 20  pIdxWriter);.   
18000 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
18010 5f 72 65 73 65 74 28 70 2d 3e 70 49 64 78 57 72  _reset(p->pIdxWr
18020 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20 70 57 72  iter);.  }.  pWr
18030 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20 3d 20  iter->iBtPage = 
18040 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
18050 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   is called once 
18060 66 6f 72 20 65 61 63 68 20 6c 65 61 66 20 70 61  for each leaf pa
18070 67 65 20 65 78 63 65 70 74 20 74 68 65 20 66 69  ge except the fi
18080 72 73 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  rst that contain
18090 73 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e  s.** at least on
180a0 65 20 74 65 72 6d 2e 20 41 72 67 75 6d 65 6e 74  e term. Argument
180b0 20 28 6e 54 65 72 6d 2f 70 54 65 72 6d 29 20 69   (nTerm/pTerm) i
180c0 73 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79 20  s the split-key 
180d0 2d 20 61 20 74 65 72 6d 20 74 68 61 74 0a 2a 2a  - a term that.**
180e0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
180f0 61 6c 6c 20 74 65 72 6d 73 20 77 72 69 74 74 65  all terms writte
18100 6e 20 74 6f 20 65 61 72 6c 69 65 72 20 6c 65 61  n to earlier lea
18110 76 65 73 2c 20 61 6e 64 20 65 71 75 61 6c 20 74  ves, and equal t
18120 6f 20 6f 72 0a 2a 2a 20 73 6d 61 6c 6c 65 72 20  o or.** smaller 
18130 74 68 61 6e 20 74 68 65 20 66 69 72 73 74 20 74  than the first t
18140 65 72 6d 20 6f 6e 20 74 68 65 20 6e 65 77 20 6c  erm on the new l
18150 65 61 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  eaf..**.** If an
18160 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
18170 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
18180 6c 65 66 74 20 69 6e 20 46 74 73 35 49 6e 64 65  left in Fts5Inde
18190 78 2e 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f  x.rc. If an erro
181a0 72 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  r.** has already
181b0 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
181c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
181d0 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
181e0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
181f0 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42   void fts5WriteB
18200 74 72 65 65 54 65 72 6d 28 0a 20 20 46 74 73 35  treeTerm(.  Fts5
18210 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
18220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18230 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
18240 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57  ct */.  Fts5SegW
18250 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20  riter *pWriter, 
18260 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
18270 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
18280 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75  t nTerm, const u
18290 38 20 2a 70 54 65 72 6d 20 20 20 20 20 20 2f 2a  8 *pTerm      /*
182a0 20 46 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 6e   First term on n
182b0 65 77 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ew page */.){.  
182c0 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 42 74  fts5WriteFlushBt
182d0 72 65 65 28 70 2c 20 70 57 72 69 74 65 72 29 3b  ree(p, pWriter);
182e0 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74  .  fts5BufferSet
182f0 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65  (&p->rc, &pWrite
18300 72 2d 3e 62 74 74 65 72 6d 2c 20 6e 54 65 72 6d  r->btterm, nTerm
18310 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70 57 72 69  , pTerm);.  pWri
18320 74 65 72 2d 3e 69 42 74 50 61 67 65 20 3d 20 70  ter->iBtPage = p
18330 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70  Writer->writer.p
18340 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
18350 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
18360 61 6c 6c 65 64 20 77 68 65 6e 20 66 6c 75 73 68  alled when flush
18370 69 6e 67 20 61 20 6c 65 61 66 20 70 61 67 65 20  ing a leaf page 
18380 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  that contains no
18390 0a 2a 2a 20 74 65 72 6d 73 20 61 74 20 61 6c 6c  .** terms at all
183a0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61   to disk..*/.sta
183b0 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
183c0 74 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 0a 20  teBtreeNoTerm(. 
183d0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
183e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183f0 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
18400 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
18410 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
18420 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ter          /* 
18430 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f  Writer object */
18440 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  .){.  /* If ther
18450 65 20 77 65 72 65 20 6e 6f 20 72 6f 77 69 64 73  e were no rowids
18460 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67   on the leaf pag
18470 65 20 65 69 74 68 65 72 20 61 6e 64 20 74 68 65  e either and the
18480 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 0a 20   doclist-index. 
18490 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20   ** has already 
184a0 62 65 65 6e 20 73 74 61 72 74 65 64 2c 20 61 70  been started, ap
184b0 70 65 6e 64 20 61 6e 20 30 78 30 30 20 62 79 74  pend an 0x00 byt
184c0 65 20 74 6f 20 69 74 2e 20 20 2a 2f 0a 20 20 69  e to it.  */.  i
184d0 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  f( pWriter->bFir
184e0 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 26 26  stRowidInPage &&
184f0 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
18500 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 29 7b 0a 20  [0].buf.n>0 ){. 
18510 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74     Fts5DlidxWrit
18520 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57  er *pDlidx = &pW
18530 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d  riter->aDlidx[0]
18540 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44  ;.    assert( pD
18550 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64  lidx->bPrevValid
18560 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46   );.    sqlite3F
18570 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
18580 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
18590 44 6c 69 64 78 2d 3e 62 75 66 2c 20 30 29 3b 0a  Dlidx->buf, 0);.
185a0 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
185b0 65 6e 74 20 74 68 65 20 22 6e 75 6d 62 65 72 20  ent the "number 
185c0 6f 66 20 73 65 71 75 65 6e 74 69 61 6c 20 6c 65  of sequential le
185d0 61 76 65 73 20 77 69 74 68 6f 75 74 20 61 20 74  aves without a t
185e0 65 72 6d 22 20 63 6f 75 6e 74 65 72 2e 20 2a 2f  erm" counter. */
185f0 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70  .  pWriter->nEmp
18600 74 79 2b 2b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ty++;.}..static 
18610 69 36 34 20 66 74 73 35 44 6c 69 64 78 45 78 74  i64 fts5DlidxExt
18620 72 61 63 74 46 69 72 73 74 52 6f 77 69 64 28 46  ractFirstRowid(F
18630 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 29  ts5Buffer *pBuf)
18640 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a  {.  i64 iRowid;.
18650 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 69    int iOff;..  i
18660 4f 66 66 20 3d 20 31 20 2b 20 66 74 73 35 47 65  Off = 1 + fts5Ge
18670 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70  tVarint(&pBuf->p
18680 5b 31 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f 77  [1], (u64*)&iRow
18690 69 64 29 3b 0a 20 20 66 74 73 35 47 65 74 56 61  id);.  fts5GetVa
186a0 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69 4f  rint(&pBuf->p[iO
186b0 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f 77  ff], (u64*)&iRow
186c0 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52  id);.  return iR
186d0 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  owid;.}../*.** R
186e0 6f 77 69 64 20 69 52 6f 77 69 64 20 68 61 73 20  owid iRowid has 
186f0 6a 75 73 74 20 62 65 65 6e 20 61 70 70 65 6e 64  just been append
18700 65 64 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ed to the curren
18710 74 20 6c 65 61 66 20 70 61 67 65 2e 20 49 74 20  t leaf page. It 
18720 69 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  is the.** first 
18730 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 54 68 69  on the page. Thi
18740 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e  s function appen
18750 64 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ds an appropriat
18760 65 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 63  e entry to the c
18770 75 72 72 65 6e 74 0a 2a 2a 20 64 6f 63 6c 69 73  urrent.** doclis
18780 74 2d 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  t-index..*/.stat
18790 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
187a0 65 44 6c 69 64 78 41 70 70 65 6e 64 28 0a 20 20  eDlidxAppend(.  
187b0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
187c0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
187d0 70 57 72 69 74 65 72 2c 20 0a 20 20 69 36 34 20  pWriter, .  i64 
187e0 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74 20  iRowid.){.  int 
187f0 69 3b 0a 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d  i;.  int bDone =
18800 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
18810 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
18820 20 26 26 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b   && bDone==0; i+
18830 2b 29 7b 0a 20 20 20 20 69 36 34 20 69 56 61 6c  +){.    i64 iVal
18840 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 57  ;.    Fts5DlidxW
18850 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  riter *pDlidx = 
18860 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78  &pWriter->aDlidx
18870 5b 69 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 44  [i];..    if( pD
18880 6c 69 64 78 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e  lidx->buf.n>=p->
18890 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b  pConfig->pgsz ){
188a0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75  .      /* The cu
188b0 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e  rrent doclist-in
188c0 64 65 78 20 70 61 67 65 20 69 73 20 66 75 6c 6c  dex page is full
188d0 2e 20 57 72 69 74 65 20 69 74 20 74 6f 20 64 69  . Write it to di
188e0 73 6b 20 61 6e 64 20 70 75 73 68 0a 20 20 20 20  sk and push.    
188f0 20 20 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 69    ** a copy of i
18900 52 6f 77 69 64 20 28 77 68 69 63 68 20 77 69 6c  Rowid (which wil
18910 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 66 69 72  l become the fir
18920 73 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  st rowid on the 
18930 6e 65 78 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f  next.      ** do
18940 63 6c 69 73 74 2d 69 6e 64 65 78 20 6c 65 61 66  clist-index leaf
18950 20 70 61 67 65 29 20 75 70 20 69 6e 74 6f 20 74   page) up into t
18960 68 65 20 6e 65 78 74 20 6c 65 76 65 6c 20 6f 66  he next level of
18970 20 74 68 65 20 62 2d 74 72 65 65 20 0a 20 20 20   the b-tree .   
18980 20 20 20 2a 2a 20 68 69 65 72 61 72 63 68 79 2e     ** hierarchy.
18990 20 49 66 20 74 68 65 20 6e 6f 64 65 20 62 65 69   If the node bei
189a0 6e 67 20 66 6c 75 73 68 65 64 20 69 73 20 63 75  ng flushed is cu
189b0 72 72 65 6e 74 6c 79 20 74 68 65 20 72 6f 6f 74  rrently the root
189c0 20 6e 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20   node,.      ** 
189d0 61 6c 73 6f 20 70 75 73 68 20 69 74 73 20 66 69  also push its fi
189e0 72 73 74 20 72 6f 77 69 64 20 75 70 77 61 72 64  rst rowid upward
189f0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 44 6c 69  s. */.      pDli
18a00 64 78 2d 3e 62 75 66 2e 70 5b 30 5d 20 3d 20 30  dx->buf.p[0] = 0
18a10 78 30 31 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 74  x01;    /* Not t
18a20 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a  he root node */.
18a30 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72        fts5DataWr
18a40 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20 20 20  ite(p, .        
18a50 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57    FTS5_DLIDX_ROW
18a60 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67  ID(pWriter->iSeg
18a70 69 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e 70  id, i, pDlidx->p
18a80 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  gno),.          
18a90 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20 70  pDlidx->buf.p, p
18aa0 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20 20  Dlidx->buf.n.   
18ab0 20 20 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35     );.      fts5
18ac0 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28 70  WriteDlidxGrow(p
18ad0 2c 20 70 57 72 69 74 65 72 2c 20 69 2b 32 29 3b  , pWriter, i+2);
18ae0 0a 20 20 20 20 20 20 70 44 6c 69 64 78 20 3d 20  .      pDlidx = 
18af0 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78  &pWriter->aDlidx
18b00 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
18b10 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
18b20 26 26 20 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66  && pDlidx[1].buf
18b30 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  .n==0 ){.       
18b40 20 69 36 34 20 69 46 69 72 73 74 20 3d 20 66 74   i64 iFirst = ft
18b50 73 35 44 6c 69 64 78 45 78 74 72 61 63 74 46 69  s5DlidxExtractFi
18b60 72 73 74 52 6f 77 69 64 28 26 70 44 6c 69 64 78  rstRowid(&pDlidx
18b70 2d 3e 62 75 66 29 3b 0a 0a 20 20 20 20 20 20 20  ->buf);..       
18b80 20 2f 2a 20 54 68 69 73 20 77 61 73 20 74 68 65   /* This was the
18b90 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 50 75 73 68   root node. Push
18ba0 20 69 74 73 20 66 69 72 73 74 20 72 6f 77 69 64   its first rowid
18bb0 20 75 70 20 74 6f 20 74 68 65 20 6e 65 77 20 72   up to the new r
18bc0 6f 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  oot. */.        
18bd0 70 44 6c 69 64 78 5b 31 5d 2e 70 67 6e 6f 20 3d  pDlidx[1].pgno =
18be0 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 3b 0a 20   pDlidx->pgno;. 
18bf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
18c00 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
18c10 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44  rint(&p->rc, &pD
18c20 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 30 29 3b  lidx[1].buf, 0);
18c30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18c40 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
18c50 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
18c60 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 70  pDlidx[1].buf, p
18c70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 3b 0a 20 20  Dlidx->pgno);.  
18c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
18c90 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
18ca0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c  int(&p->rc, &pDl
18cb0 69 64 78 5b 31 5d 2e 62 75 66 2c 20 69 46 69 72  idx[1].buf, iFir
18cc0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 6c  st);.        pDl
18cd0 69 64 78 5b 31 5d 2e 62 50 72 65 76 56 61 6c 69  idx[1].bPrevVali
18ce0 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  d = 1;.        p
18cf0 44 6c 69 64 78 5b 31 5d 2e 69 50 72 65 76 20 3d  Dlidx[1].iPrev =
18d00 20 69 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d   iFirst;.      }
18d10 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ..      sqlite3F
18d20 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
18d30 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20 20  Dlidx->buf);.   
18d40 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76     pDlidx->bPrev
18d50 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 20  Valid = 0;.     
18d60 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 2b 2b 3b   pDlidx->pgno++;
18d70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18d80 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20    bDone = 1;.   
18d90 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 44 6c 69   }..    if( pDli
18da0 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 29  dx->bPrevValid )
18db0 7b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20 69  {.      iVal = i
18dc0 52 6f 77 69 64 20 2d 20 70 44 6c 69 64 78 2d 3e  Rowid - pDlidx->
18dd0 69 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65  iPrev;.    }else
18de0 7b 0a 20 20 20 20 20 20 69 36 34 20 69 50 67 6e  {.      i64 iPgn
18df0 6f 20 3d 20 28 69 3d 3d 30 20 3f 20 70 57 72 69  o = (i==0 ? pWri
18e00 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f  ter->writer.pgno
18e10 20 3a 20 70 44 6c 69 64 78 5b 2d 31 5d 2e 70 67   : pDlidx[-1].pg
18e20 6e 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  no);.      asser
18e30 74 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e  t( pDlidx->buf.n
18e40 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
18e50 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
18e60 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
18e70 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c  c, &pDlidx->buf,
18e80 20 21 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20   !bDone);.      
18e90 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
18ea0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
18eb0 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62  ->rc, &pDlidx->b
18ec0 75 66 2c 20 69 50 67 6e 6f 29 3b 0a 20 20 20 20  uf, iPgno);.    
18ed0 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64 3b    iVal = iRowid;
18ee0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
18ef0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
18f00 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
18f10 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20  , &pDlidx->buf, 
18f20 69 56 61 6c 29 3b 0a 20 20 20 20 70 44 6c 69 64  iVal);.    pDlid
18f30 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20  x->bPrevValid = 
18f40 31 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 69  1;.    pDlidx->i
18f50 50 72 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a 20  Prev = iRowid;. 
18f60 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
18f70 64 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68  d fts5WriteFlush
18f80 4c 65 61 66 28 46 74 73 35 49 6e 64 65 78 20 2a  Leaf(Fts5Index *
18f90 70 2c 20 46 74 73 35 53 65 67 57 72 69 74 65 72  p, Fts5SegWriter
18fa0 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 73 74   *pWriter){.  st
18fb0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65  atic const u8 ze
18fc0 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20 30  ro[] = { 0x00, 0
18fd0 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
18fe0 7d 3b 0a 20 20 46 74 73 35 50 61 67 65 57 72 69  };.  Fts5PageWri
18ff0 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57  ter *pPage = &pW
19000 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20  riter->writer;. 
19010 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 0a 20 20   i64 iRowid;..  
19020 61 73 73 65 72 74 28 20 28 70 50 61 67 65 2d 3e  assert( (pPage->
19030 70 67 69 64 78 2e 6e 3d 3d 30 29 3d 3d 28 70 57  pgidx.n==0)==(pW
19040 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
19050 6d 49 6e 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  mInPage) );..  /
19060 2a 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66  * Set the szLeaf
19070 20 68 65 61 64 65 72 20 66 69 65 6c 64 2e 20 2a   header field. *
19080 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 66  /.  assert( 0==f
19090 74 73 35 47 65 74 55 31 36 28 26 70 50 61 67 65  ts5GetU16(&pPage
190a0 2d 3e 62 75 66 2e 70 5b 32 5d 29 20 29 3b 0a 20  ->buf.p[2]) );. 
190b0 20 66 74 73 35 50 75 74 55 31 36 28 26 70 50 61   fts5PutU16(&pPa
190c0 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 2c 20 28 75  ge->buf.p[2], (u
190d0 31 36 29 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29  16)pPage->buf.n)
190e0 3b 0a 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  ;..  if( pWriter
190f0 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
19100 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  ge ){.    /* No 
19110 74 65 72 6d 20 77 61 73 20 77 72 69 74 74 65 6e  term was written
19120 20 74 6f 20 74 68 69 73 20 70 61 67 65 2e 20 2a   to this page. *
19130 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
19140 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30 20  age->pgidx.n==0 
19150 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  );.    fts5Write
19160 42 74 72 65 65 4e 6f 54 65 72 6d 28 70 2c 20 70  BtreeNoTerm(p, p
19170 57 72 69 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65  Writer);.  }else
19180 7b 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  {.    /* Append 
19190 74 68 65 20 70 67 69 64 78 20 74 6f 20 74 68 65  the pgidx to the
191a0 20 70 61 67 65 20 62 75 66 66 65 72 2e 20 53 65   page buffer. Se
191b0 74 20 74 68 65 20 73 7a 4c 65 61 66 20 68 65 61  t the szLeaf hea
191c0 64 65 72 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  der field. */.  
191d0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
191e0 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
191f0 70 50 61 67 65 2d 3e 62 75 66 2c 20 70 50 61 67  pPage->buf, pPag
19200 65 2d 3e 70 67 69 64 78 2e 6e 2c 20 70 50 61 67  e->pgidx.n, pPag
19210 65 2d 3e 70 67 69 64 78 2e 70 29 3b 0a 20 20 7d  e->pgidx.p);.  }
19220 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
19230 20 70 61 67 65 20 6f 75 74 20 74 6f 20 64 69 73   page out to dis
19240 6b 20 2a 2f 0a 20 20 69 52 6f 77 69 64 20 3d 20  k */.  iRowid = 
19250 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
19260 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67  ID(pWriter->iSeg
19270 69 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  id, pPage->pgno)
19280 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72 69 74  ;.  fts5DataWrit
19290 65 28 70 2c 20 69 52 6f 77 69 64 2c 20 70 50 61  e(p, iRowid, pPa
192a0 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65  ge->buf.p, pPage
192b0 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 2f 2a 20  ->buf.n);..  /* 
192c0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e  Initialize the n
192d0 65 78 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66  ext page. */.  f
192e0 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
192f0 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20 66 74  Page->buf);.  ft
19300 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50  s5BufferZero(&pP
19310 61 67 65 2d 3e 70 67 69 64 78 29 3b 0a 20 20 66  age->pgidx);.  f
19320 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
19330 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  lob(&p->rc, &pPa
19340 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a 65 72 6f  ge->buf, 4, zero
19350 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 50 72 65  );.  pPage->iPre
19360 76 50 67 69 64 78 20 3d 20 30 3b 0a 20 20 70 50  vPgidx = 0;.  pP
19370 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a 20 20  age->pgno++;..  
19380 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20  /* Increase the 
19390 6c 65 61 76 65 73 20 77 72 69 74 74 65 6e 20 63  leaves written c
193a0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70 57 72 69  ounter */.  pWri
193b0 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69 74 74 65  ter->nLeafWritte
193c0 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  n++;..  /* The n
193d0 65 77 20 6c 65 61 66 20 68 6f 6c 64 73 20 6e 6f  ew leaf holds no
193e0 20 74 65 72 6d 73 20 6f 72 20 72 6f 77 69 64 73   terms or rowids
193f0 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 62   */.  pWriter->b
19400 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20  FirstTermInPage 
19410 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  = 1;.  pWriter->
19420 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
19430 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 1;.}../*.** 
19440 41 70 70 65 6e 64 20 74 65 72 6d 20 70 54 65 72  Append term pTer
19450 6d 2f 6e 54 65 72 6d 20 74 6f 20 74 68 65 20 73  m/nTerm to the s
19460 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72 69  egment being wri
19470 74 74 65 6e 20 62 79 20 74 68 65 20 77 72 69 74  tten by the writ
19480 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  er passed.** as 
19490 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
194a0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ent..**.** If an
194b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
194c0 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65 78  et the Fts5Index
194d0 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  .rc error code. 
194e0 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
194f0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75  .** already occu
19500 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  rred, this funct
19510 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
19520 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
19530 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65  ts5WriteAppendTe
19540 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  rm(.  Fts5Index 
19550 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
19560 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20  iter *pWriter,. 
19570 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73   int nTerm, cons
19580 74 20 75 38 20 2a 70 54 65 72 6d 20 0a 29 7b 0a  t u8 *pTerm .){.
19590 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20 20    int nPrefix;  
195a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195b0 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70 72    /* Bytes of pr
195c0 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f 6e  efix compression
195d0 20 66 6f 72 20 74 65 72 6d 20 2a 2f 0a 20 20 46   for term */.  F
195e0 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
195f0 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
19600 3e 77 72 69 74 65 72 3b 0a 20 20 46 74 73 35 42  >writer;.  Fts5B
19610 75 66 66 65 72 20 2a 70 50 67 69 64 78 20 3d 20  uffer *pPgidx = 
19620 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  &pWriter->writer
19630 2e 70 67 69 64 78 3b 0a 0a 20 20 61 73 73 65 72  .pgidx;..  asser
19640 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
19650 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _OK );.  assert(
19660 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d 34   pPage->buf.n>=4
19670 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
19680 61 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 7c 7c 20  age->buf.n>4 || 
19690 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
196a0 65 72 6d 49 6e 50 61 67 65 20 29 3b 0a 0a 20 20  ermInPage );..  
196b0 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  /* If the curren
196c0 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 66  t leaf page is f
196d0 75 6c 6c 2c 20 66 6c 75 73 68 20 69 74 20 74 6f  ull, flush it to
196e0 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 69 66 28 20   disk. */.  if( 
196f0 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20  (pPage->buf.n + 
19700 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 54 65 72  pPgidx->n + nTer
19710 6d 20 2b 20 32 29 3e 3d 70 2d 3e 70 43 6f 6e 66  m + 2)>=p->pConf
19720 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  ig->pgsz ){.    
19730 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  if( pPage->buf.n
19740 3e 34 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  >4 ){.      fts5
19750 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
19760 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  , pWriter);.    
19770 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  }.    fts5Buffer
19780 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 70 50  Grow(&p->rc, &pP
19790 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 2b  age->buf, nTerm+
197a0 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e  FTS5_DATA_PADDIN
197b0 47 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  G);.  }.  .  /* 
197c0 54 4f 44 4f 31 3a 20 55 70 64 61 74 69 6e 67 20  TODO1: Updating 
197d0 70 67 69 64 78 20 68 65 72 65 2e 20 2a 2f 0a 20  pgidx here. */. 
197e0 20 70 50 67 69 64 78 2d 3e 6e 20 2b 3d 20 73 71   pPgidx->n += sq
197f0 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72 69  lite3Fts5PutVari
19800 6e 74 28 0a 20 20 20 20 20 20 26 70 50 67 69 64  nt(.      &pPgid
19810 78 2d 3e 70 5b 70 50 67 69 64 78 2d 3e 6e 5d 2c  x->p[pPgidx->n],
19820 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2d 20   pPage->buf.n - 
19830 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64  pPage->iPrevPgid
19840 78 0a 20 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  x.  );.  pPage->
19850 69 50 72 65 76 50 67 69 64 78 20 3d 20 70 50 61  iPrevPgidx = pPa
19860 67 65 2d 3e 62 75 66 2e 6e 3b 0a 23 69 66 20 30  ge->buf.n;.#if 0
19870 0a 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70  .  fts5PutU16(&p
19880 50 67 69 64 78 2d 3e 70 5b 70 50 67 69 64 78 2d  Pgidx->p[pPgidx-
19890 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  >n], pPage->buf.
198a0 6e 29 3b 0a 20 20 70 50 67 69 64 78 2d 3e 6e 20  n);.  pPgidx->n 
198b0 2b 3d 20 32 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  += 2;.#endif..  
198c0 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
198d0 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b  rstTermInPage ){
198e0 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 30  .    nPrefix = 0
198f0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
19900 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20  >pgno!=1 ){.    
19910 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
19920 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 61   first term on a
19930 20 6c 65 61 66 20 74 68 61 74 20 69 73 20 6e 6f   leaf that is no
19940 74 20 74 68 65 20 6c 65 66 74 6d 6f 73 74 20 6c  t the leftmost l
19950 65 61 66 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  eaf in.      ** 
19960 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  the segment b-tr
19970 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ee. In this case
19980 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
19990 20 74 6f 20 61 64 64 20 61 20 74 65 72 6d 20 74   to add a term t
199a0 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 62  o.      ** the b
199b0 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79 20  -tree hierarchy 
199c0 74 68 61 74 20 69 73 20 28 61 29 20 6c 61 72 67  that is (a) larg
199d0 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67  er than the larg
199e0 65 73 74 20 74 65 72 6d 20 0a 20 20 20 20 20 20  est term .      
199f0 2a 2a 20 61 6c 72 65 61 64 79 20 77 72 69 74 74  ** already writt
19a00 65 6e 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e  en to the segmen
19a10 74 20 61 6e 64 20 28 62 29 20 73 6d 61 6c 6c 65  t and (b) smalle
19a20 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
19a30 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  to.      ** this
19a40 20 74 65 72 6d 2e 20 49 6e 20 6f 74 68 65 72 20   term. In other 
19a50 77 6f 72 64 73 2c 20 61 20 70 72 65 66 69 78 20  words, a prefix 
19a60 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  of (pTerm/nTerm)
19a70 20 74 68 61 74 20 69 73 20 6f 6e 65 0a 20 20 20   that is one.   
19a80 20 20 20 2a 2a 20 62 79 74 65 20 6c 6f 6e 67 65     ** byte longe
19a90 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 6e 67 65  r than the longe
19aa0 73 74 20 70 72 65 66 69 78 20 28 70 54 65 72 6d  st prefix (pTerm
19ab0 2f 6e 54 65 72 6d 29 20 73 68 61 72 65 73 20 77  /nTerm) shares w
19ac0 69 74 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ith the.      **
19ad0 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 2e 20   previous term. 
19ae0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
19af0 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 65 20  ** Usually, the 
19b00 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69 73  previous term is
19b10 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 50   available in pP
19b20 61 67 65 2d 3e 74 65 72 6d 2e 20 54 68 65 20 65  age->term. The e
19b30 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 20 20 2a  xception.      *
19b40 2a 20 69 73 20 69 66 20 74 68 69 73 20 69 73 20  * is if this is 
19b50 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 77  the first term w
19b60 72 69 74 74 65 6e 20 69 6e 20 61 6e 20 69 6e 63  ritten in an inc
19b70 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20 73  remental-merge s
19b80 74 65 70 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e  tep..      ** In
19b90 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70   this case the p
19ba0 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69 73 20  revious term is 
19bb0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 73  not available, s
19bc0 6f 20 6a 75 73 74 20 77 72 69 74 65 20 61 0a 20  o just write a. 
19bd0 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20       ** copy of 
19be0 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 69 6e  (pTerm/nTerm) in
19bf0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 6e 6f  to the parent no
19c00 64 65 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67  de. This is slig
19c10 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20 69 6e  htly.      ** in
19c20 65 66 66 69 63 69 65 6e 74 2c 20 62 75 74 20 73  efficient, but s
19c30 74 69 6c 6c 20 63 6f 72 72 65 63 74 2e 20 20 2a  till correct.  *
19c40 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  /.      int n = 
19c50 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28  nTerm;.      if(
19c60 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 20 29   pPage->term.n )
19c70 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 31 20  {.        n = 1 
19c80 2b 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70  + fts5PrefixComp
19c90 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65 72 6d  ress(pPage->term
19ca0 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e  .n, pPage->term.
19cb0 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29  p, nTerm, pTerm)
19cc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19cd0 66 74 73 35 57 72 69 74 65 42 74 72 65 65 54 65  fts5WriteBtreeTe
19ce0 72 6d 28 70 2c 20 70 57 72 69 74 65 72 2c 20 6e  rm(p, pWriter, n
19cf0 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
19d00 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
19d10 2d 3e 77 72 69 74 65 72 3b 0a 20 20 20 20 7d 0a  ->writer;.    }.
19d20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72    }else{.    nPr
19d30 65 66 69 78 20 3d 20 66 74 73 35 50 72 65 66 69  efix = fts5Prefi
19d40 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d  xCompress(pPage-
19d50 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e  >term.n, pPage->
19d60 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70  term.p, nTerm, p
19d70 54 65 72 6d 29 3b 0a 20 20 20 20 66 74 73 35 42  Term);.    fts5B
19d80 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
19d90 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
19da0 2d 3e 62 75 66 2c 20 6e 50 72 65 66 69 78 29 3b  ->buf, nPrefix);
19db0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e  .  }..  /* Appen
19dc0 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
19dd0 62 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61 74  bytes of new dat
19de0 61 2c 20 74 68 65 6e 20 74 68 65 20 74 65 72 6d  a, then the term
19df0 20 64 61 74 61 20 69 74 73 65 6c 66 0a 20 20 2a   data itself.  *
19e00 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2e 20 2a  * to the page. *
19e10 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  /.  fts5BufferAp
19e20 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
19e30 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
19e40 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 29  nTerm - nPrefix)
19e50 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  ;.  fts5BufferAp
19e60 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
19e70 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54   &pPage->buf, nT
19e80 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 2c 20 26  erm - nPrefix, &
19e90 70 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 29 3b  pTerm[nPrefix]);
19ea0 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
19eb0 65 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72  e Fts5PageWriter
19ec0 2e 74 65 72 6d 20 66 69 65 6c 64 2e 20 2a 2f 0a  .term field. */.
19ed0 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
19ee0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
19ef0 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65  term, nTerm, pTe
19f00 72 6d 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  rm);.  pWriter->
19f10 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
19f20 20 3d 20 30 3b 0a 0a 20 20 70 57 72 69 74 65 72   = 0;..  pWriter
19f30 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
19f40 61 67 65 20 3d 20 30 3b 0a 20 20 70 57 72 69 74  age = 0;.  pWrit
19f50 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
19f60 6e 44 6f 63 6c 69 73 74 20 3d 20 31 3b 0a 0a 20  nDoclist = 1;.. 
19f70 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c   assert( p->rc |
19f80 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69  | (pWriter->nDli
19f90 64 78 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d  dx>0 && pWriter-
19fa0 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e  >aDlidx[0].buf.n
19fb0 3d 3d 30 29 20 29 3b 0a 20 20 70 57 72 69 74 65  ==0) );.  pWrite
19fc0 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 70 67 6e  r->aDlidx[0].pgn
19fd0 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
19fe0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
19ff0 20 61 20 72 6f 77 69 64 20 61 6e 64 20 70 6f 73   a rowid and pos
1a000 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
1a010 66 69 65 6c 64 20 74 6f 20 74 68 65 20 77 72 69  field to the wri
1a020 74 65 72 73 20 6f 75 74 70 75 74 2e 20 0a 2a 2f  ters output. .*/
1a030 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1a040 35 57 72 69 74 65 41 70 70 65 6e 64 52 6f 77 69  5WriteAppendRowi
1a050 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  d(.  Fts5Index *
1a060 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
1a070 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20  ter *pWriter,.  
1a080 69 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20  i64 iRowid.){.  
1a090 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1a0a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35  E_OK ){.    Fts5
1a0b0 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67  PageWriter *pPag
1a0c0 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72  e = &pWriter->wr
1a0d0 69 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 28  iter;..    if( (
1a0e0 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70  pPage->buf.n + p
1a0f0 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 29 3e 3d  Page->pgidx.n)>=
1a100 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a  p->pConfig->pgsz
1a110 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72   ){.      fts5Wr
1a120 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20  iteFlushLeaf(p, 
1a130 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a  pWriter);.    }.
1a140 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
1a150 69 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72  is to be the fir
1a160 73 74 20 72 6f 77 69 64 20 77 72 69 74 74 65 6e  st rowid written
1a170 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 73 65   to the page, se
1a180 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 6f  t the .    ** ro
1a190 77 69 64 2d 70 6f 69 6e 74 65 72 20 69 6e 20 74  wid-pointer in t
1a1a0 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 2e 20  he page-header. 
1a1b0 41 6c 73 6f 20 61 70 70 65 6e 64 20 61 20 76 61  Also append a va
1a1c0 6c 75 65 20 74 6f 20 74 68 65 20 64 6c 69 64 78  lue to the dlidx
1a1d0 0a 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2c 20  .    ** buffer, 
1a1e0 69 6e 20 63 61 73 65 20 61 20 64 6f 63 6c 69 73  in case a doclis
1a1f0 74 2d 69 6e 64 65 78 20 69 73 20 72 65 71 75 69  t-index is requi
1a200 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  red.  */.    if(
1a210 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1a220 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20  RowidInPage ){. 
1a230 20 20 20 20 20 66 74 73 35 50 75 74 55 31 36 28       fts5PutU16(
1a240 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 28 75  pPage->buf.p, (u
1a250 31 36 29 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29  16)pPage->buf.n)
1a260 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  ;.      fts5Writ
1a270 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20  eDlidxAppend(p, 
1a280 70 57 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29  pWriter, iRowid)
1a290 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1a2a0 57 72 69 74 65 20 74 68 65 20 72 6f 77 69 64 2e  Write the rowid.
1a2b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72 69   */.    if( pWri
1a2c0 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
1a2d0 49 6e 44 6f 63 6c 69 73 74 20 7c 7c 20 70 57 72  InDoclist || pWr
1a2e0 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
1a2f0 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20  dInPage ){.     
1a300 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1a310 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1a320 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f  &pPage->buf, iRo
1a330 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  wid);.    }else{
1a340 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a350 2d 3e 72 63 20 7c 7c 20 69 52 6f 77 69 64 3e 70  ->rc || iRowid>p
1a360 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77  Writer->iPrevRow
1a370 69 64 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35  id );.      fts5
1a380 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1a390 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  nt(&p->rc, &pPag
1a3a0 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 20 2d  e->buf, iRowid -
1a3b0 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52   pWriter->iPrevR
1a3c0 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  owid);.    }.   
1a3d0 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52   pWriter->iPrevR
1a3e0 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20  owid = iRowid;. 
1a3f0 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72     pWriter->bFir
1a400 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74  stRowidInDoclist
1a410 20 3d 20 30 3b 0a 20 20 20 20 70 57 72 69 74 65   = 0;.    pWrite
1a420 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
1a430 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  Page = 0;.  }.}.
1a440 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1a450 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c  5WriteAppendPosl
1a460 69 73 74 44 61 74 61 28 0a 20 20 46 74 73 35 49  istData(.  Fts5I
1a470 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
1a480 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1a490 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20  er, .  const u8 
1a4a0 2a 61 44 61 74 61 2c 20 0a 20 20 69 6e 74 20 6e  *aData, .  int n
1a4b0 44 61 74 61 0a 29 7b 0a 20 20 46 74 73 35 50 61  Data.){.  Fts5Pa
1a4c0 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20  geWriter *pPage 
1a4d0 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  = &pWriter->writ
1a4e0 65 72 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  er;.  const u8 *
1a4f0 61 20 3d 20 61 44 61 74 61 3b 0a 20 20 69 6e 74  a = aData;.  int
1a500 20 6e 20 3d 20 6e 44 61 74 61 3b 0a 20 20 0a 20   n = nData;.  . 
1a510 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e   assert( p->pCon
1a520 66 69 67 2d 3e 70 67 73 7a 3e 30 20 29 3b 0a 20  fig->pgsz>0 );. 
1a530 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
1a540 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20 26  QLITE_OK .     &
1a550 26 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20  & (pPage->buf.n 
1a560 2b 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e  + pPage->pgidx.n
1a570 20 2b 20 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69   + n)>=p->pConfi
1a580 67 2d 3e 70 67 73 7a 20 0a 20 20 29 7b 0a 20 20  g->pgsz .  ){.  
1a590 20 20 69 6e 74 20 6e 52 65 71 20 3d 20 70 2d 3e    int nReq = p->
1a5a0 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2d 20  pConfig->pgsz - 
1a5b0 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2d 20 70  pPage->buf.n - p
1a5c0 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3b 0a 20  Page->pgidx.n;. 
1a5d0 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 30     int nCopy = 0
1a5e0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 43 6f  ;.    while( nCo
1a5f0 70 79 3c 6e 52 65 71 20 29 7b 0a 20 20 20 20 20  py<nReq ){.     
1a600 20 69 36 34 20 64 75 6d 6d 79 3b 0a 20 20 20 20   i64 dummy;.    
1a610 20 20 6e 43 6f 70 79 20 2b 3d 20 66 74 73 35 47    nCopy += fts5G
1a620 65 74 56 61 72 69 6e 74 28 26 61 5b 6e 43 6f 70  etVarint(&a[nCop
1a630 79 5d 2c 20 28 75 36 34 2a 29 26 64 75 6d 6d 79  y], (u64*)&dummy
1a640 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
1a650 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1a660 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  b(&p->rc, &pPage
1a670 2d 3e 62 75 66 2c 20 6e 43 6f 70 79 2c 20 61 29  ->buf, nCopy, a)
1a680 3b 0a 20 20 20 20 61 20 2b 3d 20 6e 43 6f 70 79  ;.    a += nCopy
1a690 3b 0a 20 20 20 20 6e 20 2d 3d 20 6e 43 6f 70 79  ;.    n -= nCopy
1a6a0 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46  ;.    fts5WriteF
1a6b0 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69  lushLeaf(p, pWri
1a6c0 74 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ter);.  }.  if( 
1a6d0 6e 3e 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42  n>0 ){.    fts5B
1a6e0 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
1a6f0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1a700 62 75 66 2c 20 6e 2c 20 61 29 3b 0a 20 20 7d 0a  buf, n, a);.  }.
1a710 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61  }../*.** Flush a
1a720 6e 79 20 64 61 74 61 20 63 61 63 68 65 64 20 62  ny data cached b
1a730 79 20 74 68 65 20 77 72 69 74 65 72 20 6f 62 6a  y the writer obj
1a740 65 63 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ect to the datab
1a750 61 73 65 2e 20 46 72 65 65 20 61 6e 79 0a 2a 2a  ase. Free any.**
1a760 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73   allocations ass
1a770 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1a780 20 77 72 69 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   writer..*/.stat
1a790 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
1a7a0 65 46 69 6e 69 73 68 28 0a 20 20 46 74 73 35 49  eFinish(.  Fts5I
1a7b0 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
1a7c0 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1a7d0 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57  er,         /* W
1a7e0 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  riter object */.
1a7f0 20 20 69 6e 74 20 2a 70 6e 4c 65 61 66 20 20 20    int *pnLeaf   
1a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a810 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72    /* OUT: Number
1a820 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 69   of leaf pages i
1a830 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a 20  n b-tree */.){. 
1a840 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 50 61   int i;.  Fts5Pa
1a850 67 65 57 72 69 74 65 72 20 2a 70 4c 65 61 66 20  geWriter *pLeaf 
1a860 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  = &pWriter->writ
1a870 65 72 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  er;.  if( p->rc=
1a880 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a890 20 20 61 73 73 65 72 74 28 20 70 4c 65 61 66 2d    assert( pLeaf-
1a8a0 3e 70 67 6e 6f 3e 3d 31 20 29 3b 0a 20 20 20 20  >pgno>=1 );.    
1a8b0 69 66 28 20 70 4c 65 61 66 2d 3e 62 75 66 2e 6e  if( pLeaf->buf.n
1a8c0 3e 34 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  >4 ){.      fts5
1a8d0 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
1a8e0 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  , pWriter);.    
1a8f0 7d 0a 20 20 20 20 2a 70 6e 4c 65 61 66 20 3d 20  }.    *pnLeaf = 
1a900 70 4c 65 61 66 2d 3e 70 67 6e 6f 2d 31 3b 0a 20  pLeaf->pgno-1;. 
1a910 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
1a920 68 42 74 72 65 65 28 70 2c 20 70 57 72 69 74 65  hBtree(p, pWrite
1a930 72 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 42 75  r);.  }.  fts5Bu
1a940 66 66 65 72 46 72 65 65 28 26 70 4c 65 61 66 2d  fferFree(&pLeaf-
1a950 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 42 75  >term);.  fts5Bu
1a960 66 66 65 72 46 72 65 65 28 26 70 4c 65 61 66 2d  fferFree(&pLeaf-
1a970 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42 75 66  >buf);.  fts5Buf
1a980 66 65 72 46 72 65 65 28 26 70 4c 65 61 66 2d 3e  ferFree(&pLeaf->
1a990 70 67 69 64 78 29 3b 0a 20 20 66 74 73 35 42 75  pgidx);.  fts5Bu
1a9a0 66 66 65 72 46 72 65 65 28 26 70 57 72 69 74 65  fferFree(&pWrite
1a9b0 72 2d 3e 62 74 74 65 72 6d 29 3b 0a 0a 20 20 66  r->btterm);..  f
1a9c0 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69 74 65  or(i=0; i<pWrite
1a9d0 72 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b 29 7b  r->nDlidx; i++){
1a9e0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
1a9f0 42 75 66 66 65 72 46 72 65 65 28 26 70 57 72 69  BufferFree(&pWri
1aa00 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 2e 62  ter->aDlidx[i].b
1aa10 75 66 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  uf);.  }.  sqlit
1aa20 65 33 5f 66 72 65 65 28 70 57 72 69 74 65 72 2d  e3_free(pWriter-
1aa30 3e 61 44 6c 69 64 78 29 3b 0a 7d 0a 0a 73 74 61  >aDlidx);.}..sta
1aa40 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
1aa50 74 65 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e  teInit(.  Fts5In
1aa60 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
1aa70 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
1aa80 72 2c 20 0a 20 20 69 6e 74 20 69 53 65 67 69 64  r, .  int iSegid
1aa90 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  .){.  const int 
1aaa0 6e 42 75 66 66 65 72 20 3d 20 70 2d 3e 70 43 6f  nBuffer = p->pCo
1aab0 6e 66 69 67 2d 3e 70 67 73 7a 20 2b 20 46 54 53  nfig->pgsz + FTS
1aac0 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 3b 0a  5_DATA_PADDING;.
1aad0 0a 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65  .  memset(pWrite
1aae0 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  r, 0, sizeof(Fts
1aaf0 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20  5SegWriter));.  
1ab00 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 20  pWriter->iSegid 
1ab10 3d 20 69 53 65 67 69 64 3b 0a 0a 20 20 66 74 73  = iSegid;..  fts
1ab20 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28  5WriteDlidxGrow(
1ab30 70 2c 20 70 57 72 69 74 65 72 2c 20 31 29 3b 0a  p, pWriter, 1);.
1ab40 20 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65    pWriter->write
1ab50 72 2e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 70 57  r.pgno = 1;.  pW
1ab60 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
1ab70 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 70  mInPage = 1;.  p
1ab80 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20  Writer->iBtPage 
1ab90 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 1;..  assert( 
1aba0 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e  pWriter->writer.
1abb0 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 61 73  buf.n==0 );.  as
1abc0 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 77  sert( pWriter->w
1abd0 72 69 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30  riter.pgidx.n==0
1abe0 20 29 3b 0a 0a 20 20 2f 2a 20 47 72 6f 77 20 74   );..  /* Grow t
1abf0 68 65 20 74 77 6f 20 62 75 66 66 65 72 73 20 74  he two buffers t
1ac00 6f 20 70 67 73 7a 20 2b 20 70 61 64 64 69 6e 67  o pgsz + padding
1ac10 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
1ac20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35  */.  sqlite3Fts5
1ac30 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72  BufferSize(&p->r
1ac40 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69  c, &pWriter->wri
1ac50 74 65 72 2e 70 67 69 64 78 2c 20 6e 42 75 66 66  ter.pgidx, nBuff
1ac60 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74  er);.  sqlite3Ft
1ac70 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d  s5BufferSize(&p-
1ac80 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 77  >rc, &pWriter->w
1ac90 72 69 74 65 72 2e 62 75 66 2c 20 6e 42 75 66 66  riter.buf, nBuff
1aca0 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  er);..  if( p->p
1acb0 49 64 78 57 72 69 74 65 72 3d 3d 30 20 29 7b 0a  IdxWriter==0 ){.
1acc0 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a      Fts5Config *
1acd0 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
1ace0 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e  nfig;.    fts5In
1acf0 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70  dexPrepareStmt(p
1ad00 2c 20 26 70 2d 3e 70 49 64 78 57 72 69 74 65 72  , &p->pIdxWriter
1ad10 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  , sqlite3_mprint
1ad20 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e  f(.          "IN
1ad30 53 45 52 54 20 49 4e 54 4f 20 27 25 71 27 2e 27  SERT INTO '%q'.'
1ad40 25 71 5f 69 64 78 27 28 73 65 67 69 64 2c 74 65  %q_idx'(segid,te
1ad50 72 6d 2c 70 67 6e 6f 29 20 56 41 4c 55 45 53 28  rm,pgno) VALUES(
1ad60 3f 2c 3f 2c 3f 29 22 2c 20 0a 20 20 20 20 20 20  ?,?,?)", .      
1ad70 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62      pConfig->zDb
1ad80 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65  , pConfig->zName
1ad90 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 0a 20 20  .    ));.  }..  
1ada0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1adb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49  E_OK ){.    /* I
1adc0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 34 2d  nitialize the 4-
1add0 62 79 74 65 20 6c 65 61 66 2d 70 61 67 65 20 68  byte leaf-page h
1ade0 65 61 64 65 72 20 74 6f 20 30 78 30 30 2e 20 2a  eader to 0x00. *
1adf0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 57 72  /.    memset(pWr
1ae00 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66  iter->writer.buf
1ae10 2e 70 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 70  .p, 0, 4);.    p
1ae20 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62  Writer->writer.b
1ae30 75 66 2e 6e 20 3d 20 34 3b 0a 0a 20 20 20 20 2f  uf.n = 4;..    /
1ae40 2a 20 42 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Bind the curre
1ae50 6e 74 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  nt output segmen
1ae60 74 20 69 64 20 74 6f 20 74 68 65 20 69 6e 64 65  t id to the inde
1ae70 78 2d 77 72 69 74 65 72 2e 20 54 68 69 73 20 69  x-writer. This i
1ae80 73 20 61 6e 0a 20 20 20 20 2a 2a 20 6f 70 74 69  s an.    ** opti
1ae90 6d 69 7a 61 74 69 6f 6e 20 6f 76 65 72 20 62 69  mization over bi
1aea0 6e 64 69 6e 67 20 74 68 65 20 73 61 6d 65 20 76  nding the same v
1aeb0 61 6c 75 65 20 6f 76 65 72 20 61 6e 64 20 6f 76  alue over and ov
1aec0 65 72 20 61 73 20 72 6f 77 73 20 61 72 65 0a 20  er as rows are. 
1aed0 20 20 20 2a 2a 20 69 6e 73 65 72 74 65 64 20 69     ** inserted i
1aee0 6e 74 6f 20 25 5f 69 64 78 20 62 79 20 74 68 65  nto %_idx by the
1aef0 20 63 75 72 72 65 6e 74 20 77 72 69 74 65 72 2e   current writer.
1af00 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
1af10 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64  _bind_int(p->pId
1af20 78 57 72 69 74 65 72 2c 20 31 2c 20 70 57 72 69  xWriter, 1, pWri
1af30 74 65 72 2d 3e 69 53 65 67 69 64 29 3b 0a 20 20  ter->iSegid);.  
1af40 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61  }.}../*.** Itera
1af50 74 6f 72 20 70 49 74 65 72 20 77 61 73 20 75 73  tor pIter was us
1af60 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
1af70 72 6f 75 67 68 20 74 68 65 20 69 6e 70 75 74 20  rough the input 
1af80 73 65 67 6d 65 6e 74 73 20 6f 66 20 6f 6e 20 61  segments of on a
1af90 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c  n.** incremental
1afa0 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e   merge operation
1afb0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1afc0 69 73 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65  is called if the
1afd0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20   incremental.** 
1afe0 6d 65 72 67 65 20 73 74 65 70 20 68 61 73 20 66  merge step has f
1aff0 69 6e 69 73 68 65 64 20 62 75 74 20 74 68 65 20  inished but the 
1b000 69 6e 70 75 74 20 68 61 73 20 6e 6f 74 20 62 65  input has not be
1b010 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 78  en completely ex
1b020 68 61 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  hausted..*/.stat
1b030 69 63 20 76 6f 69 64 20 66 74 73 35 54 72 69 6d  ic void fts5Trim
1b040 53 65 67 6d 65 6e 74 73 28 46 74 73 35 49 6e 64  Segments(Fts5Ind
1b050 65 78 20 2a 70 2c 20 46 74 73 35 49 6e 64 65 78  ex *p, Fts5Index
1b060 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
1b070 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 42 75 66  int i;.  Fts5Buf
1b080 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65  fer buf;.  memse
1b090 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f  t(&buf, 0, sizeo
1b0a0 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a  f(Fts5Buffer));.
1b0b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
1b0c0 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a  er->nSeg; i++){.
1b0d0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
1b0e0 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
1b0f0 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 69 66 28  aSeg[i];.    if(
1b100 20 70 53 65 67 2d 3e 70 53 65 67 3d 3d 30 20 29   pSeg->pSeg==0 )
1b110 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70  {.      /* no-op
1b120 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   */.    }else if
1b130 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30  ( pSeg->pLeaf==0
1b140 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c   ){.      /* All
1b150 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 69 73 20   keys from this 
1b160 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 20 68 61  input segment ha
1b170 76 65 20 62 65 65 6e 20 74 72 61 6e 73 66 65 72  ve been transfer
1b180 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ed to the output
1b190 2e 0a 20 20 20 20 20 20 2a 2a 20 53 65 74 20 62  ..      ** Set b
1b1a0 6f 74 68 20 74 68 65 20 66 69 72 73 74 20 61 6e  oth the first an
1b1b0 64 20 6c 61 73 74 20 70 61 67 65 2d 6e 75 6d 62  d last page-numb
1b1c0 65 72 73 20 74 6f 20 30 20 74 6f 20 69 6e 64 69  ers to 0 to indi
1b1d0 63 61 74 65 20 74 68 61 74 20 74 68 65 0a 20 20  cate that the.  
1b1e0 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69      ** segment i
1b1f0 73 20 6e 6f 77 20 65 6d 70 74 79 2e 20 2a 2f 0a  s now empty. */.
1b200 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67        pSeg->pSeg
1b210 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a  ->pgnoLast = 0;.
1b220 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67        pSeg->pSeg
1b230 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 30 3b  ->pgnoFirst = 0;
1b240 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b250 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 53 65    int iOff = pSe
1b260 67 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  g->iTermLeafOffs
1b270 65 74 3b 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  et;     /* Offse
1b280 74 20 6f 6e 20 6e 65 77 20 66 69 72 73 74 20 6c  t on new first l
1b290 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  eaf page */.    
1b2a0 20 20 69 36 34 20 69 4c 65 61 66 52 6f 77 69 64    i64 iLeafRowid
1b2b0 3b 0a 20 20 20 20 20 20 46 74 73 35 44 61 74 61  ;.      Fts5Data
1b2c0 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69   *pData;.      i
1b2d0 6e 74 20 69 49 64 20 3d 20 70 53 65 67 2d 3e 70  nt iId = pSeg->p
1b2e0 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20  Seg->iSegid;.   
1b2f0 20 20 20 75 38 20 61 48 64 72 5b 34 5d 20 3d 20     u8 aHdr[4] = 
1b300 7b 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30  {0x00, 0x00, 0x0
1b310 30 2c 20 30 78 30 30 7d 3b 0a 0a 20 20 20 20 20  0, 0x00};..     
1b320 20 69 4c 65 61 66 52 6f 77 69 64 20 3d 20 46 54   iLeafRowid = FT
1b330 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
1b340 28 69 49 64 2c 20 70 53 65 67 2d 3e 69 54 65 72  (iId, pSeg->iTer
1b350 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20  mLeafPgno);.    
1b360 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61    pData = fts5Da
1b370 74 61 52 65 61 64 28 70 2c 20 69 4c 65 61 66 52  taRead(p, iLeafR
1b380 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28  owid);.      if(
1b390 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20   pData ){.      
1b3a0 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
1b3b0 28 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (&buf);.        
1b3c0 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26  fts5BufferGrow(&
1b3d0 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44 61  p->rc, &buf, pDa
1b3e0 74 61 2d 3e 6e 6e 29 3b 0a 20 20 20 20 20 20 20  ta->nn);.       
1b3f0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1b400 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62  dBlob(&p->rc, &b
1b410 75 66 2c 20 73 69 7a 65 6f 66 28 61 48 64 72 29  uf, sizeof(aHdr)
1b420 2c 20 61 48 64 72 29 3b 0a 20 20 20 20 20 20 20  , aHdr);.       
1b430 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1b440 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1b450 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d  &buf, pSeg->term
1b460 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  .n);.        fts
1b470 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1b480 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  b(&p->rc, &buf, 
1b490 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 2c 20 70 53  pSeg->term.n, pS
1b4a0 65 67 2d 3e 74 65 72 6d 2e 70 29 3b 0a 20 20 20  eg->term.p);.   
1b4b0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1b4c0 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1b4d0 2c 20 26 62 75 66 2c 20 70 44 61 74 61 2d 3e 73  , &buf, pData->s
1b4e0 7a 4c 65 61 66 2d 69 4f 66 66 2c 20 26 70 44 61  zLeaf-iOff, &pDa
1b4f0 74 61 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20  ta->p[iOff]);.  
1b500 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1b510 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b520 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
1b530 68 65 20 73 7a 4c 65 61 66 20 66 69 65 6c 64 20  he szLeaf field 
1b540 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  */.          fts
1b550 35 50 75 74 55 31 36 28 26 62 75 66 2e 70 5b 32  5PutU16(&buf.p[2
1b560 5d 2c 20 28 75 31 36 29 62 75 66 2e 6e 29 3b 0a  ], (u16)buf.n);.
1b570 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1b580 20 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65     /* Set up the
1b590 20 6e 65 77 20 70 61 67 65 2d 69 6e 64 65 78 20   new page-index 
1b5a0 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 20  array */.       
1b5b0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1b5c0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1b5d0 26 62 75 66 2c 20 34 29 3b 0a 20 20 20 20 20 20  &buf, 4);.      
1b5e0 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61    if( pSeg->iLea
1b5f0 66 50 67 6e 6f 3d 3d 70 53 65 67 2d 3e 69 54 65  fPgno==pSeg->iTe
1b600 72 6d 4c 65 61 66 50 67 6e 6f 20 0a 20 20 20 20  rmLeafPgno .    
1b610 20 20 20 20 20 26 26 20 70 53 65 67 2d 3e 69 45       && pSeg->iE
1b620 6e 64 6f 66 44 6f 63 6c 69 73 74 3c 70 44 61 74  ndofDoclist<pDat
1b630 61 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 20 20 20  a->szLeaf .     
1b640 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1b650 69 6e 74 20 6e 44 69 66 66 20 3d 20 70 44 61 74  int nDiff = pDat
1b660 61 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53 65 67  a->szLeaf - pSeg
1b670 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b  ->iEndofDoclist;
1b680 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42  .          fts5B
1b690 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1b6a0 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
1b6b0 62 75 66 2e 6e 20 2d 20 31 20 2d 20 6e 44 69 66  buf.n - 1 - nDif
1b6c0 66 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 20 20  f - 4);.        
1b6d0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1b6e0 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
1b6f0 62 75 66 2c 20 0a 20 20 20 20 20 20 20 20 20 20  buf, .          
1b700 20 20 20 20 70 44 61 74 61 2d 3e 6e 6e 20 2d 20      pData->nn - 
1b710 70 53 65 67 2d 3e 69 50 67 69 64 78 4f 66 66 2c  pSeg->iPgidxOff,
1b720 20 26 70 44 61 74 61 2d 3e 70 5b 70 53 65 67 2d   &pData->p[pSeg-
1b730 3e 69 50 67 69 64 78 4f 66 66 5d 0a 20 20 20 20  >iPgidxOff].    
1b740 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
1b750 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 74 73 35   }..        fts5
1b760 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74  DataRelease(pDat
1b770 61 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 67  a);.        pSeg
1b780 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  ->pSeg->pgnoFirs
1b790 74 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c  t = pSeg->iTermL
1b7a0 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20 20  eafPgno;.       
1b7b0 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28   fts5DataDelete(
1b7c0 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  p, FTS5_SEGMENT_
1b7d0 52 4f 57 49 44 28 69 49 64 2c 20 31 29 2c 20 69  ROWID(iId, 1), i
1b7e0 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20  LeafRowid);.    
1b7f0 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74      fts5DataWrit
1b800 65 28 70 2c 20 69 4c 65 61 66 52 6f 77 69 64 2c  e(p, iLeafRowid,
1b810 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a   buf.p, buf.n);.
1b820 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b830 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  }.  fts5BufferFr
1b840 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 73 74 61  ee(&buf);.}..sta
1b850 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72  tic void fts5Mer
1b860 67 65 43 68 75 6e 6b 43 61 6c 6c 62 61 63 6b 28  geChunkCallback(
1b870 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1b880 20 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20   .  void *pCtx, 
1b890 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68  .  const u8 *pCh
1b8a0 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a  unk, int nChunk.
1b8b0 29 7b 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  ){.  Fts5SegWrit
1b8c0 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20 28 46  er *pWriter = (F
1b8d0 74 73 35 53 65 67 57 72 69 74 65 72 2a 29 70 43  ts5SegWriter*)pC
1b8e0 74 78 3b 0a 20 20 66 74 73 35 57 72 69 74 65 41  tx;.  fts5WriteA
1b8f0 70 70 65 6e 64 50 6f 73 6c 69 73 74 44 61 74 61  ppendPoslistData
1b900 28 70 2c 20 70 57 72 69 74 65 72 2c 20 70 43 68  (p, pWriter, pCh
1b910 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 7d 0a  unk, nChunk);.}.
1b920 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  ./*.**.*/.static
1b930 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 4d   void fts5IndexM
1b940 65 72 67 65 4c 65 76 65 6c 28 0a 20 20 46 74 73  ergeLevel(.  Fts
1b950 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b970 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
1b980 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
1b990 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63  ucture **ppStruc
1b9a0 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f  t,       /* IN/O
1b9b0 55 54 3a 20 53 74 75 63 74 75 72 65 20 6f 66 20  UT: Stucture of 
1b9c0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
1b9d0 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Lvl,            
1b9e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
1b9f0 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75  vel to read inpu
1ba00 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  t from */.  int 
1ba10 2a 70 6e 52 65 6d 20 20 20 20 20 20 20 20 20 20  *pnRem          
1ba20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1ba30 72 69 74 65 20 75 70 20 74 6f 20 74 68 69 73 20  rite up to this 
1ba40 6d 61 6e 79 20 6f 75 74 70 75 74 20 6c 65 61 76  many output leav
1ba50 65 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53  es */.){.  Fts5S
1ba60 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
1ba70 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
1ba80 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
1ba90 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
1baa0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1bab0 6c 5d 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  l];.  Fts5Struct
1bac0 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 4f 75  ureLevel *pLvlOu
1bad0 74 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  t;.  Fts5IndexIt
1bae0 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 20 20  er *pIter = 0;  
1baf0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
1bb00 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 64   to read input d
1bb10 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ata */.  int nRe
1bb20 6d 20 3d 20 70 6e 52 65 6d 20 3f 20 2a 70 6e 52  m = pnRem ? *pnR
1bb30 65 6d 20 3a 20 30 3b 20 20 2f 2a 20 4f 75 74 70  em : 0;  /* Outp
1bb40 75 74 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65  ut leaf pages le
1bb50 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  ft to write */. 
1bb60 20 69 6e 74 20 6e 49 6e 70 75 74 3b 20 20 20 20   int nInput;    
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb80 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
1bb90 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  put segments */.
1bba0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1bbb0 77 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 20  writer;         
1bbc0 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65    /* Writer obje
1bbd0 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
1bbe0 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
1bbf0 65 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74 70 75  eg;     /* Outpu
1bc00 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46  t segment */.  F
1bc10 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 0a  ts5Buffer term;.
1bc20 20 20 69 6e 74 20 62 4f 6c 64 65 73 74 3b 20 20    int bOldest;  
1bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc40 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1bc50 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20   output segment 
1bc60 69 73 20 74 68 65 20 6f 6c 64 65 73 74 20 2a 2f  is the oldest */
1bc70 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d  .  int eDetail =
1bc80 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
1bc90 74 61 69 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28  tail;..  assert(
1bca0 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
1bcb0 4c 65 76 65 6c 20 29 3b 0a 20 20 61 73 73 65 72  Level );.  asser
1bcc0 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c  t( pLvl->nMerge<
1bcd0 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a  =pLvl->nSeg );..
1bce0 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65 72    memset(&writer
1bcf0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
1bd00 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20 6d  SegWriter));.  m
1bd10 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20  emset(&term, 0, 
1bd20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
1bd30 72 29 29 3b 0a 20 20 69 66 28 20 70 4c 76 6c 2d  r));.  if( pLvl-
1bd40 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 70  >nMerge ){.    p
1bd50 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75 63  LvlOut = &pStruc
1bd60 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31  t->aLevel[iLvl+1
1bd70 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
1bd80 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3e 30 20 29  LvlOut->nSeg>0 )
1bd90 3b 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d 20 70  ;.    nInput = p
1bda0 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20  Lvl->nMerge;.   
1bdb0 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74   pSeg = &pLvlOut
1bdc0 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e  ->aSeg[pLvlOut->
1bdd0 6e 53 65 67 2d 31 5d 3b 0a 0a 20 20 20 20 66 74  nSeg-1];..    ft
1bde0 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26  s5WriteInit(p, &
1bdf0 77 72 69 74 65 72 2c 20 70 53 65 67 2d 3e 69 53  writer, pSeg->iS
1be00 65 67 69 64 29 3b 0a 20 20 20 20 77 72 69 74 65  egid);.    write
1be10 72 2e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20  r.writer.pgno = 
1be20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b 31  pSeg->pgnoLast+1
1be30 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 69 42 74  ;.    writer.iBt
1be40 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Page = 0;.  }els
1be50 65 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69  e{.    int iSegi
1be60 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65  d = fts5Allocate
1be70 53 65 67 69 64 28 70 2c 20 70 53 74 72 75 63 74  Segid(p, pStruct
1be80 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e  );..    /* Exten
1be90 64 20 74 68 65 20 46 74 73 35 53 74 72 75 63 74  d the Fts5Struct
1bea0 75 72 65 20 6f 62 6a 65 63 74 20 61 73 20 72 65  ure object as re
1beb0 71 75 69 72 65 64 20 74 6f 20 65 6e 73 75 72 65  quired to ensure
1bec0 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20   the output.    
1bed0 2a 2a 20 73 65 67 6d 65 6e 74 20 65 78 69 73 74  ** segment exist
1bee0 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4c  s. */.    if( iL
1bef0 76 6c 3d 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65  vl==pStruct->nLe
1bf00 76 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 66  vel-1 ){.      f
1bf10 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c  ts5StructureAddL
1bf20 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 70 53  evel(&p->rc, ppS
1bf30 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70 53  truct);.      pS
1bf40 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
1bf50 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  t;.    }.    fts
1bf60 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64  5StructureExtend
1bf70 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53  Level(&p->rc, pS
1bf80 74 72 75 63 74 2c 20 69 4c 76 6c 2b 31 2c 20 31  truct, iLvl+1, 1
1bf90 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  , 0);.    if( p-
1bfa0 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
1bfb0 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63    pLvl = &pStruc
1bfc0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
1bfd0 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26  .    pLvlOut = &
1bfe0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1bff0 69 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66 74  iLvl+1];..    ft
1c000 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26  s5WriteInit(p, &
1c010 77 72 69 74 65 72 2c 20 69 53 65 67 69 64 29 3b  writer, iSegid);
1c020 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
1c030 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 74 6f 20   new segment to 
1c040 74 68 65 20 6f 75 74 70 75 74 20 6c 65 76 65 6c  the output level
1c050 20 2a 2f 0a 20 20 20 20 70 53 65 67 20 3d 20 26   */.    pSeg = &
1c060 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c  pLvlOut->aSeg[pL
1c070 76 6c 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20  vlOut->nSeg];.  
1c080 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b    pLvlOut->nSeg+
1c090 2b 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70 67 6e  +;.    pSeg->pgn
1c0a0 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20  oFirst = 1;.    
1c0b0 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69  pSeg->iSegid = i
1c0c0 53 65 67 69 64 3b 0a 20 20 20 20 70 53 74 72 75  Segid;.    pStru
1c0d0 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a  ct->nSegment++;.
1c0e0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 69 6e 70  .    /* Read inp
1c0f0 75 74 20 66 72 6f 6d 20 61 6c 6c 20 73 65 67 6d  ut from all segm
1c100 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75  ents in the inpu
1c110 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 6e  t level */.    n
1c120 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53  Input = pLvl->nS
1c130 65 67 3b 0a 20 20 7d 0a 20 20 62 4f 6c 64 65 73  eg;.  }.  bOldes
1c140 74 20 3d 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53  t = (pLvlOut->nS
1c150 65 67 3d 3d 31 20 26 26 20 70 53 74 72 75 63 74  eg==1 && pStruct
1c160 2d 3e 6e 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32  ->nLevel==iLvl+2
1c170 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  );..  assert( iL
1c180 76 6c 3e 3d 30 20 29 3b 0a 20 20 66 6f 72 28 66  vl>=0 );.  for(f
1c190 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28  ts5MultiIterNew(
1c1a0 70 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20 30  p, pStruct, 0, 0
1c1b0 2c 20 30 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e 49  , 0, 0, iLvl, nI
1c1c0 6e 70 75 74 2c 20 26 70 49 74 65 72 29 3b 0a 20  nput, &pIter);. 
1c1d0 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
1c1e0 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d  erEof(p, pIter)=
1c1f0 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  =0;.      fts5Mu
1c200 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
1c210 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b  Iter, 0, 0).  ){
1c220 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72  .    Fts5SegIter
1c230 20 2a 70 53 65 67 49 74 65 72 20 3d 20 26 70 49   *pSegIter = &pI
1c240 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
1c250 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
1c260 73 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 50  st ];.    int nP
1c270 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  os;             
1c280 20 20 20 20 20 20 20 20 2f 2a 20 70 6f 73 69 74          /* posit
1c290 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69  ion-list size fi
1c2a0 65 6c 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  eld value */.   
1c2b0 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20   int nTerm;.    
1c2c0 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 3b  const u8 *pTerm;
1c2d0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
1c2e0 6f 72 20 6b 65 79 20 61 6e 6e 69 68 69 6c 61 74  or key annihilat
1c2f0 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ion. */.    if( 
1c300 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 3d 3d  pSegIter->nPos==
1c310 30 20 26 26 20 28 62 4f 6c 64 65 73 74 20 7c 7c  0 && (bOldest ||
1c320 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 3d   pSegIter->bDel=
1c330 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  =0) ) continue;.
1c340 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 74 73  .    pTerm = fts
1c350 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70  5MultiIterTerm(p
1c360 49 74 65 72 2c 20 26 6e 54 65 72 6d 29 3b 0a 20  Iter, &nTerm);. 
1c370 20 20 20 69 66 28 20 6e 54 65 72 6d 21 3d 74 65     if( nTerm!=te
1c380 72 6d 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70  rm.n || memcmp(p
1c390 54 65 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54  Term, term.p, nT
1c3a0 65 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 69 66  erm) ){.      if
1c3b0 28 20 70 6e 52 65 6d 20 26 26 20 77 72 69 74 65  ( pnRem && write
1c3c0 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e  r.nLeafWritten>n
1c3d0 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 62  Rem ){.        b
1c3e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
1c3f0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
1c400 61 20 6e 65 77 20 74 65 72 6d 2e 20 41 70 70 65  a new term. Appe
1c410 6e 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65  nd a term to the
1c420 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 2e   output segment.
1c430 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 57 72   */.      fts5Wr
1c440 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c  iteAppendTerm(p,
1c450 20 26 77 72 69 74 65 72 2c 20 6e 54 65 72 6d 2c   &writer, nTerm,
1c460 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 66   pTerm);.      f
1c470 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
1c480 3e 72 63 2c 20 26 74 65 72 6d 2c 20 6e 54 65 72  >rc, &term, nTer
1c490 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 7d  m, pTerm);.    }
1c4a0 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ..    /* Append 
1c4b0 74 68 65 20 72 6f 77 69 64 20 74 6f 20 74 68 65  the rowid to the
1c4c0 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 2f   output */.    /
1c4d0 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49  * WRITEPOSLISTSI
1c4e0 5a 45 20 2a 2f 0a 20 20 20 20 66 74 73 35 57 72  ZE */.    fts5Wr
1c4f0 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28 70  iteAppendRowid(p
1c500 2c 20 26 77 72 69 74 65 72 2c 20 66 74 73 35 4d  , &writer, fts5M
1c510 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49  ultiIterRowid(pI
1c520 74 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28 20  ter));..    if( 
1c530 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
1c540 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  TAIL_NONE ){.   
1c550 20 20 20 69 66 28 20 70 53 65 67 49 74 65 72 2d     if( pSegIter-
1c560 3e 62 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20  >bDel ){.       
1c570 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1c580 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1c590 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62  &writer.writer.b
1c5a0 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  uf, 0);.        
1c5b0 69 66 28 20 70 53 65 67 49 74 65 72 2d 3e 6e 50  if( pSegIter->nP
1c5c0 6f 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  os>0 ){.        
1c5d0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1c5e0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1c5f0 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e   &writer.writer.
1c600 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  buf, 0);.       
1c610 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1c620 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
1c630 70 70 65 6e 64 20 74 68 65 20 70 6f 73 69 74 69  ppend the positi
1c640 6f 6e 2d 6c 69 73 74 20 64 61 74 61 20 74 6f 20  on-list data to 
1c650 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  the output */.  
1c660 20 20 20 20 6e 50 6f 73 20 3d 20 70 53 65 67 49      nPos = pSegI
1c670 74 65 72 2d 3e 6e 50 6f 73 2a 32 20 2b 20 70 53  ter->nPos*2 + pS
1c680 65 67 49 74 65 72 2d 3e 62 44 65 6c 3b 0a 20 20  egIter->bDel;.  
1c690 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1c6a0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1c6b0 63 2c 20 26 77 72 69 74 65 72 2e 77 72 69 74 65  c, &writer.write
1c6c0 72 2e 62 75 66 2c 20 6e 50 6f 73 29 3b 0a 20 20  r.buf, nPos);.  
1c6d0 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65      fts5ChunkIte
1c6e0 72 61 74 65 28 70 2c 20 70 53 65 67 49 74 65 72  rate(p, pSegIter
1c6f0 2c 20 28 76 6f 69 64 2a 29 26 77 72 69 74 65 72  , (void*)&writer
1c700 2c 20 66 74 73 35 4d 65 72 67 65 43 68 75 6e 6b  , fts5MergeChunk
1c710 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d  Callback);.    }
1c720 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68  .  }..  /* Flush
1c730 20 74 68 65 20 6c 61 73 74 20 6c 65 61 66 20 70   the last leaf p
1c740 61 67 65 20 74 6f 20 64 69 73 6b 2e 20 53 65 74  age to disk. Set
1c750 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d   the output segm
1c760 65 6e 74 20 62 2d 74 72 65 65 20 68 65 69 67 68  ent b-tree heigh
1c770 74 0a 20 20 2a 2a 20 61 6e 64 20 6c 61 73 74 20  t.  ** and last 
1c780 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
1c790 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
1c7a0 65 2e 20 20 2a 2f 0a 20 20 66 74 73 35 57 72 69  e.  */.  fts5Wri
1c7b0 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72 69  teFinish(p, &wri
1c7c0 74 65 72 2c 20 26 70 53 65 67 2d 3e 70 67 6e 6f  ter, &pSeg->pgno
1c7d0 4c 61 73 74 29 3b 0a 0a 20 20 69 66 28 20 66 74  Last);..  if( ft
1c7e0 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
1c7f0 2c 20 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20  , pIter) ){.    
1c800 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 52  int i;..    /* R
1c810 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64  emove the redund
1c820 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f  ant segments fro
1c830 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  m the %_data tab
1c840 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  le */.    for(i=
1c850 30 3b 20 69 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b  0; i<nInput; i++
1c860 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  ){.      fts5Dat
1c870 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28 70  aRemoveSegment(p
1c880 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e  , pLvl->aSeg[i].
1c890 69 53 65 67 69 64 29 3b 0a 20 20 20 20 7d 0a 0a  iSegid);.    }..
1c8a0 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
1c8b0 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d  e redundant segm
1c8c0 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e  ents from the in
1c8d0 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  put level */.   
1c8e0 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 21   if( pLvl->nSeg!
1c8f0 3d 6e 49 6e 70 75 74 20 29 7b 0a 20 20 20 20 20  =nInput ){.     
1c900 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 28 70 4c   int nMove = (pL
1c910 76 6c 2d 3e 6e 53 65 67 20 2d 20 6e 49 6e 70 75  vl->nSeg - nInpu
1c920 74 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  t) * sizeof(Fts5
1c930 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
1c940 29 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65  );.      memmove
1c950 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 26 70 4c  (pLvl->aSeg, &pL
1c960 76 6c 2d 3e 61 53 65 67 5b 6e 49 6e 70 75 74 5d  vl->aSeg[nInput]
1c970 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 7d 0a  , nMove);.    }.
1c980 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65      pStruct->nSe
1c990 67 6d 65 6e 74 20 2d 3d 20 6e 49 6e 70 75 74 3b  gment -= nInput;
1c9a0 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20  .    pLvl->nSeg 
1c9b0 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70  -= nInput;.    p
1c9c0 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 30 3b  Lvl->nMerge = 0;
1c9d0 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70  .    if( pSeg->p
1c9e0 67 6e 6f 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20  gnoLast==0 ){.  
1c9f0 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65      pLvlOut->nSe
1ca00 67 2d 2d 3b 0a 20 20 20 20 20 20 70 53 74 72 75  g--;.      pStru
1ca10 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2d 2d 3b 0a  ct->nSegment--;.
1ca20 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1ca30 20 20 20 61 73 73 65 72 74 28 20 70 53 65 67 2d     assert( pSeg-
1ca40 3e 70 67 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a 20  >pgnoLast>0 );. 
1ca50 20 20 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65     fts5TrimSegme
1ca60 6e 74 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  nts(p, pIter);. 
1ca70 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20     pLvl->nMerge 
1ca80 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20  = nInput;.  }.. 
1ca90 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
1caa0 65 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ee(p, pIter);.  
1cab0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
1cac0 74 65 72 6d 29 3b 0a 20 20 69 66 28 20 70 6e 52  term);.  if( pnR
1cad0 65 6d 20 29 20 2a 70 6e 52 65 6d 20 2d 3d 20 77  em ) *pnRem -= w
1cae0 72 69 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74  riter.nLeafWritt
1caf0 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  en;.}../*.** Do 
1cb00 75 70 20 74 6f 20 6e 50 67 20 70 61 67 65 73 20  up to nPg pages 
1cb10 6f 66 20 61 75 74 6f 6d 65 72 67 65 20 77 6f 72  of automerge wor
1cb20 6b 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  k on the index..
1cb30 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1cb40 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 0a 20  ts5IndexMerge(. 
1cb50 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
1cb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb70 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
1cb80 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
1cb90 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53  5Structure **ppS
1cba0 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20  truct,       /* 
1cbb0 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20  IN/OUT: Current 
1cbc0 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64  structure of ind
1cbd0 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 67 20  ex */.  int nPg 
1cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbf0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
1cc00 20 6f 66 20 77 6f 72 6b 20 74 6f 20 64 6f 20 2a   of work to do *
1cc10 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20  /.){.  int nRem 
1cc20 3d 20 6e 50 67 3b 0a 20 20 46 74 73 35 53 74 72  = nPg;.  Fts5Str
1cc30 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
1cc40 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 77  = *ppStruct;.  w
1cc50 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 26 26 20  hile( nRem>0 && 
1cc60 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1cc70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c   ){.    int iLvl
1cc80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cc90 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74      /* To iterat
1cca0 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73  e through levels
1ccb0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 65 73   */.    int iBes
1ccc0 74 4c 76 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  tLvl = 0;       
1ccd0 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 66      /* Level off
1cce0 65 72 69 6e 67 20 74 68 65 20 6d 6f 73 74 20 69  ering the most i
1ccf0 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f  nput segments */
1cd00 0a 20 20 20 20 69 6e 74 20 6e 42 65 73 74 20 3d  .    int nBest =
1cd10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1cd20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
1cd30 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20  put segments on 
1cd40 62 65 73 74 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20  best level */.. 
1cd50 20 20 20 2f 2a 20 53 65 74 20 69 42 65 73 74 4c     /* Set iBestL
1cd60 76 6c 20 74 6f 20 74 68 65 20 6c 65 76 65 6c 20  vl to the level 
1cd70 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 73 65  to read input se
1cd80 67 6d 65 6e 74 73 20 66 72 6f 6d 2e 20 2a 2f 0a  gments from. */.
1cd90 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72      assert( pStr
1cda0 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b  uct->nLevel>0 );
1cdb0 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
1cdc0 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
1cdd0 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
1cde0 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
1cdf0 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
1ce00 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
1ce10 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69  l[iLvl];.      i
1ce20 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20  f( pLvl->nMerge 
1ce30 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1ce40 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65 73  Lvl->nMerge>nBes
1ce50 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t ){.          i
1ce60 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a  BestLvl = iLvl;.
1ce70 20 20 20 20 20 20 20 20 20 20 6e 42 65 73 74 20            nBest 
1ce80 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a  = pLvl->nMerge;.
1ce90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cea0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1ceb0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d  .      if( pLvl-
1cec0 3e 6e 53 65 67 3e 6e 42 65 73 74 20 29 7b 0a 20  >nSeg>nBest ){. 
1ced0 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70         nBest = p
1cee0 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20 20 20  Lvl->nSeg;.     
1cef0 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c     iBestLvl = iL
1cf00 76 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  vl;.      }.    
1cf10 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 42 65  }..    /* If nBe
1cf20 73 74 20 69 73 20 73 74 69 6c 6c 20 30 2c 20 74  st is still 0, t
1cf30 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20 6d 75  hen the index mu
1cf40 73 74 20 62 65 20 65 6d 70 74 79 2e 20 2a 2f 0a  st be empty. */.
1cf50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1cf60 42 55 47 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c  BUG.    for(iLvl
1cf70 3d 30 3b 20 6e 42 65 73 74 3d 3d 30 20 26 26 20  =0; nBest==0 && 
1cf80 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
1cf90 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
1cfa0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74       assert( pSt
1cfb0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1cfc0 6c 5d 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a 20 20  l].nSeg==0 );.  
1cfd0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1cfe0 69 66 28 20 6e 42 65 73 74 3c 70 2d 3e 70 43 6f  if( nBest<p->pCo
1cff0 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65  nfig->nAutomerge
1d000 20 0a 20 20 20 20 20 20 20 20 26 26 20 70 53 74   .        && pSt
1d010 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65  ruct->aLevel[iBe
1d020 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30  stLvl].nMerge==0
1d030 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
1d040 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1d050 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65    fts5IndexMerge
1d060 4c 65 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63  Level(p, &pStruc
1d070 74 2c 20 69 42 65 73 74 4c 76 6c 2c 20 26 6e 52  t, iBestLvl, &nR
1d080 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  em);.    if( p->
1d090 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1d0a0 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
1d0b0 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67  [iBestLvl].nMerg
1d0c0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74  e==0 ){.      ft
1d0d0 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f  s5StructurePromo
1d0e0 74 65 28 70 2c 20 69 42 65 73 74 4c 76 6c 2b 31  te(p, iBestLvl+1
1d0f0 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20  , pStruct);.    
1d100 7d 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63  }.  }.  *ppStruc
1d110 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a  t = pStruct;.}..
1d120 2f 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  /*.** A total of
1d130 20 6e 4c 65 61 66 20 6c 65 61 66 20 70 61 67 65   nLeaf leaf page
1d140 73 20 6f 66 20 64 61 74 61 20 68 61 73 20 6a 75  s of data has ju
1d150 73 74 20 62 65 65 6e 20 66 6c 75 73 68 65 64 20  st been flushed 
1d160 74 6f 20 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20  to a level-0.** 
1d170 73 65 67 6d 65 6e 74 2e 20 54 68 69 73 20 66 75  segment. This fu
1d180 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73 20 74  nction updates t
1d190 68 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72  he write-counter
1d1a0 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64   accordingly and
1d1b0 2c 20 69 66 0a 2a 2a 20 6e 65 63 65 73 73 61 72  , if.** necessar
1d1c0 79 2c 20 70 65 72 66 6f 72 6d 73 20 69 6e 63 72  y, performs incr
1d1d0 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 77 6f  emental merge wo
1d1e0 72 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rk..**.** If an 
1d1f0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
1d200 74 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e  t the Fts5Index.
1d210 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  rc error code. I
1d220 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
1d230 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
1d240 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
1d250 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
1d260 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1d270 73 35 49 6e 64 65 78 41 75 74 6f 6d 65 72 67 65  s5IndexAutomerge
1d280 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1d290 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d2a0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
1d2b0 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
1d2c0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a  Fts5Structure **
1d2d0 70 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20  ppStruct,       
1d2e0 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65  /* IN/OUT: Curre
1d2f0 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f 66 20  nt structure of 
1d300 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e  index */.  int n
1d310 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20  Leaf            
1d320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1d330 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 6c  mber of output l
1d340 65 61 76 65 73 20 6a 75 73 74 20 77 72 69 74 74  eaves just writt
1d350 65 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  en */.){.  if( p
1d360 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1d370 26 26 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e  && p->pConfig->n
1d380 41 75 74 6f 6d 65 72 67 65 3e 30 20 29 7b 0a 20  Automerge>0 ){. 
1d390 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
1d3a0 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53   *pStruct = *ppS
1d3b0 74 72 75 63 74 3b 0a 20 20 20 20 75 36 34 20 6e  truct;.    u64 n
1d3c0 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
1d3d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
1d3e0 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 77 72 69  ial value of wri
1d3f0 74 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  te-counter */.  
1d400 20 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20    int nWork;    
1d410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d420 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 6f 72  /* Number of wor
1d430 6b 2d 71 75 61 6e 74 61 20 74 6f 20 70 65 72 66  k-quanta to perf
1d440 6f 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  orm */.    int n
1d450 52 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rem;            
1d460 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1d470 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73  er of leaf pages
1d480 20 6c 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a   left to write *
1d490 2f 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  /..    /* Update
1d4a0 20 74 68 65 20 77 72 69 74 65 2d 63 6f 75 6e 74   the write-count
1d4b0 65 72 2e 20 57 68 69 6c 65 20 64 6f 69 6e 67 20  er. While doing 
1d4c0 73 6f 2c 20 73 65 74 20 6e 57 6f 72 6b 2e 20 2a  so, set nWork. *
1d4d0 2f 0a 20 20 20 20 6e 57 72 69 74 65 20 3d 20 70  /.    nWrite = p
1d4e0 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f  Struct->nWriteCo
1d4f0 75 6e 74 65 72 3b 0a 20 20 20 20 6e 57 6f 72 6b  unter;.    nWork
1d500 20 3d 20 28 69 6e 74 29 28 28 28 6e 57 72 69 74   = (int)(((nWrit
1d510 65 20 2b 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e  e + nLeaf) / p->
1d520 6e 57 6f 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57  nWorkUnit) - (nW
1d530 72 69 74 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55  rite / p->nWorkU
1d540 6e 69 74 29 29 3b 0a 20 20 20 20 70 53 74 72 75  nit));.    pStru
1d550 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  ct->nWriteCounte
1d560 72 20 2b 3d 20 6e 4c 65 61 66 3b 0a 20 20 20 20  r += nLeaf;.    
1d570 6e 52 65 6d 20 3d 20 28 69 6e 74 29 28 70 2d 3e  nRem = (int)(p->
1d580 6e 57 6f 72 6b 55 6e 69 74 20 2a 20 6e 57 6f 72  nWorkUnit * nWor
1d590 6b 20 2a 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  k * pStruct->nLe
1d5a0 76 65 6c 29 3b 0a 0a 20 20 20 20 66 74 73 35 49  vel);..    fts5I
1d5b0 6e 64 65 78 4d 65 72 67 65 28 70 2c 20 70 70 53  ndexMerge(p, ppS
1d5c0 74 72 75 63 74 2c 20 6e 52 65 6d 29 3b 0a 20 20  truct, nRem);.  
1d5d0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
1d5e0 20 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73   fts5IndexCrisis
1d5f0 6d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64  merge(.  Fts5Ind
1d600 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
1d610 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
1d620 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
1d630 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
1d640 72 65 20 2a 2a 70 70 53 74 72 75 63 74 20 20 20  re **ppStruct   
1d650 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
1d660 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75 72  Current structur
1d670 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 29 7b  e of index */.){
1d680 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 72  .  const int nCr
1d690 69 73 69 73 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  isis = p->pConfi
1d6a0 67 2d 3e 6e 43 72 69 73 69 73 4d 65 72 67 65 3b  g->nCrisisMerge;
1d6b0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1d6c0 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53   *pStruct = *ppS
1d6d0 74 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 4c 76  truct;.  int iLv
1d6e0 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  l = 0;..  assert
1d6f0 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
1d700 4f 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e  OK || pStruct->n
1d710 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20 77 68 69  Level>0 );.  whi
1d720 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
1d730 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d  E_OK && pStruct-
1d740 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
1d750 65 67 3e 3d 6e 43 72 69 73 69 73 20 29 7b 0a 20  eg>=nCrisis ){. 
1d760 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67     fts5IndexMerg
1d770 65 4c 65 76 65 6c 28 70 2c 20 26 70 53 74 72 75  eLevel(p, &pStru
1d780 63 74 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a 20 20  ct, iLvl, 0);.  
1d790 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
1d7a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53  =SQLITE_OK || pS
1d7b0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 28 69  truct->nLevel>(i
1d7c0 4c 76 6c 2b 31 29 20 29 3b 0a 20 20 20 20 66 74  Lvl+1) );.    ft
1d7d0 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f  s5StructurePromo
1d7e0 74 65 28 70 2c 20 69 4c 76 6c 2b 31 2c 20 70 53  te(p, iLvl+1, pS
1d7f0 74 72 75 63 74 29 3b 0a 20 20 20 20 69 4c 76 6c  truct);.    iLvl
1d800 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72  ++;.  }.  *ppStr
1d810 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 7d  uct = pStruct;.}
1d820 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
1d830 35 49 6e 64 65 78 52 65 74 75 72 6e 28 46 74 73  5IndexReturn(Fts
1d840 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e  5Index *p){.  in
1d850 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
1d860 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
1d870 4b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  K;.  return rc;.
1d880 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  }..typedef struc
1d890 74 20 46 74 73 35 46 6c 75 73 68 43 74 78 20 46  t Fts5FlushCtx F
1d8a0 74 73 35 46 6c 75 73 68 43 74 78 3b 0a 73 74 72  ts5FlushCtx;.str
1d8b0 75 63 74 20 46 74 73 35 46 6c 75 73 68 43 74 78  uct Fts5FlushCtx
1d8c0 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a   {.  Fts5Index *
1d8d0 70 49 64 78 3b 0a 20 20 46 74 73 35 53 65 67 57  pIdx;.  Fts5SegW
1d8e0 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 0a 7d  riter writer; .}
1d8f0 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20  ;../*.** Buffer 
1d900 61 42 75 66 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  aBuf[] contains 
1d910 61 20 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74  a list of varint
1d920 73 2c 20 61 6c 6c 20 73 6d 61 6c 6c 20 65 6e 6f  s, all small eno
1d930 75 67 68 20 74 6f 20 66 69 74 0a 2a 2a 20 69 6e  ugh to fit.** in
1d940 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
1d950 72 2e 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  r. Return the si
1d960 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73  ze of the larges
1d970 74 20 70 72 65 66 69 78 20 6f 66 20 74 68 69 73  t prefix of this
1d980 20 0a 2a 2a 20 6c 69 73 74 20 6e 4d 61 78 20 62   .** list nMax b
1d990 79 74 65 73 20 6f 72 20 6c 65 73 73 20 69 6e 20  ytes or less in 
1d9a0 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
1d9b0 69 6e 74 20 66 74 73 35 50 6f 73 6c 69 73 74 50  int fts5PoslistP
1d9c0 72 65 66 69 78 28 63 6f 6e 73 74 20 75 38 20 2a  refix(const u8 *
1d9d0 61 42 75 66 2c 20 69 6e 74 20 6e 4d 61 78 29 7b  aBuf, int nMax){
1d9e0 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 75 33  .  int ret;.  u3
1d9f0 32 20 64 75 6d 6d 79 3b 0a 20 20 72 65 74 20 3d  2 dummy;.  ret =
1da00 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
1da10 28 61 42 75 66 2c 20 64 75 6d 6d 79 29 3b 0a 20  (aBuf, dummy);. 
1da20 20 69 66 28 20 72 65 74 3c 6e 4d 61 78 20 29 7b   if( ret<nMax ){
1da30 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b  .    while( 1 ){
1da40 0a 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 66  .      int i = f
1da50 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
1da60 61 42 75 66 5b 72 65 74 5d 2c 20 64 75 6d 6d 79  aBuf[ret], dummy
1da70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 72 65  );.      if( (re
1da80 74 20 2b 20 69 29 20 3e 20 6e 4d 61 78 20 29 20  t + i) > nMax ) 
1da90 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 72 65 74  break;.      ret
1daa0 20 2b 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d   += i;.    }.  }
1dab0 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
1dac0 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68  ../*.** Flush th
1dad0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e  e contents of in
1dae0 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62  -memory hash tab
1daf0 6c 65 20 69 48 61 73 68 20 74 6f 20 61 20 6e 65  le iHash to a ne
1db00 77 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20 73 65  w level-0 .** se
1db10 67 6d 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 20 41  gment on disk. A
1db20 6c 73 6f 20 75 70 64 61 74 65 20 74 68 65 20 63  lso update the c
1db30 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 73 74 72  orresponding str
1db40 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a  ucture record..*
1db50 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1db60 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65   occurs, set the
1db70 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72   Fts5Index.rc er
1db80 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20  ror code. If an 
1db90 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c  error has .** al
1dba0 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
1dbb0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1dbc0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
1dbd0 74 69 63 20 76 6f 69 64 20 66 74 73 35 46 6c 75  tic void fts5Flu
1dbe0 73 68 4f 6e 65 48 61 73 68 28 46 74 73 35 49 6e  shOneHash(Fts5In
1dbf0 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 48  dex *p){.  Fts5H
1dc00 61 73 68 20 2a 70 48 61 73 68 20 3d 20 70 2d 3e  ash *pHash = p->
1dc10 70 48 61 73 68 3b 0a 20 20 46 74 73 35 53 74 72  pHash;.  Fts5Str
1dc20 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b  ucture *pStruct;
1dc30 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20  .  int iSegid;. 
1dc40 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20   int pgnoLast = 
1dc50 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1dc60 20 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66 20     /* Last leaf 
1dc70 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73  page number in s
1dc80 65 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20  egment */..  /* 
1dc90 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e  Obtain a referen
1dca0 63 65 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ce to the index 
1dcb0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c  structure and al
1dcc0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 67  locate a new seg
1dcd0 6d 65 6e 74 2d 69 64 0a 20 20 2a 2a 20 66 6f 72  ment-id.  ** for
1dce0 20 74 68 65 20 6e 65 77 20 6c 65 76 65 6c 2d 30   the new level-0
1dcf0 20 73 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20   segment.  */.  
1dd00 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
1dd10 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
1dd20 20 20 69 53 65 67 69 64 20 3d 20 66 74 73 35 41    iSegid = fts5A
1dd30 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20  llocateSegid(p, 
1dd40 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 69 66 28  pStruct);..  if(
1dd50 20 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20 63   iSegid ){.    c
1dd60 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20  onst int pgsz = 
1dd70 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a  p->pConfig->pgsz
1dd80 3b 0a 20 20 20 20 69 6e 74 20 65 44 65 74 61 69  ;.    int eDetai
1dd90 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  l = p->pConfig->
1dda0 65 44 65 74 61 69 6c 3b 0a 20 20 20 20 46 74 73  eDetail;.    Fts
1ddb0 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
1ddc0 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a 20 4e 65  t *pSeg;   /* Ne
1ddd0 77 20 73 65 67 6d 65 6e 74 20 77 69 74 68 69 6e  w segment within
1dde0 20 70 53 74 72 75 63 74 20 2a 2f 0a 20 20 20 20   pStruct */.    
1ddf0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
1de00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1de10 20 42 75 66 66 65 72 20 69 6e 20 77 68 69 63 68   Buffer in which
1de20 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 6c 65 61   to assemble lea
1de30 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 46 74  f page */.    Ft
1de40 73 35 42 75 66 66 65 72 20 2a 70 50 67 69 64 78  s5Buffer *pPgidx
1de50 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ;           /* B
1de60 75 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74  uffer in which t
1de70 6f 20 61 73 73 65 6d 62 6c 65 20 70 67 69 64 78  o assemble pgidx
1de80 20 2a 2f 0a 0a 20 20 20 20 46 74 73 35 53 65 67   */..    Fts5Seg
1de90 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a 20  Writer writer;. 
1dea0 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69 74     fts5WriteInit
1deb0 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 53 65  (p, &writer, iSe
1dec0 67 69 64 29 3b 0a 0a 20 20 20 20 70 42 75 66 20  gid);..    pBuf 
1ded0 3d 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72  = &writer.writer
1dee0 2e 62 75 66 3b 0a 20 20 20 20 70 50 67 69 64 78  .buf;.    pPgidx
1def0 20 3d 20 26 77 72 69 74 65 72 2e 77 72 69 74 65   = &writer.write
1df00 72 2e 70 67 69 64 78 3b 0a 0a 20 20 20 20 2f 2a  r.pgidx;..    /*
1df10 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 29   fts5WriteInit()
1df20 20 73 68 6f 75 6c 64 20 68 61 76 65 20 69 6e 69   should have ini
1df30 74 69 61 6c 69 7a 65 64 20 74 68 65 20 62 75 66  tialized the buf
1df40 66 65 72 73 20 74 6f 20 28 6d 6f 73 74 20 6c 69  fers to (most li
1df50 6b 65 6c 79 29 0a 20 20 20 20 2a 2a 20 74 68 65  kely).    ** the
1df60 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72   maximum space r
1df70 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
1df80 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c  assert( p->rc ||
1df90 20 70 42 75 66 2d 3e 6e 53 70 61 63 65 3e 3d 28   pBuf->nSpace>=(
1dfa0 70 67 73 7a 20 2b 20 46 54 53 35 5f 44 41 54 41  pgsz + FTS5_DATA
1dfb0 5f 50 41 44 44 49 4e 47 29 20 29 3b 0a 20 20 20  _PADDING) );.   
1dfc0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c   assert( p->rc |
1dfd0 7c 20 70 50 67 69 64 78 2d 3e 6e 53 70 61 63 65  | pPgidx->nSpace
1dfe0 3e 3d 28 70 67 73 7a 20 2b 20 46 54 53 35 5f 44  >=(pgsz + FTS5_D
1dff0 41 54 41 5f 50 41 44 44 49 4e 47 29 20 29 3b 0a  ATA_PADDING) );.
1e000 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 73 63  .    /* Begin sc
1e010 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 68  anning through h
1e020 61 73 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65  ash table entrie
1e030 73 2e 20 54 68 69 73 20 6c 6f 6f 70 20 72 75 6e  s. This loop run
1e040 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 0a  s once for each.
1e050 20 20 20 20 2a 2a 20 74 65 72 6d 2f 64 6f 63 6c      ** term/docl
1e060 69 73 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74  ist currently st
1e070 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ored within the 
1e080 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  hash table. */. 
1e090 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1e0a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e0b0 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
1e0c0 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69 74  Fts5HashScanInit
1e0d0 28 70 48 61 73 68 2c 20 30 2c 20 30 29 3b 0a 20  (pHash, 0, 0);. 
1e0e0 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
1e0f0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1e100 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46 74   && 0==sqlite3Ft
1e110 73 35 48 61 73 68 53 63 61 6e 45 6f 66 28 70 48  s5HashScanEof(pH
1e120 61 73 68 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  ash) ){.      co
1e130 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b  nst char *zTerm;
1e140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
1e150 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
1e160 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  erm */.      con
1e170 73 74 20 75 38 20 2a 70 44 6f 63 6c 69 73 74 3b  st u8 *pDoclist;
1e180 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1e190 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 66  ter to doclist f
1e1a0 6f 72 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a  or this term */.
1e1b0 20 20 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69        int nDocli
1e1c0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1e1d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63    /* Size of doc
1e1e0 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  list in bytes */
1e1f0 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
1e200 20 74 68 65 20 74 65 72 6d 20 66 6f 72 20 74 68   the term for th
1e210 69 73 20 65 6e 74 72 79 20 74 6f 20 64 69 73 6b  is entry to disk
1e220 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1e230 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e  e3Fts5HashScanEn
1e240 74 72 79 28 70 48 61 73 68 2c 20 26 7a 54 65 72  try(pHash, &zTer
1e250 6d 2c 20 26 70 44 6f 63 6c 69 73 74 2c 20 26 6e  m, &pDoclist, &n
1e260 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  Doclist);.      
1e270 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54  fts5WriteAppendT
1e280 65 72 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20  erm(p, &writer, 
1e290 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65 72  (int)strlen(zTer
1e2a0 6d 29 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a  m), (const u8*)z
1e2b0 54 65 72 6d 29 3b 0a 0a 20 20 20 20 20 20 61 73  Term);..      as
1e2c0 73 65 72 74 28 20 77 72 69 74 65 72 2e 62 46 69  sert( writer.bFi
1e2d0 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 3d 3d  rstRowidInPage==
1e2e0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
1e2f0 67 73 7a 3e 3d 28 70 42 75 66 2d 3e 6e 20 2b 20  gsz>=(pBuf->n + 
1e300 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 44 6f 63  pPgidx->n + nDoc
1e310 6c 69 73 74 20 2b 20 31 29 20 29 7b 0a 20 20 20  list + 1) ){.   
1e320 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69       /* The enti
1e330 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c 20  re doclist will 
1e340 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65  fit on the curre
1e350 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20 20 20 20  nt leaf. */.    
1e360 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
1e370 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75  feAppendBlob(pBu
1e380 66 2c 20 70 44 6f 63 6c 69 73 74 2c 20 6e 44 6f  f, pDoclist, nDo
1e390 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  clist);.      }e
1e3a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34  lse{.        i64
1e3b0 20 69 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20   iRowid = 0;.   
1e3c0 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 20       i64 iDelta 
1e3d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
1e3e0 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 20 20   iOff = 0;..    
1e3f0 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72      /* The entir
1e400 65 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c 20 6e  e doclist will n
1e410 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20 6c  ot fit on this l
1e420 65 61 66 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  eaf. The followi
1e430 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ng .        ** l
1e440 6f 6f 70 20 69 74 65 72 61 74 65 73 20 74 68 72  oop iterates thr
1e450 6f 75 67 68 20 74 68 65 20 70 6f 73 6c 69 73 74  ough the poslist
1e460 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
1e470 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 20 20  he current .    
1e480 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2e 20      ** doclist. 
1e490 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c   */.        whil
1e4a0 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
1e4b0 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 6e 44 6f 63  _OK && iOff<nDoc
1e4c0 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  list ){.        
1e4d0 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
1e4e0 74 56 61 72 69 6e 74 28 26 70 44 6f 63 6c 69 73  tVarint(&pDoclis
1e4f0 74 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  t[iOff], (u64*)&
1e500 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20  iDelta);.       
1e510 20 20 20 69 52 6f 77 69 64 20 2b 3d 20 69 44 65     iRowid += iDe
1e520 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20 0a  lta;.          .
1e530 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77 72            if( wr
1e540 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64  iter.bFirstRowid
1e550 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  InPage ){.      
1e560 20 20 20 20 20 20 66 74 73 35 50 75 74 55 31 36        fts5PutU16
1e570 28 26 70 42 75 66 2d 3e 70 5b 30 5d 2c 20 28 75  (&pBuf->p[0], (u
1e580 31 36 29 70 42 75 66 2d 3e 6e 29 3b 20 20 20 2f  16)pBuf->n);   /
1e590 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  * first rowid on
1e5a0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
1e5b0 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20       pBuf->n += 
1e5c0 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61  sqlite3Fts5PutVa
1e5d0 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42  rint(&pBuf->p[pB
1e5e0 75 66 2d 3e 6e 5d 2c 20 69 52 6f 77 69 64 29 3b  uf->n], iRowid);
1e5f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69  .            wri
1e600 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49  ter.bFirstRowidI
1e610 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
1e620 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65         fts5Write
1e630 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20 26  DlidxAppend(p, &
1e640 77 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b  writer, iRowid);
1e650 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1e660 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42  {.            pB
1e670 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33  uf->n += sqlite3
1e680 46 74 73 35 50 75 74 56 61 72 69 6e 74 28 26 70  Fts5PutVarint(&p
1e690 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c  Buf->p[pBuf->n],
1e6a0 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20   iDelta);.      
1e6b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1e6c0 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c  assert( pBuf->n<
1e6d0 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b  =pBuf->nSpace );
1e6e0 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ..          if( 
1e6f0 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
1e700 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  TAIL_NONE ){.   
1e710 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66           if( iOf
1e720 66 3c 6e 44 6f 63 6c 69 73 74 20 26 26 20 70 44  f<nDoclist && pD
1e730 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3d 3d 30 20  oclist[iOff]==0 
1e740 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1e750 20 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e   pBuf->p[pBuf->n
1e760 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ++] = 0;.       
1e770 20 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20         iOff++;. 
1e780 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1e790 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20 26   iOff<nDoclist &
1e7a0 26 20 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d  & pDoclist[iOff]
1e7b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1e7c0 20 20 20 20 20 20 20 70 42 75 66 2d 3e 70 5b 70         pBuf->p[p
1e7d0 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a 20  Buf->n++] = 0;. 
1e7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1e7f0 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Off++;.         
1e800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e810 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1e820 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20   if( (pBuf->n + 
1e830 70 50 67 69 64 78 2d 3e 6e 29 3e 3d 70 67 73 7a  pPgidx->n)>=pgsz
1e840 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e850 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
1e860 4c 65 61 66 28 70 2c 20 26 77 72 69 74 65 72 29  Leaf(p, &writer)
1e870 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1e880 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1e890 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
1e8a0 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20   bDummy;.       
1e8b0 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20       int nPos;. 
1e8c0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
1e8d0 43 6f 70 79 20 3d 20 66 74 73 35 47 65 74 50 6f  Copy = fts5GetPo
1e8e0 73 6c 69 73 74 53 69 7a 65 28 26 70 44 6f 63 6c  slistSize(&pDocl
1e8f0 69 73 74 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73  ist[iOff], &nPos
1e900 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20  , &bDummy);.    
1e910 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d          nCopy +=
1e920 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20   nPos;.         
1e930 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20     if( (pBuf->n 
1e940 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 43  + pPgidx->n + nC
1e950 6f 70 79 29 20 3c 3d 20 70 67 73 7a 20 29 7b 0a  opy) <= pgsz ){.
1e960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e970 20 54 68 65 20 65 6e 74 69 72 65 20 70 6f 73 6c   The entire posl
1e980 69 73 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  ist will fit on 
1e990 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
1e9a0 2e 20 53 6f 20 63 6f 70 79 0a 20 20 20 20 20 20  . So copy.      
1e9b0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69 6e          ** it in
1e9c0 20 6f 6e 65 20 67 6f 2e 20 2a 2f 0a 20 20 20 20   one go. */.    
1e9d0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
1e9e0 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
1e9f0 6f 62 28 70 42 75 66 2c 20 26 70 44 6f 63 6c 69  ob(pBuf, &pDocli
1ea00 73 74 5b 69 4f 66 66 5d 2c 20 6e 43 6f 70 79 29  st[iOff], nCopy)
1ea10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
1ea20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1ea30 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65     /* The entire
1ea40 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20 6e 6f   poslist will no
1ea50 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20 6c 65  t fit on this le
1ea60 61 66 2e 20 53 6f 20 69 74 20 6e 65 65 64 73 0a  af. So it needs.
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1ea80 20 74 6f 20 62 65 20 62 72 6f 6b 65 6e 20 69 6e   to be broken in
1ea90 74 6f 20 73 65 63 74 69 6f 6e 73 2e 20 54 68 65  to sections. The
1eaa0 20 6f 6e 6c 79 20 71 75 61 6c 69 66 69 63 61 74   only qualificat
1eab0 69 6f 6e 20 62 65 69 6e 67 0a 20 20 20 20 20 20  ion being.      
1eac0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
1ead0 65 61 63 68 20 76 61 72 69 6e 74 20 6d 75 73 74  each varint must
1eae0 20 62 65 20 73 74 6f 72 65 64 20 63 6f 6e 74 69   be stored conti
1eaf0 67 75 6f 75 73 6c 79 2e 20 20 2a 2f 0a 20 20 20  guously.  */.   
1eb00 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74             const
1eb10 20 75 38 20 2a 70 50 6f 73 6c 69 73 74 20 3d 20   u8 *pPoslist = 
1eb20 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3b  &pDoclist[iOff];
1eb30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1eb40 6e 74 20 69 50 6f 73 20 3d 20 30 3b 0a 20 20 20  nt iPos = 0;.   
1eb50 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65             while
1eb60 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1eb70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1eb80 20 20 20 20 20 20 69 6e 74 20 6e 53 70 61 63 65        int nSpace
1eb90 20 3d 20 70 67 73 7a 20 2d 20 70 42 75 66 2d 3e   = pgsz - pBuf->
1eba0 6e 20 2d 20 70 50 67 69 64 78 2d 3e 6e 3b 0a 20  n - pPgidx->n;. 
1ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1ebc0 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt n = 0;.      
1ebd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6e            if( (n
1ebe0 43 6f 70 79 20 2d 20 69 50 6f 73 29 3c 3d 6e 53  Copy - iPos)<=nS
1ebf0 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  pace ){.        
1ec00 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 6e 43            n = nC
1ec10 6f 70 79 20 2d 20 69 50 6f 73 3b 0a 20 20 20 20  opy - iPos;.    
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
1ec30 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
1ec40 20 20 20 20 20 6e 20 3d 20 66 74 73 35 50 6f 73       n = fts5Pos
1ec50 6c 69 73 74 50 72 65 66 69 78 28 26 70 50 6f 73  listPrefix(&pPos
1ec60 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 53 70 61  list[iPos], nSpa
1ec70 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ce);.           
1ec80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1ec90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
1eca0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >0 );.          
1ecb0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1ecc0 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70  SafeAppendBlob(p
1ecd0 42 75 66 2c 20 26 70 50 6f 73 6c 69 73 74 5b 69  Buf, &pPoslist[i
1ece0 50 6f 73 5d 2c 20 6e 29 3b 0a 20 20 20 20 20 20  Pos], n);.      
1ecf0 20 20 20 20 20 20 20 20 20 20 69 50 6f 73 20 2b            iPos +
1ed00 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = n;.           
1ed10 20 20 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e       if( (pBuf->
1ed20 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 29 3e 3d  n + pPgidx->n)>=
1ed30 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  pgsz ){.        
1ed40 20 20 20 20 20 20 20 20 20 20 66 74 73 35 57 72            fts5Wr
1ed50 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20  iteFlushLeaf(p, 
1ed60 26 77 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20  &writer);.      
1ed70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1ed90 69 50 6f 73 3e 3d 6e 43 6f 70 79 20 29 20 62 72  iPos>=nCopy ) br
1eda0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
1edb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1edc0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
1edd0 4f 66 66 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20  Off += nCopy;.  
1ede0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1edf0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1ee00 20 20 20 2f 2a 20 54 4f 44 4f 32 3a 20 44 6f 63     /* TODO2: Doc
1ee10 6c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20  list terminator 
1ee20 77 72 69 74 74 65 6e 20 68 65 72 65 2e 20 2a 2f  written here. */
1ee30 0a 20 20 20 20 20 20 2f 2a 20 70 42 75 66 2d 3e  .      /* pBuf->
1ee40 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 27  p[pBuf->n++] = '
1ee50 5c 30 27 3b 20 2a 2f 0a 20 20 20 20 20 20 61 73  \0'; */.      as
1ee60 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70  sert( pBuf->n<=p
1ee70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 20  Buf->nSpace );. 
1ee80 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1ee90 48 61 73 68 53 63 61 6e 4e 65 78 74 28 70 48 61  HashScanNext(pHa
1eea0 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  sh);.    }.    s
1eeb0 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 43 6c  qlite3Fts5HashCl
1eec0 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20 20 20  ear(pHash);.    
1eed0 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28  fts5WriteFinish(
1eee0 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70 67 6e  p, &writer, &pgn
1eef0 6f 4c 61 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  oLast);..    /* 
1ef00 55 70 64 61 74 65 20 74 68 65 20 46 74 73 35 53  Update the Fts5S
1ef10 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20  tructure. It is 
1ef20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20  written back to 
1ef30 74 68 65 20 64 61 74 61 62 61 73 65 20 62 79 20  the database by 
1ef40 74 68 65 0a 20 20 20 20 2a 2a 20 66 74 73 35 53  the.    ** fts5S
1ef50 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
1ef60 29 20 63 61 6c 6c 20 62 65 6c 6f 77 2e 20 20 2a  ) call below.  *
1ef70 2f 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63  /.    if( pStruc
1ef80 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 30 20 29 7b 0a  t->nLevel==0 ){.
1ef90 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
1efa0 75 72 65 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e  ureAddLevel(&p->
1efb0 72 63 2c 20 26 70 53 74 72 75 63 74 29 3b 0a 20  rc, &pStruct);. 
1efc0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72     }.    fts5Str
1efd0 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65  uctureExtendLeve
1efe0 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63  l(&p->rc, pStruc
1eff0 74 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20  t, 0, 1, 0);.   
1f000 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1f010 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1f020 53 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Seg = &pStruct->
1f030 61 4c 65 76 65 6c 5b 30 5d 2e 61 53 65 67 5b 20  aLevel[0].aSeg[ 
1f040 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1f050 30 5d 2e 6e 53 65 67 2b 2b 20 5d 3b 0a 20 20 20  0].nSeg++ ];.   
1f060 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64 20     pSeg->iSegid 
1f070 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20  = iSegid;.      
1f080 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
1f090 3d 20 31 3b 0a 20 20 20 20 20 20 70 53 65 67 2d  = 1;.      pSeg-
1f0a0 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f  >pgnoLast = pgno
1f0b0 4c 61 73 74 3b 0a 20 20 20 20 20 20 70 53 74 72  Last;.      pStr
1f0c0 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b  uct->nSegment++;
1f0d0 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53  .    }.    fts5S
1f0e0 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28  tructurePromote(
1f0f0 70 2c 20 30 2c 20 70 53 74 72 75 63 74 29 3b 0a  p, 0, pStruct);.
1f100 20 20 7d 0a 0a 20 20 66 74 73 35 49 6e 64 65 78    }..  fts5Index
1f110 41 75 74 6f 6d 65 72 67 65 28 70 2c 20 26 70 53  Automerge(p, &pS
1f120 74 72 75 63 74 2c 20 70 67 6e 6f 4c 61 73 74 29  truct, pgnoLast)
1f130 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 43 72 69  ;.  fts5IndexCri
1f140 73 69 73 6d 65 72 67 65 28 70 2c 20 26 70 53 74  sismerge(p, &pSt
1f150 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72  ruct);.  fts5Str
1f160 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 70  uctureWrite(p, p
1f170 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53  Struct);.  fts5S
1f180 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
1f190 70 53 74 72 75 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a  pStruct);.}../*.
1f1a0 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74  ** Flush any dat
1f1b0 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
1f1c0 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
1f1d0 61 62 6c 65 73 20 74 6f 20 74 68 65 20 64 61 74  ables to the dat
1f1e0 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
1f1f0 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 46   void fts5IndexF
1f200 6c 75 73 68 28 46 74 73 35 49 6e 64 65 78 20 2a  lush(Fts5Index *
1f210 70 29 7b 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20  p){.  /* Unless 
1f220 69 74 20 69 73 20 65 6d 70 74 79 2c 20 66 6c 75  it is empty, flu
1f230 73 68 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  sh the hash tabl
1f240 65 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69  e to disk */.  i
1f250 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61  f( p->nPendingDa
1f260 74 61 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ta ){.    assert
1f270 28 20 70 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20  ( p->pHash );.  
1f280 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74    p->nPendingDat
1f290 61 20 3d 20 30 3b 0a 20 20 20 20 66 74 73 35 46  a = 0;.    fts5F
1f2a0 6c 75 73 68 4f 6e 65 48 61 73 68 28 70 29 3b 0a  lushOneHash(p);.
1f2b0 20 20 7d 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69    }.}...int sqli
1f2c0 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 74 69  te3Fts5IndexOpti
1f2d0 6d 69 7a 65 28 46 74 73 35 49 6e 64 65 78 20 2a  mize(Fts5Index *
1f2e0 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  p){.  Fts5Struct
1f2f0 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20  ure *pStruct;.  
1f300 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
1f310 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  New = 0;.  int n
1f320 53 65 67 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  Seg = 0;..  asse
1f330 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
1f340 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e  E_OK );.  fts5In
1f350 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 70  dexFlush(p);.  p
1f360 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
1f370 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 0a  uctureRead(p);..
1f380 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
1f390 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
1f3a0 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d  ruct->nSegment==
1f3b0 66 74 73 35 53 74 72 75 63 74 75 72 65 43 6f 75  fts5StructureCou
1f3c0 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75  ntSegments(pStru
1f3d0 63 74 29 20 29 3b 0a 20 20 20 20 6e 53 65 67 20  ct) );.    nSeg 
1f3e0 3d 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  = pStruct->nSegm
1f3f0 65 6e 74 3b 0a 20 20 20 20 69 66 28 20 6e 53 65  ent;.    if( nSe
1f400 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  g>1 ){.      int
1f410 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
1f420 46 74 73 35 53 74 72 75 63 74 75 72 65 29 3b 0a  Fts5Structure);.
1f430 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 28        nByte += (
1f440 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b  pStruct->nLevel+
1f450 31 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  1) * sizeof(Fts5
1f460 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 3b  StructureLevel);
1f470 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28 46  .      pNew = (F
1f480 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 73 71  ts5Structure*)sq
1f490 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
1f4a0 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74  ero(&p->rc, nByt
1f4b0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
1f4c0 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
1f4d0 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
1f4e0 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20 20 69 6e  el *pLvl;.    in
1f4f0 74 20 6e 42 79 74 65 20 3d 20 6e 53 65 67 20 2a  t nByte = nSeg *
1f500 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
1f510 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20  ctureSegment);. 
1f520 20 20 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 20     pNew->nLevel 
1f530 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  = pStruct->nLeve
1f540 6c 2b 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  l+1;.    pNew->n
1f550 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 4e 65  Ref = 1;.    pNe
1f560 77 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  w->nWriteCounter
1f570 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69   = pStruct->nWri
1f580 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20 70  teCounter;.    p
1f590 4c 76 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 65  Lvl = &pNew->aLe
1f5a0 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65  vel[pStruct->nLe
1f5b0 76 65 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  vel];.    pLvl->
1f5c0 61 53 65 67 20 3d 20 28 46 74 73 35 53 74 72 75  aSeg = (Fts5Stru
1f5d0 63 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71  ctureSegment*)sq
1f5e0 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
1f5f0 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74  ero(&p->rc, nByt
1f600 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 76 6c  e);.    if( pLvl
1f610 2d 3e 61 53 65 67 20 29 7b 0a 20 20 20 20 20 20  ->aSeg ){.      
1f620 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a  int iLvl, iSeg;.
1f630 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 4f 75        int iSegOu
1f640 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  t = 0;.      for
1f650 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
1f660 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
1f670 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Lvl++){.        
1f680 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67  for(iSeg=0; iSeg
1f690 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  <pStruct->aLevel
1f6a0 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65  [iLvl].nSeg; iSe
1f6b0 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g++){.          
1f6c0 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 4f  pLvl->aSeg[iSegO
1f6d0 75 74 5d 20 3d 20 70 53 74 72 75 63 74 2d 3e 61  ut] = pStruct->a
1f6e0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67  Level[iLvl].aSeg
1f6f0 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20  [iSeg];.        
1f700 20 20 69 53 65 67 4f 75 74 2b 2b 3b 0a 20 20 20    iSegOut++;.   
1f710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1f720 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67 6d       pNew->nSegm
1f730 65 6e 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67  ent = pLvl->nSeg
1f740 20 3d 20 6e 53 65 67 3b 0a 20 20 20 20 7d 65 6c   = nSeg;.    }el
1f750 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1f760 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
1f770 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
1f780 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1f790 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  New ){.    int i
1f7a0 4c 76 6c 20 3d 20 70 4e 65 77 2d 3e 6e 4c 65 76  Lvl = pNew->nLev
1f7b0 65 6c 2d 31 3b 0a 20 20 20 20 77 68 69 6c 65 28  el-1;.    while(
1f7c0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1f7d0 4b 20 26 26 20 70 4e 65 77 2d 3e 61 4c 65 76 65  K && pNew->aLeve
1f7e0 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 30 20 29  l[iLvl].nSeg>0 )
1f7f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 52 65 6d  {.      int nRem
1f800 20 3d 20 46 54 53 35 5f 4f 50 54 5f 57 4f 52 4b   = FTS5_OPT_WORK
1f810 5f 55 4e 49 54 3b 0a 20 20 20 20 20 20 66 74 73  _UNIT;.      fts
1f820 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c  5IndexMergeLevel
1f830 28 70 2c 20 26 70 4e 65 77 2c 20 69 4c 76 6c 2c  (p, &pNew, iLvl,
1f840 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20 7d 0a 0a   &nRem);.    }..
1f850 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
1f860 65 57 72 69 74 65 28 70 2c 20 70 4e 65 77 29 3b  eWrite(p, pNew);
1f870 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
1f880 72 65 52 65 6c 65 61 73 65 28 70 4e 65 77 29 3b  reRelease(pNew);
1f890 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 74 72 75  .  }..  fts5Stru
1f8a0 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
1f8b0 72 75 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ruct);.  return 
1f8c0 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
1f8d0 70 29 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69  p); .}..int sqli
1f8e0 74 65 33 46 74 73 35 49 6e 64 65 78 4d 65 72 67  te3Fts5IndexMerg
1f8f0 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
1f900 69 6e 74 20 6e 4d 65 72 67 65 29 7b 0a 20 20 46  int nMerge){.  F
1f910 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
1f920 74 72 75 63 74 3b 0a 0a 20 20 70 53 74 72 75 63  truct;..  pStruc
1f930 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
1f940 65 52 65 61 64 28 70 29 3b 0a 20 20 69 66 28 20  eRead(p);.  if( 
1f950 70 53 74 72 75 63 74 20 26 26 20 70 53 74 72 75  pStruct && pStru
1f960 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 7b 0a 20 20  ct->nLevel ){.  
1f970 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65    fts5IndexMerge
1f980 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20 6e 4d  (p, &pStruct, nM
1f990 65 72 67 65 29 3b 0a 20 20 20 20 66 74 73 35 53  erge);.    fts5S
1f9a0 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c  tructureWrite(p,
1f9b0 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 20   pStruct);.  }. 
1f9c0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1f9d0 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
1f9e0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
1f9f0 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
1fa00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1fa10 35 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b  5PoslistCallback
1fa20 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1fa30 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74  , .  void *pCont
1fa40 65 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  ext, .  const u8
1fa50 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43   *pChunk, int nC
1fa60 68 75 6e 6b 0a 29 7b 0a 20 20 61 73 73 65 72 74  hunk.){.  assert
1fa70 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29  _nc( nChunk>=0 )
1fa80 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30  ;.  if( nChunk>0
1fa90 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66   ){.    fts5Buff
1faa0 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
1fab0 28 28 46 74 73 35 42 75 66 66 65 72 2a 29 70 43  ((Fts5Buffer*)pC
1fac0 6f 6e 74 65 78 74 2c 20 70 43 68 75 6e 6b 2c 20  ontext, pChunk, 
1fad0 6e 43 68 75 6e 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a  nChunk);.  }.}..
1fae0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
1faf0 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74  oslistCallbackCt
1fb00 78 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63  x PoslistCallbac
1fb10 6b 43 74 78 3b 0a 73 74 72 75 63 74 20 50 6f 73  kCtx;.struct Pos
1fb20 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20  listCallbackCtx 
1fb30 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  {.  Fts5Buffer *
1fb40 70 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20  pBuf;           
1fb50 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f      /* Append to
1fb60 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a   this buffer */.
1fb70 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
1fb80 6f 6c 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  olset;          
1fb90 20 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61    /* Restrict ma
1fba0 74 63 68 65 73 20 74 6f 20 74 68 69 73 20 63 6f  tches to this co
1fbb0 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 53  lumn */.  int eS
1fbc0 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  tate;           
1fbd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
1fbe0 20 61 62 6f 76 65 20 2a 2f 0a 7d 3b 0a 0a 74 79   above */.};..ty
1fbf0 70 65 64 65 66 20 73 74 72 75 63 74 20 50 6f 73  pedef struct Pos
1fc00 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78 20 50  listOffsetsCtx P
1fc10 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78  oslistOffsetsCtx
1fc20 3b 0a 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74  ;.struct Poslist
1fc30 4f 66 66 73 65 74 73 43 74 78 20 7b 0a 20 20 46  OffsetsCtx {.  F
1fc40 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b  ts5Buffer *pBuf;
1fc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fc60 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73  * Append to this
1fc70 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 46 74 73   buffer */.  Fts
1fc80 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
1fc90 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1fca0 52 65 73 74 72 69 63 74 20 6d 61 74 63 68 65 73  Restrict matches
1fcb0 20 74 6f 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20   to this column 
1fcc0 2a 2f 0a 20 20 69 6e 74 20 69 52 65 61 64 3b 0a  */.  int iRead;.
1fcd0 20 20 69 6e 74 20 69 57 72 69 74 65 3b 0a 7d 3b    int iWrite;.};
1fce0 0a 0a 2f 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 4d 61  ../*.** TODO: Ma
1fcf0 6b 65 20 74 68 69 73 20 6d 6f 72 65 20 65 66 66  ke this more eff
1fd00 69 63 69 65 6e 74 21 0a 2a 2f 0a 73 74 61 74 69  icient!.*/.stati
1fd10 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 43  c int fts5IndexC
1fd20 6f 6c 73 65 74 54 65 73 74 28 46 74 73 35 43 6f  olsetTest(Fts5Co
1fd30 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 69  lset *pColset, i
1fd40 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  nt iCol){.  int 
1fd50 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
1fd60 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69  pColset->nCol; i
1fd70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f  ++){.    if( pCo
1fd80 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 3d 3d  lset->aiCol[i]==
1fd90 69 43 6f 6c 20 29 20 72 65 74 75 72 6e 20 31 3b  iCol ) return 1;
1fda0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1fdb0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1fdc0 66 74 73 35 50 6f 73 6c 69 73 74 4f 66 66 73 65  fts5PoslistOffse
1fdd0 74 73 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74  tsCallback(.  Ft
1fde0 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 76  s5Index *p, .  v
1fdf0 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a  oid *pContext, .
1fe00 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75    const u8 *pChu
1fe10 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29  nk, int nChunk.)
1fe20 7b 0a 20 20 50 6f 73 6c 69 73 74 4f 66 66 73 65  {.  PoslistOffse
1fe30 74 73 43 74 78 20 2a 70 43 74 78 20 3d 20 28 50  tsCtx *pCtx = (P
1fe40 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78  oslistOffsetsCtx
1fe50 2a 29 70 43 6f 6e 74 65 78 74 3b 0a 20 20 61 73  *)pContext;.  as
1fe60 73 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e  sert_nc( nChunk>
1fe70 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75  =0 );.  if( nChu
1fe80 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  nk>0 ){.    int 
1fe90 69 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  i = 0;.    while
1fea0 28 20 69 3c 6e 43 68 75 6e 6b 20 29 7b 0a 20 20  ( i<nChunk ){.  
1feb0 20 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20      int iVal;.  
1fec0 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
1fed0 56 61 72 69 6e 74 33 32 28 26 70 43 68 75 6e 6b  Varint32(&pChunk
1fee0 5b 69 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20  [i], iVal);.    
1fef0 20 20 69 56 61 6c 20 2b 3d 20 70 43 74 78 2d 3e    iVal += pCtx->
1ff00 69 52 65 61 64 20 2d 20 32 3b 0a 20 20 20 20 20  iRead - 2;.     
1ff10 20 70 43 74 78 2d 3e 69 52 65 61 64 20 3d 20 69   pCtx->iRead = i
1ff20 56 61 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 66  Val;.      if( f
1ff30 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65  ts5IndexColsetTe
1ff40 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74  st(pCtx->pColset
1ff50 2c 20 69 56 61 6c 29 20 29 7b 0a 20 20 20 20 20  , iVal) ){.     
1ff60 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
1ff70 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 43  eAppendVarint(pC
1ff80 74 78 2d 3e 70 42 75 66 2c 20 69 56 61 6c 20 2b  tx->pBuf, iVal +
1ff90 20 32 20 2d 20 70 43 74 78 2d 3e 69 57 72 69 74   2 - pCtx->iWrit
1ffa0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 74 78  e);.        pCtx
1ffb0 2d 3e 69 57 72 69 74 65 20 3d 20 69 56 61 6c 3b  ->iWrite = iVal;
1ffc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ffd0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
1ffe0 64 20 66 74 73 35 50 6f 73 6c 69 73 74 46 69 6c  d fts5PoslistFil
1fff0 74 65 72 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46  terCallback(.  F
20000 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
20010 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20  void *pContext, 
20020 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68  .  const u8 *pCh
20030 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a  unk, int nChunk.
20040 29 7b 0a 20 20 50 6f 73 6c 69 73 74 43 61 6c 6c  ){.  PoslistCall
20050 62 61 63 6b 43 74 78 20 2a 70 43 74 78 20 3d 20  backCtx *pCtx = 
20060 28 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b  (PoslistCallback
20070 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b 0a 20  Ctx*)pContext;. 
20080 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43 68 75   assert_nc( nChu
20090 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e  nk>=0 );.  if( n
200a0 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 2f  Chunk>0 ){.    /
200b0 2a 20 53 65 61 72 63 68 20 74 68 72 6f 75 67 68  * Search through
200c0 20 74 6f 20 66 69 6e 64 20 74 68 65 20 66 69 72   to find the fir
200d0 73 74 20 76 61 72 69 6e 74 20 77 69 74 68 20 76  st varint with v
200e0 61 6c 75 65 20 31 2e 20 54 68 69 73 20 69 73 20  alue 1. This is 
200f0 74 68 65 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  the.    ** start
20100 20 6f 66 20 74 68 65 20 6e 65 78 74 20 63 6f 6c   of the next col
20110 75 6d 6e 73 20 68 69 74 73 2e 20 2a 2f 0a 20 20  umns hits. */.  
20120 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20    int i = 0;.   
20130 20 69 6e 74 20 69 53 74 61 72 74 20 3d 20 30 3b   int iStart = 0;
20140 0a 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e  ..    if( pCtx->
20150 65 53 74 61 74 65 3d 3d 32 20 29 7b 0a 20 20 20  eState==2 ){.   
20160 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20     int iCol;.   
20170 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61     fts5FastGetVa
20180 72 69 6e 74 33 32 28 70 43 68 75 6e 6b 2c 20 69  rint32(pChunk, i
20190 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69  , iCol);.      i
201a0 66 28 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73  f( fts5IndexCols
201b0 65 74 54 65 73 74 28 70 43 74 78 2d 3e 70 43 6f  etTest(pCtx->pCo
201c0 6c 73 65 74 2c 20 69 43 6f 6c 29 20 29 7b 0a 20  lset, iCol) ){. 
201d0 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74         pCtx->eSt
201e0 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ate = 1;.       
201f0 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
20200 70 70 65 6e 64 56 61 72 69 6e 74 28 70 43 74 78  ppendVarint(pCtx
20210 2d 3e 70 42 75 66 2c 20 31 29 3b 0a 20 20 20 20  ->pBuf, 1);.    
20220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20230 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20   pCtx->eState = 
20240 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
20250 0a 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ..    do {.     
20260 20 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b   while( i<nChunk
20270 20 26 26 20 70 43 68 75 6e 6b 5b 69 5d 21 3d 30   && pChunk[i]!=0
20280 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 77  x01 ){.        w
20290 68 69 6c 65 28 20 70 43 68 75 6e 6b 5b 69 5d 20  hile( pChunk[i] 
202a0 26 20 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20  & 0x80 ) i++;.  
202b0 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
202c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43 74   }.      if( pCt
202d0 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  x->eState ){.   
202e0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
202f0 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 43  afeAppendBlob(pC
20300 74 78 2d 3e 70 42 75 66 2c 20 26 70 43 68 75 6e  tx->pBuf, &pChun
20310 6b 5b 69 53 74 61 72 74 5d 2c 20 69 2d 69 53 74  k[iStart], i-iSt
20320 61 72 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  art);.      }.  
20330 20 20 20 20 69 66 28 20 69 3c 6e 43 68 75 6e 6b      if( i<nChunk
20340 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
20350 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 53  iCol;.        iS
20360 74 61 72 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  tart = i;.      
20370 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69    i++;.        i
20380 66 28 20 69 3e 3d 6e 43 68 75 6e 6b 20 29 7b 0a  f( i>=nChunk ){.
20390 20 20 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e            pCtx->
203a0 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20  eState = 2;.    
203b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
203c0 20 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74       fts5FastGet
203d0 56 61 72 69 6e 74 33 32 28 70 43 68 75 6e 6b 2c  Varint32(pChunk,
203e0 20 69 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20   i, iCol);.     
203f0 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74       pCtx->eStat
20400 65 20 3d 20 66 74 73 35 49 6e 64 65 78 43 6f 6c  e = fts5IndexCol
20410 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e 70 43  setTest(pCtx->pC
20420 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 3b 0a 20 20  olset, iCol);.  
20430 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78          if( pCtx
20440 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
20450 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
20460 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
20470 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 26 70 43  (pCtx->pBuf, &pC
20480 68 75 6e 6b 5b 69 53 74 61 72 74 5d 2c 20 69 2d  hunk[iStart], i-
20490 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20  iStart);.       
204a0 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 3b       iStart = i;
204b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
204c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
204d0 20 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 43 68     }while( i<nCh
204e0 75 6e 6b 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  unk );.  }.}../*
204f0 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
20500 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  er currently poi
20510 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20 65  nts to a valid e
20520 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20  ntry (not EOF). 
20530 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
20540 20 61 70 70 65 6e 64 73 20 74 68 65 20 70 6f 73   appends the pos
20550 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 20  ition list data 
20560 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
20570 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 62 75 66 66  entry to.** buff
20580 65 72 20 70 42 75 66 2e 20 49 74 20 64 6f 65 73  er pBuf. It does
20590 20 6e 6f 74 20 6d 61 6b 65 20 61 20 63 6f 70 79   not make a copy
205a0 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   of the position
205b0 2d 6c 69 73 74 20 73 69 7a 65 0a 2a 2a 20 66 69  -list size.** fi
205c0 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  eld..*/.static v
205d0 6f 69 64 20 66 74 73 35 53 65 67 69 74 65 72 50  oid fts5SegiterP
205e0 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e  oslist(.  Fts5In
205f0 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 65  dex *p,.  Fts5Se
20600 67 49 74 65 72 20 2a 70 53 65 67 2c 0a 20 20 46  gIter *pSeg,.  F
20610 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
20620 65 74 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72  et,.  Fts5Buffer
20630 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 66 28 20   *pBuf.){.  if( 
20640 30 3d 3d 66 74 73 35 42 75 66 66 65 72 47 72 6f  0==fts5BufferGro
20650 77 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20  w(&p->rc, pBuf, 
20660 70 53 65 67 2d 3e 6e 50 6f 73 29 20 29 7b 0a 20  pSeg->nPos) ){. 
20670 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74 3d 3d     if( pColset==
20680 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 43  0 ){.      fts5C
20690 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70  hunkIterate(p, p
206a0 53 65 67 2c 20 28 76 6f 69 64 2a 29 70 42 75 66  Seg, (void*)pBuf
206b0 2c 20 66 74 73 35 50 6f 73 6c 69 73 74 43 61 6c  , fts5PoslistCal
206c0 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73  lback);.    }els
206d0 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  e{.      if( p->
206e0 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
206f0 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 46 55  ==FTS5_DETAIL_FU
20700 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 50 6f  LL ){.        Po
20710 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78  slistCallbackCtx
20720 20 73 43 74 78 3b 0a 20 20 20 20 20 20 20 20 73   sCtx;.        s
20730 43 74 78 2e 70 42 75 66 20 3d 20 70 42 75 66 3b  Ctx.pBuf = pBuf;
20740 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 70 43  .        sCtx.pC
20750 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b  olset = pColset;
20760 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 65 53  .        sCtx.eS
20770 74 61 74 65 20 3d 20 66 74 73 35 49 6e 64 65 78  tate = fts5Index
20780 43 6f 6c 73 65 74 54 65 73 74 28 70 43 6f 6c 73  ColsetTest(pCols
20790 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  et, 0);.        
207a0 61 73 73 65 72 74 28 20 73 43 74 78 2e 65 53 74  assert( sCtx.eSt
207b0 61 74 65 3d 3d 30 20 7c 7c 20 73 43 74 78 2e 65  ate==0 || sCtx.e
207c0 53 74 61 74 65 3d 3d 31 20 29 3b 0a 20 20 20 20  State==1 );.    
207d0 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65      fts5ChunkIte
207e0 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20 28 76  rate(p, pSeg, (v
207f0 6f 69 64 2a 29 26 73 43 74 78 2c 20 66 74 73 35  oid*)&sCtx, fts5
20800 50 6f 73 6c 69 73 74 46 69 6c 74 65 72 43 61 6c  PoslistFilterCal
20810 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 7d 65  lback);.      }e
20820 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50 6f 73  lse{.        Pos
20830 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78 20 73  listOffsetsCtx s
20840 43 74 78 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  Ctx;.        mem
20850 73 65 74 28 26 73 43 74 78 2c 20 30 2c 20 73 69  set(&sCtx, 0, si
20860 7a 65 6f 66 28 73 43 74 78 29 29 3b 0a 20 20 20  zeof(sCtx));.   
20870 20 20 20 20 20 73 43 74 78 2e 70 42 75 66 20 3d       sCtx.pBuf =
20880 20 70 42 75 66 3b 0a 20 20 20 20 20 20 20 20 73   pBuf;.        s
20890 43 74 78 2e 70 43 6f 6c 73 65 74 20 3d 20 70 43  Ctx.pColset = pC
208a0 6f 6c 73 65 74 3b 0a 20 20 20 20 20 20 20 20 66  olset;.        f
208b0 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28  ts5ChunkIterate(
208c0 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29  p, pSeg, (void*)
208d0 26 73 43 74 78 2c 20 66 74 73 35 50 6f 73 6c 69  &sCtx, fts5Posli
208e0 73 74 4f 66 66 73 65 74 73 43 61 6c 6c 62 61 63  stOffsetsCallbac
208f0 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
20900 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
20910 4e 2f 4f 55 54 20 70 61 72 61 6d 65 74 65 72 20  N/OUT parameter 
20920 28 2a 70 61 29 20 70 6f 69 6e 74 73 20 74 6f 20  (*pa) points to 
20930 61 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  a position list 
20940 6e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  n bytes in size.
20950 20 49 66 0a 2a 2a 20 74 68 65 20 70 6f 73 69 74   If.** the posit
20960 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ion list contain
20970 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63 6f  s entries for co
20980 6c 75 6d 6e 20 69 43 6f 6c 2c 20 74 68 65 6e 20  lumn iCol, then 
20990 28 2a 70 61 29 20 69 73 20 73 65 74 0a 2a 2a 20  (*pa) is set.** 
209a0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
209b0 73 75 62 2d 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  sub-position-lis
209c0 74 20 66 6f 72 20 74 68 61 74 20 63 6f 6c 75 6d  t for that colum
209d0 6e 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  n and the number
209e0 20 6f 66 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20   of.** bytes in 
209f0 69 74 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c  it returned. Or,
20a00 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   if the argument
20a10 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64   position list d
20a20 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6e 74 61  oes not.** conta
20a30 69 6e 20 61 6e 79 20 65 6e 74 72 69 65 73 20 66  in any entries f
20a40 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20  or column iCol, 
20a50 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
20a60 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65  tic int fts5Inde
20a70 78 45 78 74 72 61 63 74 43 6f 6c 28 0a 20 20 63  xExtractCol(.  c
20a80 6f 6e 73 74 20 75 38 20 2a 2a 70 61 2c 20 20 20  onst u8 **pa,   
20a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20aa0 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65  * IN/OUT: Pointe
20ab0 72 20 74 6f 20 70 6f 73 6c 69 73 74 20 2a 2f 0a  r to poslist */.
20ac0 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
20ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ae0 20 20 2f 2a 20 49 4e 3a 20 53 69 7a 65 20 6f 66    /* IN: Size of
20af0 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65   poslist in byte
20b00 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20  s */.  int iCol 
20b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
20b30 20 74 6f 20 65 78 74 72 61 63 74 20 66 72 6f 6d   to extract from
20b40 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20   poslist */.){. 
20b50 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20   int iCurrent = 
20b60 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
20b70 20 2f 2a 20 41 6e 79 74 68 69 6e 67 20 62 65 66   /* Anything bef
20b80 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 30 78  ore the first 0x
20b90 30 31 20 69 73 20 63 6f 6c 20 30 20 2a 2f 0a 20  01 is col 0 */. 
20ba0 20 63 6f 6e 73 74 20 75 38 20 2a 70 20 3d 20 2a   const u8 *p = *
20bb0 70 61 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  pa;.  const u8 *
20bc0 70 45 6e 64 20 3d 20 26 70 5b 6e 5d 3b 20 20 20  pEnd = &p[n];   
20bd0 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 79 74        /* One byt
20be0 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 6f  e past end of po
20bf0 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20  sition list */. 
20c00 20 75 38 20 70 72 65 76 20 3d 20 30 3b 0a 0a 20   u8 prev = 0;.. 
20c10 20 77 68 69 6c 65 28 20 69 43 6f 6c 3e 69 43 75   while( iCol>iCu
20c20 72 72 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  rrent ){.    /* 
20c30 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65 72 20  Advance pointer 
20c40 70 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74  p until it point
20c50 73 20 74 6f 20 70 45 6e 64 20 6f 72 20 61 6e 20  s to pEnd or an 
20c60 30 78 30 31 20 62 79 74 65 20 74 68 61 74 20 69  0x01 byte that i
20c70 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 70 61 72  s.    ** not par
20c80 74 20 6f 66 20 61 20 76 61 72 69 6e 74 20 2a 2f  t of a varint */
20c90 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 72 65  .    while( (pre
20ca0 76 20 26 20 30 78 38 30 29 20 7c 7c 20 2a 70 21  v & 0x80) || *p!
20cb0 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 70  =0x01 ){.      p
20cc0 72 65 76 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20 20  rev = *p++;.    
20cd0 20 20 69 66 28 20 70 3d 3d 70 45 6e 64 20 29 20    if( p==pEnd ) 
20ce0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
20cf0 20 20 20 20 2a 70 61 20 3d 20 70 2b 2b 3b 0a 20      *pa = p++;. 
20d00 20 20 20 70 20 2b 3d 20 66 74 73 35 47 65 74 56     p += fts5GetV
20d10 61 72 69 6e 74 33 32 28 70 2c 20 69 43 75 72 72  arint32(p, iCurr
20d20 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ent);.  }.  if( 
20d30 69 43 6f 6c 21 3d 69 43 75 72 72 65 6e 74 20 29  iCol!=iCurrent )
20d40 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
20d50 20 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65 72   Advance pointer
20d60 20 70 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e   p until it poin
20d70 74 73 20 74 6f 20 70 45 6e 64 20 6f 72 20 61 6e  ts to pEnd or an
20d80 20 30 78 30 31 20 62 79 74 65 20 74 68 61 74 20   0x01 byte that 
20d90 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 70 61 72 74  is.  ** not part
20da0 20 6f 66 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a   of a varint */.
20db0 20 20 61 73 73 65 72 74 28 20 28 70 72 65 76 20    assert( (prev 
20dc0 26 20 30 78 38 30 29 3d 3d 30 20 29 3b 0a 20 20  & 0x80)==0 );.  
20dd0 77 68 69 6c 65 28 20 70 3c 70 45 6e 64 20 26 26  while( p<pEnd &&
20de0 20 28 28 70 72 65 76 20 26 20 30 78 38 30 29 20   ((prev & 0x80) 
20df0 7c 7c 20 2a 70 21 3d 30 78 30 31 29 20 29 7b 0a  || *p!=0x01) ){.
20e00 20 20 20 20 70 72 65 76 20 3d 20 2a 70 2b 2b 3b      prev = *p++;
20e10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 20  .  }.  return p 
20e20 2d 20 28 2a 70 61 29 3b 0a 7d 0a 0a 73 74 61 74  - (*pa);.}..stat
20e30 69 63 20 69 6e 74 20 66 74 73 35 41 70 70 65 6e  ic int fts5Appen
20e40 64 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e  dRowid(.  Fts5In
20e50 64 65 78 20 2a 70 2c 0a 20 20 69 36 34 20 69 44  dex *p,.  i64 iD
20e60 65 6c 74 61 2c 0a 20 20 46 74 73 35 49 6e 64 65  elta,.  Fts5Inde
20e70 78 49 74 65 72 20 2a 70 4d 75 6c 74 69 2c 0a 20  xIter *pMulti,. 
20e80 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
20e90 6c 73 65 74 2c 0a 20 20 46 74 73 35 42 75 66 66  lset,.  Fts5Buff
20ea0 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 66 74  er *pBuf.){.  ft
20eb0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
20ec0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 70 42 75  rint(&p->rc, pBu
20ed0 66 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20 72 65  f, iDelta);.  re
20ee0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
20ef0 20 49 74 65 72 61 74 6f 72 20 70 4d 75 6c 74 69   Iterator pMulti
20f00 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
20f10 73 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  s to a valid ent
20f20 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68  ry (not EOF). Th
20f30 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
20f40 70 70 65 6e 64 73 20 74 68 65 20 66 6f 6c 6c 6f  ppends the follo
20f50 77 69 6e 67 20 74 6f 20 62 75 66 66 65 72 20 70  wing to buffer p
20f60 42 75 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  Buf:.**.**   * T
20f70 68 65 20 76 61 72 69 6e 74 20 69 44 65 6c 74 61  he varint iDelta
20f80 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65  , and.**   * the
20f90 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 74   position list t
20fa0 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  hat currently po
20fb0 69 6e 74 73 20 74 6f 2c 20 69 6e 63 6c 75 64 69  ints to, includi
20fc0 6e 67 20 74 68 65 20 73 69 7a 65 20 66 69 65 6c  ng the size fiel
20fd0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  d..**.** If argu
20fe0 6d 65 6e 74 20 70 43 6f 6c 73 65 74 20 69 73 20  ment pColset is 
20ff0 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 70  NULL, then the p
21000 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 73 20  osition list is 
21010 66 69 6c 74 65 72 65 64 20 61 63 63 6f 72 64 69  filtered accordi
21020 6e 67 0a 2a 2a 20 74 6f 20 70 43 6f 6c 73 65 74  ng.** to pColset
21030 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61 70   before being ap
21040 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75  pended to the bu
21050 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 6d 65  ffer. If this me
21060 61 6e 73 20 74 68 65 72 65 20 61 72 65 0a 2a 2a  ans there are.**
21070 20 6e 6f 20 65 6e 74 72 69 65 73 20 69 6e 20 74   no entries in t
21080 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
21090 2c 20 6e 6f 74 68 69 6e 67 20 69 73 20 61 70 70  , nothing is app
210a0 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66  ended to the buf
210b0 66 65 72 20 28 6e 6f 74 0a 2a 2a 20 65 76 65 6e  fer (not.** even
210c0 20 69 44 65 6c 74 61 29 2e 0a 2a 2a 0a 2a 2a 20   iDelta)..**.** 
210d0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
210e0 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
210f0 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e  e is left in p->
21100 72 63 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rc. .*/.static i
21110 6e 74 20 66 74 73 35 41 70 70 65 6e 64 50 6f 73  nt fts5AppendPos
21120 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65  list(.  Fts5Inde
21130 78 20 2a 70 2c 0a 20 20 69 36 34 20 69 44 65 6c  x *p,.  i64 iDel
21140 74 61 2c 0a 20 20 46 74 73 35 49 6e 64 65 78 49  ta,.  Fts5IndexI
21150 74 65 72 20 2a 70 4d 75 6c 74 69 2c 0a 20 20 46  ter *pMulti,.  F
21160 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
21170 65 74 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72  et,.  Fts5Buffer
21180 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 66 28 20   *pBuf.){.  if( 
21190 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
211a0 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49   ){.    Fts5SegI
211b0 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 4d 75  ter *pSeg = &pMu
211c0 6c 74 69 2d 3e 61 53 65 67 5b 20 70 4d 75 6c 74  lti->aSeg[ pMult
211d0 69 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  i->aFirst[1].iFi
211e0 72 73 74 20 5d 3b 0a 20 20 20 20 61 73 73 65 72  rst ];.    asser
211f0 74 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  t( fts5MultiIter
21200 45 6f 66 28 70 2c 20 70 4d 75 6c 74 69 29 3d 3d  Eof(p, pMulti)==
21210 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
21220 20 70 53 65 67 2d 3e 6e 50 6f 73 3e 30 20 29 3b   pSeg->nPos>0 );
21230 0a 20 20 20 20 69 66 28 20 30 3d 3d 66 74 73 35  .    if( 0==fts5
21240 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72  BufferGrow(&p->r
21250 63 2c 20 70 42 75 66 2c 20 70 53 65 67 2d 3e 6e  c, pBuf, pSeg->n
21260 50 6f 73 2b 39 2b 39 29 20 29 7b 0a 20 20 20 20  Pos+9+9) ){.    
21270 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67    if( p->pConfig
21280 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
21290 44 45 54 41 49 4c 5f 46 55 4c 4c 0a 20 20 20 20  DETAIL_FULL.    
212a0 20 20 20 26 26 20 70 53 65 67 2d 3e 69 4c 65 61     && pSeg->iLea
212b0 66 4f 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50  fOffset+pSeg->nP
212c0 6f 73 3c 3d 70 53 65 67 2d 3e 70 4c 65 61 66 2d  os<=pSeg->pLeaf-
212d0 3e 73 7a 4c 65 61 66 20 0a 20 20 20 20 20 20 20  >szLeaf .       
212e0 26 26 20 28 70 43 6f 6c 73 65 74 3d 3d 30 20 7c  && (pColset==0 |
212f0 7c 20 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d  | pColset->nCol=
21300 3d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  =1).      ){.   
21310 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70       const u8 *p
21320 50 6f 73 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65  Pos = &pSeg->pLe
21330 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61  af->p[pSeg->iLea
21340 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 20 20  fOffset];.      
21350 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20    int nPos;.    
21360 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74 20      if( pColset 
21370 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 50 6f  ){.          nPo
21380 73 20 3d 20 66 74 73 35 49 6e 64 65 78 45 78 74  s = fts5IndexExt
21390 72 61 63 74 43 6f 6c 28 26 70 50 6f 73 2c 20 70  ractCol(&pPos, p
213a0 53 65 67 2d 3e 6e 50 6f 73 2c 20 70 43 6f 6c 73  Seg->nPos, pCols
213b0 65 74 2d 3e 61 69 43 6f 6c 5b 30 5d 29 3b 0a 20  et->aiCol[0]);. 
213c0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 6f           if( nPo
213d0 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  s==0 ) return 1;
213e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
213f0 20 20 20 20 20 20 20 20 20 20 6e 50 6f 73 20 3d            nPos =
21400 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 20 20 20   pSeg->nPos;.   
21410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
21420 73 73 65 72 74 28 20 6e 50 6f 73 3e 30 20 29 3b  ssert( nPos>0 );
21430 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
21440 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
21450 69 6e 74 28 70 42 75 66 2c 20 69 44 65 6c 74 61  int(pBuf, iDelta
21460 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
21470 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
21480 61 72 69 6e 74 28 70 42 75 66 2c 20 6e 50 6f 73  arint(pBuf, nPos
21490 2a 32 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  *2);.        fts
214a0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
214b0 64 42 6c 6f 62 28 70 42 75 66 2c 20 70 50 6f 73  dBlob(pBuf, pPos
214c0 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20 7d  , nPos);.      }
214d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
214e0 74 20 69 53 76 31 3b 0a 20 20 20 20 20 20 20 20  t iSv1;.        
214f0 69 6e 74 20 69 53 76 32 3b 0a 20 20 20 20 20 20  int iSv2;.      
21500 20 20 69 6e 74 20 69 44 61 74 61 3b 0a 0a 20 20    int iData;..  
21510 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20        /* Append 
21520 69 44 65 6c 74 61 20 2a 2f 0a 20 20 20 20 20 20  iDelta */.      
21530 20 20 69 53 76 31 20 3d 20 70 42 75 66 2d 3e 6e    iSv1 = pBuf->n
21540 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
21550 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
21560 72 69 6e 74 28 70 42 75 66 2c 20 69 44 65 6c 74  rint(pBuf, iDelt
21570 61 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  a);..        /* 
21580 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45  WRITEPOSLISTSIZE
21590 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 53 76 32   */.        iSv2
215a0 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a 20 20 20 20   = pBuf->n;.    
215b0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
215c0 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70  feAppendVarint(p
215d0 42 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2a  Buf, pSeg->nPos*
215e0 32 29 3b 0a 20 20 20 20 20 20 20 20 69 44 61 74  2);.        iDat
215f0 61 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a 0a 20 20  a = pBuf->n;..  
21600 20 20 20 20 20 20 66 74 73 35 53 65 67 69 74 65        fts5Segite
21610 72 50 6f 73 6c 69 73 74 28 70 2c 20 70 53 65 67  rPoslist(p, pSeg
21620 2c 20 70 43 6f 6c 73 65 74 2c 20 70 42 75 66 29  , pColset, pBuf)
21630 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ;..        if( p
21640 43 6f 6c 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Colset ){.      
21650 20 20 20 20 69 6e 74 20 6e 41 63 74 75 61 6c 20      int nActual 
21660 3d 20 70 42 75 66 2d 3e 6e 20 2d 20 69 44 61 74  = pBuf->n - iDat
21670 61 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  a;.          if(
21680 20 6e 41 63 74 75 61 6c 21 3d 70 53 65 67 2d 3e   nActual!=pSeg->
21690 6e 50 6f 73 20 29 7b 0a 20 20 20 20 20 20 20 20  nPos ){.        
216a0 20 20 20 20 69 66 28 20 6e 41 63 74 75 61 6c 3d      if( nActual=
216b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
216c0 20 20 20 20 70 42 75 66 2d 3e 6e 20 3d 20 69 53      pBuf->n = iS
216d0 76 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v1;.            
216e0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
216f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
21700 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
21710 20 6e 52 65 71 20 3d 20 73 71 6c 69 74 65 33 46   nReq = sqlite3F
21720 74 73 35 47 65 74 56 61 72 69 6e 74 4c 65 6e 28  ts5GetVarintLen(
21730 28 75 33 32 29 28 6e 41 63 74 75 61 6c 2a 32 29  (u32)(nActual*2)
21740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
21750 20 77 68 69 6c 65 28 20 69 53 76 32 3c 28 69 44   while( iSv2<(iD
21760 61 74 61 2d 6e 52 65 71 29 20 29 7b 20 70 42 75  ata-nReq) ){ pBu
21770 66 2d 3e 70 5b 69 53 76 32 2b 2b 5d 20 3d 20 30  f->p[iSv2++] = 0
21780 78 38 30 3b 20 7d 0a 20 20 20 20 20 20 20 20 20  x80; }.         
21790 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
217a0 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d  PutVarint(&pBuf-
217b0 3e 70 5b 69 53 76 32 5d 2c 20 6e 41 63 74 75 61  >p[iSv2], nActua
217c0 6c 2a 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l*2);.          
217d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
217e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
217f0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
21800 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 73 74 61  eturn 0;.}...sta
21810 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63  tic void fts5Doc
21820 6c 69 73 74 49 74 65 72 4e 65 78 74 28 46 74 73  listIterNext(Fts
21830 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49  5DoclistIter *pI
21840 74 65 72 29 7b 0a 20 20 75 38 20 2a 70 20 3d 20  ter){.  u8 *p = 
21850 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20  pIter->aPoslist 
21860 2b 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 2b  + pIter->nSize +
21870 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74   pIter->nPoslist
21880 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ;..  assert( pIt
21890 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 29 3b 0a  er->aPoslist );.
218a0 20 20 69 66 28 20 70 3e 3d 70 49 74 65 72 2d 3e    if( p>=pIter->
218b0 61 45 6f 66 20 29 7b 0a 20 20 20 20 70 49 74 65  aEof ){.    pIte
218c0 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b  r->aPoslist = 0;
218d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36  .  }else{.    i6
218e0 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 70  4 iDelta;..    p
218f0 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
21900 74 28 70 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  t(p, (u64*)&iDel
21910 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ta);.    pIter->
21920 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61  iRowid += iDelta
21930 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 70  ;..    /* Read p
21940 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a  osition list siz
21950 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 5b 30  e */.    if( p[0
21960 5d 20 26 20 30 78 38 30 20 29 7b 0a 20 20 20 20  ] & 0x80 ){.    
21970 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20    int nPos;.    
21980 20 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d    pIter->nSize =
21990 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
219a0 28 70 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20  (p, nPos);.     
219b0 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74   pIter->nPoslist
219c0 20 3d 20 28 6e 50 6f 73 3e 3e 31 29 3b 0a 20 20   = (nPos>>1);.  
219d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
219e0 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d  Iter->nPoslist =
219f0 20 28 28 69 6e 74 29 28 70 5b 30 5d 29 29 20 3e   ((int)(p[0])) >
21a00 3e 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 72  > 1;.      pIter
21a10 2d 3e 6e 53 69 7a 65 20 3d 20 31 3b 0a 20 20 20  ->nSize = 1;.   
21a20 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 61   }..    pIter->a
21a30 50 6f 73 6c 69 73 74 20 3d 20 70 3b 0a 20 20 7d  Poslist = p;.  }
21a40 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
21a50 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49  fts5DoclistIterI
21a60 6e 69 74 28 0a 20 20 46 74 73 35 42 75 66 66 65  nit(.  Fts5Buffe
21a70 72 20 2a 70 42 75 66 2c 20 0a 20 20 46 74 73 35  r *pBuf, .  Fts5
21a80 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74  DoclistIter *pIt
21a90 65 72 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70  er.){.  memset(p
21aa0 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
21ab0 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65  *pIter));.  pIte
21ac0 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70 42  r->aPoslist = pB
21ad0 75 66 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e  uf->p;.  pIter->
21ae0 61 45 6f 66 20 3d 20 26 70 42 75 66 2d 3e 70 5b  aEof = &pBuf->p[
21af0 70 42 75 66 2d 3e 6e 5d 3b 0a 20 20 66 74 73 35  pBuf->n];.  fts5
21b00 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
21b10 70 49 74 65 72 29 3b 0a 7d 0a 0a 23 69 66 20 30  pIter);.}..#if 0
21b20 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
21b30 64 6f 63 6c 69 73 74 20 74 6f 20 62 75 66 66 65  doclist to buffe
21b40 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68  r pBuf..**.** Th
21b50 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
21b60 6d 65 73 20 74 68 61 74 20 73 70 61 63 65 20 77  mes that space w
21b70 69 74 68 69 6e 20 74 68 65 20 62 75 66 66 65 72  ithin the buffer
21b80 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
21b90 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  n.** allocated..
21ba0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
21bb0 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
21bc0 63 69 64 28 0a 20 20 46 74 73 35 42 75 66 66 65  cid(.  Fts5Buffe
21bd0 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  r *pBuf,        
21be0 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
21bf0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
21c00 20 20 69 36 34 20 2a 70 69 4c 61 73 74 52 6f 77    i64 *piLastRow
21c10 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
21c20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65    /* IN/OUT: Pre
21c30 76 69 6f 75 73 20 72 6f 77 69 64 20 77 72 69 74  vious rowid writ
21c40 74 65 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ten (if any) */.
21c50 20 20 69 36 34 20 69 52 6f 77 69 64 20 20 20 20    i64 iRowid    
21c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c70 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61 70    /* Rowid to ap
21c80 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  pend */.){.  ass
21c90 65 72 74 28 20 70 42 75 66 2d 3e 6e 21 3d 30 20  ert( pBuf->n!=0 
21ca0 7c 7c 20 28 2a 70 69 4c 61 73 74 52 6f 77 69 64  || (*piLastRowid
21cb0 29 3d 3d 30 20 29 3b 0a 20 20 66 74 73 35 42 75  )==0 );.  fts5Bu
21cc0 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
21cd0 72 69 6e 74 28 70 42 75 66 2c 20 69 52 6f 77 69  rint(pBuf, iRowi
21ce0 64 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77 69 64  d - *piLastRowid
21cf0 29 3b 0a 20 20 2a 70 69 4c 61 73 74 52 6f 77 69  );.  *piLastRowi
21d00 64 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 23 65  d = iRowid;.}.#e
21d10 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 66 74  ndif..#define ft
21d20 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
21d30 69 64 28 70 42 75 66 2c 20 69 4c 61 73 74 52 6f  id(pBuf, iLastRo
21d40 77 69 64 2c 20 69 52 6f 77 69 64 29 20 7b 20 20  wid, iRowid) {  
21d50 20 20 20 20 20 5c 0a 20 20 61 73 73 65 72 74 28       \.  assert(
21d60 20 28 70 42 75 66 29 2d 3e 6e 21 3d 30 20 7c 7c   (pBuf)->n!=0 ||
21d70 20 28 69 4c 61 73 74 52 6f 77 69 64 29 3d 3d 30   (iLastRowid)==0
21d80 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
21d90 20 20 20 20 20 20 5c 0a 20 20 66 74 73 35 42 75        \.  fts5Bu
21da0 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
21db0 72 69 6e 74 28 28 70 42 75 66 29 2c 20 28 69 52  rint((pBuf), (iR
21dc0 6f 77 69 64 29 20 2d 20 28 69 4c 61 73 74 52 6f  owid) - (iLastRo
21dd0 77 69 64 29 29 3b 20 5c 0a 20 20 28 69 4c 61 73  wid)); \.  (iLas
21de0 74 52 6f 77 69 64 29 20 3d 20 28 69 52 6f 77 69  tRowid) = (iRowi
21df0 64 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d);             
21e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e10 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a          \.}../*.
21e20 2a 2a 20 53 77 61 70 20 74 68 65 20 63 6f 6e 74  ** Swap the cont
21e30 65 6e 74 73 20 6f 66 20 62 75 66 66 65 72 20 2a  ents of buffer *
21e40 70 31 20 77 69 74 68 20 74 68 61 74 20 6f 66 20  p1 with that of 
21e50 2a 70 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  *p2..*/.static v
21e60 6f 69 64 20 66 74 73 35 42 75 66 66 65 72 53 77  oid fts5BufferSw
21e70 61 70 28 46 74 73 35 42 75 66 66 65 72 20 2a 70  ap(Fts5Buffer *p
21e80 31 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  1, Fts5Buffer *p
21e90 32 29 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72  2){.  Fts5Buffer
21ea0 20 74 6d 70 20 3d 20 2a 70 31 3b 0a 20 20 2a 70   tmp = *p1;.  *p
21eb0 31 20 3d 20 2a 70 32 3b 0a 20 20 2a 70 32 20 3d  1 = *p2;.  *p2 =
21ec0 20 74 6d 70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   tmp;.}..static 
21ed0 76 6f 69 64 20 66 74 73 35 4e 65 78 74 52 6f 77  void fts5NextRow
21ee0 69 64 28 46 74 73 35 42 75 66 66 65 72 20 2a 70  id(Fts5Buffer *p
21ef0 42 75 66 2c 20 69 6e 74 20 2a 70 69 4f 66 66 2c  Buf, int *piOff,
21f00 20 69 36 34 20 2a 70 69 52 6f 77 69 64 29 7b 0a   i64 *piRowid){.
21f10 20 20 69 6e 74 20 69 20 3d 20 2a 70 69 4f 66 66    int i = *piOff
21f20 3b 0a 20 20 69 66 28 20 69 3e 3d 70 42 75 66 2d  ;.  if( i>=pBuf-
21f30 3e 6e 20 29 7b 0a 20 20 20 20 2a 70 69 4f 66 66  >n ){.    *piOff
21f40 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
21f50 20 20 20 20 75 36 34 20 69 56 61 6c 3b 0a 20 20      u64 iVal;.  
21f60 20 20 2a 70 69 4f 66 66 20 3d 20 69 20 2b 20 73    *piOff = i + s
21f70 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
21f80 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69 5d 2c  int(&pBuf->p[i],
21f90 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 2a 70 69   &iVal);.    *pi
21fa0 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20  Rowid += iVal;. 
21fb0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
21fc0 20 69 73 20 74 68 65 20 65 71 75 69 76 61 6c 65   is the equivale
21fd0 6e 74 20 6f 66 20 66 74 73 35 4d 65 72 67 65 50  nt of fts5MergeP
21fe0 72 65 66 69 78 4c 69 73 74 73 28 29 20 66 6f 72  refixLists() for
21ff0 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 6d 6f 64   detail=none mod
22000 65 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63 61  e..** In this ca
22010 73 65 20 74 68 65 20 62 75 66 66 65 72 73 20 63  se the buffers c
22020 6f 6e 73 69 73 74 20 6f 66 20 61 20 64 65 6c 74  onsist of a delt
22030 61 2d 65 6e 63 6f 64 65 64 20 6c 69 73 74 20 6f  a-encoded list o
22040 66 20 72 6f 77 69 64 73 20 6f 6e 6c 79 2e 0a 2a  f rowids only..*
22050 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
22060 73 35 4d 65 72 67 65 52 6f 77 69 64 4c 69 73 74  s5MergeRowidList
22070 73 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  s(.  Fts5Index *
22080 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
22090 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
220a0 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
220b0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c   Fts5Buffer *p1,
220c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220d0 20 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20 74   /* First list t
220e0 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73  o merge */.  Fts
220f0 35 42 75 66 66 65 72 20 2a 70 32 20 20 20 20 20  5Buffer *p2     
22100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22110 53 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d  Second list to m
22120 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  erge */.){.  int
22130 20 69 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   i1 = 0;.  int i
22140 32 20 3d 20 30 3b 0a 20 20 69 36 34 20 69 52 6f  2 = 0;.  i64 iRo
22150 77 69 64 31 20 3d 20 30 3b 0a 20 20 69 36 34 20  wid1 = 0;.  i64 
22160 69 52 6f 77 69 64 32 20 3d 20 30 3b 0a 20 20 69  iRowid2 = 0;.  i
22170 36 34 20 69 4f 75 74 20 3d 20 30 3b 0a 0a 20 20  64 iOut = 0;..  
22180 46 74 73 35 42 75 66 66 65 72 20 6f 75 74 3b 0a  Fts5Buffer out;.
22190 20 20 6d 65 6d 73 65 74 28 26 6f 75 74 2c 20 30    memset(&out, 0
221a0 2c 20 73 69 7a 65 6f 66 28 6f 75 74 29 29 3b 0a  , sizeof(out));.
221b0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
221c0 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20  ferSize(&p->rc, 
221d0 26 6f 75 74 2c 20 70 31 2d 3e 6e 20 2b 20 70 32  &out, p1->n + p2
221e0 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  ->n);.  if( p->r
221f0 63 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 66  c ) return;..  f
22200 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70 31 2c  ts5NextRowid(p1,
22210 20 26 69 31 2c 20 26 69 52 6f 77 69 64 31 29 3b   &i1, &iRowid1);
22220 0a 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64  .  fts5NextRowid
22230 28 70 32 2c 20 26 69 32 2c 20 26 69 52 6f 77 69  (p2, &i2, &iRowi
22240 64 32 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 31  d2);.  while( i1
22250 3e 3d 30 20 7c 7c 20 69 32 3e 3d 30 20 29 7b 0a  >=0 || i2>=0 ){.
22260 20 20 20 20 69 66 28 20 69 31 3e 3d 30 20 26 26      if( i1>=0 &&
22270 20 28 69 32 3c 30 20 7c 7c 20 69 52 6f 77 69 64   (i2<0 || iRowid
22280 31 3c 69 52 6f 77 69 64 32 29 20 29 7b 0a 20 20  1<iRowid2) ){.  
22290 20 20 20 20 61 73 73 65 72 74 28 20 69 4f 75 74      assert( iOut
222a0 3d 3d 30 20 7c 7c 20 69 52 6f 77 69 64 31 3e 69  ==0 || iRowid1>i
222b0 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 66 74 73  Out );.      fts
222c0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
222d0 64 56 61 72 69 6e 74 28 26 6f 75 74 2c 20 69 52  dVarint(&out, iR
222e0 6f 77 69 64 31 20 2d 20 69 4f 75 74 29 3b 0a 20  owid1 - iOut);. 
222f0 20 20 20 20 20 69 4f 75 74 20 3d 20 69 52 6f 77       iOut = iRow
22300 69 64 31 3b 0a 20 20 20 20 20 20 66 74 73 35 4e  id1;.      fts5N
22310 65 78 74 52 6f 77 69 64 28 70 31 2c 20 26 69 31  extRowid(p1, &i1
22320 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a 20 20 20  , &iRowid1);.   
22330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
22340 73 65 72 74 28 20 69 4f 75 74 3d 3d 30 20 7c 7c  sert( iOut==0 ||
22350 20 69 52 6f 77 69 64 32 3e 69 4f 75 74 20 29 3b   iRowid2>iOut );
22360 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
22370 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
22380 74 28 26 6f 75 74 2c 20 69 52 6f 77 69 64 32 20  t(&out, iRowid2 
22390 2d 20 69 4f 75 74 29 3b 0a 20 20 20 20 20 20 69  - iOut);.      i
223a0 4f 75 74 20 3d 20 69 52 6f 77 69 64 32 3b 0a 20  Out = iRowid2;. 
223b0 20 20 20 20 20 69 66 28 20 69 31 3e 3d 30 20 26       if( i1>=0 &
223c0 26 20 69 52 6f 77 69 64 31 3d 3d 69 52 6f 77 69  & iRowid1==iRowi
223d0 64 32 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  d2 ){.        ft
223e0 73 35 4e 65 78 74 52 6f 77 69 64 28 70 31 2c 20  s5NextRowid(p1, 
223f0 26 69 31 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a  &i1, &iRowid1);.
22400 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
22410 73 35 4e 65 78 74 52 6f 77 69 64 28 70 32 2c 20  s5NextRowid(p2, 
22420 26 69 32 2c 20 26 69 52 6f 77 69 64 32 29 3b 0a  &i2, &iRowid2);.
22430 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73      }.  }..  fts
22440 35 42 75 66 66 65 72 53 77 61 70 28 26 6f 75 74  5BufferSwap(&out
22450 2c 20 70 31 29 3b 0a 20 20 66 74 73 35 42 75 66  , p1);.  fts5Buf
22460 66 65 72 46 72 65 65 28 26 6f 75 74 29 3b 0a 7d  ferFree(&out);.}
22470 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 73 20  ../*.** Buffers 
22480 70 31 20 61 6e 64 20 70 32 20 63 6f 6e 74 61 69  p1 and p2 contai
22490 6e 20 64 6f 63 6c 69 73 74 73 2e 20 54 68 69 73  n doclists. This
224a0 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65 73   function merges
224b0 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   the content.** 
224c0 6f 66 20 74 68 65 20 74 77 6f 20 64 6f 63 6c 69  of the two docli
224d0 73 74 73 20 74 6f 67 65 74 68 65 72 20 61 6e 64  sts together and
224e0 20 73 65 74 73 20 62 75 66 66 65 72 20 70 31 20   sets buffer p1 
224f0 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 62 65  to the result be
22500 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e  fore.** returnin
22510 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  g..**.** If an e
22520 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
22530 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65  error code is le
22540 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 66 20  ft in p->rc. If 
22550 61 6e 20 65 72 72 6f 72 20 68 61 73 0a 2a 2a 20  an error has.** 
22560 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
22570 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
22580 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
22590 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
225a0 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 28  ergePrefixLists(
225b0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
225c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225d0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
225e0 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
225f0 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20 20  ts5Buffer *p1,  
22600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22610 2a 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f 20  * First list to 
22620 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35 42  merge */.  Fts5B
22630 75 66 66 65 72 20 2a 70 32 20 20 20 20 20 20 20  uffer *p2       
22640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
22650 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65 72  cond list to mer
22660 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  ge */.){.  if( p
22670 32 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34 20  2->n ){.    i64 
22680 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a  iLastRowid = 0;.
22690 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49      Fts5DoclistI
226a0 74 65 72 20 69 31 3b 0a 20 20 20 20 46 74 73 35  ter i1;.    Fts5
226b0 44 6f 63 6c 69 73 74 49 74 65 72 20 69 32 3b 0a  DoclistIter i2;.
226c0 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 6f      Fts5Buffer o
226d0 75 74 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66  ut;.    Fts5Buff
226e0 65 72 20 74 6d 70 3b 0a 20 20 20 20 6d 65 6d 73  er tmp;.    mems
226f0 65 74 28 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65  et(&out, 0, size
22700 6f 66 28 6f 75 74 29 29 3b 0a 20 20 20 20 6d 65  of(out));.    me
22710 6d 73 65 74 28 26 74 6d 70 2c 20 30 2c 20 73 69  mset(&tmp, 0, si
22720 7a 65 6f 66 28 74 6d 70 29 29 3b 0a 0a 20 20 20  zeof(tmp));..   
22730 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
22740 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26  erSize(&p->rc, &
22750 6f 75 74 2c 20 70 31 2d 3e 6e 20 2b 20 70 32 2d  out, p1->n + p2-
22760 3e 6e 29 3b 0a 20 20 20 20 66 74 73 35 44 6f 63  >n);.    fts5Doc
22770 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70 31 2c  listIterInit(p1,
22780 20 26 69 31 29 3b 0a 20 20 20 20 66 74 73 35 44   &i1);.    fts5D
22790 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70  oclistIterInit(p
227a0 32 2c 20 26 69 32 29 3b 0a 20 20 20 20 77 68 69  2, &i2);.    whi
227b0 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
227c0 45 5f 4f 4b 20 26 26 20 28 69 31 2e 61 50 6f 73  E_OK && (i1.aPos
227d0 6c 69 73 74 21 3d 30 20 7c 7c 20 69 32 2e 61 50  list!=0 || i2.aP
227e0 6f 73 6c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20  oslist!=0) ){.  
227f0 20 20 20 20 69 66 28 20 69 32 2e 61 50 6f 73 6c      if( i2.aPosl
22800 69 73 74 3d 3d 30 20 7c 7c 20 28 69 31 2e 61 50  ist==0 || (i1.aP
22810 6f 73 6c 69 73 74 20 26 26 20 69 31 2e 69 52 6f  oslist && i1.iRo
22820 77 69 64 3c 69 32 2e 69 52 6f 77 69 64 29 20 29  wid<i2.iRowid) )
22830 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  {.        /* Cop
22840 79 20 65 6e 74 72 79 20 66 72 6f 6d 20 69 31 20  y entry from i1 
22850 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  */.        fts5M
22860 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28  ergeAppendDocid(
22870 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64  &out, iLastRowid
22880 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20 20  , i1.iRowid);.  
22890 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
228a0 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26  SafeAppendBlob(&
228b0 6f 75 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74  out, i1.aPoslist
228c0 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2b 69 31  , i1.nPoslist+i1
228d0 2e 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  .nSize);.       
228e0 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
228f0 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20 20  Next(&i1);.     
22900 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66   }.      else if
22910 28 20 69 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30  ( i1.aPoslist==0
22920 20 7c 7c 20 69 32 2e 69 52 6f 77 69 64 21 3d 69   || i2.iRowid!=i
22930 31 2e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  1.iRowid ){.    
22940 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72      /* Copy entr
22950 79 20 66 72 6f 6d 20 69 32 20 2a 2f 0a 20 20 20  y from i2 */.   
22960 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70       fts5MergeAp
22970 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20  pendDocid(&out, 
22980 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69  iLastRowid, i2.i
22990 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
229a0 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
229b0 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69  pendBlob(&out, i
229c0 32 2e 61 50 6f 73 6c 69 73 74 2c 20 69 32 2e 6e  2.aPoslist, i2.n
229d0 50 6f 73 6c 69 73 74 2b 69 32 2e 6e 53 69 7a 65  Poslist+i2.nSize
229e0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
229f0 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26  oclistIterNext(&
22a00 69 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i2);.      }.   
22a10 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20     else{.       
22a20 20 69 36 34 20 69 50 6f 73 31 20 3d 20 30 3b 0a   i64 iPos1 = 0;.
22a30 20 20 20 20 20 20 20 20 69 36 34 20 69 50 6f 73          i64 iPos
22a40 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  2 = 0;.        i
22a50 6e 74 20 69 4f 66 66 31 20 3d 20 30 3b 0a 20 20  nt iOff1 = 0;.  
22a60 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 32 20        int iOff2 
22a70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20  = 0;.        u8 
22a80 2a 61 31 20 3d 20 26 69 31 2e 61 50 6f 73 6c 69  *a1 = &i1.aPosli
22a90 73 74 5b 69 31 2e 6e 53 69 7a 65 5d 3b 0a 20 20  st[i1.nSize];.  
22aa0 20 20 20 20 20 20 75 38 20 2a 61 32 20 3d 20 26        u8 *a2 = &
22ab0 69 32 2e 61 50 6f 73 6c 69 73 74 5b 69 32 2e 6e  i2.aPoslist[i2.n
22ac0 53 69 7a 65 5d 3b 0a 0a 20 20 20 20 20 20 20 20  Size];..        
22ad0 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65  Fts5PoslistWrite
22ae0 72 20 77 72 69 74 65 72 3b 0a 20 20 20 20 20 20  r writer;.      
22af0 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65 72    memset(&writer
22b00 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 72 69 74  , 0, sizeof(writ
22b10 65 72 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  er));..        /
22b20 2a 20 4d 65 72 67 65 20 74 68 65 20 74 77 6f 20  * Merge the two 
22b30 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 2e 20  position lists. 
22b40 2a 2f 20 0a 20 20 20 20 20 20 20 20 66 74 73 35  */ .        fts5
22b50 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64  MergeAppendDocid
22b60 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69  (&out, iLastRowi
22b70 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20  d, i2.iRowid);. 
22b80 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
22b90 72 5a 65 72 6f 28 26 74 6d 70 29 3b 0a 0a 20 20  rZero(&tmp);..  
22ba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
22bb0 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61  5PoslistNext64(a
22bc0 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20  1, i1.nPoslist, 
22bd0 26 69 4f 66 66 31 2c 20 26 69 50 6f 73 31 29 3b  &iOff1, &iPos1);
22be0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22bf0 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
22c00 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73  4(a2, i2.nPoslis
22c10 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73  t, &iOff2, &iPos
22c20 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 77 68 69  2);..        whi
22c30 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
22c40 45 5f 4f 4b 20 26 26 20 28 69 50 6f 73 31 3e 3d  E_OK && (iPos1>=
22c50 30 20 7c 7c 20 69 50 6f 73 32 3e 3d 30 29 20 29  0 || iPos2>=0) )
22c60 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 20  {.          i64 
22c70 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
22c80 69 66 28 20 69 50 6f 73 32 3c 30 20 7c 7c 20 28  if( iPos2<0 || (
22c90 69 50 6f 73 31 3e 3d 30 20 26 26 20 69 50 6f 73  iPos1>=0 && iPos
22ca0 31 3c 69 50 6f 73 32 29 20 29 7b 0a 20 20 20 20  1<iPos2) ){.    
22cb0 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 69          iNew = i
22cc0 50 6f 73 31 3b 0a 20 20 20 20 20 20 20 20 20 20  Pos1;.          
22cd0 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
22ce0 6c 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69  listNext64(a1, i
22cf0 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66  1.nPoslist, &iOf
22d00 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20  f1, &iPos1);.   
22d10 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
22d20 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d            iNew =
22d30 20 69 50 6f 73 32 3b 0a 20 20 20 20 20 20 20 20   iPos2;.        
22d40 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
22d50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61 32 2c  oslistNext64(a2,
22d60 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69   i2.nPoslist, &i
22d70 4f 66 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20  Off2, &iPos2);. 
22d80 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
22d90 50 6f 73 31 3d 3d 69 50 6f 73 32 20 29 7b 0a 20  Pos1==iPos2 ){. 
22da0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
22db0 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e  ite3Fts5PoslistN
22dc0 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f  ext64(a1, i1.nPo
22dd0 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 26 69  slist, &iOff1,&i
22de0 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20  Pos1);.         
22df0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
22e00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
22e10 4e 65 77 21 3d 77 72 69 74 65 72 2e 69 50 72 65  New!=writer.iPre
22e20 76 20 7c 7c 20 74 6d 70 2e 6e 3d 3d 30 20 29 7b  v || tmp.n==0 ){
22e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
22e40 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
22e50 50 6f 73 6c 69 73 74 57 72 69 74 65 72 41 70 70  PoslistWriterApp
22e60 65 6e 64 28 26 74 6d 70 2c 20 26 77 72 69 74 65  end(&tmp, &write
22e70 72 2c 20 69 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, iNew);.      
22e80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
22e90 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49 54  .        /* WRIT
22ea0 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a  EPOSLISTSIZE */.
22eb0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
22ec0 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
22ed0 6e 74 28 26 6f 75 74 2c 20 74 6d 70 2e 6e 20 2a  nt(&out, tmp.n *
22ee0 20 32 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73   2);.        fts
22ef0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
22f00 64 42 6c 6f 62 28 26 6f 75 74 2c 20 74 6d 70 2e  dBlob(&out, tmp.
22f10 70 2c 20 74 6d 70 2e 6e 29 3b 0a 20 20 20 20 20  p, tmp.n);.     
22f20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
22f30 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20  erNext(&i1);.   
22f40 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74       fts5Doclist
22f50 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20  IterNext(&i2);. 
22f60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
22f70 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
22f80 26 70 2d 3e 72 63 2c 20 70 31 2c 20 6f 75 74 2e  &p->rc, p1, out.
22f90 6e 2c 20 6f 75 74 2e 70 29 3b 0a 20 20 20 20 66  n, out.p);.    f
22fa0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74  ts5BufferFree(&t
22fb0 6d 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  mp);.    fts5Buf
22fc0 66 65 72 46 72 65 65 28 26 6f 75 74 29 3b 0a 20  ferFree(&out);. 
22fd0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
22fe0 64 20 66 74 73 35 53 65 74 75 70 50 72 65 66 69  d fts5SetupPrefi
22ff0 78 49 74 65 72 28 0a 20 20 46 74 73 35 49 6e 64  xIter(.  Fts5Ind
23000 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
23010 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
23020 78 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  x to read from *
23030 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 20 20  /.  int bDesc,  
23040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23050 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
23060 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20  "ORDER BY rowid 
23070 44 45 53 43 22 20 2a 2f 0a 20 20 63 6f 6e 73 74  DESC" */.  const
23080 20 75 38 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20   u8 *pToken,    
23090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
230a0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
230b0 70 72 65 66 69 78 20 74 6f 20 6d 61 74 63 68 20  prefix to match 
230c0 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c  */.  int nToken,
230d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230e0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
230f0 62 75 66 66 65 72 20 70 54 6f 6b 65 6e 20 69 6e  buffer pToken in
23100 20 62 79 74 65 73 20 2a 2f 0a 20 20 46 74 73 35   bytes */.  Fts5
23110 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c  Colset *pColset,
23120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
23130 65 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20  estrict matches 
23140 74 6f 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73  to these columns
23150 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49   */.  Fts5IndexI
23160 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20  ter **ppIter    
23170 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
23180 77 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 29 7b  w iterator */.){
23190 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
231a0 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73   *pStruct;.  Fts
231b0 35 42 75 66 66 65 72 20 2a 61 42 75 66 3b 0a 20  5Buffer *aBuf;. 
231c0 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66 20   const int nBuf 
231d0 3d 20 33 32 3b 0a 0a 20 20 76 6f 69 64 20 28 2a  = 32;..  void (*
231e0 78 4d 65 72 67 65 29 28 46 74 73 35 49 6e 64 65  xMerge)(Fts5Inde
231f0 78 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c  x*, Fts5Buffer*,
23200 20 46 74 73 35 42 75 66 66 65 72 2a 29 3b 0a 20   Fts5Buffer*);. 
23210 20 69 6e 74 20 28 2a 78 41 70 70 65 6e 64 29 28   int (*xAppend)(
23220 46 74 73 35 49 6e 64 65 78 2a 2c 20 69 36 34 2c  Fts5Index*, i64,
23230 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a 2c   Fts5IndexIter*,
23240 20 46 74 73 35 43 6f 6c 73 65 74 2a 2c 20 46 74   Fts5Colset*, Ft
23250 73 35 42 75 66 66 65 72 2a 29 3b 0a 20 20 69 66  s5Buffer*);.  if
23260 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  ( p->pConfig->eD
23270 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
23280 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 78  IL_NONE ){.    x
23290 4d 65 72 67 65 20 3d 20 66 74 73 35 4d 65 72 67  Merge = fts5Merg
232a0 65 52 6f 77 69 64 4c 69 73 74 73 3b 0a 20 20 20  eRowidLists;.   
232b0 20 78 41 70 70 65 6e 64 20 3d 20 66 74 73 35 41   xAppend = fts5A
232c0 70 70 65 6e 64 52 6f 77 69 64 3b 0a 20 20 7d 65  ppendRowid;.  }e
232d0 6c 73 65 7b 0a 20 20 20 20 78 4d 65 72 67 65 20  lse{.    xMerge 
232e0 3d 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69  = fts5MergePrefi
232f0 78 4c 69 73 74 73 3b 0a 20 20 20 20 78 41 70 70  xLists;.    xApp
23300 65 6e 64 20 3d 20 66 74 73 35 41 70 70 65 6e 64  end = fts5Append
23310 50 6f 73 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20  Poslist;.  }..  
23320 61 42 75 66 20 3d 20 28 46 74 73 35 42 75 66 66  aBuf = (Fts5Buff
23330 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f  er*)fts5IdxMallo
23340 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  c(p, sizeof(Fts5
23350 42 75 66 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20  Buffer)*nBuf);. 
23360 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53   pStruct = fts5S
23370 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
23380 0a 0a 20 20 69 66 28 20 61 42 75 66 20 26 26 20  ..  if( aBuf && 
23390 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 63  pStruct ){.    c
233a0 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
233b0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
233c0 5f 53 43 41 4e 3b 0a 20 20 20 20 69 6e 74 20 69  _SCAN;.    int i
233d0 3b 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 52  ;.    i64 iLastR
233e0 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74  owid = 0;.    Ft
233f0 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 31 20  s5IndexIter *p1 
23400 3d 20 30 3b 20 20 20 20 20 2f 2a 20 49 74 65 72  = 0;     /* Iter
23410 61 74 6f 72 20 75 73 65 64 20 74 6f 20 67 61 74  ator used to gat
23420 68 65 72 20 64 61 74 61 20 66 72 6f 6d 20 69 6e  her data from in
23430 64 65 78 20 2a 2f 0a 20 20 20 20 46 74 73 35 44  dex */.    Fts5D
23440 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  ata *pData;.    
23450 46 74 73 35 42 75 66 66 65 72 20 64 6f 63 6c 69  Fts5Buffer docli
23460 73 74 3b 0a 20 20 20 20 69 6e 74 20 62 4e 65 77  st;.    int bNew
23470 54 65 72 6d 20 3d 20 31 3b 0a 0a 20 20 20 20 6d  Term = 1;..    m
23480 65 6d 73 65 74 28 26 64 6f 63 6c 69 73 74 2c 20  emset(&doclist, 
23490 30 2c 20 73 69 7a 65 6f 66 28 64 6f 63 6c 69 73  0, sizeof(doclis
234a0 74 29 29 3b 0a 20 20 20 20 66 6f 72 28 66 74 73  t));.    for(fts
234b0 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c  5MultiIterNew(p,
234c0 20 70 53 74 72 75 63 74 2c 20 31 2c 20 66 6c 61   pStruct, 1, fla
234d0 67 73 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  gs, pToken, nTok
234e0 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b  en, -1, 0, &p1);
234f0 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c  .        fts5Mul
23500 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 31 29  tiIterEof(p, p1)
23510 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ==0;.        fts
23520 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 32 28  5MultiIterNext2(
23530 70 2c 20 70 31 2c 20 26 62 4e 65 77 54 65 72 6d  p, p1, &bNewTerm
23540 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  ).    ){.      i
23550 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35  64 iRowid = fts5
23560 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70  MultiIterRowid(p
23570 31 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  1);.      int nT
23580 65 72 6d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  erm;.      const
23590 20 75 38 20 2a 70 54 65 72 6d 20 3d 20 66 74 73   u8 *pTerm = fts
235a0 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70  5MultiIterTerm(p
235b0 31 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20  1, &nTerm);.    
235c0 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6d 65 6d    assert_nc( mem
235d0 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72  cmp(pToken, pTer
235e0 6d 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e  m, MIN(nToken, n
235f0 54 65 72 6d 29 29 3c 3d 30 20 29 3b 0a 20 20 20  Term))<=0 );.   
23600 20 20 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20     if( bNewTerm 
23610 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
23620 54 65 72 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d  Term<nToken || m
23630 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54  emcmp(pToken, pT
23640 65 72 6d 2c 20 6e 54 6f 6b 65 6e 29 20 29 20 62  erm, nToken) ) b
23650 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
23660 20 20 20 20 20 69 66 28 20 64 6f 63 6c 69 73 74       if( doclist
23670 2e 6e 3e 30 20 26 26 20 69 52 6f 77 69 64 3c 3d  .n>0 && iRowid<=
23680 69 4c 61 73 74 52 6f 77 69 64 20 29 7b 0a 20 20  iLastRowid ){.  
23690 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70        for(i=0; p
236a0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
236b0 26 26 20 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b  && doclist.n; i+
236c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  +){.          as
236d0 73 65 72 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a  sert( i<nBuf );.
236e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 42            if( aB
236f0 75 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20  uf[i].n==0 ){.  
23700 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
23710 66 66 65 72 53 77 61 70 28 26 64 6f 63 6c 69 73  fferSwap(&doclis
23720 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20  t, &aBuf[i]);.  
23730 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
23740 66 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73  fferZero(&doclis
23750 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  t);.          }e
23760 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
23770 20 78 4d 65 72 67 65 28 70 2c 20 26 64 6f 63 6c   xMerge(p, &docl
23780 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a  ist, &aBuf[i]);.
23790 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
237a0 42 75 66 66 65 72 5a 65 72 6f 28 26 61 42 75 66  BufferZero(&aBuf
237b0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
237c0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
237d0 20 20 20 20 69 4c 61 73 74 52 6f 77 69 64 20 3d      iLastRowid =
237e0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   0;.      }..   
237f0 20 20 20 69 66 28 20 21 78 41 70 70 65 6e 64 28     if( !xAppend(
23800 70 2c 20 69 52 6f 77 69 64 2d 69 4c 61 73 74 52  p, iRowid-iLastR
23810 6f 77 69 64 2c 20 70 31 2c 20 70 43 6f 6c 73 65  owid, p1, pColse
23820 74 2c 20 26 64 6f 63 6c 69 73 74 29 20 29 7b 0a  t, &doclist) ){.
23830 20 20 20 20 20 20 20 20 69 4c 61 73 74 52 6f 77          iLastRow
23840 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20  id = iRowid;.   
23850 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
23860 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 75 66 3b  for(i=0; i<nBuf;
23870 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
23880 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
23890 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 78 4d 65  K ){.        xMe
238a0 72 67 65 28 70 2c 20 26 64 6f 63 6c 69 73 74 2c  rge(p, &doclist,
238b0 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20   &aBuf[i]);.    
238c0 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 42 75    }.      fts5Bu
238d0 66 66 65 72 46 72 65 65 28 26 61 42 75 66 5b 69  fferFree(&aBuf[i
238e0 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  ]);.    }.    ft
238f0 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
23900 70 2c 20 70 31 29 3b 0a 0a 20 20 20 20 70 44 61  p, p1);..    pDa
23910 74 61 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c  ta = fts5IdxMall
23920 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73  oc(p, sizeof(Fts
23930 35 44 61 74 61 29 20 2b 20 64 6f 63 6c 69 73 74  5Data) + doclist
23940 2e 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 44 61  .n);.    if( pDa
23950 74 61 20 29 7b 0a 20 20 20 20 20 20 70 44 61 74  ta ){.      pDat
23960 61 2d 3e 70 20 3d 20 28 75 38 2a 29 26 70 44 61  a->p = (u8*)&pDa
23970 74 61 5b 31 5d 3b 0a 20 20 20 20 20 20 70 44 61  ta[1];.      pDa
23980 74 61 2d 3e 6e 6e 20 3d 20 70 44 61 74 61 2d 3e  ta->nn = pData->
23990 73 7a 4c 65 61 66 20 3d 20 64 6f 63 6c 69 73 74  szLeaf = doclist
239a0 2e 6e 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  .n;.      memcpy
239b0 28 70 44 61 74 61 2d 3e 70 2c 20 64 6f 63 6c 69  (pData->p, docli
239c0 73 74 2e 70 2c 20 64 6f 63 6c 69 73 74 2e 6e 29  st.p, doclist.n)
239d0 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  ;.      fts5Mult
239e0 69 49 74 65 72 4e 65 77 32 28 70 2c 20 70 44 61  iIterNew2(p, pDa
239f0 74 61 2c 20 62 44 65 73 63 2c 20 70 70 49 74 65  ta, bDesc, ppIte
23a00 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  r);.    }.    ft
23a10 73 35 42 75 66 66 65 72 46 72 65 65 28 26 64 6f  s5BufferFree(&do
23a20 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 66  clist);.  }..  f
23a30 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
23a40 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
23a50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 42 75  sqlite3_free(aBu
23a60 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e  f);.}.../*.** In
23a70 64 69 63 61 74 65 20 74 68 61 74 20 61 6c 6c 20  dicate that all 
23a80 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
23a90 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49   to sqlite3Fts5I
23aa0 6e 64 65 78 57 72 69 74 65 28 29 20 70 65 72 74  ndexWrite() pert
23ab0 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 6f  ain.** to the do
23ac0 63 75 6d 65 6e 74 20 77 69 74 68 20 72 6f 77 69  cument with rowi
23ad0 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74  d iRowid..*/.int
23ae0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
23af0 78 42 65 67 69 6e 57 72 69 74 65 28 46 74 73 35  xBeginWrite(Fts5
23b00 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62 44  Index *p, int bD
23b10 65 6c 65 74 65 2c 20 69 36 34 20 69 52 6f 77 69  elete, i64 iRowi
23b20 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  d){.  assert( p-
23b30 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
23b40 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
23b50 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
23b60 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c  if it has not al
23b70 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
23b80 61 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ated */.  if( p-
23b90 3e 70 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20  >pHash==0 ){.   
23ba0 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
23bb0 46 74 73 35 48 61 73 68 4e 65 77 28 70 2d 3e 70  Fts5HashNew(p->p
23bc0 43 6f 6e 66 69 67 2c 20 26 70 2d 3e 70 48 61 73  Config, &p->pHas
23bd0 68 2c 20 26 70 2d 3e 6e 50 65 6e 64 69 6e 67 44  h, &p->nPendingD
23be0 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ata);.  }..  /* 
23bf0 46 6c 75 73 68 20 74 68 65 20 68 61 73 68 20 74  Flush the hash t
23c00 61 62 6c 65 20 74 6f 20 64 69 73 6b 20 69 66 20  able to disk if 
23c10 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 66  required */.  if
23c20 28 20 69 52 6f 77 69 64 3c 70 2d 3e 69 57 72 69  ( iRowid<p->iWri
23c30 74 65 52 6f 77 69 64 20 0a 20 20 20 7c 7c 20 28  teRowid .   || (
23c40 69 52 6f 77 69 64 3d 3d 70 2d 3e 69 57 72 69 74  iRowid==p->iWrit
23c50 65 52 6f 77 69 64 20 26 26 20 70 2d 3e 62 44 65  eRowid && p->bDe
23c60 6c 65 74 65 3d 3d 30 29 0a 20 20 20 7c 7c 20 28  lete==0).   || (
23c70 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
23c80 3e 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 48  > p->pConfig->nH
23c90 61 73 68 53 69 7a 65 29 20 0a 20 20 29 7b 0a 20  ashSize) .  ){. 
23ca0 20 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73     fts5IndexFlus
23cb0 68 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e  h(p);.  }..  p->
23cc0 69 57 72 69 74 65 52 6f 77 69 64 20 3d 20 69 52  iWriteRowid = iR
23cd0 6f 77 69 64 3b 0a 20 20 70 2d 3e 62 44 65 6c 65  owid;.  p->bDele
23ce0 74 65 20 3d 20 62 44 65 6c 65 74 65 3b 0a 20 20  te = bDelete;.  
23cf0 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
23d00 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
23d10 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61 74 61 20  .** Commit data 
23d20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  to disk..*/.int 
23d30 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
23d40 53 79 6e 63 28 46 74 73 35 49 6e 64 65 78 20 2a  Sync(Fts5Index *
23d50 70 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  p, int bCommit){
23d60 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
23d70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
23d80 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28   fts5IndexFlush(
23d90 70 29 3b 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69  p);.  if( bCommi
23da0 74 20 29 20 66 74 73 35 43 6c 6f 73 65 52 65 61  t ) fts5CloseRea
23db0 64 65 72 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  der(p);.  return
23dc0 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
23dd0 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  (p);.}../*.** Di
23de0 73 63 61 72 64 20 61 6e 79 20 64 61 74 61 20 73  scard any data s
23df0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d  tored in the in-
23e00 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
23e10 65 73 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  es. Do not write
23e20 20 69 74 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61   it.** to the da
23e30 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e  tabase. Addition
23e40 61 6c 6c 79 2c 20 61 73 73 75 6d 65 20 74 68 61  ally, assume tha
23e50 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
23e60 66 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20  f the %_data.** 
23e70 74 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 63  table may have c
23e80 68 61 6e 67 65 64 20 6f 6e 20 64 69 73 6b 2e 20  hanged on disk. 
23e90 53 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d 6f 72 79  So any in-memory
23ea0 20 63 61 63 68 65 73 20 6f 66 20 25 5f 64 61 74   caches of %_dat
23eb0 61 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20 6d 75  a .** records mu
23ec0 73 74 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  st be invalidate
23ed0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
23ee0 33 46 74 73 35 49 6e 64 65 78 52 6f 6c 6c 62 61  3Fts5IndexRollba
23ef0 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ck(Fts5Index *p)
23f00 7b 0a 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61  {.  fts5CloseRea
23f10 64 65 72 28 70 29 3b 0a 20 20 66 74 73 35 49 6e  der(p);.  fts5In
23f20 64 65 78 44 69 73 63 61 72 64 44 61 74 61 28 70  dexDiscardData(p
23f30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
23f40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
23f50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
23f60 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
23f70 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 69  e %_data table i
23f80 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  s completely emp
23f90 74 79 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ty when this fun
23fa0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
23fb0 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
23fc0 6e 20 70 6f 70 75 6c 61 74 65 73 20 69 74 20 77  n populates it w
23fd0 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ith the initial 
23fe0 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  structure object
23ff0 73 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78  s for each index
24000 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 69  ,.** and the ini
24010 74 69 61 6c 20 76 65 72 73 69 6f 6e 20 6f 66 20  tial version of 
24020 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72  the "averages" r
24030 65 63 6f 72 64 20 28 61 20 7a 65 72 6f 2d 62 79  ecord (a zero-by
24040 74 65 20 62 6c 6f 62 29 2e 0a 2a 2f 0a 69 6e 74  te blob)..*/.int
24050 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
24060 78 52 65 69 6e 69 74 28 46 74 73 35 49 6e 64 65  xReinit(Fts5Inde
24070 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72  x *p){.  Fts5Str
24080 75 63 74 75 72 65 20 73 3b 0a 20 20 6d 65 6d 73  ucture s;.  mems
24090 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&s, 0, sizeof
240a0 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29 29  (Fts5Structure))
240b0 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72 69 74  ;.  fts5DataWrit
240c0 65 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47  e(p, FTS5_AVERAG
240d0 45 53 5f 52 4f 57 49 44 2c 20 28 63 6f 6e 73 74  ES_ROWID, (const
240e0 20 75 38 2a 29 22 22 2c 20 30 29 3b 0a 20 20 66   u8*)"", 0);.  f
240f0 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74  ts5StructureWrit
24100 65 28 70 2c 20 26 73 29 3b 0a 20 20 72 65 74 75  e(p, &s);.  retu
24110 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
24120 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn(p);.}../*.** 
24130 4f 70 65 6e 20 61 20 6e 65 77 20 46 74 73 35 49  Open a new Fts5I
24140 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20 49 66 20  ndex handle. If 
24150 74 68 65 20 62 43 72 65 61 74 65 20 61 72 67 75  the bCreate argu
24160 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 63 72  ment is true, cr
24170 65 61 74 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  eate.** and init
24180 69 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72  ialize the under
24190 6c 79 69 6e 67 20 25 5f 64 61 74 61 20 74 61 62  lying %_data tab
241a0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  le..**.** If suc
241b0 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70  cessful, set *pp
241c0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
241d0 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 20   new object and 
241e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
241f0 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
24200 73 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 20  set *pp to NULL 
24210 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51  and return an SQ
24220 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
24230 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
24240 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 0a 20 20  ts5IndexOpen(.  
24250 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
24260 66 69 67 2c 20 0a 20 20 69 6e 74 20 62 43 72 65  fig, .  int bCre
24270 61 74 65 2c 20 0a 20 20 46 74 73 35 49 6e 64 65  ate, .  Fts5Inde
24280 78 20 2a 2a 70 70 2c 0a 20 20 63 68 61 72 20 2a  x **pp,.  char *
24290 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20  *pzErr.){.  int 
242a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
242b0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 3b 20    Fts5Index *p; 
242c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242d0 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20    /* New object 
242e0 2a 2f 0a 0a 20 20 2a 70 70 20 3d 20 70 20 3d 20  */..  *pp = p = 
242f0 28 46 74 73 35 49 6e 64 65 78 2a 29 73 71 6c 69  (Fts5Index*)sqli
24300 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
24310 6f 28 26 72 63 2c 20 73 69 7a 65 6f 66 28 46 74  o(&rc, sizeof(Ft
24320 73 35 49 6e 64 65 78 29 29 3b 0a 20 20 69 66 28  s5Index));.  if(
24330 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24340 7b 0a 20 20 20 20 70 2d 3e 70 43 6f 6e 66 69 67  {.    p->pConfig
24350 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20   = pConfig;.    
24360 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 3d 20 46  p->nWorkUnit = F
24370 54 53 35 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20  TS5_WORK_UNIT;. 
24380 20 20 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 3d     p->zDataTbl =
24390 20 73 71 6c 69 74 65 33 46 74 73 35 4d 70 72 69   sqlite3Fts5Mpri
243a0 6e 74 66 28 26 72 63 2c 20 22 25 73 5f 64 61 74  ntf(&rc, "%s_dat
243b0 61 22 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61  a", pConfig->zNa
243c0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  me);.    if( p->
243d0 7a 44 61 74 61 54 62 6c 20 26 26 20 62 43 72 65  zDataTbl && bCre
243e0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ate ){.      rc 
243f0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43 72 65  = sqlite3Fts5Cre
24400 61 74 65 54 61 62 6c 65 28 0a 20 20 20 20 20 20  ateTable(.      
24410 20 20 20 20 70 43 6f 6e 66 69 67 2c 20 22 64 61      pConfig, "da
24420 74 61 22 2c 20 22 69 64 20 49 4e 54 45 47 45 52  ta", "id INTEGER
24430 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c   PRIMARY KEY, bl
24440 6f 63 6b 20 42 4c 4f 42 22 2c 20 30 2c 20 70 7a  ock BLOB", 0, pz
24450 45 72 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Err.      );.   
24460 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
24470 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
24480 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
24490 43 72 65 61 74 65 54 61 62 6c 65 28 70 43 6f 6e  CreateTable(pCon
244a0 66 69 67 2c 20 22 69 64 78 22 2c 20 0a 20 20 20  fig, "idx", .   
244b0 20 20 20 20 20 20 20 20 20 22 73 65 67 69 64 2c           "segid,
244c0 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49   term, pgno, PRI
244d0 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20  MARY KEY(segid, 
244e0 74 65 72 6d 29 22 2c 20 0a 20 20 20 20 20 20 20  term)", .       
244f0 20 20 20 20 20 31 2c 20 70 7a 45 72 72 0a 20 20       1, pzErr.  
24500 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
24510 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
24520 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24530 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24540 46 74 73 35 49 6e 64 65 78 52 65 69 6e 69 74 28  Fts5IndexReinit(
24550 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
24560 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
24570 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
24580 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
24590 4f 4b 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29  OK );.  if( rc )
245a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
245b0 35 49 6e 64 65 78 43 6c 6f 73 65 28 70 29 3b 0a  5IndexClose(p);.
245c0 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d      *pp = 0;.  }
245d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
245e0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 68  ./*.** Close a h
245f0 61 6e 64 6c 65 20 6f 70 65 6e 65 64 20 62 79 20  andle opened by 
24600 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
24610 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  to sqlite3Fts5In
24620 64 65 78 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e  dexOpen()..*/.in
24630 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
24640 65 78 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65  exClose(Fts5Inde
24650 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  x *p){.  int rc 
24660 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
24670 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65  f( p ){.    asse
24680 72 74 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d  rt( p->pReader==
24690 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
246a0 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 57 72  _finalize(p->pWr
246b0 69 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  iter);.    sqlit
246c0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70  e3_finalize(p->p
246d0 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 73 71  Deleter);.    sq
246e0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
246f0 2d 3e 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20  ->pIdxWriter);. 
24700 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
24710 69 7a 65 28 70 2d 3e 70 49 64 78 44 65 6c 65 74  ize(p->pIdxDelet
24720 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
24730 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64  _finalize(p->pId
24740 78 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  xSelect);.    sq
24750 6c 69 74 65 33 46 74 73 35 48 61 73 68 46 72 65  lite3Fts5HashFre
24760 65 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20  e(p->pHash);.   
24770 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
24780 3e 7a 44 61 74 61 54 62 6c 29 3b 0a 20 20 20 20  >zDataTbl);.    
24790 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
247a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
247b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ;.}../*.** Argum
247c0 65 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20  ent p points to 
247d0 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
247e0 69 6e 67 20 75 74 66 2d 38 20 74 65 78 74 20 74  ing utf-8 text t
247f0 68 61 74 20 69 73 20 6e 20 62 79 74 65 73 20 69  hat is n bytes i
24800 6e 20 0a 2a 2a 20 73 69 7a 65 2e 20 52 65 74 75  n .** size. Retu
24810 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
24820 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6e 43   bytes in the nC
24830 68 61 72 20 63 68 61 72 61 63 74 65 72 20 70 72  har character pr
24840 65 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20 62  efix of the.** b
24850 75 66 66 65 72 2c 20 6f 72 20 30 20 69 66 20 74  uffer, or 0 if t
24860 68 65 72 65 20 61 72 65 20 6c 65 73 73 20 74 68  here are less th
24870 61 6e 20 6e 43 68 61 72 20 63 68 61 72 61 63 74  an nChar charact
24880 65 72 73 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f  ers in total..*/
24890 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
248a0 74 65 33 46 74 73 35 49 6e 64 65 78 43 68 61 72  te3Fts5IndexChar
248b0 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 0a 20 20  lenToBytelen(.  
248c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 2c 20 0a  const char *p, .
248d0 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 0a 20 20    int nByte, .  
248e0 69 6e 74 20 6e 43 68 61 72 0a 29 7b 0a 20 20 69  int nChar.){.  i
248f0 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt n = 0;.  int 
24900 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
24910 6e 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nChar; i++){.   
24920 20 69 66 28 20 6e 3e 3d 6e 42 79 74 65 20 29 20   if( n>=nByte ) 
24930 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 2f  return 0;      /
24940 2a 20 49 6e 70 75 74 20 63 6f 6e 74 61 69 6e 73  * Input contains
24950 20 66 65 77 65 72 20 74 68 61 6e 20 6e 43 68 61   fewer than nCha
24960 72 20 63 68 61 72 73 20 2a 2f 0a 20 20 20 20 69  r chars */.    i
24970 66 28 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  f( (unsigned cha
24980 72 29 70 5b 6e 2b 2b 5d 3e 3d 30 78 63 30 20 29  r)p[n++]>=0xc0 )
24990 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  {.      while( (
249a0 70 5b 6e 5d 20 26 20 30 78 63 30 29 3d 3d 30 78  p[n] & 0xc0)==0x
249b0 38 30 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a  80 ) n++;.    }.
249c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
249d0 7d 0a 0a 2f 2a 0a 2a 2a 20 70 49 6e 20 69 73 20  }../*.** pIn is 
249e0 61 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  a UTF-8 encoded 
249f0 73 74 72 69 6e 67 2c 20 6e 49 6e 20 62 79 74 65  string, nIn byte
24a00 73 20 69 6e 20 73 69 7a 65 2e 20 52 65 74 75 72  s in size. Retur
24a10 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  n the number of.
24a20 2a 2a 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61  ** unicode chara
24a30 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 74 72  cters in the str
24a40 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
24a50 6e 74 20 66 74 73 35 49 6e 64 65 78 43 68 61 72  nt fts5IndexChar
24a60 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  len(const char *
24a70 70 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20  pIn, int nIn){. 
24a80 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 30 3b 20   int nChar = 0; 
24a90 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e             .  in
24aa0 74 20 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  t i = 0;.  while
24ab0 28 20 69 3c 6e 49 6e 20 29 7b 0a 20 20 20 20 69  ( i<nIn ){.    i
24ac0 66 28 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  f( (unsigned cha
24ad0 72 29 70 49 6e 5b 69 2b 2b 5d 3e 3d 30 78 63 30  r)pIn[i++]>=0xc0
24ae0 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ){.      while(
24af0 20 69 3c 6e 49 6e 20 26 26 20 28 70 49 6e 5b 69   i<nIn && (pIn[i
24b00 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20  ] & 0xc0)==0x80 
24b10 29 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ) i++;.    }.   
24b20 20 6e 43 68 61 72 2b 2b 3b 0a 20 20 7d 0a 20 20   nChar++;.  }.  
24b30 72 65 74 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a  return nChar;.}.
24b40 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72  ./*.** Insert or
24b50 20 72 65 6d 6f 76 65 20 64 61 74 61 20 74 6f 20   remove data to 
24b60 6f 72 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  or from the inde
24b70 78 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20 64  x. Each time a d
24b80 6f 63 75 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61  ocument is .** a
24b90 64 64 65 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76  dded to or remov
24ba0 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ed from the inde
24bb0 78 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  x, this function
24bc0 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f   is called one o
24bd0 72 20 6d 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e  r more.** times.
24be0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e  .**.** For an in
24bf0 73 65 72 74 2c 20 69 74 20 6d 75 73 74 20 62 65  sert, it must be
24c00 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
24c10 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74   each token in t
24c20 68 65 20 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e  he new document.
24c30 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61  .** If the opera
24c40 74 69 6f 6e 20 69 73 20 61 20 64 65 6c 65 74 65  tion is a delete
24c50 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c  , it must be cal
24c60 6c 65 64 20 28 61 74 20 6c 65 61 73 74 29 20 6f  led (at least) o
24c70 6e 63 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  nce for each.** 
24c80 75 6e 69 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20  unique token in 
24c90 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74  the document wit
24ca0 68 20 61 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20  h an iCol value 
24cb0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20  less than zero. 
24cc0 54 68 65 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75  The iPos.** argu
24cd0 6d 65 6e 74 20 69 73 20 69 67 6e 6f 72 65 64 20  ment is ignored 
24ce0 66 6f 72 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f  for a delete..*/
24cf0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
24d00 49 6e 64 65 78 57 72 69 74 65 28 0a 20 20 46 74  IndexWrite(.  Ft
24d10 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
24d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24d30 20 49 6e 64 65 78 20 74 6f 20 77 72 69 74 65 20   Index to write 
24d40 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  to */.  int iCol
24d50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24d60 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
24d70 6e 20 74 6f 6b 65 6e 20 61 70 70 65 61 72 73 20  n token appears 
24d80 69 6e 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74  in (-ve -> delet
24d90 65 29 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73  e) */.  int iPos
24da0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24db0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74          /* Posit
24dc0 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74  ion of token wit
24dd0 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  hin column */.  
24de0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b  const char *pTok
24df0 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20  en, int nToken  
24e00 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20  /* Token to add 
24e10 6f 72 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20  or remove to or 
24e20 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b  from index */.){
24e30 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
24e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e50 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
24e60 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 69 6e  erate through in
24e70 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  dexes */.  int r
24e80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
24e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
24ea0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46  turn code */.  F
24eb0 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
24ec0 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
24ed0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
24ee0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
24ef0 20 20 61 73 73 65 72 74 28 20 28 69 43 6f 6c 3c    assert( (iCol<
24f00 30 29 3d 3d 70 2d 3e 62 44 65 6c 65 74 65 20 29  0)==p->bDelete )
24f10 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  ;..  /* Add the 
24f20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 6d 61 69  entry to the mai
24f30 6e 20 74 65 72 6d 73 20 69 6e 64 65 78 2e 20 2a  n terms index. *
24f40 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
24f50 46 74 73 35 48 61 73 68 57 72 69 74 65 28 0a 20  Fts5HashWrite(. 
24f60 20 20 20 20 20 70 2d 3e 70 48 61 73 68 2c 20 70       p->pHash, p
24f70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 2c 20 69  ->iWriteRowid, i
24f80 43 6f 6c 2c 20 69 50 6f 73 2c 20 46 54 53 35 5f  Col, iPos, FTS5_
24f90 4d 41 49 4e 5f 50 52 45 46 49 58 2c 20 70 54 6f  MAIN_PREFIX, pTo
24fa0 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 0a 20 20 29 3b  ken, nToken.  );
24fb0 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
24fc0 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20  Config->nPrefix 
24fd0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
24fe0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
24ff0 74 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 70 43  t int nChar = pC
25000 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69  onfig->aPrefix[i
25010 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  ];.    int nByte
25020 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e   = sqlite3Fts5In
25030 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65  dexCharlenToByte
25040 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  len(pToken, nTok
25050 65 6e 2c 20 6e 43 68 61 72 29 3b 0a 20 20 20 20  en, nChar);.    
25060 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20  if( nByte ){.   
25070 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
25080 74 73 35 48 61 73 68 57 72 69 74 65 28 70 2d 3e  ts5HashWrite(p->
25090 70 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  pHash, .        
250a0 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64    p->iWriteRowid
250b0 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 28 63  , iCol, iPos, (c
250c0 68 61 72 29 28 46 54 53 35 5f 4d 41 49 4e 5f 50  har)(FTS5_MAIN_P
250d0 52 45 46 49 58 2b 69 2b 31 29 2c 20 70 54 6f 6b  REFIX+i+1), pTok
250e0 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 42  en,.          nB
250f0 79 74 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  yte.      );.   
25100 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
25110 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   rc;.}../*.** Op
25120 65 6e 20 61 20 6e 65 77 20 69 74 65 72 61 74 6f  en a new iterato
25130 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 6f  r to iterate tho
25140 75 67 68 20 61 6c 6c 20 72 6f 77 69 64 20 74 68  ugh all rowid th
25150 61 74 20 6d 61 74 63 68 20 74 68 65 20 0a 2a 2a  at match the .**
25160 20 73 70 65 63 69 66 69 65 64 20 74 6f 6b 65 6e   specified token
25170 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66 69 78   or token prefix
25180 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25190 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 0a  Fts5IndexQuery(.
251a0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
251b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251c0 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 74    /* FTS index t
251d0 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 63 6f 6e  o query */.  con
251e0 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c  st char *pToken,
251f0 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20   int nToken, /* 
25200 54 6f 6b 65 6e 20 28 6f 72 20 70 72 65 66 69 78  Token (or prefix
25210 29 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a  ) to query for *
25220 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
25230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25240 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46      /* Mask of F
25250 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 58  TS5INDEX_QUERY_X
25260 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35   flags */.  Fts5
25270 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c  Colset *pColset,
25280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
25290 61 74 63 68 20 74 68 65 73 65 20 63 6f 6c 75 6d  atch these colum
252a0 6e 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 46 74 73  ns only */.  Fts
252b0 35 49 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 49  5IndexIter **ppI
252c0 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ter          /* 
252d0 4f 55 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f  OUT: New iterato
252e0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  r object */.){. 
252f0 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
25300 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
25310 67 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  g;.  Fts5IndexIt
25320 65 72 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  er *pRet = 0;.  
25330 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20  int iIdx = 0;.  
25340 46 74 73 35 42 75 66 66 65 72 20 62 75 66 20 3d  Fts5Buffer buf =
25350 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 2f   {0, 0, 0};..  /
25360 2a 20 49 66 20 74 68 65 20 51 55 45 52 59 5f 53  * If the QUERY_S
25370 43 41 4e 20 66 6c 61 67 20 69 73 20 73 65 74 2c  CAN flag is set,
25380 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73   all other flags
25390 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 2e 20   must be clear. 
253a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
253b0 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
253c0 51 55 45 52 59 5f 53 43 41 4e 29 3d 3d 30 20 7c  QUERY_SCAN)==0 |
253d0 7c 20 66 6c 61 67 73 3d 3d 46 54 53 35 49 4e 44  | flags==FTS5IND
253e0 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20 29 3b  EX_QUERY_SCAN );
253f0 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ..  if( sqlite3F
25400 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70  ts5BufferSize(&p
25410 2d 3e 72 63 2c 20 26 62 75 66 2c 20 6e 54 6f 6b  ->rc, &buf, nTok
25420 65 6e 2b 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  en+1)==0 ){.    
25430 6d 65 6d 63 70 79 28 26 62 75 66 2e 70 5b 31 5d  memcpy(&buf.p[1]
25440 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , pToken, nToken
25450 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
25460 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49  E_DEBUG.    /* I
25470 66 20 74 68 65 20 51 55 45 52 59 5f 54 45 53 54  f the QUERY_TEST
25480 5f 4e 4f 49 44 58 20 66 6c 61 67 20 77 61 73 20  _NOIDX flag was 
25490 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20  specified, then 
254a0 74 68 69 73 20 6d 75 73 74 20 62 65 20 61 0a 20  this must be a. 
254b0 20 20 20 2a 2a 20 70 72 65 66 69 78 2d 71 75 65     ** prefix-que
254c0 72 79 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 75  ry. Instead of u
254d0 73 69 6e 67 20 61 20 70 72 65 66 69 78 2d 69 6e  sing a prefix-in
254e0 64 65 78 20 28 69 66 20 6f 6e 65 20 65 78 69 73  dex (if one exis
254f0 74 73 29 2c 20 0a 20 20 20 20 2a 2a 20 65 76 61  ts), .    ** eva
25500 6c 75 61 74 65 20 74 68 65 20 70 72 65 66 69 78  luate the prefix
25510 20 71 75 65 72 79 20 75 73 69 6e 67 20 74 68 65   query using the
25520 20 6d 61 69 6e 20 46 54 53 20 69 6e 64 65 78 2e   main FTS index.
25530 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 20 20   This is used.  
25540 20 20 2a 2a 20 66 6f 72 20 69 6e 74 65 72 6e 61    ** for interna
25550 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  l sanity checkin
25560 67 20 62 79 20 74 68 65 20 69 6e 74 65 67 72 69  g by the integri
25570 74 79 2d 63 68 65 63 6b 20 69 6e 20 64 65 62 75  ty-check in debu
25580 67 20 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 6f  g .    ** mode o
25590 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  nly.  */.    if(
255a0 20 70 43 6f 6e 66 69 67 2d 3e 62 50 72 65 66 69   pConfig->bPrefi
255b0 78 49 6e 64 65 78 3d 3d 30 20 7c 7c 20 28 66 6c  xIndex==0 || (fl
255c0 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
255d0 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58  QUERY_TEST_NOIDX
255e0 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
255f0 74 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49  t( flags & FTS5I
25600 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49  NDEX_QUERY_PREFI
25610 58 20 29 3b 0a 20 20 20 20 20 20 69 49 64 78 20  X );.      iIdx 
25620 3d 20 31 2b 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  = 1+pConfig->nPr
25630 65 66 69 78 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  efix;.    }else.
25640 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66  #endif.    if( f
25650 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
25660 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20 29 7b  _QUERY_PREFIX ){
25670 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 68 61 72  .      int nChar
25680 20 3d 20 66 74 73 35 49 6e 64 65 78 43 68 61 72   = fts5IndexChar
25690 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  len(pToken, nTok
256a0 65 6e 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  en);.      for(i
256b0 49 64 78 3d 31 3b 20 69 49 64 78 3c 3d 70 43 6f  Idx=1; iIdx<=pCo
256c0 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69  nfig->nPrefix; i
256d0 49 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Idx++){.        
256e0 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72  if( pConfig->aPr
256f0 65 66 69 78 5b 69 49 64 78 2d 31 5d 3d 3d 6e 43  efix[iIdx-1]==nC
25700 68 61 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  har ) break;.   
25710 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
25720 69 66 28 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69  if( iIdx<=pConfi
25730 67 2d 3e 6e 50 72 65 66 69 78 20 29 7b 0a 20 20  g->nPrefix ){.  
25740 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
25750 65 20 2a 70 53 74 72 75 63 74 20 3d 20 66 74 73  e *pStruct = fts
25760 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
25770 29 3b 0a 20 20 20 20 20 20 62 75 66 2e 70 5b 30  );.      buf.p[0
25780 5d 20 3d 20 28 75 38 29 28 46 54 53 35 5f 4d 41  ] = (u8)(FTS5_MA
25790 49 4e 5f 50 52 45 46 49 58 20 2b 20 69 49 64 78  IN_PREFIX + iIdx
257a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 74  );.      if( pSt
257b0 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ruct ){.        
257c0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
257d0 28 70 2c 20 70 53 74 72 75 63 74 2c 20 31 2c 20  (p, pStruct, 1, 
257e0 66 6c 61 67 73 2c 20 62 75 66 2e 70 2c 20 6e 54  flags, buf.p, nT
257f0 6f 6b 65 6e 2b 31 2c 20 2d 31 2c 20 30 2c 20 26  oken+1, -1, 0, &
25800 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 66  pRet);.        f
25810 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
25820 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
25830 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
25840 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65 73 63  .      int bDesc
25850 20 3d 20 28 66 6c 61 67 73 20 26 20 46 54 53 35   = (flags & FTS5
25860 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
25870 29 21 3d 30 3b 0a 20 20 20 20 20 20 62 75 66 2e  )!=0;.      buf.
25880 70 5b 30 5d 20 3d 20 46 54 53 35 5f 4d 41 49 4e  p[0] = FTS5_MAIN
25890 5f 50 52 45 46 49 58 3b 0a 20 20 20 20 20 20 66  _PREFIX;.      f
258a0 74 73 35 53 65 74 75 70 50 72 65 66 69 78 49 74  ts5SetupPrefixIt
258b0 65 72 28 70 2c 20 62 44 65 73 63 2c 20 62 75 66  er(p, bDesc, buf
258c0 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20 70 43  .p, nToken+1, pC
258d0 6f 6c 73 65 74 2c 20 26 70 52 65 74 29 3b 0a 20  olset, &pRet);. 
258e0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d     }..    if( p-
258f0 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  >rc ){.      sql
25900 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73  ite3Fts5IterClos
25910 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 70  e(pRet);.      p
25920 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  Ret = 0;.      f
25930 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70  ts5CloseReader(p
25940 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70  );.    }.    *pp
25950 49 74 65 72 20 3d 20 70 52 65 74 3b 0a 20 20 20  Iter = pRet;.   
25960 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
25970 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 20 20  erFree(&buf);.  
25980 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  }.  return fts5I
25990 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
259a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
259b0 72 75 65 20 69 66 20 74 68 65 20 69 74 65 72 61  rue if the itera
259c0 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
259d0 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
259e0 69 73 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a 69 6e  is at EOF..*/.in
259f0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  t sqlite3Fts5Ite
25a00 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 49 74  rEof(Fts5IndexIt
25a10 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73  er *pIter){.  as
25a20 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e  sert( pIter->pIn
25a30 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  dex->rc==SQLITE_
25a40 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  OK );.  return p
25a50 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f  Iter->bEof;.}../
25a60 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65  *.** Move to the
25a70 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72   next matching r
25a80 6f 77 69 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  owid. .*/.int sq
25a90 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78  lite3Fts5IterNex
25aa0 74 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  t(Fts5IndexIter 
25ab0 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72  *pIter){.  asser
25ac0 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  t( pIter->pIndex
25ad0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
25ae0 29 3b 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74  );.  fts5MultiIt
25af0 65 72 4e 65 78 74 28 70 49 74 65 72 2d 3e 70 49  erNext(pIter->pI
25b00 6e 64 65 78 2c 20 70 49 74 65 72 2c 20 30 2c 20  ndex, pIter, 0, 
25b10 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  0);.  return fts
25b20 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74  5IndexReturn(pIt
25b30 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a  er->pIndex);.}..
25b40 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68  /*.** Move to th
25b50 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20  e next matching 
25b60 74 65 72 6d 2f 72 6f 77 69 64 2e 20 55 73 65 64  term/rowid. Used
25b70 20 62 79 20 74 68 65 20 66 74 73 35 76 6f 63 61   by the fts5voca
25b80 62 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 69 6e 74  b module..*/.int
25b90 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
25ba0 4e 65 78 74 53 63 61 6e 28 46 74 73 35 49 6e 64  NextScan(Fts5Ind
25bb0 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  exIter *pIter){.
25bc0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 20 3d    Fts5Index *p =
25bd0 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a   pIter->pIndex;.
25be0 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
25bf0 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51  ->pIndex->rc==SQ
25c00 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 66 74  LITE_OK );..  ft
25c10 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
25c20 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29 3b  p, pIter, 0, 0);
25c30 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
25c40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
25c50 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
25c60 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
25c70 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
25c80 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
25c90 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 20  if( pSeg->pLeaf 
25ca0 26 26 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 5b  && pSeg->term.p[
25cb0 30 5d 21 3d 46 54 53 35 5f 4d 41 49 4e 5f 50 52  0]!=FTS5_MAIN_PR
25cc0 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20 66 74  EFIX ){.      ft
25cd0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 53  s5DataRelease(pS
25ce0 65 67 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20  eg->pLeaf);.    
25cf0 20 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 3d 20    pSeg->pLeaf = 
25d00 30 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  0;.      pIter->
25d10 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  bEof = 1;.    }.
25d20 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 66 74    }..  return ft
25d30 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49  s5IndexReturn(pI
25d40 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a  ter->pIndex);.}.
25d50 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74  ./*.** Move to t
25d60 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67  he next matching
25d70 20 72 6f 77 69 64 20 74 68 61 74 20 6f 63 63 75   rowid that occu
25d80 72 73 20 61 74 20 6f 72 20 61 66 74 65 72 20 69  rs at or after i
25d90 4d 61 74 63 68 2e 20 54 68 65 0a 2a 2a 20 64 65  Match. The.** de
25da0 66 69 6e 69 74 69 6f 6e 20 6f 66 20 22 61 74 20  finition of "at 
25db0 6f 72 20 61 66 74 65 72 22 20 64 65 70 65 6e 64  or after" depend
25dc0 73 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 69  s on whether thi
25dd0 73 20 69 74 65 72 61 74 6f 72 20 69 74 65 72 61  s iterator itera
25de0 74 65 73 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64  tes.** in ascend
25df0 69 6e 67 20 6f 72 20 64 65 73 63 65 6e 64 69 6e  ing or descendin
25e00 67 20 72 6f 77 69 64 20 6f 72 64 65 72 2e 0a 2a  g rowid order..*
25e10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
25e20 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 46 74  5IterNextFrom(Ft
25e30 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
25e40 65 72 2c 20 69 36 34 20 69 4d 61 74 63 68 29 7b  er, i64 iMatch){
25e50 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  .  fts5MultiIter
25e60 4e 65 78 74 46 72 6f 6d 28 70 49 74 65 72 2d 3e  NextFrom(pIter->
25e70 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2c 20 69  pIndex, pIter, i
25e80 4d 61 74 63 68 29 3b 0a 20 20 72 65 74 75 72 6e  Match);.  return
25e90 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
25ea0 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b  (pIter->pIndex);
25eb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
25ec0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
25ed0 69 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74  id..*/.i64 sqlit
25ee0 65 33 46 74 73 35 49 74 65 72 52 6f 77 69 64 28  e3Fts5IterRowid(
25ef0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
25f00 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Iter){.  return 
25f10 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
25f20 69 64 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  id(pIter);.}../*
25f30 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
25f40 75 72 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a  urrent term..*/.
25f50 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
25f60 74 65 33 46 74 73 35 49 74 65 72 54 65 72 6d 28  te3Fts5IterTerm(
25f70 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
25f80 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a  Iter, int *pn){.
25f90 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74    int n;.  const
25fa0 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73   char *z = (cons
25fb0 74 20 63 68 61 72 2a 29 66 74 73 35 4d 75 6c 74  t char*)fts5Mult
25fc0 69 49 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c  iIterTerm(pIter,
25fd0 20 26 6e 29 3b 0a 20 20 2a 70 6e 20 3d 20 6e 2d   &n);.  *pn = n-
25fe0 31 3b 0a 20 20 72 65 74 75 72 6e 20 26 7a 5b 31  1;.  return &z[1
25ff0 5d 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e  ];.}...static in
26000 74 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61  t fts5IndexExtra
26010 63 74 43 6f 6c 73 65 74 20 28 0a 20 20 46 74 73  ctColset (.  Fts
26020 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
26030 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
26040 43 6f 6c 73 65 74 20 74 6f 20 66 69 6c 74 65 72  Colset to filter
26050 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75   on */.  const u
26060 38 20 2a 70 50 6f 73 2c 20 69 6e 74 20 6e 50 6f  8 *pPos, int nPo
26070 73 2c 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69  s,       /* Posi
26080 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 46  tion list */.  F
26090 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 20  ts5Buffer *pBuf 
260a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
260b0 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20  * Output buffer 
260c0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
260d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
260e0 74 20 69 3b 0a 0a 20 20 66 74 73 35 42 75 66 66  t i;..  fts5Buff
260f0 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20 20  erZero(pBuf);.  
26100 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 73  for(i=0; i<pCols
26110 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  et->nCol; i++){.
26120 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53      const u8 *pS
26130 75 62 20 3d 20 70 50 6f 73 3b 0a 20 20 20 20 69  ub = pPos;.    i
26140 6e 74 20 6e 53 75 62 20 3d 20 66 74 73 35 49 6e  nt nSub = fts5In
26150 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28 26 70  dexExtractCol(&p
26160 53 75 62 2c 20 6e 50 6f 73 2c 20 70 43 6f 6c 73  Sub, nPos, pCols
26170 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 29 3b 0a 20  et->aiCol[i]);. 
26180 20 20 20 69 66 28 20 6e 53 75 62 20 29 7b 0a 20     if( nSub ){. 
26190 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
261a0 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20 70  ppendBlob(&rc, p
261b0 42 75 66 2c 20 6e 53 75 62 2c 20 70 53 75 62 29  Buf, nSub, pSub)
261c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
261d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
261e0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
261f0 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
26200 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 63 6f 70  containing a cop
26210 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f  y of the positio
26220 6e 20 6c 69 73 74 20 66 6f 72 0a 2a 2a 20 74 68  n list for.** th
26230 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e  e current entry.
26240 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
26250 20 2a 70 6e 20 69 73 20 73 65 74 20 74 6f 20 74   *pn is set to t
26260 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
26270 75 66 66 65 72 20 0a 2a 2a 20 69 6e 20 62 79 74  uffer .** in byt
26280 65 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  es before return
26290 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ing..**.** The r
262a0 65 74 75 72 6e 65 64 20 70 6f 73 69 74 69 6f 6e  eturned position
262b0 20 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74 20 69   list does not i
262c0 6e 63 6c 75 64 65 20 74 68 65 20 22 6e 75 6d 62  nclude the "numb
262d0 65 72 20 6f 66 20 62 79 74 65 73 22 20 76 61 72  er of bytes" var
262e0 69 6e 74 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61  int.** field tha
262f0 74 20 73 74 61 72 74 73 20 74 68 65 20 70 6f 73  t starts the pos
26300 69 74 69 6f 6e 20 6c 69 73 74 20 6f 6e 20 64 69  ition list on di
26310 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
26320 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69 73  e3Fts5IterPoslis
26330 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  t(.  Fts5IndexIt
26340 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 46 74  er *pIter, .  Ft
26350 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65  s5Colset *pColse
26360 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
26370 20 43 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 20 28   Column filter (
26380 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 63 6f  or NULL) */.  co
26390 6e 73 74 20 75 38 20 2a 2a 70 70 2c 20 20 20 20  nst u8 **pp,    
263a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
263b0 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f   OUT: Pointer to
263c0 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 64   position-list d
263d0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
263e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
263f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
26400 20 53 69 7a 65 20 6f 66 20 70 6f 73 69 74 69 6f   Size of positio
26410 6e 2d 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20  n-list in bytes 
26420 2a 2f 0a 20 20 69 36 34 20 2a 70 69 52 6f 77 69  */.  i64 *piRowi
26430 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
26440 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 75 72       /* OUT: Cur
26450 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 29 7b  rent rowid */.){
26460 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
26470 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
26480 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
26490 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
264a0 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20    int eDetail = 
264b0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70  pIter->pIndex->p
264c0 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b  Config->eDetail;
264d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
264e0 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53  r->pIndex->rc==S
264f0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 2a 70  QLITE_OK );.  *p
26500 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69  iRowid = pSeg->i
26510 52 6f 77 69 64 3b 0a 20 20 69 66 28 20 65 44 65  Rowid;.  if( eDe
26520 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
26530 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 2a 70  L_NONE ){.    *p
26540 6e 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a  n = pSeg->nPos;.
26550 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 65 44    }else.  if( eD
26560 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
26570 49 4c 5f 46 55 4c 4c 20 0a 20 20 20 26 26 20 70  IL_FULL .   && p
26580 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  Seg->iLeafOffset
26590 2b 70 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65  +pSeg->nPos<=pSe
265a0 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  g->pLeaf->szLeaf
265b0 20 0a 20 20 29 7b 0a 20 20 20 20 75 38 20 2a 70   .  ){.    u8 *p
265c0 50 6f 73 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65  Pos = &pSeg->pLe
265d0 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61  af->p[pSeg->iLea
265e0 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 69 66  fOffset];.    if
265f0 28 20 70 43 6f 6c 73 65 74 3d 3d 30 20 7c 7c 20  ( pColset==0 || 
26600 70 49 74 65 72 2d 3e 62 46 69 6c 74 65 72 65 64  pIter->bFiltered
26610 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 20 3d 20   ){.      *pn = 
26620 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20  pSeg->nPos;.    
26630 20 20 2a 70 70 20 3d 20 70 50 6f 73 3b 0a 20 20    *pp = pPos;.  
26640 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c    }else if( pCol
26650 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 31 20 29 7b 0a  set->nCol==1 ){.
26660 20 20 20 20 20 20 2a 70 70 20 3d 20 70 50 6f 73        *pp = pPos
26670 3b 0a 20 20 20 20 20 20 2a 70 6e 20 3d 20 66 74  ;.      *pn = ft
26680 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f  s5IndexExtractCo
26690 6c 28 70 70 2c 20 70 53 65 67 2d 3e 6e 50 6f 73  l(pp, pSeg->nPos
266a0 2c 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c  , pColset->aiCol
266b0 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [0]);.    }else{
266c0 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
266d0 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f  rZero(&pIter->po
266e0 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 66 74  slist);.      ft
266f0 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f  s5IndexExtractCo
26700 6c 73 65 74 28 70 43 6f 6c 73 65 74 2c 20 70 50  lset(pColset, pP
26710 6f 73 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c 20  os, pSeg->nPos, 
26720 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
26730 3b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 49  ;.      *pp = pI
26740 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
26750 20 20 20 20 20 20 2a 70 6e 20 3d 20 70 49 74 65        *pn = pIte
26760 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20  r->poslist.n;.  
26770 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
26780 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
26790 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
267a0 3b 0a 20 20 20 20 66 74 73 35 53 65 67 69 74 65  ;.    fts5Segite
267b0 72 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d 3e  rPoslist(pIter->
267c0 70 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 70 43  pIndex, pSeg, pC
267d0 6f 6c 73 65 74 2c 20 26 70 49 74 65 72 2d 3e 70  olset, &pIter->p
267e0 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  oslist);.    if(
267f0 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44   eDetail==FTS5_D
26800 45 54 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20  ETAIL_FULL ){.  
26810 20 20 20 20 2a 70 70 20 3d 20 70 49 74 65 72 2d      *pp = pIter-
26820 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20  >poslist.p;.    
26830 7d 0a 20 20 20 20 2a 70 6e 20 3d 20 70 49 74 65  }.    *pn = pIte
26840 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20  r->poslist.n;.  
26850 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  }.  return fts5I
26860 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65 72  ndexReturn(pIter
26870 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 69 6e  ->pIndex);.}..in
26880 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  t sqlite3Fts5Ite
26890 72 43 6f 6c 6c 69 73 74 28 0a 20 20 46 74 73 35  rCollist(.  Fts5
268a0 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
268b0 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a  , .  const u8 **
268c0 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pp,             
268d0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69       /* OUT: Poi
268e0 6e 74 65 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e  nter to position
268f0 2d 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a 20 20  -list data */.  
26900 69 6e 74 20 2a 70 6e 20 20 20 20 20 20 20 20 20  int *pn         
26910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26920 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  /* OUT: Size of 
26930 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 69 6e  position-list in
26940 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 61   bytes */.){.  a
26950 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49  ssert( pIter->pI
26960 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65  ndex->pConfig->e
26970 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
26980 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20 29 3b 0a 20  AIL_COLUMNS );. 
26990 20 2a 70 70 20 3d 20 70 49 74 65 72 2d 3e 70 6f   *pp = pIter->po
269a0 73 6c 69 73 74 2e 70 3b 0a 20 20 2a 70 6e 20 3d  slist.p;.  *pn =
269b0 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
269c0 6e 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  n;.  return SQLI
269d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
269e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
269f0 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
26a00 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69  te3Fts5IterPosli
26a10 73 74 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  st(), except tha
26a20 74 20 69 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74  t it.** copies t
26a30 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
26a40 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72   into the buffer
26a50 20 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65   supplied as the
26a60 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75   second .** argu
26a70 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
26a80 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c  ite3Fts5IterPosl
26a90 69 73 74 42 75 66 66 65 72 28 46 74 73 35 49 6e  istBuffer(Fts5In
26aa0 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20  dexIter *pIter, 
26ab0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
26ac0 29 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  ){.  Fts5Index *
26ad0 70 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  p = pIter->pInde
26ae0 78 3b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  x;.  Fts5SegIter
26af0 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
26b00 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
26b10 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
26b20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
26b30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
26b40 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
26b50 28 70 42 75 66 29 3b 0a 20 20 66 74 73 35 53 65  (pBuf);.  fts5Se
26b60 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20  giterPoslist(p, 
26b70 70 53 65 67 2c 20 30 2c 20 70 42 75 66 29 3b 0a  pSeg, 0, pBuf);.
26b80 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
26b90 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
26ba0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69  /*.** Close an i
26bb0 74 65 72 61 74 6f 72 20 6f 70 65 6e 65 64 20 62  terator opened b
26bc0 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  y an earlier cal
26bd0 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35  l to sqlite3Fts5
26be0 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f  IndexQuery()..*/
26bf0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
26c00 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73 35 49  5IterClose(Fts5I
26c10 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29  ndexIter *pIter)
26c20 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b  {.  if( pIter ){
26c30 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78 20 2a  .    Fts5Index *
26c40 70 49 6e 64 65 78 20 3d 20 70 49 74 65 72 2d 3e  pIndex = pIter->
26c50 70 49 6e 64 65 78 3b 0a 20 20 20 20 66 74 73 35  pIndex;.    fts5
26c60 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 49  MultiIterFree(pI
26c70 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74  ter->pIndex, pIt
26c80 65 72 29 3b 0a 20 20 20 20 66 74 73 35 43 6c 6f  er);.    fts5Clo
26c90 73 65 52 65 61 64 65 72 28 70 49 6e 64 65 78 29  seReader(pIndex)
26ca0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
26cb0 65 61 64 20 61 6e 64 20 64 65 63 6f 64 65 20 74  ead and decode t
26cc0 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72 65  he "averages" re
26cd0 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 64 61  cord from the da
26ce0 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 50  tabase. .**.** P
26cf0 61 72 61 6d 65 74 65 72 20 61 6e 53 69 7a 65 20  arameter anSize 
26d00 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  must point to an
26d10 20 61 72 72 61 79 20 6f 66 20 73 69 7a 65 20 6e   array of size n
26d20 43 6f 6c 2c 20 77 68 65 72 65 20 6e 43 6f 6c 20  Col, where nCol 
26d30 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  is.** the number
26d40 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65 64   of user defined
26d50 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
26d60 46 54 53 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e  FTS table..*/.in
26d70 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
26d80 65 78 47 65 74 41 76 65 72 61 67 65 73 28 46 74  exGetAverages(Ft
26d90 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20  s5Index *p, i64 
26da0 2a 70 6e 52 6f 77 2c 20 69 36 34 20 2a 61 6e 53  *pnRow, i64 *anS
26db0 69 7a 65 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c  ize){.  int nCol
26dc0 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e   = p->pConfig->n
26dd0 43 6f 6c 3b 0a 20 20 46 74 73 35 44 61 74 61 20  Col;.  Fts5Data 
26de0 2a 70 44 61 74 61 3b 0a 0a 20 20 2a 70 6e 52 6f  *pData;..  *pnRo
26df0 77 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  w = 0;.  memset(
26e00 61 6e 53 69 7a 65 2c 20 30 2c 20 73 69 7a 65 6f  anSize, 0, sizeo
26e10 66 28 69 36 34 29 20 2a 20 6e 43 6f 6c 29 3b 0a  f(i64) * nCol);.
26e20 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61    pData = fts5Da
26e30 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 41  taRead(p, FTS5_A
26e40 56 45 52 41 47 45 53 5f 52 4f 57 49 44 29 3b 0a  VERAGES_ROWID);.
26e50 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
26e60 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 2d  ITE_OK && pData-
26e70 3e 6e 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  >nn ){.    int i
26e80 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 43   = 0;.    int iC
26e90 6f 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74 73  ol;.    i += fts
26ea0 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74  5GetVarint(&pDat
26eb0 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29 70  a->p[i], (u64*)p
26ec0 6e 52 6f 77 29 3b 0a 20 20 20 20 66 6f 72 28 69  nRow);.    for(i
26ed0 43 6f 6c 3d 30 3b 20 69 3c 70 44 61 74 61 2d 3e  Col=0; i<pData->
26ee0 6e 6e 20 26 26 20 69 43 6f 6c 3c 6e 43 6f 6c 3b  nn && iCol<nCol;
26ef0 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
26f00 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
26f10 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d 2c  nt(&pData->p[i],
26f20 20 28 75 36 34 2a 29 26 61 6e 53 69 7a 65 5b 69   (u64*)&anSize[i
26f30 43 6f 6c 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Col]);.    }.  }
26f40 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ..  fts5DataRele
26f50 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 72 65  ase(pData);.  re
26f60 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
26f70 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn(p);.}../*.*
26f80 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 75  * Replace the cu
26f90 72 72 65 6e 74 20 22 61 76 65 72 61 67 65 73 22  rrent "averages"
26fa0 20 72 65 63 6f 72 64 20 77 69 74 68 20 74 68 65   record with the
26fb0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
26fc0 20 62 75 66 66 65 72 20 0a 2a 2a 20 73 75 70 70   buffer .** supp
26fd0 6c 69 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  lied as the seco
26fe0 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
26ff0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
27000 6e 64 65 78 53 65 74 41 76 65 72 61 67 65 73 28  ndexSetAverages(
27010 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 63 6f  Fts5Index *p, co
27020 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69  nst u8 *pData, i
27030 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 61 73 73  nt nData){.  ass
27040 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
27050 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 44  TE_OK );.  fts5D
27060 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35  ataWrite(p, FTS5
27070 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c  _AVERAGES_ROWID,
27080 20 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a   pData, nData);.
27090 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
270a0 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
270b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
270c0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
270d0 20 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f 64   blocks this mod
270e0 75 6c 65 20 68 61 73 20 72 65 61 64 20 66 72 6f  ule has read fro
270f0 6d 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20  m the %_data.** 
27100 74 61 62 6c 65 20 73 69 6e 63 65 20 69 74 20 77  table since it w
27110 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 69  as created..*/.i
27120 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
27130 64 65 78 52 65 61 64 73 28 46 74 73 35 49 6e 64  dexReads(Fts5Ind
27140 65 78 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ex *p){.  return
27150 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a   p->nRead;.}../*
27160 0a 2a 2a 20 53 65 74 20 74 68 65 20 33 32 2d 62  .** Set the 32-b
27170 69 74 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  it cookie value 
27180 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
27190 61 72 74 20 6f 66 20 61 6c 6c 20 73 74 72 75 63  art of all struc
271a0 74 75 72 65 20 0a 2a 2a 20 72 65 63 6f 72 64 73  ture .** records
271b0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61   to the value pa
271c0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
271d0 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
271e0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
271f0 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
27200 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
27210 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
27220 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73   error.** occurs
27230 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27240 46 74 73 35 49 6e 64 65 78 53 65 74 43 6f 6f 6b  Fts5IndexSetCook
27250 69 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ie(Fts5Index *p,
27260 20 69 6e 74 20 69 4e 65 77 29 7b 0a 20 20 69 6e   int iNew){.  in
27270 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
27280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27290 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
272a0 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69  e */.  Fts5Confi
272b0 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
272c0 70 43 6f 6e 66 69 67 3b 20 20 20 20 2f 2a 20 43  pConfig;    /* C
272d0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a  onfiguration obj
272e0 65 63 74 20 2a 2f 0a 20 20 75 38 20 61 43 6f 6f  ect */.  u8 aCoo
272f0 6b 69 65 5b 34 5d 3b 20 20 20 20 20 20 20 20 20  kie[4];         
27300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27310 20 42 69 6e 61 72 79 20 72 65 70 72 65 73 65 6e   Binary represen
27320 74 61 74 69 6f 6e 20 6f 66 20 69 4e 65 77 20 2a  tation of iNew *
27330 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  /.  sqlite3_blob
27340 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 0a 20 20   *pBlob = 0;..  
27350 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
27360 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71  QLITE_OK );.  sq
27370 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28 61  lite3Fts5Put32(a
27380 43 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b 0a 0a  Cookie, iNew);..
27390 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
273a0 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67  lob_open(pConfig
273b0 2d 3e 64 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  ->db, pConfig->z
273c0 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c  Db, p->zDataTbl,
273d0 20 0a 20 20 20 20 20 20 22 62 6c 6f 63 6b 22 2c   .      "block",
273e0 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f   FTS5_STRUCTURE_
273f0 52 4f 57 49 44 2c 20 31 2c 20 26 70 42 6c 6f 62  ROWID, 1, &pBlob
27400 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
27410 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27420 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72   sqlite3_blob_wr
27430 69 74 65 28 70 42 6c 6f 62 2c 20 61 43 6f 6f 6b  ite(pBlob, aCook
27440 69 65 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 72  ie, 4, 0);.    r
27450 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
27460 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b 0a 20  _close(pBlob);. 
27470 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
27480 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .}..int sqlite3F
27490 74 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e 66  ts5IndexLoadConf
274a0 69 67 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ig(Fts5Index *p)
274b0 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
274c0 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 70 53  e *pStruct;.  pS
274d0 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
274e0 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20  ctureRead(p);.  
274f0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
27500 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
27510 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
27520 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 0a  xReturn(p);.}...
27530 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
27540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
27580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
275a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
275b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
275c0 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74  *****.** Below t
275d0 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65  his point is the
275e0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
275f0 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  of the integrity
27600 2d 63 68 65 63 6b 20 0a 2a 2a 20 66 75 6e 63 74  -check .** funct
27610 69 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a 0a 2f 2a  ionality..*/../*
27620 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69 6d  .** Return a sim
27630 70 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 61 6c  ple checksum val
27640 75 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ue based on the 
27650 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36  arguments..*/.u6
27660 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  4 sqlite3Fts5Ind
27670 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20  exEntryCksum(.  
27680 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20 69  i64 iRowid, .  i
27690 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20  nt iCol, .  int 
276a0 69 50 6f 73 2c 20 0a 20 20 69 6e 74 20 69 49 64  iPos, .  int iId
276b0 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  x,.  const char 
276c0 2a 70 54 65 72 6d 2c 0a 20 20 69 6e 74 20 6e 54  *pTerm,.  int nT
276d0 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  erm.){.  int i;.
276e0 20 20 75 36 34 20 72 65 74 20 3d 20 69 52 6f 77    u64 ret = iRow
276f0 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65  id;.  ret += (re
27700 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20 20  t<<3) + iCol;.  
27710 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
27720 2b 20 69 50 6f 73 3b 0a 20 20 69 66 28 20 69 49  + iPos;.  if( iI
27730 64 78 3e 3d 30 20 29 20 72 65 74 20 2b 3d 20 28  dx>=0 ) ret += (
27740 72 65 74 3c 3c 33 29 20 2b 20 28 46 54 53 35 5f  ret<<3) + (FTS5_
27750 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69 49  MAIN_PREFIX + iI
27760 64 78 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  dx);.  for(i=0; 
27770 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72 65  i<nTerm; i++) re
27780 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20  t += (ret<<3) + 
27790 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 72 65 74 75  pTerm[i];.  retu
277a0 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 64 65  rn ret;.}..#ifde
277b0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
277c0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
277d0 6f 6e 20 69 73 20 70 75 72 65 6c 79 20 61 6e 20  on is purely an 
277e0 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20 49  internal test. I
277f0 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  t does not contr
27800 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53  ibute to .** FTS
27810 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20   functionality, 
27820 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74 65  or even the inte
27830 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20  grity-check, in 
27840 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  any way..**.** I
27850 6e 73 74 65 61 64 2c 20 69 74 20 74 65 73 74 73  nstead, it tests
27860 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 73   that the same s
27870 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f 77 69 64  et of pgno/rowid
27880 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72   combinations ar
27890 65 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 72 65  e .** visited re
278a0 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
278b0 68 65 72 20 74 68 65 20 64 6f 63 6c 69 73 74 2d  her the doclist-
278c0 69 6e 64 65 78 20 69 64 65 6e 74 69 66 69 65 64  index identified
278d0 20 62 79 20 70 61 72 61 6d 65 74 65 72 73 0a 2a   by parameters.*
278e0 2a 20 69 53 65 67 69 64 2f 69 4c 65 61 66 20 69  * iSegid/iLeaf i
278f0 73 20 69 74 65 72 61 74 65 64 20 69 6e 20 66 6f  s iterated in fo
27900 72 77 61 72 64 73 20 6f 72 20 72 65 76 65 72 73  rwards or revers
27910 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  e order..*/.stat
27920 69 63 20 76 6f 69 64 20 66 74 73 35 54 65 73 74  ic void fts5Test
27930 44 6c 69 64 78 52 65 76 65 72 73 65 28 0a 20 20  DlidxReverse(.  
27940 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
27950 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20   int iSegid,    
27960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27970 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 74   /* Segment id t
27980 6f 20 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o load from */. 
27990 20 69 6e 74 20 69 4c 65 61 66 20 20 20 20 20 20   int iLeaf      
279a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279b0 20 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73 74   /* Load doclist
279c0 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20  -index for this 
279d0 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  leaf */.){.  Fts
279e0 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69  5DlidxIter *pDli
279f0 64 78 20 3d 20 30 3b 0a 20 20 75 36 34 20 63 6b  dx = 0;.  u64 ck
27a00 73 75 6d 31 20 3d 20 31 33 3b 0a 20 20 75 36 34  sum1 = 13;.  u64
27a10 20 63 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a 20   cksum2 = 13;.. 
27a20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35   for(pDlidx=fts5
27a30 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c  DlidxIterInit(p,
27a40 20 30 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61   0, iSegid, iLea
27a50 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  f);.      fts5Dl
27a60 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
27a70 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20  lidx)==0;.      
27a80 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
27a90 74 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 29  t(p, pDlidx).  )
27aa0 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  {.    i64 iRowid
27ab0 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
27ac0 52 6f 77 69 64 28 70 44 6c 69 64 78 29 3b 0a 20  Rowid(pDlidx);. 
27ad0 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74     int pgno = ft
27ae0 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
27af0 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 61 73 73  pDlidx);.    ass
27b00 65 72 74 28 20 70 67 6e 6f 3e 69 4c 65 61 66 20  ert( pgno>iLeaf 
27b10 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 2b 3d  );.    cksum1 +=
27b20 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34 29   iRowid + ((i64)
27b30 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20  pgno<<32);.  }. 
27b40 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
27b50 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44  ee(pDlidx);.  pD
27b60 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f 72  lidx = 0;..  for
27b70 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64  (pDlidx=fts5Dlid
27b80 78 49 74 65 72 49 6e 69 74 28 70 2c 20 31 2c 20  xIterInit(p, 1, 
27b90 69 53 65 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a  iSegid, iLeaf);.
27ba0 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
27bb0 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78  terEof(p, pDlidx
27bc0 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35  )==0;.      fts5
27bd0 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 70 2c  DlidxIterPrev(p,
27be0 20 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20   pDlidx).  ){.  
27bf0 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66    i64 iRowid = f
27c00 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69  ts5DlidxIterRowi
27c10 64 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 69  d(pDlidx);.    i
27c20 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c  nt pgno = fts5Dl
27c30 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69  idxIterPgno(pDli
27c40 64 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dx);.    assert(
27c50 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
27c60 6e 6f 28 70 44 6c 69 64 78 29 3e 69 4c 65 61 66  no(pDlidx)>iLeaf
27c70 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32 20 2b   );.    cksum2 +
27c80 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34  = iRowid + ((i64
27c90 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a  )pgno<<32);.  }.
27ca0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
27cb0 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70  ree(pDlidx);.  p
27cc0 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 69 66  Dlidx = 0;..  if
27cd0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
27ce0 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d 63 6b  OK && cksum1!=ck
27cf0 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20 46  sum2 ) p->rc = F
27d00 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 0a  TS5_CORRUPT;.}..
27d10 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 51  static int fts5Q
27d20 75 65 72 79 43 6b 73 75 6d 28 0a 20 20 46 74 73  ueryCksum(.  Fts
27d30 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
27d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27d50 46 74 73 35 20 69 6e 64 65 78 20 6f 62 6a 65 63  Fts5 index objec
27d60 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  t */.  int iIdx,
27d70 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
27d80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27d90 20 20 20 2f 2a 20 49 6e 64 65 78 20 6b 65 79 20     /* Index key 
27da0 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a  to query for */.
27db0 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
27dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27dd0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 69 6e 64    /* Size of ind
27de0 65 78 20 6b 65 79 20 69 6e 20 62 79 74 65 73 20  ex key in bytes 
27df0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
27e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e10 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
27e20 72 20 46 74 73 35 49 6e 64 65 78 51 75 65 72 79  r Fts5IndexQuery
27e30 20 2a 2f 0a 20 20 75 36 34 20 2a 70 43 6b 73 75   */.  u64 *pCksu
27e40 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
27e50 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
27e60 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   Checksum value 
27e70 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 74  */.){.  int eDet
27e80 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  ail = p->pConfig
27e90 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 75 36 34  ->eDetail;.  u64
27ea0 20 63 6b 73 75 6d 20 3d 20 2a 70 43 6b 73 75 6d   cksum = *pCksum
27eb0 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  ;.  Fts5IndexIte
27ec0 72 20 2a 70 49 64 78 49 74 65 72 20 3d 20 30 3b  r *pIdxIter = 0;
27ed0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75  .  Fts5Buffer bu
27ee0 66 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 20  f = {0, 0, 0};. 
27ef0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
27f00 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28  3Fts5IndexQuery(
27f10 70 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c 20  p, z, n, flags, 
27f20 30 2c 20 26 70 49 64 78 49 74 65 72 29 3b 0a 0a  0, &pIdxIter);..
27f30 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
27f40 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c  ITE_OK && 0==sql
27f50 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28  ite3Fts5IterEof(
27f60 70 49 64 78 49 74 65 72 29 20 29 7b 0a 20 20 20  pIdxIter) ){.   
27f70 20 69 36 34 20 72 6f 77 69 64 20 3d 20 73 71 6c   i64 rowid = sql
27f80 69 74 65 33 46 74 73 35 49 74 65 72 52 6f 77 69  ite3Fts5IterRowi
27f90 64 28 70 49 64 78 49 74 65 72 29 3b 0a 0a 20 20  d(pIdxIter);..  
27fa0 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46    if( eDetail==F
27fb0 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
27fc0 29 7b 0a 20 20 20 20 20 20 63 6b 73 75 6d 20 5e  ){.      cksum ^
27fd0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
27fe0 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f 77  exEntryCksum(row
27ff0 69 64 2c 20 30 2c 20 30 2c 20 69 49 64 78 2c 20  id, 0, 0, iIdx, 
28000 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  z, n);.    }else
28010 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
28020 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c  ite3Fts5IterPosl
28030 69 73 74 42 75 66 66 65 72 28 70 49 64 78 49 74  istBuffer(pIdxIt
28040 65 72 2c 20 26 62 75 66 29 3b 0a 20 20 20 20 20  er, &buf);.     
28050 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28060 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 46 74  OK ){.        Ft
28070 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20  s5PoslistReader 
28080 73 52 65 61 64 65 72 3b 0a 20 20 20 20 20 20 20  sReader;.       
28090 20 66 6f 72 28 73 71 6c 69 74 65 33 46 74 73 35   for(sqlite3Fts5
280a0 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69  PoslistReaderIni
280b0 74 28 62 75 66 2e 70 2c 20 62 75 66 2e 6e 2c 20  t(buf.p, buf.n, 
280c0 26 73 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20  &sReader);.     
280d0 20 20 20 20 20 20 20 73 52 65 61 64 65 72 2e 62         sReader.b
280e0 45 6f 66 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  Eof==0;.        
280f0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
28100 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74  oslistReaderNext
28110 28 26 73 52 65 61 64 65 72 29 0a 20 20 20 20 20  (&sReader).     
28120 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
28130 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f  int iCol = FTS5_
28140 50 4f 53 32 43 4f 4c 55 4d 4e 28 73 52 65 61 64  POS2COLUMN(sRead
28150 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20 20  er.iPos);.      
28160 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 46      int iOff = F
28170 54 53 35 5f 50 4f 53 32 4f 46 46 53 45 54 28 73  TS5_POS2OFFSET(s
28180 52 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20  Reader.iPos);.  
28190 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 5e 3d          cksum ^=
281a0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
281b0 78 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f 77 69  xEntryCksum(rowi
281c0 64 2c 20 69 43 6f 6c 2c 20 69 4f 66 66 2c 20 69  d, iCol, iOff, i
281d0 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  Idx, z, n);.    
281e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
281f0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
28200 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28210 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
28220 74 73 35 49 74 65 72 4e 65 78 74 28 70 49 64 78  ts5IterNext(pIdx
28230 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Iter);.    }.  }
28240 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  .  sqlite3Fts5It
28250 65 72 43 6c 6f 73 65 28 70 49 64 78 49 74 65 72  erClose(pIdxIter
28260 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  );.  fts5BufferF
28270 72 65 65 28 26 62 75 66 29 3b 0a 0a 20 20 2a 70  ree(&buf);..  *p
28280 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 3b 0a 20  Cksum = cksum;. 
28290 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
282a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
282b0 69 6f 6e 20 69 73 20 61 6c 73 6f 20 70 75 72 65  ion is also pure
282c0 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74  ly an internal t
282d0 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74  est. It does not
282e0 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a   contribute to .
282f0 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61  ** FTS functiona
28300 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68  lity, or even th
28310 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  e integrity-chec
28320 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  k, in any way..*
28330 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
28340 73 35 54 65 73 74 54 65 72 6d 28 0a 20 20 46 74  s5TestTerm(.  Ft
28350 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
28360 74 73 35 42 75 66 66 65 72 20 2a 70 50 72 65 76  ts5Buffer *pPrev
28370 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
28380 2a 20 50 72 65 76 69 6f 75 73 20 74 65 72 6d 20  * Previous term 
28390 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
283a0 2a 7a 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  *z, int n,      
283b0 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
283c0 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 65 73   new term to tes
283d0 74 20 2a 2f 0a 20 20 75 36 34 20 65 78 70 65 63  t */.  u64 expec
283e0 74 65 64 2c 0a 20 20 75 36 34 20 2a 70 43 6b 73  ted,.  u64 *pCks
283f0 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  um.){.  int rc =
28400 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 50   p->rc;.  if( pP
28410 72 65 76 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20  rev->n==0 ){.   
28420 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
28430 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28 63  rc, pPrev, n, (c
28440 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 20 20 7d  onst u8*)z);.  }
28450 65 6c 73 65 0a 20 20 69 66 28 20 72 63 3d 3d 53  else.  if( rc==S
28460 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 72  QLITE_OK && (pPr
28470 65 76 2d 3e 6e 21 3d 6e 20 7c 7c 20 6d 65 6d 63  ev->n!=n || memc
28480 6d 70 28 70 50 72 65 76 2d 3e 70 2c 20 7a 2c 20  mp(pPrev->p, z, 
28490 6e 29 29 20 29 7b 0a 20 20 20 20 75 36 34 20 63  n)) ){.    u64 c
284a0 6b 73 75 6d 33 20 3d 20 2a 70 43 6b 73 75 6d 3b  ksum3 = *pCksum;
284b0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
284c0 2a 7a 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20  *zTerm = (const 
284d0 63 68 61 72 2a 29 26 70 50 72 65 76 2d 3e 70 5b  char*)&pPrev->p[
284e0 31 5d 3b 20 20 2f 2a 20 74 65 72 6d 20 73 61 6e  1];  /* term san
284f0 73 20 70 72 65 66 69 78 2d 62 79 74 65 20 2a 2f  s prefix-byte */
28500 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d  .    int nTerm =
28510 20 70 50 72 65 76 2d 3e 6e 2d 31 3b 20 20 20 20   pPrev->n-1;    
28520 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
28530 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65  of zTerm in byte
28540 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  s */.    int iId
28550 78 20 3d 20 28 70 50 72 65 76 2d 3e 70 5b 30 5d  x = (pPrev->p[0]
28560 20 2d 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45   - FTS5_MAIN_PRE
28570 46 49 58 29 3b 0a 20 20 20 20 69 6e 74 20 66 6c  FIX);.    int fl
28580 61 67 73 20 3d 20 28 69 49 64 78 3d 3d 30 20 3f  ags = (iIdx==0 ?
28590 20 30 20 3a 20 46 54 53 35 49 4e 44 45 58 5f 51   0 : FTS5INDEX_Q
285a0 55 45 52 59 5f 50 52 45 46 49 58 29 3b 0a 20 20  UERY_PREFIX);.  
285b0 20 20 75 36 34 20 63 6b 31 20 3d 20 30 3b 0a 20    u64 ck1 = 0;. 
285c0 20 20 20 75 36 34 20 63 6b 32 20 3d 20 30 3b 0a     u64 ck2 = 0;.
285d0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
285e0 61 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 72  at the results r
285f0 65 74 75 72 6e 65 64 20 66 6f 72 20 41 53 43 20  eturned for ASC 
28600 61 6e 64 20 44 45 53 43 20 71 75 65 72 69 65 73  and DESC queries
28610 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   are.    ** the 
28620 73 61 6d 65 2e 20 49 66 20 6e 6f 74 2c 20 63 61  same. If not, ca
28630 6c 6c 20 74 68 69 73 20 63 6f 72 72 75 70 74 69  ll this corrupti
28640 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  on.  */.    rc =
28650 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28   fts5QueryCksum(
28660 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20  p, iIdx, zTerm, 
28670 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 26 63  nTerm, flags, &c
28680 6b 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  k1);.    if( rc=
28690 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
286a0 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67      int f = flag
286b0 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  s|FTS5INDEX_QUER
286c0 59 5f 44 45 53 43 3b 0a 20 20 20 20 20 20 72 63  Y_DESC;.      rc
286d0 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75   = fts5QueryCksu
286e0 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d  m(p, iIdx, zTerm
286f0 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32  , nTerm, f, &ck2
28700 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
28710 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
28720 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20  & ck1!=ck2 ) rc 
28730 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
28740 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
28750 69 73 20 61 20 70 72 65 66 69 78 20 71 75 65 72  is a prefix quer
28760 79 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  y, check that th
28770 65 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e  e results return
28780 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a  ed if the.    **
28790 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 64 69   the index is di
287a0 73 61 62 6c 65 64 20 61 72 65 20 74 68 65 20 73  sabled are the s
287b0 61 6d 65 2e 20 49 6e 20 62 6f 74 68 20 41 53 43  ame. In both ASC
287c0 20 61 6e 64 20 44 45 53 43 20 6f 72 64 65 72 2e   and DESC order.
287d0 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
287e0 54 68 69 73 20 63 68 65 63 6b 20 6d 61 79 20 6f  This check may o
287f0 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64  nly be performed
28800 20 69 66 20 74 68 65 20 68 61 73 68 20 74 61 62   if the hash tab
28810 6c 65 20 69 73 20 65 6d 70 74 79 2e 20 54 68 69  le is empty. Thi
28820 73 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 63 61  s.    ** is beca
28830 75 73 65 20 74 68 65 20 68 61 73 68 20 74 61 62  use the hash tab
28840 6c 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73  le only supports
28850 20 61 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 71   a single scan q
28860 75 65 72 79 20 61 74 0a 20 20 20 20 2a 2a 20 61  uery at.    ** a
28870 20 74 69 6d 65 2c 20 61 6e 64 20 74 68 65 20 6d   time, and the m
28880 75 6c 74 69 2d 69 74 65 72 20 6c 6f 6f 70 20 66  ulti-iter loop f
28890 72 6f 6d 20 77 68 69 63 68 20 74 68 69 73 20 66  rom which this f
288a0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
288b0 64 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65  d.    ** is alre
288c0 61 64 79 20 70 65 72 66 6f 72 6d 69 6e 67 20 73  ady performing s
288d0 75 63 68 20 61 20 73 63 61 6e 2e 20 2a 2f 0a 20  uch a scan. */. 
288e0 20 20 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69     if( p->nPendi
288f0 6e 67 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20  ngData==0 ){.   
28900 20 20 20 69 66 28 20 69 49 64 78 3e 30 20 26 26     if( iIdx>0 &&
28910 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28920 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 20  {.        int f 
28930 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45  = flags|FTS5INDE
28940 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49  X_QUERY_TEST_NOI
28950 44 58 3b 0a 20 20 20 20 20 20 20 20 63 6b 32 20  DX;.        ck2 
28960 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
28970 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d  = fts5QueryCksum
28980 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c  (p, iIdx, zTerm,
28990 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29   nTerm, f, &ck2)
289a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
289b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
289c0 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46  k1!=ck2 ) rc = F
289d0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
289e0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
289f0 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c  Idx>0 && rc==SQL
28a00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28a10 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c    int f = flags|
28a20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
28a30 54 45 53 54 5f 4e 4f 49 44 58 7c 46 54 53 35 49  TEST_NOIDX|FTS5I
28a40 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 3b  NDEX_QUERY_DESC;
28a50 0a 20 20 20 20 20 20 20 20 63 6b 32 20 3d 20 30  .        ck2 = 0
28a60 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  ;.        rc = f
28a70 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c  ts5QueryCksum(p,
28a80 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54   iIdx, zTerm, nT
28a90 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20  erm, f, &ck2);. 
28aa0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
28ab0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21  QLITE_OK && ck1!
28ac0 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35  =ck2 ) rc = FTS5
28ad0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
28ae0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6b 73  }.    }..    cks
28af0 75 6d 33 20 5e 3d 20 63 6b 31 3b 0a 20 20 20 20  um3 ^= ck1;.    
28b00 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 72  fts5BufferSet(&r
28b10 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f  c, pPrev, n, (co
28b20 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 0a 20 20 20  nst u8*)z);..   
28b30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28b40 4f 4b 20 26 26 20 63 6b 73 75 6d 33 21 3d 65 78  OK && cksum3!=ex
28b50 70 65 63 74 65 64 20 29 7b 0a 20 20 20 20 20 20  pected ){.      
28b60 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
28b70 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 43  T;.    }.    *pC
28b80 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 33 3b 0a 20  ksum = cksum3;. 
28b90 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b   }.  p->rc = rc;
28ba0 0a 7d 0a 20 0a 23 65 6c 73 65 0a 23 20 64 65 66  .}. .#else.# def
28bb0 69 6e 65 20 66 74 73 35 54 65 73 74 44 6c 69 64  ine fts5TestDlid
28bc0 78 52 65 76 65 72 73 65 28 78 2c 79 2c 7a 29 0a  xReverse(x,y,z).
28bd0 23 20 64 65 66 69 6e 65 20 66 74 73 35 54 65 73  # define fts5Tes
28be0 74 54 65 72 6d 28 75 2c 76 2c 77 2c 78 2c 79 2c  tTerm(u,v,w,x,y,
28bf0 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  z).#endif../*.**
28c00 20 43 68 65 63 6b 20 74 68 61 74 3a 0a 2a 2a 0a   Check that:.**.
28c10 2a 2a 20 20 20 31 29 20 41 6c 6c 20 6c 65 61 76  **   1) All leav
28c20 65 73 20 6f 66 20 70 53 65 67 20 62 65 74 77 65  es of pSeg betwe
28c30 65 6e 20 69 46 69 72 73 74 20 61 6e 64 20 69 4c  en iFirst and iL
28c40 61 73 74 20 28 69 6e 63 6c 75 73 69 76 65 29 20  ast (inclusive) 
28c50 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20 20 20 20  exist and.**    
28c60 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 74    contain zero t
28c70 65 72 6d 73 2e 0a 2a 2a 20 20 20 32 29 20 41 6c  erms..**   2) Al
28c80 6c 20 6c 65 61 76 65 73 20 6f 66 20 70 53 65 67  l leaves of pSeg
28c90 20 62 65 74 77 65 65 6e 20 69 4e 6f 52 6f 77 69   between iNoRowi
28ca0 64 20 61 6e 64 20 69 4c 61 73 74 20 28 69 6e 63  d and iLast (inc
28cb0 6c 75 73 69 76 65 29 20 65 78 69 73 74 20 61 6e  lusive) exist an
28cc0 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69  d.**      contai
28cd0 6e 20 7a 65 72 6f 20 72 6f 77 69 64 73 2e 0a 2a  n zero rowids..*
28ce0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
28cf0 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79  s5IndexIntegrity
28d00 43 68 65 63 6b 45 6d 70 74 79 28 0a 20 20 46 74  CheckEmpty(.  Ft
28d10 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74  s5Index *p,.  Ft
28d20 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
28d30 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a  nt *pSeg,     /*
28d40 20 53 65 67 6d 65 6e 74 20 74 6f 20 63 68 65 63   Segment to chec
28d50 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69  k internal consi
28d60 73 74 65 6e 63 79 20 2a 2f 0a 20 20 69 6e 74 20  stency */.  int 
28d70 69 46 69 72 73 74 2c 0a 20 20 69 6e 74 20 69 4e  iFirst,.  int iN
28d80 6f 52 6f 77 69 64 2c 0a 20 20 69 6e 74 20 69 4c  oRowid,.  int iL
28d90 61 73 74 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  ast.){.  int i;.
28da0 0a 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20  .  /* Now check 
28db0 74 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45  that the iter.nE
28dc0 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c  mpty leaves foll
28dd0 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  owing the curren
28de0 74 20 6c 65 61 66 0a 20 20 2a 2a 20 28 61 29 20  t leaf.  ** (a) 
28df0 65 78 69 73 74 20 61 6e 64 20 28 62 29 20 63 6f  exist and (b) co
28e00 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20  ntain no terms. 
28e10 2a 2f 0a 20 20 66 6f 72 28 69 3d 69 46 69 72 73  */.  for(i=iFirs
28e20 74 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t; p->rc==SQLITE
28e30 5f 4f 4b 20 26 26 20 69 3c 3d 69 4c 61 73 74 3b  _OK && i<=iLast;
28e40 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 44   i++){.    Fts5D
28e50 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 66 74 73  ata *pLeaf = fts
28e60 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53  5DataRead(p, FTS
28e70 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
28e80 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69 29  pSeg->iSegid, i)
28e90 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  );.    if( pLeaf
28ea0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 66   ){.      if( !f
28eb0 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73  ts5LeafIsTermles
28ec0 73 28 70 4c 65 61 66 29 20 29 20 70 2d 3e 72 63  s(pLeaf) ) p->rc
28ed0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
28ee0 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 69 4e  .      if( i>=iN
28ef0 6f 52 6f 77 69 64 20 26 26 20 30 21 3d 66 74 73  oRowid && 0!=fts
28f00 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
28f10 66 66 28 70 4c 65 61 66 29 20 29 20 70 2d 3e 72  ff(pLeaf) ) p->r
28f20 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
28f30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
28f40 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61  DataRelease(pLea
28f50 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  f);.  }.}..stati
28f60 63 20 76 6f 69 64 20 66 74 73 35 49 6e 74 65 67  c void fts5Integ
28f70 72 69 74 79 43 68 65 63 6b 50 67 69 64 78 28 46  rityCheckPgidx(F
28f80 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
28f90 35 44 61 74 61 20 2a 70 4c 65 61 66 29 7b 0a 20  5Data *pLeaf){. 
28fa0 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20   int iTermOff = 
28fb0 30 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20  0;.  int ii;..  
28fc0 46 74 73 35 42 75 66 66 65 72 20 62 75 66 31 20  Fts5Buffer buf1 
28fd0 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 20 20 46 74 73  = {0,0,0};.  Fts
28fe0 35 42 75 66 66 65 72 20 62 75 66 32 20 3d 20 7b  5Buffer buf2 = {
28ff0 30 2c 30 2c 30 7d 3b 0a 0a 20 20 69 69 20 3d 20  0,0,0};..  ii = 
29000 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20  pLeaf->szLeaf;. 
29010 20 77 68 69 6c 65 28 20 69 69 3c 70 4c 65 61 66   while( ii<pLeaf
29020 2d 3e 6e 6e 20 26 26 20 70 2d 3e 72 63 3d 3d 53  ->nn && p->rc==S
29030 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29040 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74  int res;.    int
29050 20 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e   iOff;.    int n
29060 49 6e 63 72 3b 0a 0a 20 20 20 20 69 69 20 2b 3d  Incr;..    ii +=
29070 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
29080 28 26 70 4c 65 61 66 2d 3e 70 5b 69 69 5d 2c 20  (&pLeaf->p[ii], 
29090 6e 49 6e 63 72 29 3b 0a 20 20 20 20 69 54 65 72  nIncr);.    iTer
290a0 6d 4f 66 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a 20  mOff += nIncr;. 
290b0 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f     iOff = iTermO
290c0 66 66 3b 0a 0a 20 20 20 20 69 66 28 20 69 4f 66  ff;..    if( iOf
290d0 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  f>=pLeaf->szLeaf
290e0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
290f0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
29100 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 54      }else if( iT
29110 65 72 6d 4f 66 66 3d 3d 6e 49 6e 63 72 20 29 7b  ermOff==nIncr ){
29120 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
29130 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
29140 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
29150 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
29160 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69   nByte);.      i
29170 66 28 20 28 69 4f 66 66 2b 6e 42 79 74 65 29 3e  f( (iOff+nByte)>
29180 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
29190 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
291a0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
291b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
291c0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
291d0 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 31 2c  t(&p->rc, &buf1,
291e0 20 6e 42 79 74 65 2c 20 26 70 4c 65 61 66 2d 3e   nByte, &pLeaf->
291f0 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20  p[iOff]);.      
29200 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
29210 20 20 20 69 6e 74 20 6e 4b 65 65 70 2c 20 6e 42     int nKeep, nB
29220 79 74 65 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  yte;.      iOff 
29230 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
29240 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  32(&pLeaf->p[iOf
29250 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  f], nKeep);.    
29260 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
29270 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66  tVarint32(&pLeaf
29280 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65  ->p[iOff], nByte
29290 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4b 65  );.      if( nKe
292a0 65 70 3e 62 75 66 31 2e 6e 20 7c 7c 20 28 69 4f  ep>buf1.n || (iO
292b0 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66 2d  ff+nByte)>pLeaf-
292c0 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
292d0 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
292e0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
292f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 75  else{.        bu
29300 66 31 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20  f1.n = nKeep;.  
29310 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
29320 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
29330 63 2c 20 26 62 75 66 31 2c 20 6e 42 79 74 65 2c  c, &buf1, nByte,
29340 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d   &pLeaf->p[iOff]
29350 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
29360 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
29370 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29380 20 20 72 65 73 20 3d 20 66 74 73 35 42 75 66 66    res = fts5Buff
29390 65 72 43 6f 6d 70 61 72 65 28 26 62 75 66 31 2c  erCompare(&buf1,
293a0 20 26 62 75 66 32 29 3b 0a 20 20 20 20 20 20 20   &buf2);.       
293b0 20 69 66 28 20 72 65 73 3c 3d 30 20 29 20 70 2d   if( res<=0 ) p-
293c0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
293d0 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
293e0 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  }.    fts5Buffer
293f0 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  Set(&p->rc, &buf
29400 32 2c 20 62 75 66 31 2e 6e 2c 20 62 75 66 31 2e  2, buf1.n, buf1.
29410 70 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 42  p);.  }..  fts5B
29420 75 66 66 65 72 46 72 65 65 28 26 62 75 66 31 29  ufferFree(&buf1)
29430 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ;.  fts5BufferFr
29440 65 65 28 26 62 75 66 32 29 3b 0a 7d 0a 0a 73 74  ee(&buf2);.}..st
29450 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
29460 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63  dexIntegrityChec
29470 6b 53 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 35  kSegment(.  Fts5
29480 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
29490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
294a0 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
294b0 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
294c0 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
294d0 65 67 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65  eg      /* Segme
294e0 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65  nt to check inte
294f0 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79  rnal consistency
29500 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e   */.){.  Fts5Con
29510 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
29520 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 73 71 6c  ->pConfig;.  sql
29530 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
29540 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 32 3b   = 0;.  int rc2;
29550 0a 20 20 69 6e 74 20 69 49 64 78 50 72 65 76 4c  .  int iIdxPrevL
29560 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  eaf = pSeg->pgno
29570 46 69 72 73 74 2d 31 3b 0a 20 20 69 6e 74 20 69  First-1;.  int i
29580 44 6c 69 64 78 50 72 65 76 4c 65 61 66 20 3d 20  DlidxPrevLeaf = 
29590 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a  pSeg->pgnoLast;.
295a0 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e  .  if( pSeg->pgn
295b0 6f 46 69 72 73 74 3d 3d 30 20 29 20 72 65 74 75  oFirst==0 ) retu
295c0 72 6e 3b 0a 0a 20 20 66 74 73 35 49 6e 64 65 78  rn;..  fts5Index
295d0 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26  PrepareStmt(p, &
295e0 70 53 74 6d 74 2c 20 73 71 6c 69 74 65 33 5f 6d  pStmt, sqlite3_m
295f0 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22 53  printf(.      "S
29600 45 4c 45 43 54 20 73 65 67 69 64 2c 20 74 65 72  ELECT segid, ter
29610 6d 2c 20 28 70 67 6e 6f 3e 3e 31 29 2c 20 28 70  m, (pgno>>1), (p
29620 67 6e 6f 26 31 29 20 46 52 4f 4d 20 25 51 2e 27  gno&1) FROM %Q.'
29630 25 71 5f 69 64 78 27 20 57 48 45 52 45 20 73 65  %q_idx' WHERE se
29640 67 69 64 3d 25 64 22 2c 0a 20 20 20 20 20 20 70  gid=%d",.      p
29650 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f  Config->zDb, pCo
29660 6e 66 69 67 2d 3e 7a 4e 61 6d 65 2c 20 70 53 65  nfig->zName, pSe
29670 67 2d 3e 69 53 65 67 69 64 0a 20 20 29 29 3b 0a  g->iSegid.  ));.
29680 0a 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68  .  /* Iterate th
29690 72 6f 75 67 68 20 74 68 65 20 62 2d 74 72 65 65  rough the b-tree
296a0 20 68 69 65 72 61 72 63 68 79 2e 20 20 2a 2f 0a   hierarchy.  */.
296b0 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
296c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
296d0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
296e0 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
296f0 20 20 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20      i64 iRow;   
29700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29710 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74    /* Rowid for t
29720 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20  his leaf */.    
29730 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b  Fts5Data *pLeaf;
29740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29750 20 44 61 74 61 20 66 6f 72 20 74 68 69 73 20 6c   Data for this l
29760 65 61 66 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20  eaf */..    int 
29770 6e 49 64 78 54 65 72 6d 20 3d 20 73 71 6c 69 74  nIdxTerm = sqlit
29780 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
29790 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 63  pStmt, 1);.    c
297a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 54  onst char *zIdxT
297b0 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  erm = (const cha
297c0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
297d0 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
297e0 3b 0a 20 20 20 20 69 6e 74 20 69 49 64 78 4c 65  ;.    int iIdxLe
297f0 61 66 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  af = sqlite3_col
29800 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32  umn_int(pStmt, 2
29810 29 3b 0a 20 20 20 20 69 6e 74 20 62 49 64 78 44  );.    int bIdxD
29820 6c 69 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 63  lidx = sqlite3_c
29830 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
29840 20 33 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20   3);..    /* If 
29850 74 68 65 20 6c 65 61 66 20 69 6e 20 71 75 65 73  the leaf in ques
29860 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
29870 20 62 65 65 6e 20 74 72 69 6d 6d 65 64 20 66 72   been trimmed fr
29880 6f 6d 20 74 68 65 20 73 65 67 6d 65 6e 74 2c 20  om the segment, 
29890 0a 20 20 20 20 2a 2a 20 69 67 6e 6f 72 65 20 74  .    ** ignore t
298a0 68 69 73 20 62 2d 74 72 65 65 20 65 6e 74 72 79  his b-tree entry
298b0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6c 6f 61  . Otherwise, loa
298c0 64 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  d it into memory
298d0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 49 64  . */.    if( iId
298e0 78 4c 65 61 66 3c 70 53 65 67 2d 3e 70 67 6e 6f  xLeaf<pSeg->pgno
298f0 46 69 72 73 74 20 29 20 63 6f 6e 74 69 6e 75 65  First ) continue
29900 3b 0a 20 20 20 20 69 52 6f 77 20 3d 20 46 54 53  ;.    iRow = FTS
29910 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
29920 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69 49  pSeg->iSegid, iI
29930 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 70 4c 65  dxLeaf);.    pLe
29940 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  af = fts5DataRea
29950 64 28 70 2c 20 69 52 6f 77 29 3b 0a 20 20 20 20  d(p, iRow);.    
29960 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 62  if( pLeaf==0 ) b
29970 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  reak;..    /* Ch
29980 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61  eck that the lea
29990 66 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  f contains at le
299a0 61 73 74 20 6f 6e 65 20 74 65 72 6d 2c 20 61 6e  ast one term, an
299b0 64 20 74 68 61 74 20 69 74 20 69 73 20 65 71 75  d that it is equ
299c0 61 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 6f 72 20  al.    ** to or 
299d0 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
299e0 73 70 6c 69 74 2d 6b 65 79 20 69 6e 20 7a 49 64  split-key in zId
299f0 78 54 65 72 6d 2e 20 20 41 6c 73 6f 20 63 68 65  xTerm.  Also che
29a00 63 6b 20 74 68 61 74 20 69 66 20 74 68 65 72 65  ck that if there
29a10 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c 73 6f 20  .    ** is also 
29a20 61 20 72 6f 77 69 64 20 70 6f 69 6e 74 65 72 20  a rowid pointer 
29a30 77 69 74 68 69 6e 20 74 68 65 20 6c 65 61 66 20  within the leaf 
29a40 70 61 67 65 20 68 65 61 64 65 72 2c 20 69 74 20  page header, it 
29a50 70 6f 69 6e 74 73 20 74 6f 20 61 0a 20 20 20 20  points to a.    
29a60 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f  ** location befo
29a70 72 65 20 74 68 65 20 74 65 72 6d 2e 20 20 2a 2f  re the term.  */
29a80 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e  .    if( pLeaf->
29a90 6e 6e 3c 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  nn<=pLeaf->szLea
29aa0 66 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  f ){.      p->rc
29ab0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
29ac0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29ad0 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20    int iOff;     
29ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29af0 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
29b00 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f   term on leaf */
29b10 0a 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69  .      int iRowi
29b20 64 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  dOff;           
29b30 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
29b40 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 6c  first rowid on l
29b50 65 61 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  eaf */.      int
29b60 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   nTerm;         
29b70 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
29b80 20 6f 66 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66   of term on leaf
29b90 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
29ba0 20 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20     int res;     
29bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29bc0 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  * Comparison of 
29bd0 74 65 72 6d 20 61 6e 64 20 73 70 6c 69 74 2d 6b  term and split-k
29be0 65 79 20 2a 2f 0a 0a 20 20 20 20 20 20 69 4f 66  ey */..      iOf
29bf0 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  f = fts5LeafFirs
29c00 74 54 65 72 6d 4f 66 66 28 70 4c 65 61 66 29 3b  tTermOff(pLeaf);
29c10 0a 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66  .      iRowidOff
29c20 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
29c30 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 3b  RowidOff(pLeaf);
29c40 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69  .      if( iRowi
29c50 64 4f 66 66 3e 3d 69 4f 66 66 20 29 7b 0a 20 20  dOff>=iOff ){.  
29c60 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
29c70 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
29c80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29c90 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
29ca0 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d  Varint32(&pLeaf-
29cb0 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72 6d 29  >p[iOff], nTerm)
29cc0 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  ;.        res = 
29cd0 6d 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d 3e 70  memcmp(&pLeaf->p
29ce0 5b 69 4f 66 66 5d 2c 20 7a 49 64 78 54 65 72 6d  [iOff], zIdxTerm
29cf0 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20 6e 49 64  , MIN(nTerm, nId
29d00 78 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 20  xTerm));.       
29d10 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65   if( res==0 ) re
29d20 73 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 49 64 78  s = nTerm - nIdx
29d30 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
29d40 28 20 72 65 73 3c 30 20 29 20 70 2d 3e 72 63 20  ( res<0 ) p->rc 
29d50 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
29d60 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66        }..      f
29d70 74 73 35 49 6e 74 65 67 72 69 74 79 43 68 65 63  ts5IntegrityChec
29d80 6b 50 67 69 64 78 28 70 2c 20 70 4c 65 61 66 29  kPgidx(p, pLeaf)
29d90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
29da0 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61  DataRelease(pLea
29db0 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  f);.    if( p->r
29dc0 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  c ) break;..    
29dd0 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  /* Now check tha
29de0 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d 70 74  t the iter.nEmpt
29df0 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69  y leaves followi
29e00 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  ng the current l
29e10 65 61 66 0a 20 20 20 20 2a 2a 20 28 61 29 20 65  eaf.    ** (a) e
29e20 78 69 73 74 20 61 6e 64 20 28 62 29 20 63 6f 6e  xist and (b) con
29e30 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a  tain no terms. *
29e40 2f 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 49  /.    fts5IndexI
29e50 6e 74 65 67 72 69 74 79 43 68 65 63 6b 45 6d 70  ntegrityCheckEmp
29e60 74 79 28 0a 20 20 20 20 20 20 20 20 70 2c 20 70  ty(.        p, p
29e70 53 65 67 2c 20 69 49 64 78 50 72 65 76 4c 65 61  Seg, iIdxPrevLea
29e80 66 2b 31 2c 20 69 44 6c 69 64 78 50 72 65 76 4c  f+1, iDlidxPrevL
29e90 65 61 66 2b 31 2c 20 69 49 64 78 4c 65 61 66 2d  eaf+1, iIdxLeaf-
29ea0 31 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  1.    );.    if(
29eb0 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a   p->rc ) break;.
29ec0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
29ed0 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e   is a doclist-in
29ee0 64 65 78 2c 20 63 68 65 63 6b 20 74 68 61 74 20  dex, check that 
29ef0 69 74 20 6c 6f 6f 6b 73 20 72 69 67 68 74 2e 20  it looks right. 
29f00 2a 2f 0a 20 20 20 20 69 66 28 20 62 49 64 78 44  */.    if( bIdxD
29f10 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20 46 74  lidx ){.      Ft
29f20 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c  s5DlidxIter *pDl
29f30 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20 46 6f 72  idx = 0;  /* For
29f40 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
29f50 67 68 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78  gh doclist index
29f60 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 50   */.      int iP
29f70 72 65 76 4c 65 61 66 20 3d 20 69 49 64 78 4c 65  revLeaf = iIdxLe
29f80 61 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53  af;.      int iS
29f90 65 67 69 64 20 3d 20 70 53 65 67 2d 3e 69 53 65  egid = pSeg->iSe
29fa0 67 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  gid;.      int i
29fb0 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 36  Pg = 0;.      i6
29fc0 34 20 69 4b 65 79 3b 0a 0a 20 20 20 20 20 20 66  4 iKey;..      f
29fd0 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c  or(pDlidx=fts5Dl
29fe0 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 30  idxIterInit(p, 0
29ff0 2c 20 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65  , iSegid, iIdxLe
2a000 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  af);.          f
2a010 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
2a020 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20  p, pDlidx)==0;. 
2a030 20 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69           fts5Dli
2a040 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44  dxIterNext(p, pD
2a050 6c 69 64 78 29 0a 20 20 20 20 20 20 29 7b 0a 0a  lidx).      ){..
2a060 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
2a070 20 61 6e 79 20 72 6f 77 69 64 2d 6c 65 73 73 20   any rowid-less 
2a080 70 61 67 65 73 20 74 68 61 74 20 6f 63 63 75 72  pages that occur
2a090 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
2a0a0 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20 20 20  ent leaf. */.   
2a0b0 20 20 20 20 20 66 6f 72 28 69 50 67 3d 69 50 72       for(iPg=iPr
2a0c0 65 76 4c 65 61 66 2b 31 3b 20 69 50 67 3c 66 74  evLeaf+1; iPg<ft
2a0d0 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
2a0e0 70 44 6c 69 64 78 29 3b 20 69 50 67 2b 2b 29 7b  pDlidx); iPg++){
2a0f0 0a 20 20 20 20 20 20 20 20 20 20 69 4b 65 79 20  .          iKey 
2a100 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
2a110 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69 50 67  OWID(iSegid, iPg
2a120 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65  );.          pLe
2a130 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  af = fts5DataRea
2a140 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20  d(p, iKey);.    
2a150 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20        if( pLeaf 
2a160 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2a170 66 28 20 66 74 73 35 4c 65 61 66 46 69 72 73 74  f( fts5LeafFirst
2a180 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 21  RowidOff(pLeaf)!
2a190 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  =0 ) p->rc = FTS
2a1a0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
2a1b0 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
2a1c0 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20  elease(pLeaf);. 
2a1d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a1e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 50 72     }.        iPr
2a1f0 65 76 4c 65 61 66 20 3d 20 66 74 73 35 44 6c 69  evLeaf = fts5Dli
2a200 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
2a210 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  x);..        /* 
2a220 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c  Check that the l
2a230 65 61 66 20 70 61 67 65 20 69 6e 64 69 63 61 74  eaf page indicat
2a240 65 64 20 62 79 20 74 68 65 20 69 74 65 72 61 74  ed by the iterat
2a250 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 0a 20  or really does. 
2a260 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
2a270 6e 20 74 68 65 20 72 6f 77 69 64 20 73 75 67 67  n the rowid sugg
2a280 65 73 74 65 64 20 62 79 20 74 68 65 20 73 61 6d  ested by the sam
2a290 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 4b  e. */.        iK
2a2a0 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  ey = FTS5_SEGMEN
2a2b0 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20  T_ROWID(iSegid, 
2a2c0 69 50 72 65 76 4c 65 61 66 29 3b 0a 20 20 20 20  iPrevLeaf);.    
2a2d0 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35      pLeaf = fts5
2a2e0 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79  DataRead(p, iKey
2a2f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2a300 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
2a310 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20    i64 iRowid;.  
2a320 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77          int iRow
2a330 69 64 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66  idOff = fts5Leaf
2a340 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c  FirstRowidOff(pL
2a350 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eaf);.          
2a360 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b  ASSERT_SZLEAF_OK
2a370 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
2a380 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66     if( iRowidOff
2a390 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  >=pLeaf->szLeaf 
2a3a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
2a3b0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2a3c0 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  UPT;.          }
2a3d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2a3e0 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28    fts5GetVarint(
2a3f0 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f 77 69 64  &pLeaf->p[iRowid
2a400 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f  Off], (u64*)&iRo
2a410 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wid);.          
2a420 20 20 69 66 28 20 69 52 6f 77 69 64 21 3d 66 74    if( iRowid!=ft
2a430 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64  s5DlidxIterRowid
2a440 28 70 44 6c 69 64 78 29 20 29 20 70 2d 3e 72 63  (pDlidx) ) p->rc
2a450 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2a460 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2a470 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
2a480 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20  elease(pLeaf);. 
2a490 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2a4a0 0a 0a 20 20 20 20 20 20 69 44 6c 69 64 78 50 72  ..      iDlidxPr
2a4b0 65 76 4c 65 61 66 20 3d 20 69 50 67 3b 0a 20 20  evLeaf = iPg;.  
2a4c0 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
2a4d0 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20  rFree(pDlidx);. 
2a4e0 20 20 20 20 20 66 74 73 35 54 65 73 74 44 6c 69       fts5TestDli
2a4f0 64 78 52 65 76 65 72 73 65 28 70 2c 20 69 53 65  dxReverse(p, iSe
2a500 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a  gid, iIdxLeaf);.
2a510 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a520 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66 20   iDlidxPrevLeaf 
2a530 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  = pSeg->pgnoLast
2a540 3b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a  ;.      /* TODO:
2a550 20 43 68 65 63 6b 20 74 68 65 72 65 20 69 73 20   Check there is 
2a560 6e 6f 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78  no doclist index
2a570 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   */.    }..    i
2a580 49 64 78 50 72 65 76 4c 65 61 66 20 3d 20 69 49  IdxPrevLeaf = iI
2a590 64 78 4c 65 61 66 3b 0a 20 20 7d 0a 0a 20 20 72  dxLeaf;.  }..  r
2a5a0 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  c2 = sqlite3_fin
2a5b0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
2a5c0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
2a5d0 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72  E_OK ) p->rc = r
2a5e0 63 32 3b 0a 0a 20 20 2f 2a 20 50 61 67 65 20 69  c2;..  /* Page i
2a5f0 74 65 72 2e 69 4c 65 61 66 20 6d 75 73 74 20 6e  ter.iLeaf must n
2a600 6f 77 20 62 65 20 74 68 65 20 72 69 67 68 74 6d  ow be the rightm
2a610 6f 73 74 20 6c 65 61 66 2d 70 61 67 65 20 69 6e  ost leaf-page in
2a620 20 74 68 65 20 73 65 67 6d 65 6e 74 20 2a 2f 0a   the segment */.
2a630 23 69 66 20 30 0a 20 20 69 66 28 20 70 2d 3e 72  #if 0.  if( p->r
2a640 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2a650 69 74 65 72 2e 69 4c 65 61 66 21 3d 70 53 65 67  iter.iLeaf!=pSeg
2a660 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20  ->pgnoLast ){.  
2a670 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
2a680 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  ORRUPT;.  }.#end
2a690 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e  if.}.../*.** Run
2a6a0 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b 73   internal checks
2a6b0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
2a6c0 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 28 61  the FTS index (a
2a6d0 29 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20  ) is internally 
2a6e0 0a 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 61  .** consistent a
2a6f0 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 73 20  nd (b) contains 
2a700 65 6e 74 72 69 65 73 20 66 6f 72 20 77 68 69 63  entries for whic
2a710 68 20 74 68 65 20 58 4f 52 20 6f 66 20 74 68 65  h the XOR of the
2a720 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 73   checksums.** as
2a730 20 63 61 6c 63 75 6c 61 74 65 64 20 62 79 20 73   calculated by s
2a740 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45  qlite3Fts5IndexE
2a750 6e 74 72 79 43 6b 73 75 6d 28 29 20 69 73 20 63  ntryCksum() is c
2a760 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ksum..**.** Retu
2a770 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2a780 54 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  T if any of the 
2a790 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b 73 20  internal checks 
2a7a0 66 61 69 6c 2c 20 6f 72 20 69 66 20 74 68 65 0a  fail, or if the.
2a7b0 2a 2a 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  ** checksum does
2a7c0 20 6e 6f 74 20 6d 61 74 63 68 2e 20 52 65 74 75   not match. Retu
2a7d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
2a7e0 61 6c 6c 20 63 68 65 63 6b 73 20 70 61 73 73 20  all checks pass 
2a7f0 77 69 74 68 6f 75 74 0a 2a 2a 20 65 72 72 6f 72  without.** error
2a800 2c 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  , or some other 
2a810 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
2a820 65 20 69 66 20 61 6e 6f 74 68 65 72 20 65 72 72  e if another err
2a830 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a  or (e.g. OOM).**
2a840 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20   occurs..*/.int 
2a850 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
2a860 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 46  IntegrityCheck(F
2a870 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 75 36 34  ts5Index *p, u64
2a880 20 63 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20 65   cksum){.  int e
2a890 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e  Detail = p->pCon
2a8a0 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20  fig->eDetail;.  
2a8b0 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 30 3b 20  u64 cksum2 = 0; 
2a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8d0 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65  /* Checksum base
2a8e0 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66  d on contents of
2a8f0 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74   indexes */.  Ft
2a900 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69 73 74  s5Buffer poslist
2a910 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 2f 2a   = {0,0,0};   /*
2a920 20 42 75 66 66 65 72 20 75 73 65 64 20 74 6f 20   Buffer used to 
2a930 68 6f 6c 64 20 61 20 70 6f 73 6c 69 73 74 20 2a  hold a poslist *
2a940 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  /.  Fts5IndexIte
2a950 72 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20  r *pIter;       
2a960 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
2a970 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 65  terate through e
2a980 6e 74 69 72 65 20 69 6e 64 65 78 20 2a 2f 0a 20  ntire index */. 
2a990 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
2a9a0 70 53 74 72 75 63 74 3b 20 20 20 20 20 20 20 20  pStruct;        
2a9b0 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74   /* Index struct
2a9c0 75 72 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ure */..#ifdef S
2a9d0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
2a9e0 20 55 73 65 64 20 62 79 20 65 78 74 72 61 20 69   Used by extra i
2a9f0 6e 74 65 72 6e 61 6c 20 74 65 73 74 73 20 6f 6e  nternal tests on
2aa00 6c 79 20 72 75 6e 20 69 66 20 4e 44 45 42 55 47  ly run if NDEBUG
2aa10 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20   is not defined 
2aa20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d 33 20  */.  u64 cksum3 
2aa30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2aa40 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
2aa50 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e   based on conten
2aa60 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f  ts of indexes */
2aa70 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65  .  Fts5Buffer te
2aa80 72 6d 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20  rm = {0,0,0};   
2aa90 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65     /* Buffer use
2aaa0 64 20 74 6f 20 68 6f 6c 64 20 6d 6f 73 74 20 72  d to hold most r
2aab0 65 63 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 23 65  ecent term */.#e
2aac0 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 4c 6f 61  ndif.  .  /* Loa
2aad0 64 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  d the FTS index 
2aae0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 70  structure */.  p
2aaf0 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
2ab00 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 0a  uctureRead(p);..
2ab10 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
2ab20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
2ab30 65 73 20 6f 66 20 65 61 63 68 20 73 65 67 6d 65  es of each segme
2ab40 6e 74 20 6d 61 74 63 68 20 74 68 65 20 6c 65 61  nt match the lea
2ab50 76 65 73 20 2a 2f 0a 20 20 69 66 28 20 70 53 74  ves */.  if( pSt
2ab60 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ruct ){.    int 
2ab70 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20  iLvl, iSeg;.    
2ab80 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
2ab90 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
2aba0 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
2abb0 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
2abc0 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  g<pStruct->aLeve
2abd0 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53  l[iLvl].nSeg; iS
2abe0 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 46  eg++){.        F
2abf0 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
2ac00 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 53 74  ent *pSeg = &pSt
2ac10 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
2ac20 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20  l].aSeg[iSeg];. 
2ac30 20 20 20 20 20 20 20 66 74 73 35 49 6e 64 65 78         fts5Index
2ac40 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53 65  IntegrityCheckSe
2ac50 67 6d 65 6e 74 28 70 2c 20 70 53 65 67 29 3b 0a  gment(p, pSeg);.
2ac60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2ac70 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6b 73 75  }..  /* The cksu
2ac80 6d 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  m argument passe
2ac90 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
2aca0 6f 6e 20 69 73 20 61 20 63 68 65 63 6b 73 75 6d  on is a checksum
2acb0 20 63 61 6c 63 75 6c 61 74 65 64 0a 20 20 2a 2a   calculated.  **
2acc0 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20 65 78   based on all ex
2acd0 70 65 63 74 65 64 20 65 6e 74 72 69 65 73 20 69  pected entries i
2ace0 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  n the FTS index 
2acf0 28 69 6e 63 6c 75 64 69 6e 67 20 70 72 65 66 69  (including prefi
2ad00 78 20 69 6e 64 65 78 0a 20 20 2a 2a 20 65 6e 74  x index.  ** ent
2ad10 72 69 65 73 29 2e 20 54 68 69 73 20 62 6c 6f 63  ries). This bloc
2ad20 6b 20 63 68 65 63 6b 73 20 74 68 61 74 20 61 20  k checks that a 
2ad30 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c 61  checksum calcula
2ad40 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
2ad50 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 63 6f 6e  .  ** actual con
2ad60 74 65 6e 74 73 20 6f 66 20 46 54 53 20 69 6e 64  tents of FTS ind
2ad70 65 78 20 69 73 20 69 64 65 6e 74 69 63 61 6c 2e  ex is identical.
2ad80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 77 6f 20 76  .  **.  ** Two v
2ad90 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 73  ersions of the s
2ada0 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 61 72 65  ame checksum are
2adb0 20 63 61 6c 63 75 6c 61 74 65 64 2e 20 54 68 65   calculated. The
2adc0 20 66 69 72 73 74 20 28 73 74 61 63 6b 0a 20 20   first (stack.  
2add0 2a 2a 20 76 61 72 69 61 62 6c 65 20 63 6b 73 75  ** variable cksu
2ade0 6d 32 29 20 62 61 73 65 64 20 6f 6e 20 65 6e 74  m2) based on ent
2adf0 72 69 65 73 20 65 78 74 72 61 63 74 65 64 20 66  ries extracted f
2ae00 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d 74 65 78  rom the full-tex
2ae10 74 20 69 6e 64 65 78 0a 20 20 2a 2a 20 77 68 69  t index.  ** whi
2ae20 6c 65 20 64 6f 69 6e 67 20 61 20 6c 69 6e 65 61  le doing a linea
2ae30 72 20 73 63 61 6e 20 6f 66 20 65 61 63 68 20 69  r scan of each i
2ae40 6e 64 69 76 69 64 75 61 6c 20 69 6e 64 65 78 20  ndividual index 
2ae50 69 6e 20 74 75 72 6e 2e 20 0a 20 20 2a 2a 0a 20  in turn. .  **. 
2ae60 20 2a 2a 20 41 73 20 65 61 63 68 20 74 65 72 6d   ** As each term
2ae70 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65 20   visited by the 
2ae80 6c 69 6e 65 61 72 20 73 63 61 6e 73 2c 20 61 20  linear scans, a 
2ae90 73 65 70 61 72 61 74 65 20 71 75 65 72 79 20 66  separate query f
2aea0 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  or the.  ** same
2aeb0 20 74 65 72 6d 20 69 73 20 70 65 72 66 6f 72 6d   term is perform
2aec0 65 64 2e 20 63 6b 73 75 6d 33 20 69 73 20 63 61  ed. cksum3 is ca
2aed0 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f  lculated based o
2aee0 6e 20 74 68 65 20 65 6e 74 72 69 65 73 0a 20 20  n the entries.  
2aef0 2a 2a 20 65 78 74 72 61 63 74 65 64 20 62 79 20  ** extracted by 
2af00 74 68 65 73 65 20 71 75 65 72 69 65 73 2e 0a 20  these queries.. 
2af10 20 2a 2f 0a 20 20 66 6f 72 28 66 74 73 35 4d 75   */.  for(fts5Mu
2af20 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53  ltiIterNew(p, pS
2af30 74 72 75 63 74 2c 20 30 2c 20 30 2c 20 30 2c 20  truct, 0, 0, 0, 
2af40 30 2c 20 2d 31 2c 20 30 2c 20 26 70 49 74 65 72  0, -1, 0, &pIter
2af50 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  );.      fts5Mul
2af60 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74  tiIterEof(p, pIt
2af70 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74  er)==0;.      ft
2af80 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
2af90 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29 0a  p, pIter, 0, 0).
2afa0 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 20    ){.    int n; 
2afb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afc0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2afd0 74 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f  term in bytes */
2afe0 0a 20 20 20 20 69 36 34 20 69 50 6f 73 20 3d 20  .    i64 iPos = 
2aff0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2b000 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 72 65 61   /* Position rea
2b010 64 20 66 72 6f 6d 20 70 6f 73 6c 69 73 74 20 2a  d from poslist *
2b020 2f 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d  /.    int iOff =
2b030 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2b040 20 20 2f 2a 20 4f 66 66 73 65 74 20 77 69 74 68    /* Offset with
2b050 69 6e 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20  in poslist */.  
2b060 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66    i64 iRowid = f
2b070 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69  ts5MultiIterRowi
2b080 64 28 70 49 74 65 72 29 3b 0a 20 20 20 20 63 68  d(pIter);.    ch
2b090 61 72 20 2a 7a 20 3d 20 28 63 68 61 72 2a 29 66  ar *z = (char*)f
2b0a0 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d  ts5MultiIterTerm
2b0b0 28 70 49 74 65 72 2c 20 26 6e 29 3b 0a 0a 20 20  (pIter, &n);..  
2b0c0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
2b0d0 61 20 6e 65 77 20 74 65 72 6d 2c 20 71 75 65 72  a new term, quer
2b0e0 79 20 66 6f 72 20 69 74 2e 20 55 70 64 61 74 65  y for it. Update
2b0f0 20 63 6b 73 75 6d 33 20 77 69 74 68 20 74 68 65   cksum3 with the
2b100 20 72 65 73 75 6c 74 73 2e 20 2a 2f 0a 20 20 20   results. */.   
2b110 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 70 2c   fts5TestTerm(p,
2b120 20 26 74 65 72 6d 2c 20 7a 2c 20 6e 2c 20 63 6b   &term, z, n, ck
2b130 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33 29 3b 0a  sum2, &cksum3);.
2b140 0a 20 20 20 20 69 66 28 20 65 44 65 74 61 69 6c  .    if( eDetail
2b150 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  ==FTS5_DETAIL_NO
2b160 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  NE ){.      if( 
2b170 30 3d 3d 66 74 73 35 4d 75 6c 74 69 49 74 65 72  0==fts5MultiIter
2b180 49 73 45 6d 70 74 79 28 70 2c 20 70 49 74 65 72  IsEmpty(p, pIter
2b190 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6b 73  ) ){.        cks
2b1a0 75 6d 32 20 5e 3d 20 73 71 6c 69 74 65 33 46 74  um2 ^= sqlite3Ft
2b1b0 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75  s5IndexEntryCksu
2b1c0 6d 28 69 52 6f 77 69 64 2c 20 30 2c 20 30 2c 20  m(iRowid, 0, 0, 
2b1d0 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  -1, z, n);.     
2b1e0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2b1f0 20 20 20 20 70 6f 73 6c 69 73 74 2e 6e 20 3d 20      poslist.n = 
2b200 30 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  0;.      fts5Seg
2b210 69 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20 26  iterPoslist(p, &
2b220 70 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65  pIter->aSeg[pIte
2b230 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
2b240 72 73 74 5d 2c 20 30 2c 20 26 70 6f 73 6c 69 73  rst], 0, &poslis
2b250 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
2b260 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 50   0==sqlite3Fts5P
2b270 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 70 6f 73  oslistNext64(pos
2b280 6c 69 73 74 2e 70 2c 20 70 6f 73 6c 69 73 74 2e  list.p, poslist.
2b290 6e 2c 20 26 69 4f 66 66 2c 20 26 69 50 6f 73 29  n, &iOff, &iPos)
2b2a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
2b2b0 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32  iCol = FTS5_POS2
2b2c0 43 4f 4c 55 4d 4e 28 69 50 6f 73 29 3b 0a 20 20  COLUMN(iPos);.  
2b2d0 20 20 20 20 20 20 69 6e 74 20 69 54 6f 6b 4f 66        int iTokOf
2b2e0 66 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46  f = FTS5_POS2OFF
2b2f0 53 45 54 28 69 50 6f 73 29 3b 0a 20 20 20 20 20  SET(iPos);.     
2b300 20 20 20 63 6b 73 75 6d 32 20 5e 3d 20 73 71 6c     cksum2 ^= sql
2b310 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74  ite3Fts5IndexEnt
2b320 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20  ryCksum(iRowid, 
2b330 69 43 6f 6c 2c 20 69 54 6f 6b 4f 66 66 2c 20 2d  iCol, iTokOff, -
2b340 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  1, z, n);.      
2b350 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74  }.    }.  }.  ft
2b360 73 35 54 65 73 74 54 65 72 6d 28 70 2c 20 26 74  s5TestTerm(p, &t
2b370 65 72 6d 2c 20 30 2c 20 30 2c 20 63 6b 73 75 6d  erm, 0, 0, cksum
2b380 32 2c 20 26 63 6b 73 75 6d 33 29 3b 0a 0a 20 20  2, &cksum3);..  
2b390 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65  fts5MultiIterFre
2b3a0 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 69  e(p, pIter);.  i
2b3b0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
2b3c0 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21 3d 63 6b  _OK && cksum!=ck
2b3d0 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20 46  sum2 ) p->rc = F
2b3e0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20  TS5_CORRUPT;..  
2b3f0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
2b400 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 23  ease(pStruct);.#
2b410 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2b420 55 47 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  UG.  fts5BufferF
2b430 72 65 65 28 26 74 65 72 6d 29 3b 0a 23 65 6e 64  ree(&term);.#end
2b440 69 66 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  if.  fts5BufferF
2b450 72 65 65 28 26 70 6f 73 6c 69 73 74 29 3b 0a 20  ree(&poslist);. 
2b460 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
2b470 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
2b480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b4a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b4b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
2b4d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b4e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b4f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b510 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68  ****.** Below th
2b520 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65 20  is point is the 
2b530 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
2b540 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64  f the fts5_decod
2b550 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a 20 66 75  e() scalar.** fu
2b560 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f 0a  nction only..*/.
2b570 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20  ./*.** Decode a 
2b580 73 65 67 6d 65 6e 74 2d 64 61 74 61 20 72 6f 77  segment-data row
2b590 69 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  id from the %_da
2b5a0 74 61 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66  ta table. This f
2b5b0 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 74 68  unction is.** th
2b5c0 65 20 6f 70 70 6f 73 69 74 65 20 6f 66 20 6d 61  e opposite of ma
2b5d0 63 72 6f 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  cro FTS5_SEGMENT
2b5e0 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73 74 61  _ROWID()..*/.sta
2b5f0 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63  tic void fts5Dec
2b600 6f 64 65 52 6f 77 69 64 28 0a 20 20 69 36 34 20  odeRowid(.  i64 
2b610 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20  iRowid,         
2b620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2b630 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64 61 74 61  owid from %_data
2b640 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
2b650 2a 70 69 53 65 67 69 64 2c 20 20 20 20 20 20 20  *piSegid,       
2b660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2b670 55 54 3a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a  UT: Segment id *
2b680 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6c 69 64 78  /.  int *pbDlidx
2b690 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b6a0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6c 69 64      /* OUT: Dlid
2b6b0 78 20 66 6c 61 67 20 2a 2f 0a 20 20 69 6e 74 20  x flag */.  int 
2b6c0 2a 70 69 48 65 69 67 68 74 2c 20 20 20 20 20 20  *piHeight,      
2b6d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2b6e0 55 54 3a 20 48 65 69 67 68 74 20 2a 2f 0a 20 20  UT: Height */.  
2b6f0 69 6e 74 20 2a 70 69 50 67 6e 6f 20 20 20 20 20  int *piPgno     
2b700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b710 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20 6e 75 6d  /* OUT: Page num
2b720 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70 69 50  ber */.){.  *piP
2b730 67 6e 6f 20 3d 20 28 69 6e 74 29 28 69 52 6f 77  gno = (int)(iRow
2b740 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c  id & (((i64)1 <<
2b750 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f   FTS5_DATA_PAGE_
2b760 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77  B) - 1));.  iRow
2b770 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41  id >>= FTS5_DATA
2b780 5f 50 41 47 45 5f 42 3b 0a 0a 20 20 2a 70 69 48  _PAGE_B;..  *piH
2b790 65 69 67 68 74 20 3d 20 28 69 6e 74 29 28 69 52  eight = (int)(iR
2b7a0 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20  owid & (((i64)1 
2b7b0 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49  << FTS5_DATA_HEI
2b7c0 47 48 54 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20  GHT_B) - 1));.  
2b7d0 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f  iRowid >>= FTS5_
2b7e0 44 41 54 41 5f 48 45 49 47 48 54 5f 42 3b 0a 0a  DATA_HEIGHT_B;..
2b7f0 20 20 2a 70 62 44 6c 69 64 78 20 3d 20 28 69 6e    *pbDlidx = (in
2b800 74 29 28 69 52 6f 77 69 64 20 26 20 30 78 30 30  t)(iRowid & 0x00
2b810 30 31 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e  01);.  iRowid >>
2b820 3d 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f  = FTS5_DATA_DLI_
2b830 42 3b 0a 0a 20 20 2a 70 69 53 65 67 69 64 20 3d  B;..  *piSegid =
2b840 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20   (int)(iRowid & 
2b850 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35  (((i64)1 << FTS5
2b860 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d 20 31 29  _DATA_ID_B) - 1)
2b870 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
2b880 64 20 66 74 73 35 44 65 62 75 67 52 6f 77 69 64  d fts5DebugRowid
2b890 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42  (int *pRc, Fts5B
2b8a0 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69 36 34  uffer *pBuf, i64
2b8b0 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74 20 69 53   iKey){.  int iS
2b8c0 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c 20 69  egid, iHeight, i
2b8d0 50 67 6e 6f 2c 20 62 44 6c 69 64 78 3b 20 20 20  Pgno, bDlidx;   
2b8e0 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 63 6f 6d      /* Rowid com
2b8f0 70 65 6e 65 6e 74 73 20 2a 2f 0a 20 20 66 74 73  penents */.  fts
2b900 35 44 65 63 6f 64 65 52 6f 77 69 64 28 69 4b 65  5DecodeRowid(iKe
2b910 79 2c 20 26 69 53 65 67 69 64 2c 20 26 62 44 6c  y, &iSegid, &bDl
2b920 69 64 78 2c 20 26 69 48 65 69 67 68 74 2c 20 26  idx, &iHeight, &
2b930 69 50 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 69  iPgno);..  if( i
2b940 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Segid==0 ){.    
2b950 69 66 28 20 69 4b 65 79 3d 3d 46 54 53 35 5f 41  if( iKey==FTS5_A
2b960 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29 7b  VERAGES_ROWID ){
2b970 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
2b980 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2b990 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2b9a0 22 7b 61 76 65 72 61 67 65 73 7d 20 22 29 3b 0a  "{averages} ");.
2b9b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b9c0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2b9d0 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2b9e0 52 63 2c 20 70 42 75 66 2c 20 22 7b 73 74 72 75  Rc, pBuf, "{stru
2b9f0 63 74 75 72 65 7d 22 29 3b 0a 20 20 20 20 7d 0a  cture}");.    }.
2ba00 20 20 7d 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20    }.  else{.    
2ba10 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2ba20 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
2ba30 63 2c 20 70 42 75 66 2c 20 22 7b 25 73 73 65 67  c, pBuf, "{%sseg
2ba40 69 64 3d 25 64 20 68 3d 25 64 20 70 67 6e 6f 3d  id=%d h=%d pgno=
2ba50 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 62 44  %d}",.        bD
2ba60 6c 69 64 78 20 3f 20 22 64 6c 69 64 78 20 22 20  lidx ? "dlidx " 
2ba70 3a 20 22 22 2c 20 69 53 65 67 69 64 2c 20 69 48  : "", iSegid, iH
2ba80 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a 20 20 20  eight, iPgno.   
2ba90 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   );.  }.}..stati
2baa0 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67  c void fts5Debug
2bab0 53 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e 74  Structure(.  int
2bac0 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
2bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bae0 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f  IN/OUT: error co
2baf0 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  de */.  Fts5Buff
2bb00 65 72 20 2a 70 42 75 66 2c 0a 20 20 46 74 73 35  er *pBuf,.  Fts5
2bb10 53 74 72 75 63 74 75 72 65 20 2a 70 0a 29 7b 0a  Structure *p.){.
2bb20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67    int iLvl, iSeg
2bb30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2bb40 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72    /* Iterate thr
2bb50 6f 75 67 68 20 6c 65 76 65 6c 73 2c 20 73 65 67  ough levels, seg
2bb60 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 66 6f 72 28  ments */..  for(
2bb70 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 2d 3e  iLvl=0; iLvl<p->
2bb80 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
2bb90 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
2bba0 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
2bbb0 26 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  &p->aLevel[iLvl]
2bbc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
2bbd0 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2bbe0 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 0a  ntf(pRc, pBuf, .
2bbf0 20 20 20 20 20 20 20 20 22 20 7b 6c 76 6c 3d 25          " {lvl=%
2bc00 64 20 6e 4d 65 72 67 65 3d 25 64 20 6e 53 65 67  d nMerge=%d nSeg
2bc10 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c  =%d", iLvl, pLvl
2bc20 2d 3e 6e 4d 65 72 67 65 2c 20 70 4c 76 6c 2d 3e  ->nMerge, pLvl->
2bc30 6e 53 65 67 0a 20 20 20 20 29 3b 0a 20 20 20 20  nSeg.    );.    
2bc40 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67  for(iSeg=0; iSeg
2bc50 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65  <pLvl->nSeg; iSe
2bc60 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  g++){.      Fts5
2bc70 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
2bc80 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e   *pSeg = &pLvl->
2bc90 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20  aSeg[iSeg];.    
2bca0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2bcb0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2bcc0 70 52 63 2c 20 70 42 75 66 2c 20 22 20 7b 69 64  pRc, pBuf, " {id
2bcd0 3d 25 64 20 6c 65 61 76 65 73 3d 25 64 2e 2e 25  =%d leaves=%d..%
2bce0 64 7d 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  d}", .          
2bcf0 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 53  pSeg->iSegid, pS
2bd00 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2c 20 70  eg->pgnoFirst, p
2bd10 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a 20 20  Seg->pgnoLast.  
2bd20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
2bd30 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2bd40 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2bd50 52 63 2c 20 70 42 75 66 2c 20 22 7d 22 29 3b 0a  Rc, pBuf, "}");.
2bd60 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
2bd70 73 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  s is part of the
2bd80 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64   fts5_decode() d
2bd90 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a  ebugging aid..**
2bda0 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42  .** Arguments pB
2bdb0 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69  lob/nBlob contai
2bdc0 6e 20 61 20 73 65 72 69 61 6c 69 7a 65 64 20 46  n a serialized F
2bdd0 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a  ts5Structure obj
2bde0 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ect. This.** fun
2bdf0 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20  ction appends a 
2be00 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 72  human-readable r
2be10 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
2be20 20 74 68 65 20 73 61 6d 65 20 6f 62 6a 65 63 74   the same object
2be30 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 66 66 65  .** to the buffe
2be40 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
2be50 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
2be60 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
2be70 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75 63   fts5DecodeStruc
2be80 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63  ture(.  int *pRc
2be90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2bea0 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
2beb0 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  T: error code */
2bec0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
2bed0 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20  Buf,.  const u8 
2bee0 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f  *pBlob, int nBlo
2bef0 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  b.){.  int rc;  
2bf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf10 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2bf20 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 53   code */.  Fts5S
2bf30 74 72 75 63 74 75 72 65 20 2a 70 20 3d 20 30 3b  tructure *p = 0;
2bf40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
2bf50 63 6f 64 65 64 20 73 74 72 75 63 74 75 72 65 20  coded structure 
2bf60 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 72 63 20  object */..  rc 
2bf70 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  = fts5StructureD
2bf80 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20 6e 42 6c  ecode(pBlob, nBl
2bf90 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20 20 69 66  ob, 0, &p);.  if
2bfa0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2bfb0 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63  ){.    *pRc = rc
2bfc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
2bfd0 7d 0a 0a 20 20 66 74 73 35 44 65 62 75 67 53 74  }..  fts5DebugSt
2bfe0 72 75 63 74 75 72 65 28 70 52 63 2c 20 70 42 75  ructure(pRc, pBu
2bff0 66 2c 20 70 29 3b 0a 20 20 66 74 73 35 53 74 72  f, p);.  fts5Str
2c000 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 29  uctureRelease(p)
2c010 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2c020 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
2c030 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64 65 62  ts5_decode() deb
2c040 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a 2a  ugging aid..**.*
2c050 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42 6c 6f  * Arguments pBlo
2c060 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69 6e 20  b/nBlob contain 
2c070 61 6e 20 22 61 76 65 72 61 67 65 73 22 20 72 65  an "averages" re
2c080 63 6f 72 64 2e 20 54 68 69 73 20 66 75 6e 63 74  cord. This funct
2c090 69 6f 6e 20 0a 2a 2a 20 61 70 70 65 6e 64 73 20  ion .** appends 
2c0a0 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  a human-readable
2c0b0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2c0c0 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 74 68 65  of record to the
2c0d0 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 0a   buffer passed .
2c0e0 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ** as the second
2c0f0 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73   argument. .*/.s
2c100 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
2c110 65 63 6f 64 65 41 76 65 72 61 67 65 73 28 0a 20  ecodeAverages(. 
2c120 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
2c130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c140 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f   /* IN/OUT: erro
2c150 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  r code */.  Fts5
2c160 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20  Buffer *pBuf,.  
2c170 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f 62 2c  const u8 *pBlob,
2c180 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20   int nBlob.){.  
2c190 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 63 6f 6e  int i = 0;.  con
2c1a0 73 74 20 63 68 61 72 20 2a 7a 53 70 61 63 65 20  st char *zSpace 
2c1b0 3d 20 22 22 3b 0a 0a 20 20 77 68 69 6c 65 28 20  = "";..  while( 
2c1c0 69 3c 6e 42 6c 6f 62 20 29 7b 0a 20 20 20 20 75  i<nBlob ){.    u
2c1d0 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 20 2b  64 iVal;.    i +
2c1e0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  = sqlite3Fts5Get
2c1f0 56 61 72 69 6e 74 28 26 70 42 6c 6f 62 5b 69 5d  Varint(&pBlob[i]
2c200 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 73 71  , &iVal);.    sq
2c210 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2c220 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
2c230 20 70 42 75 66 2c 20 22 25 73 25 64 22 2c 20 7a   pBuf, "%s%d", z
2c240 53 70 61 63 65 2c 20 28 69 6e 74 29 69 56 61 6c  Space, (int)iVal
2c250 29 3b 0a 20 20 20 20 7a 53 70 61 63 65 20 3d 20  );.    zSpace = 
2c260 22 20 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  " ";.  }.}../*.*
2c270 2a 20 42 75 66 66 65 72 20 28 61 2f 6e 29 20 69  * Buffer (a/n) i
2c280 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e  s assumed to con
2c290 74 61 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 73  tain a list of s
2c2a0 65 72 69 61 6c 69 7a 65 64 20 76 61 72 69 6e 74  erialized varint
2c2b0 73 2e 20 52 65 61 64 0a 2a 2a 20 65 61 63 68 20  s. Read.** each 
2c2c0 76 61 72 69 6e 74 20 61 6e 64 20 61 70 70 65 6e  varint and appen
2c2d0 64 20 69 74 73 20 73 74 72 69 6e 67 20 72 65 70  d its string rep
2c2e0 72 65 73 65 6e 74 61 74 69 6f 6e 20 74 6f 20 62  resentation to b
2c2f0 75 66 66 65 72 20 70 42 75 66 2e 20 52 65 74 75  uffer pBuf. Retu
2c300 72 6e 0a 2a 2a 20 61 66 74 65 72 20 65 69 74 68  rn.** after eith
2c310 65 72 20 74 68 65 20 69 6e 70 75 74 20 62 75 66  er the input buf
2c320 66 65 72 20 69 73 20 65 78 68 61 75 73 74 65 64  fer is exhausted
2c330 20 6f 72 20 61 20 30 20 76 61 6c 75 65 20 69 73   or a 0 value is
2c340 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   read..**.** The
2c350 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
2c360 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
2c370 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  ytes read from t
2c380 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72 2e  he input buffer.
2c390 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
2c3a0 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74  ts5DecodePoslist
2c3b0 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42  (int *pRc, Fts5B
2c3c0 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e  uffer *pBuf, con
2c3d0 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29  st u8 *a, int n)
2c3e0 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30  {.  int iOff = 0
2c3f0 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c  ;.  while( iOff<
2c400 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61  n ){.    int iVa
2c410 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  l;.    iOff += f
2c420 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
2c430 61 5b 69 4f 66 66 5d 2c 20 69 56 61 6c 29 3b 0a  a[iOff], iVal);.
2c440 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2c450 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2c460 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 25  f(pRc, pBuf, " %
2c470 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 20  d", iVal);.  }. 
2c480 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a   return iOff;.}.
2c490 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 72 74  ./*.** The start
2c4a0 20 6f 66 20 62 75 66 66 65 72 20 28 61 2f 6e 29   of buffer (a/n)
2c4b0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 74   contains the st
2c4c0 61 72 74 20 6f 66 20 61 20 64 6f 63 6c 69 73 74  art of a doclist
2c4d0 2e 20 54 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a  . The doclist.**
2c4e0 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
2c4f0 66 69 6e 69 73 68 20 77 69 74 68 69 6e 20 74 68  finish within th
2c500 65 20 62 75 66 66 65 72 2e 20 54 68 69 73 20 66  e buffer. This f
2c510 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20  unction appends 
2c520 61 20 74 65 78 74 0a 2a 2a 20 72 65 70 72 65 73  a text.** repres
2c530 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
2c540 70 61 72 74 20 6f 66 20 74 68 65 20 64 6f 63 6c  part of the docl
2c550 69 73 74 20 74 68 61 74 20 69 73 20 70 72 65 73  ist that is pres
2c560 65 6e 74 20 74 6f 20 62 75 66 66 65 72 0a 2a 2a  ent to buffer.**
2c570 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a 20 54 68   pBuf. .**.** Th
2c580 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
2c590 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2c5a0 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20  bytes read from 
2c5b0 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72  the input buffer
2c5c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c5d0 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73  fts5DecodeDoclis
2c5e0 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35  t(int *pRc, Fts5
2c5f0 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63 6f  Buffer *pBuf, co
2c600 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e  nst u8 *a, int n
2c610 29 7b 0a 20 20 69 36 34 20 69 44 6f 63 69 64 20  ){.  i64 iDocid 
2c620 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66 20  = 0;.  int iOff 
2c630 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3e 30 20  = 0;..  if( n>0 
2c640 29 7b 0a 20 20 20 20 69 4f 66 66 20 3d 20 73 71  ){.    iOff = sq
2c650 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
2c660 6e 74 28 61 2c 20 28 75 36 34 2a 29 26 69 44 6f  nt(a, (u64*)&iDo
2c670 63 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  cid);.    sqlite
2c680 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2c690 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2c6a0 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20 69  f, " id=%lld", i
2c6b0 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20 20 77 68  Docid);.  }.  wh
2c6c0 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20  ile( iOff<n ){. 
2c6d0 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
2c6e0 20 69 6e 74 20 62 44 65 6c 3b 0a 20 20 20 20 69   int bDel;.    i
2c6f0 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50 6f  Off += fts5GetPo
2c700 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 4f 66  slistSize(&a[iOf
2c710 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 65 6c  f], &nPos, &bDel
2c720 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
2c730 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2c740 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2c750 22 20 6e 50 6f 73 3d 25 64 25 73 22 2c 20 6e 50  " nPos=%d%s", nP
2c760 6f 73 2c 20 62 44 65 6c 3f 22 2a 22 3a 22 22 29  os, bDel?"*":"")
2c770 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74  ;.    iOff += ft
2c780 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28  s5DecodePoslist(
2c790 70 52 63 2c 20 70 42 75 66 2c 20 26 61 5b 69 4f  pRc, pBuf, &a[iO
2c7a0 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f 66 66 2c  ff], MIN(n-iOff,
2c7b0 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20 69 66 28   nPos));.    if(
2c7c0 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20   iOff<n ){.     
2c7d0 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20   i64 iDelta;.   
2c7e0 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74     iOff += sqlit
2c7f0 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
2c800 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  &a[iOff], (u64*)
2c810 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
2c820 69 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c 74 61  iDocid += iDelta
2c830 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
2c840 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2c850 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2c860 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20 69 44 6f   " id=%lld", iDo
2c870 63 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  cid);.    }.  }.
2c880 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a  .  return iOff;.
2c890 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  }../*.** The imp
2c8a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75  lementation of u
2c8b0 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c  ser-defined scal
2c8c0 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35  ar function fts5
2c8d0 5f 64 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74  _decode()..*/.st
2c8e0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
2c8f0 63 6f 64 65 46 75 6e 63 74 69 6f 6e 28 0a 20 20  codeFunction(.  
2c900 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2c910 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
2c920 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  /* Function call
2c930 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
2c940 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20  t nArg,         
2c950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c960 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20   Number of args 
2c970 28 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20  (always 2) */.  
2c980 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2c990 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20  apVal           
2c9a0 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75  /* Function argu
2c9b0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 36  ments */.){.  i6
2c9c0 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20  4 iRowid;       
2c9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c9e0 20 52 6f 77 69 64 20 66 6f 72 20 72 65 63 6f 72   Rowid for recor
2c9f0 64 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20  d being decoded 
2ca00 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c  */.  int iSegid,
2ca10 69 48 65 69 67 68 74 2c 69 50 67 6e 6f 2c 62 44  iHeight,iPgno,bD
2ca20 6c 69 64 78 3b 2f 2a 20 52 6f 77 69 64 20 63 6f  lidx;/* Rowid co
2ca30 6d 70 6f 6e 65 6e 74 73 20 2a 2f 0a 20 20 63 6f  mponents */.  co
2ca40 6e 73 74 20 75 38 20 2a 61 42 6c 6f 62 3b 20 69  nst u8 *aBlob; i
2ca50 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  nt n;         /*
2ca60 20 52 65 63 6f 72 64 20 74 6f 20 64 65 63 6f 64   Record to decod
2ca70 65 20 2a 2f 0a 20 20 75 38 20 2a 61 20 3d 20 30  e */.  u8 *a = 0
2ca80 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 73  ;.  Fts5Buffer s
2ca90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2caa0 20 20 20 20 2f 2a 20 42 75 69 6c 64 20 75 70 20      /* Build up 
2cab0 74 65 78 74 20 74 6f 20 72 65 74 75 72 6e 20 68  text to return h
2cac0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ere */.  int rc 
2cad0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2cae0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2caf0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2cb00 20 6e 53 70 61 63 65 20 3d 20 30 3b 0a 0a 20 20   nSpace = 0;..  
2cb10 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 32 20  assert( nArg==2 
2cb20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20  );.  memset(&s, 
2cb30 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  0, sizeof(Fts5Bu
2cb40 66 66 65 72 29 29 3b 0a 20 20 69 52 6f 77 69 64  ffer));.  iRowid
2cb50 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2cb60 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b 30 5d 29  _int64(apVal[0])
2cb70 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63  ;..  /* Make a c
2cb80 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  opy of the secon
2cb90 64 20 61 72 67 75 6d 65 6e 74 20 28 61 20 62 6c  d argument (a bl
2cba0 6f 62 29 20 69 6e 20 61 42 6c 6f 62 5b 5d 2e 20  ob) in aBlob[]. 
2cbb0 54 68 65 20 61 42 6c 6f 62 5b 5d 0a 20 20 2a 2a  The aBlob[].  **
2cbc0 20 63 6f 70 79 20 69 73 20 66 6f 6c 6c 6f 77 65   copy is followe
2cbd0 64 20 62 79 20 46 54 53 35 5f 44 41 54 41 5f 5a  d by FTS5_DATA_Z
2cbe0 45 52 4f 5f 50 41 44 44 49 4e 47 20 30 78 30 30  ERO_PADDING 0x00
2cbf0 20 62 79 74 65 73 2c 20 77 68 69 63 68 20 70 72   bytes, which pr
2cc00 65 76 65 6e 74 73 0a 20 20 2a 2a 20 62 75 66 66  events.  ** buff
2cc10 65 72 20 6f 76 65 72 72 65 61 64 73 20 65 76 65  er overreads eve
2cc20 6e 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 20  n if the record 
2cc30 69 73 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a  is corrupt.  */.
2cc40 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    n = sqlite3_va
2cc50 6c 75 65 5f 62 79 74 65 73 28 61 70 56 61 6c 5b  lue_bytes(apVal[
2cc60 31 5d 29 3b 0a 20 20 61 42 6c 6f 62 20 3d 20 73  1]);.  aBlob = s
2cc70 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
2cc80 62 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 6e  b(apVal[1]);.  n
2cc90 53 70 61 63 65 20 3d 20 6e 20 2b 20 46 54 53 35  Space = n + FTS5
2cca0 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49  _DATA_ZERO_PADDI
2ccb0 4e 47 3b 0a 20 20 61 20 3d 20 28 75 38 2a 29 73  NG;.  a = (u8*)s
2ccc0 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
2ccd0 5a 65 72 6f 28 26 72 63 2c 20 6e 53 70 61 63 65  Zero(&rc, nSpace
2cce0 29 3b 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 20  );.  if( a==0 ) 
2ccf0 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b  goto decode_out;
2cd00 0a 20 20 6d 65 6d 63 70 79 28 61 2c 20 61 42 6c  .  memcpy(a, aBl
2cd10 6f 62 2c 20 6e 29 3b 0a 0a 0a 20 20 66 74 73 35  ob, n);...  fts5
2cd20 44 65 63 6f 64 65 52 6f 77 69 64 28 69 52 6f 77  DecodeRowid(iRow
2cd30 69 64 2c 20 26 69 53 65 67 69 64 2c 20 26 62 44  id, &iSegid, &bD
2cd40 6c 69 64 78 2c 20 26 69 48 65 69 67 68 74 2c 20  lidx, &iHeight, 
2cd50 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 66 74 73 35  &iPgno);..  fts5
2cd60 44 65 62 75 67 52 6f 77 69 64 28 26 72 63 2c 20  DebugRowid(&rc, 
2cd70 26 73 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 69  &s, iRowid);.  i
2cd80 66 28 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20  f( bDlidx ){.   
2cd90 20 46 74 73 35 44 61 74 61 20 64 6c 69 64 78 3b   Fts5Data dlidx;
2cda0 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76  .    Fts5DlidxLv
2cdb0 6c 20 6c 76 6c 3b 0a 0a 20 20 20 20 64 6c 69 64  l lvl;..    dlid
2cdc0 78 2e 70 20 3d 20 61 3b 0a 20 20 20 20 64 6c 69  x.p = a;.    dli
2cdd0 64 78 2e 6e 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20  dx.nn = n;..    
2cde0 6d 65 6d 73 65 74 28 26 6c 76 6c 2c 20 30 2c 20  memset(&lvl, 0, 
2cdf0 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
2ce00 4c 76 6c 29 29 3b 0a 20 20 20 20 6c 76 6c 2e 70  Lvl));.    lvl.p
2ce10 44 61 74 61 20 3d 20 26 64 6c 69 64 78 3b 0a 20  Data = &dlidx;. 
2ce20 20 20 20 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f     lvl.iLeafPgno
2ce30 20 3d 20 69 50 67 6e 6f 3b 0a 0a 20 20 20 20 66   = iPgno;..    f
2ce40 6f 72 28 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e  or(fts5DlidxLvlN
2ce50 65 78 74 28 26 6c 76 6c 29 3b 20 6c 76 6c 2e 62  ext(&lvl); lvl.b
2ce60 45 6f 66 3d 3d 30 3b 20 66 74 73 35 44 6c 69 64  Eof==0; fts5Dlid
2ce70 78 4c 76 6c 4e 65 78 74 28 26 6c 76 6c 29 29 7b  xLvlNext(&lvl)){
2ce80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
2ce90 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2cea0 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20 0a 20  intf(&rc, &s, . 
2ceb0 20 20 20 20 20 20 20 20 20 22 20 25 64 28 25 6c           " %d(%l
2cec0 6c 64 29 22 2c 20 6c 76 6c 2e 69 4c 65 61 66 50  ld)", lvl.iLeafP
2ced0 67 6e 6f 2c 20 6c 76 6c 2e 69 52 6f 77 69 64 0a  gno, lvl.iRowid.
2cee0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
2cef0 20 7d 65 6c 73 65 20 69 66 28 20 69 53 65 67 69   }else if( iSegi
2cf00 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  d==0 ){.    if( 
2cf10 69 52 6f 77 69 64 3d 3d 46 54 53 35 5f 41 56 45  iRowid==FTS5_AVE
2cf20 52 41 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20  RAGES_ROWID ){. 
2cf30 20 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 41       fts5DecodeA
2cf40 76 65 72 61 67 65 73 28 26 72 63 2c 20 26 73 2c  verages(&rc, &s,
2cf50 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73   a, n);.    }els
2cf60 65 7b 0a 20 20 20 20 20 20 66 74 73 35 44 65 63  e{.      fts5Dec
2cf70 6f 64 65 53 74 72 75 63 74 75 72 65 28 26 72 63  odeStructure(&rc
2cf80 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20  , &s, a, n);.   
2cf90 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2cfa0 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b  Fts5Buffer term;
2cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cfc0 20 43 75 72 72 65 6e 74 20 74 65 72 6d 20 72 65   Current term re
2cfd0 61 64 20 66 72 6f 6d 20 70 61 67 65 20 2a 2f 0a  ad from page */.
2cfe0 20 20 20 20 69 6e 74 20 73 7a 4c 65 61 66 3b 20      int szLeaf; 
2cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d000 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 70    /* Offset of p
2d010 67 69 64 78 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20  gidx in a[] */. 
2d020 20 20 20 69 6e 74 20 69 50 67 69 64 78 4f 66 66     int iPgidxOff
2d030 3b 0a 20 20 20 20 69 6e 74 20 69 50 67 69 64 78  ;.    int iPgidx
2d040 50 72 65 76 20 3d 20 30 3b 20 20 20 20 20 20 20  Prev = 0;       
2d050 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
2d060 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
2d070 70 67 69 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74  pgidx */.    int
2d080 20 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20   iTermOff = 0;. 
2d090 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66     int iRowidOff
2d0a0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 4f   = 0;.    int iO
2d0b0 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 44 6f 63  ff;.    int nDoc
2d0c0 6c 69 73 74 3b 0a 0a 20 20 20 20 6d 65 6d 73 65  list;..    memse
2d0d0 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65  t(&term, 0, size
2d0e0 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b  of(Fts5Buffer));
2d0f0 0a 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29 7b  ..    if( n<4 ){
2d100 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
2d110 73 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c  s5BufferSet(&rc,
2d120 20 26 73 2c 20 37 2c 20 28 63 6f 6e 73 74 20 75   &s, 7, (const u
2d130 38 2a 29 22 63 6f 72 72 75 70 74 22 29 3b 0a 20  8*)"corrupt");. 
2d140 20 20 20 20 20 67 6f 74 6f 20 64 65 63 6f 64 65       goto decode
2d150 5f 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  _out;.    }else{
2d160 0a 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66  .      iRowidOff
2d170 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61   = fts5GetU16(&a
2d180 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 50 67 69  [0]);.      iPgi
2d190 64 78 4f 66 66 20 3d 20 73 7a 4c 65 61 66 20 3d  dxOff = szLeaf =
2d1a0 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 32   fts5GetU16(&a[2
2d1b0 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50  ]);.      if( iP
2d1c0 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  gidxOff<n ){.   
2d1d0 20 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69       fts5GetVari
2d1e0 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66  nt32(&a[iPgidxOf
2d1f0 66 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20  f], iTermOff);. 
2d200 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2d210 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
2d220 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 61  position list ta
2d230 69 6c 20 61 74 20 74 68 65 20 73 74 61 72 74 20  il at the start 
2d240 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
2d250 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66     if( iRowidOff
2d260 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4f 66  !=0 ){.      iOf
2d270 66 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20  f = iRowidOff;. 
2d280 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 54 65     }else if( iTe
2d290 72 6d 4f 66 66 21 3d 30 20 29 7b 0a 20 20 20 20  rmOff!=0 ){.    
2d2a0 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66    iOff = iTermOf
2d2b0 66 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  f;.    }else{.  
2d2c0 20 20 20 20 69 4f 66 66 20 3d 20 73 7a 4c 65 61      iOff = szLea
2d2d0 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  f;.    }.    fts
2d2e0 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 26  5DecodePoslist(&
2d2f0 72 63 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69  rc, &s, &a[4], i
2d300 4f 66 66 2d 34 29 3b 0a 0a 20 20 20 20 2f 2a 20  Off-4);..    /* 
2d310 44 65 63 6f 64 65 20 61 6e 79 20 6d 6f 72 65 20  Decode any more 
2d320 64 6f 63 6c 69 73 74 20 64 61 74 61 20 74 68 61  doclist data tha
2d330 74 20 61 70 70 65 61 72 73 20 6f 6e 20 74 68 65  t appears on the
2d340 20 70 61 67 65 20 62 65 66 6f 72 65 20 74 68 65   page before the
2d350 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 74 65  .    ** first te
2d360 72 6d 2e 20 2a 2f 0a 20 20 20 20 6e 44 6f 63 6c  rm. */.    nDocl
2d370 69 73 74 20 3d 20 28 69 54 65 72 6d 4f 66 66 20  ist = (iTermOff 
2d380 3f 20 69 54 65 72 6d 4f 66 66 20 3a 20 73 7a 4c  ? iTermOff : szL
2d390 65 61 66 29 20 2d 20 69 4f 66 66 3b 0a 20 20 20  eaf) - iOff;.   
2d3a0 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69   fts5DecodeDocli
2d3b0 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69  st(&rc, &s, &a[i
2d3c0 4f 66 66 5d 2c 20 6e 44 6f 63 6c 69 73 74 29 3b  Off], nDoclist);
2d3d0 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 69 50 67  ..    while( iPg
2d3e0 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  idxOff<n ){.    
2d3f0 20 20 69 6e 74 20 62 46 69 72 73 74 20 3d 20 28    int bFirst = (
2d400 69 50 67 69 64 78 4f 66 66 3d 3d 73 7a 4c 65 61  iPgidxOff==szLea
2d410 66 29 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20  f);     /* True 
2d420 66 6f 72 20 66 69 72 73 74 20 74 65 72 6d 20 6f  for first term o
2d430 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  n page */.      
2d440 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
2d450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d460 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
2d470 66 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 20 20  f data */.      
2d480 69 6e 74 20 69 45 6e 64 3b 0a 20 20 20 20 20 20  int iEnd;.      
2d490 0a 20 20 20 20 20 20 69 50 67 69 64 78 4f 66 66  .      iPgidxOff
2d4a0 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
2d4b0 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66  t32(&a[iPgidxOff
2d4c0 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  ], nByte);.     
2d4d0 20 69 50 67 69 64 78 50 72 65 76 20 2b 3d 20 6e   iPgidxPrev += n
2d4e0 42 79 74 65 3b 0a 20 20 20 20 20 20 69 4f 66 66  Byte;.      iOff
2d4f0 20 3d 20 69 50 67 69 64 78 50 72 65 76 3b 0a 0a   = iPgidxPrev;..
2d500 20 20 20 20 20 20 69 66 28 20 69 50 67 69 64 78        if( iPgidx
2d510 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20  Off<n ){.       
2d520 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
2d530 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20  (&a[iPgidxOff], 
2d540 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
2d550 69 45 6e 64 20 3d 20 69 50 67 69 64 78 50 72 65  iEnd = iPgidxPre
2d560 76 20 2b 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  v + nByte;.     
2d570 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d580 69 45 6e 64 20 3d 20 73 7a 4c 65 61 66 3b 0a 20  iEnd = szLeaf;. 
2d590 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
2d5a0 28 20 62 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20  ( bFirst==0 ){. 
2d5b0 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
2d5c0 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
2d5d0 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b  a[iOff], nByte);
2d5e0 0a 20 20 20 20 20 20 20 20 74 65 72 6d 2e 6e 20  .        term.n 
2d5f0 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 7d  = nByte;.      }
2d600 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  .      iOff += f
2d610 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
2d620 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b  a[iOff], nByte);
2d630 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
2d640 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c  rAppendBlob(&rc,
2d650 20 26 74 65 72 6d 2c 20 6e 42 79 74 65 2c 20 26   &term, nByte, &
2d660 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20  a[iOff]);.      
2d670 69 4f 66 66 20 2b 3d 20 6e 42 79 74 65 3b 0a 0a  iOff += nByte;..
2d680 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
2d690 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2d6a0 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 26  ntf(.          &
2d6b0 72 63 2c 20 26 73 2c 20 22 20 74 65 72 6d 3d 25  rc, &s, " term=%
2d6c0 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c 20 28 63  .*s", term.n, (c
2d6d0 6f 6e 73 74 20 63 68 61 72 2a 29 74 65 72 6d 2e  onst char*)term.
2d6e0 70 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  p.      );.     
2d6f0 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63   iOff += fts5Dec
2d700 6f 64 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20  odeDoclist(&rc, 
2d710 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 69 45  &s, &a[iOff], iE
2d720 6e 64 2d 69 4f 66 66 29 3b 0a 20 20 20 20 7d 0a  nd-iOff);.    }.
2d730 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
2d740 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 7d 0a  ree(&term);.  }.
2d750 20 20 0a 20 64 65 63 6f 64 65 5f 6f 75 74 3a 0a    . decode_out:.
2d760 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
2d770 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2d780 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
2d790 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
2d7a0 74 28 70 43 74 78 2c 20 28 63 6f 6e 73 74 20 63  t(pCtx, (const c
2d7b0 68 61 72 2a 29 73 2e 70 2c 20 73 2e 6e 2c 20 53  har*)s.p, s.n, S
2d7c0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
2d7d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
2d7e0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
2d7f0 72 6f 72 5f 63 6f 64 65 28 70 43 74 78 2c 20 72  ror_code(pCtx, r
2d800 63 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 42 75  c);.  }.  fts5Bu
2d810 66 66 65 72 46 72 65 65 28 26 73 29 3b 0a 7d 0a  fferFree(&s);.}.
2d820 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  ./*.** The imple
2d830 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65  mentation of use
2d840 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72  r-defined scalar
2d850 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 72   function fts5_r
2d860 6f 77 69 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  owid()..*/.stati
2d870 63 20 76 6f 69 64 20 66 74 73 35 52 6f 77 69 64  c void fts5Rowid
2d880 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  Function(.  sqli
2d890 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2d8a0 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  x,          /* F
2d8b0 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e  unction call con
2d8c0 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  text */.  int nA
2d8d0 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
2d8e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2d8f0 62 65 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77  ber of args (alw
2d900 61 79 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69  ays 2) */.  sqli
2d910 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
2d920 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  l           /* F
2d930 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
2d940 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  s */.){.  const 
2d950 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20 69 66  char *zArg;.  if
2d960 28 20 6e 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20  ( nArg==0 ){.   
2d970 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2d980 65 72 72 6f 72 28 70 43 74 78 2c 20 22 73 68 6f  error(pCtx, "sho
2d990 75 6c 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77  uld be: fts5_row
2d9a0 69 64 28 73 75 62 6a 65 63 74 2c 20 2e 2e 2e 2e  id(subject, ....
2d9b0 29 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65  )", -1);.  }else
2d9c0 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 28 63 6f  {.    zArg = (co
2d9d0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
2d9e0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
2d9f0 61 6c 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20  al[0]);.    if( 
2da00 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
2da10 6d 70 28 7a 41 72 67 2c 20 22 73 65 67 6d 65 6e  mp(zArg, "segmen
2da20 74 22 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t") ){.      i64
2da30 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 69   iRowid;.      i
2da40 6e 74 20 73 65 67 69 64 2c 20 70 67 6e 6f 3b 0a  nt segid, pgno;.
2da50 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d        if( nArg!=
2da60 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  3 ){.        sql
2da70 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
2da80 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20  r(pCtx, .       
2da90 20 20 20 20 20 22 73 68 6f 75 6c 64 20 62 65 3a       "should be:
2daa0 20 66 74 73 35 5f 72 6f 77 69 64 28 27 73 65 67   fts5_rowid('seg
2dab0 6d 65 6e 74 27 2c 20 73 65 67 69 64 2c 20 70 67  ment', segid, pg
2dac0 6e 6f 29 29 22 2c 20 2d 31 0a 20 20 20 20 20 20  no))", -1.      
2dad0 20 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65    );.      }else
2dae0 7b 0a 20 20 20 20 20 20 20 20 73 65 67 69 64 20  {.        segid 
2daf0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
2db00 69 6e 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20  int(apVal[1]);. 
2db10 20 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 73 71         pgno = sq
2db20 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
2db30 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 20 20 20  apVal[2]);.     
2db40 20 20 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35     iRowid = FTS5
2db50 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 73  _SEGMENT_ROWID(s
2db60 65 67 69 64 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  egid, pgno);.   
2db70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
2db80 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20  ult_int64(pCtx, 
2db90 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d  iRowid);.      }
2dba0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2dbb0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2dbc0 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20  _error(pCtx, .  
2dbd0 20 20 20 20 20 20 22 66 69 72 73 74 20 61 72 67        "first arg
2dbe0 20 74 6f 20 66 74 73 35 5f 72 6f 77 69 64 28 29   to fts5_rowid()
2dbf0 20 6d 75 73 74 20 62 65 20 27 73 65 67 6d 65 6e   must be 'segmen
2dc00 74 27 22 20 2c 20 2d 31 0a 20 20 20 20 20 20 29  t'" , -1.      )
2dc10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
2dc20 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c  *.** This is cal
2dc30 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 72  led as part of r
2dc40 65 67 69 73 74 65 72 69 6e 67 20 74 68 65 20 46  egistering the F
2dc50 54 53 35 20 6d 6f 64 75 6c 65 20 77 69 74 68 20  TS5 module with 
2dc60 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e  database.** conn
2dc70 65 63 74 69 6f 6e 20 64 62 2e 20 49 74 20 72 65  ection db. It re
2dc80 67 69 73 74 65 72 73 20 73 65 76 65 72 61 6c 20  gisters several 
2dc90 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61  user-defined sca
2dca0 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73 20 75 73  lar functions us
2dcb0 65 66 75 6c 0a 2a 2a 20 77 69 74 68 20 46 54 53  eful.** with FTS
2dcc0 35 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  5..**.** If succ
2dcd0 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
2dce0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
2dcf0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2dd00 73 2c 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  s, some other.**
2dd10 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
2dd20 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
2dd30 6e 73 74 65 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  nstead..*/.int s
2dd40 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 49  qlite3Fts5IndexI
2dd50 6e 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nit(sqlite3 *db)
2dd60 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  {.  int rc = sql
2dd70 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
2dd80 74 69 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c 20  tion(.      db, 
2dd90 22 66 74 73 35 5f 64 65 63 6f 64 65 22 2c 20 32  "fts5_decode", 2
2dda0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
2ddb0 2c 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63  , fts5DecodeFunc
2ddc0 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 29 3b 0a  tion, 0, 0.  );.
2ddd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2dde0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
2ddf0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
2de00 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 20  unction(.       
2de10 20 64 62 2c 20 22 66 74 73 35 5f 72 6f 77 69 64   db, "fts5_rowid
2de20 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  ", -1, SQLITE_UT
2de30 46 38 2c 20 30 2c 20 66 74 73 35 52 6f 77 69 64  F8, 0, fts5Rowid
2de40 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20  Function, 0, 0. 
2de50 20 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75     );.  }.  retu
2de60 72 6e 20 72 63 3b 0a 7d 0a 0a                    rn rc;.}..