/ Hex Artifact Content
Login

Artifact 8e734f8592ce933cf4189f9818287406d392346576f8f9c2722beb79f2cd826e:


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: 49 74 65 72 20 46 74 73 35 49 74 65 72 3b 0a 74  Iter Fts5Iter;.t
24e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
24f0: 73 35 50 61 67 65 57 72 69 74 65 72 20 46 74 73  s5PageWriter Fts
2500: 35 50 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70  5PageWriter;.typ
2510: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2520: 53 65 67 49 74 65 72 20 46 74 73 35 53 65 67 49  SegIter Fts5SegI
2530: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2540: 75 63 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49  uct Fts5DoclistI
2550: 74 65 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49  ter Fts5DoclistI
2560: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2570: 75 63 74 20 46 74 73 35 53 65 67 57 72 69 74 65  uct Fts5SegWrite
2580: 72 20 46 74 73 35 53 65 67 57 72 69 74 65 72 3b  r Fts5SegWriter;
2590: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
25a0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 46 74  Fts5Structure Ft
25b0: 73 35 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70  s5Structure;.typ
25c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
25d0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46  StructureLevel F
25e0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
25f0: 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  l;.typedef struc
2600: 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53  t Fts5StructureS
2610: 65 67 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63  egment Fts5Struc
2620: 74 75 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74  tureSegment;..st
2630: 72 75 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a  ruct Fts5Data {.
2640: 20 20 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20    u8 *p;        
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2670: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
2680: 67 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  g record */.  in
2690: 74 20 6e 6e 3b 20 20 20 20 20 20 20 20 20 20 20  t nn;           
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26b0: 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20   Size of record 
26c0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
26d0: 74 20 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20  t szLeaf;       
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26f0: 20 53 69 7a 65 20 6f 66 20 6c 65 61 66 20 77 69   Size of leaf wi
2700: 74 68 6f 75 74 20 70 61 67 65 2d 69 6e 64 65 78  thout page-index
2710: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e   */.};../*.** On
2720: 65 20 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64  e object per %_d
2730: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ata table..*/.st
2740: 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b  ruct Fts5Index {
2750: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
2760: 43 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20  Config;         
2770: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
2780: 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ble configuratio
2790: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61  n */.  char *zDa
27a0: 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20  taTbl;          
27b0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
27c0: 66 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  f %_data table *
27d0: 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69  /.  int nWorkUni
27e0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
27f0: 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65      /* Leaf page
2800: 73 20 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66  s in a "unit" of
2810: 20 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20   work */..  /*. 
2820: 20 2a 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65   ** Variables re
2830: 6c 61 74 65 64 20 74 6f 20 74 68 65 20 61 63 63  lated to the acc
2840: 75 6d 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b  umulation of tok
2850: 65 6e 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73  ens and doclists
2860: 20 77 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a   within the.  **
2870: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
2880: 74 61 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68  tables before th
2890: 65 79 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  ey are flushed t
28a0: 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46  o disk..  */.  F
28b0: 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20  ts5Hash *pHash; 
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28d0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
28e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20   in-memory data 
28f0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e  */.  int nPendin
2900: 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  gData;          
2910: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2920: 62 79 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67  bytes of pending
2930: 20 64 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69   data */.  i64 i
2940: 57 72 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20  WriteRowid;     
2950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2960: 77 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20  wid for current 
2970: 64 6f 63 20 62 65 69 6e 67 20 77 72 69 74 74 65  doc being writte
2980: 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 65  n */.  int bDele
2990: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
29a0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
29b0: 74 20 77 72 69 74 65 20 69 73 20 61 20 64 65 6c  t write is a del
29c0: 65 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72  ete */..  /* Err
29d0: 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
29e0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a00: 2a 20 43 75 72 72 65 6e 74 20 65 72 72 6f 72 20  * Current error 
2a10: 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74  code */..  /* St
2a20: 61 74 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ate used by the 
2a30: 66 74 73 35 44 61 74 61 58 58 58 28 29 20 66 75  fts5DataXXX() fu
2a40: 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71  nctions. */.  sq
2a50: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61  lite3_blob *pRea
2a60: 64 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  der;          /*
2a70: 20 52 4f 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70   RO incr-blob op
2a80: 65 6e 20 6f 6e 20 25 5f 64 61 74 61 20 74 61 62  en on %_data tab
2a90: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
2aa0: 73 74 6d 74 20 2a 70 57 72 69 74 65 72 3b 20 20  stmt *pWriter;  
2ab0: 20 20 20 20 20 20 20 20 2f 2a 20 22 49 4e 53 45          /* "INSE
2ac0: 52 54 20 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41  RT ... %_data VA
2ad0: 4c 55 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20  LUES(?,?)" */.  
2ae0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44  sqlite3_stmt *pD
2af0: 65 6c 65 74 65 72 3b 20 20 20 20 20 20 20 20 20  eleter;         
2b00: 2f 2a 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  /* "DELETE FROM 
2b10: 25 5f 64 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f  %_data ... id>=?
2b20: 20 41 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20   AND id<=?" */. 
2b30: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2b40: 49 64 78 57 72 69 74 65 72 3b 20 20 20 20 20 20  IdxWriter;      
2b50: 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20   /* "INSERT ... 
2b60: 25 5f 69 64 78 20 56 41 4c 55 45 53 28 3f 2c 3f  %_idx VALUES(?,?
2b70: 2c 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69  ,?,?)" */.  sqli
2b80: 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 44 65  te3_stmt *pIdxDe
2b90: 6c 65 74 65 72 3b 20 20 20 20 20 20 2f 2a 20 22  leter;      /* "
2ba0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 69 64  DELETE FROM %_id
2bb0: 78 20 57 48 45 52 45 20 73 65 67 69 64 3d 3f 20  x WHERE segid=? 
2bc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
2bd0: 74 20 2a 70 49 64 78 53 65 6c 65 63 74 3b 0a 20  t *pIdxSelect;. 
2be0: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2c10: 20 6f 66 20 62 6c 6f 63 6b 73 20 72 65 61 64 20   of blocks read 
2c20: 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  */..  sqlite3_st
2c30: 6d 74 20 2a 70 44 61 74 61 56 65 72 73 69 6f 6e  mt *pDataVersion
2c40: 3b 0a 20 20 69 36 34 20 69 53 74 72 75 63 74 56  ;.  i64 iStructV
2c50: 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ersion;         
2c60: 20 20 20 20 2f 2a 20 64 61 74 61 5f 76 65 72 73      /* data_vers
2c70: 69 6f 6e 20 77 68 65 6e 20 70 53 74 72 75 63 74  ion when pStruct
2c80: 20 72 65 61 64 20 2a 2f 0a 20 20 46 74 73 35 53   read */.  Fts5S
2c90: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
2ca0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  t;         /* Cu
2cb0: 72 72 65 6e 74 20 64 62 20 73 74 72 75 63 74 75  rrent db structu
2cc0: 72 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  re (or NULL) */.
2cd0: 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44  };..struct Fts5D
2ce0: 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20 75  oclistIter {.  u
2cf0: 38 20 2a 61 45 6f 66 3b 20 20 20 20 20 20 20 20  8 *aEof;        
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d10: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62  * Pointer to 1 b
2d20: 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20  yte past end of 
2d30: 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f 2a  doclist */..  /*
2d40: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
2d50: 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20 61  s. aPoslist==0 a
2d60: 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69  t EOF */.  i64 i
2d70: 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50 6f  Rowid;.  u8 *aPo
2d80: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50 6f  slist;.  int nPo
2d90: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 53 69  slist;.  int nSi
2da0: 7a 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  ze;.};../*.** Th
2db0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2dc0: 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65  e "structure" re
2dd0: 63 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e  cord for each in
2de0: 64 65 78 20 61 72 65 20 72 65 70 72 65 73 65 6e  dex are represen
2df0: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20  ted.** using an 
2e00: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 72 65  Fts5Structure re
2e10: 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  cord in memory. 
2e20: 57 68 69 63 68 20 75 73 65 73 20 69 6e 73 74 61  Which uses insta
2e30: 6e 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  nces of the .** 
2e40: 6f 74 68 65 72 20 46 74 73 35 53 74 72 75 63 74  other Fts5Struct
2e50: 75 72 65 58 58 58 20 74 79 70 65 73 20 61 73 20  ureXXX types as 
2e60: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73  components..*/.s
2e70: 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74  truct Fts5Struct
2e80: 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69  ureSegment {.  i
2e90: 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20  nt iSegid;      
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2eb0: 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a  * Segment id */.
2ec0: 20 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b    int pgnoFirst;
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20    /* First leaf 
2ef0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73  page number in s
2f00: 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
2f10: 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20 20  pgnoLast;       
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2f30: 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ast leaf page nu
2f40: 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20  mber in segment 
2f50: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
2f60: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
2f70: 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20  {.  int nMerge; 
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2fa0: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63   segments in inc
2fb0: 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74  r-merge */.  int
2fc0: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fe0: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2ff0: 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65  segments on leve
3000: 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  l */.  Fts5Struc
3010: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53 65  tureSegment *aSe
3020: 67 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  g;     /* Array 
3030: 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53 65  of segments. aSe
3040: 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20  g[0] is oldest. 
3050: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
3060: 35 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20 69  5Structure {.  i
3070: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3090: 2a 20 4f 62 6a 65 63 74 20 72 65 66 65 72 65 6e  * Object referen
30a0: 63 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75 36  ce count */.  u6
30b0: 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b  4 nWriteCounter;
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30d0: 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77 72   Total leaves wr
30e0: 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30  itten to level 0
30f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65   */.  int nSegme
3100: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
3110: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
3120: 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20  egments in this 
3130: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
3140: 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20  nt nLevel;      
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3160: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  * Number of leve
3170: 6c 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78  ls in this index
3180: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
3190: 75 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c 5b  ureLevel aLevel[
31a0: 31 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  1];   /* Array o
31b0: 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20 6f  f nLevel level o
31c0: 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  bjects */.};../*
31d0: 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66  .** An object of
31e0: 20 74 79 70 65 20 46 74 73 35 53 65 67 57 72 69   type Fts5SegWri
31f0: 74 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 77  ter is used to w
3200: 72 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74 73  rite to segments
3210: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
3220: 50 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20 69  PageWriter {.  i
3230: 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  nt pgno;        
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3250: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
3260: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
3270: 20 69 6e 74 20 69 50 72 65 76 50 67 69 64 78 3b   int iPrevPgidx;
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c   /* Previous val
32a0: 75 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ue written into 
32b0: 70 67 69 64 78 20 2a 2f 0a 20 20 46 74 73 35 42  pgidx */.  Fts5B
32c0: 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20  uffer buf;      
32d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
32e0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
32f0: 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 46  leaf data */.  F
3300: 74 73 35 42 75 66 66 65 72 20 70 67 69 64 78 3b  ts5Buffer pgidx;
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3320: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
3330: 69 6e 67 20 70 61 67 65 2d 69 6e 64 65 78 20 2a  ing page-index *
3340: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
3350: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
3360: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
3370: 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75  ntaining previou
3380: 73 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a  s term on page *
3390: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
33a0: 44 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20 20  DlidxWriter {.  
33b0: 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  int pgno;       
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
33e0: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
33f0: 20 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69 64    int bPrevValid
3400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3410: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50 72    /* True if iPr
3420: 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  ev is valid */. 
3430: 20 69 36 34 20 69 50 72 65 76 3b 20 20 20 20 20   i64 iPrev;     
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77   /* Previous row
3460: 69 64 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e  id value written
3470: 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46 74   to page */.  Ft
3480: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34a0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
34b0: 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ng page data */.
34c0: 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 65  };.struct Fts5Se
34d0: 67 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20  gWriter {.  int 
34e0: 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20 20  iSegid;         
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
3500: 65 67 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f  egid to write to
3510: 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72   */.  Fts5PageWr
3520: 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20  iter writer;    
3530: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 57 72 69        /* PageWri
3540: 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
3550: 69 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b 20  i64 iPrevRowid; 
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69  /* Previous rowi
3580: 64 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75 72  d written to cur
3590: 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75  rent leaf */.  u
35a0: 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  8 bFirstRowidInD
35b0: 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 2f  oclist;        /
35c0: 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72  * True if next r
35d0: 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e  owid is first in
35e0: 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38   doclist */.  u8
35f0: 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61   bFirstRowidInPa
3600: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
3610: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f   True if next ro
3620: 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20  wid is first in 
3630: 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20 54 4f 44  page */.  /* TOD
3640: 4f 31 3a 20 43 61 6e 20 75 73 65 20 28 77 72 69  O1: Can use (wri
3650: 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 29 20  ter.pgidx.n==0) 
3660: 69 6e 73 74 65 61 64 20 6f 66 20 62 46 69 72 73  instead of bFirs
3670: 74 54 65 72 6d 49 6e 50 61 67 65 20 2a 2f 0a 20  tTermInPage */. 
3680: 20 75 38 20 62 46 69 72 73 74 54 65 72 6d 49 6e   u8 bFirstTermIn
3690: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
36a0: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74   /* True if next
36b0: 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 66 69   term will be fi
36c0: 72 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f 0a 20  rst in leaf */. 
36d0: 20 69 6e 74 20 6e 4c 65 61 66 57 72 69 74 74 65   int nLeafWritte
36e0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
36f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
3700: 61 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  af pages written
3710: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79   */.  int nEmpty
3720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3730: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3740: 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 74 65  of contiguous te
3750: 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a 2f  rm-less nodes */
3760: 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78 3b 20  ..  int nDlidx; 
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3780: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
3790: 20 73 69 7a 65 20 6f 66 20 61 44 6c 69 64 78 5b   size of aDlidx[
37a0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73  ] array */.  Fts
37b0: 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44  5DlidxWriter *aD
37c0: 6c 69 64 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  lidx;        /* 
37d0: 41 72 72 61 79 20 6f 66 20 46 74 73 35 44 6c 69  Array of Fts5Dli
37e0: 64 78 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73  dxWriter objects
37f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c 75 65 73   */..  /* Values
3800: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
3810: 74 68 65 20 25 5f 69 64 78 20 74 61 62 6c 65 20  the %_idx table 
3820: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
3830: 62 74 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  btterm;         
3840: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 65 72       /* Next ter
3850: 6d 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  m to insert into
3860: 20 25 5f 69 64 78 20 74 61 62 6c 65 20 2a 2f 0a   %_idx table */.
3870: 20 20 69 6e 74 20 69 42 74 50 61 67 65 3b 20 20    int iBtPage;  
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
38a0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
38b0: 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d 3b 0a 0a  o btterm */.};..
38c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
38d0: 74 73 35 43 52 65 73 75 6c 74 20 46 74 73 35 43  ts5CResult Fts5C
38e0: 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20 46  Result;.struct F
38f0: 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20 75  ts5CResult {.  u
3900: 31 36 20 69 46 69 72 73 74 3b 20 20 20 20 20 20  16 iFirst;      
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3920: 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20 6f  * aSeg[] index o
3930: 66 20 66 69 72 73 74 65 73 74 20 69 74 65 72 61  f firstest itera
3940: 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65 72  tor */.  u8 bTer
3950: 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  mEq;            
3960: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3970: 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 61 72   if the terms ar
3980: 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  e equal */.};../
3990: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20  *.** Object for 
39a0: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
39b0: 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65  h a single segme
39c0: 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63  nt, visiting eac
39d0: 68 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a 20  h term/rowid.** 
39e0: 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d  pair in the segm
39f0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a  ent..**.** pSeg:
3a00: 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e  .**   The segmen
3a10: 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  t to iterate thr
3a20: 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ough..**.** iLea
3a30: 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72  fPgno:.**   Curr
3a40: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ent leaf page nu
3a50: 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d  mber within segm
3a60: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66  ent..**.** iLeaf
3a70: 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74  Offset:.**   Byt
3a80: 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  e offset within 
3a90: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
3aa0: 20 74 68 61 74 20 69 73 20 74 68 65 20 66 69 72   that is the fir
3ab0: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a  st byte of the .
3ac0: 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69  **   position li
3ad0: 73 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79 74  st data (one byt
3ae0: 65 20 70 61 73 73 65 64 20 74 68 65 20 70 6f 73  e passed the pos
3af0: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
3b00: 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f 77  field)..**   row
3b10: 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  id field of the 
3b20: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55  current entry. U
3b30: 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74  sually this is t
3b40: 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  he size field of
3b50: 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69   the.**   positi
3b60: 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68  on list data. Th
3b70: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69  e exception is i
3b80: 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20  f the rowid for 
3b90: 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
3ba0: 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c  y .**   is the l
3bb0: 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65  ast thing on the
3bc0: 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a   leaf page..**.*
3bd0: 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75  * pLeaf:.**   Bu
3be0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
3bf0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
3c00: 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e  e data. Set to N
3c10: 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a  ULL at EOF..**.*
3c20: 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c  * iTermLeafPgno,
3c30: 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74   iTermLeafOffset
3c40: 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65  :.**   Leaf page
3c50: 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69   number containi
3c60: 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d  ng the last term
3c70: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
3c80: 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20  egment. And.**  
3c90: 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65   the offset imme
3ca0: 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
3cb0: 67 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e  g the term data.
3cc0: 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a  .**.** flags:.**
3cd0: 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f     Mask of FTS5_
3ce0: 53 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75  SEGITER_XXX valu
3cf0: 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20  es. Interpreted 
3d00: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
3d10: 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52  *   FTS5_SEGITER
3d20: 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20  _ONETERM:.**    
3d30: 20 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65   If set, set the
3d40: 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69   iterator to poi
3d50: 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20  nt to EOF after 
3d60: 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
3d70: 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20  ist .**     has 
3d80: 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20  been exhausted. 
3d90: 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74  Do not proceed t
3da0: 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20  o the next term 
3db0: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a  in the segment..
3dc0: 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47  **.**   FTS5_SEG
3dd0: 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a  ITER_REVERSE:.**
3de0: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69       This flag i
3df0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20  s only ever set 
3e00: 69 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  if FTS5_SEGITER_
3e10: 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20  ONETERM is also 
3e20: 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69  set. If.**     i
3e30: 74 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74  t is set, iterat
3e40: 65 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64 20  e through rowid 
3e50: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72  in descending or
3e60: 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74  der instead of t
3e70: 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c  he.**     defaul
3e80: 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  t ascending orde
3e90: 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f  r..**.** iRowidO
3ea0: 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73  ffset/nRowidOffs
3eb0: 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a  et/aRowidOffset:
3ec0: 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72  .**     These ar
3ed0: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54  e used if the FT
3ee0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
3ef0: 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
3f00: 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65 61  **.**     For ea
3f10: 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  ch rowid on the 
3f20: 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  page correspondi
3f30: 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
3f40: 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20 20  t term, the.**  
3f50: 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67     corresponding
3f60: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
3f70: 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f 20  entry is set to 
3f80: 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20  the byte offset 
3f90: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73 74  of the.**     st
3fa0: 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73 69  art of the "posi
3fb0: 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22 20  tion-list-size" 
3fc0: 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65  field within the
3fd0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 69 54 65   page..**.** iTe
3fe0: 72 6d 49 64 78 3a 0a 2a 2a 20 20 20 20 20 49 6e  rmIdx:.**     In
3ff0: 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 74  dex of current t
4000: 65 72 6d 20 6f 6e 20 69 54 65 72 6d 4c 65 61 66  erm on iTermLeaf
4010: 50 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  Pgno..*/.struct 
4020: 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20 20  Fts5SegIter {.  
4030: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
4040: 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20  ment *pSeg;     
4050: 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69 74  /* Segment to it
4060: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f  erate through */
4070: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20  .  int flags;   
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f     /* Mask of co
40a0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61 67  nfiguration flag
40b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  s */.  int iLeaf
40c0: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
40d0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
40e0: 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
40f0: 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  er */.  Fts5Data
4100: 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20   *pLeaf;        
4110: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4120: 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  nt leaf data */.
4130: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 78    Fts5Data *pNex
4140: 74 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  tLeaf;          
4150: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 28    /* Leaf page (
4160: 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f 0a  iLeafPgno+1) */.
4170: 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73 65    int iLeafOffse
4180: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4190: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
41a0: 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20   within current 
41b0: 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 4e 65  leaf */..  /* Ne
41c0: 78 74 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 76  xt method */.  v
41d0: 6f 69 64 20 28 2a 78 4e 65 78 74 29 28 46 74 73  oid (*xNext)(Fts
41e0: 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67  5Index*, Fts5Seg
41f0: 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 20  Iter*, int*);.. 
4200: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 61 6e 64   /* The page and
4210: 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 77 68 69   offset from whi
4220: 63 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ch the current t
4230: 65 72 6d 20 77 61 73 20 72 65 61 64 2e 20 54 68  erm was read. Th
4240: 65 20 6f 66 66 73 65 74 20 0a 20 20 2a 2a 20 69  e offset .  ** i
4250: 73 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  s the offset of 
4260: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
4270: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  in the current d
4280: 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 69 6e  oclist.  */.  in
4290: 74 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b  t iTermLeafPgno;
42a0: 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c 65 61 66  .  int iTermLeaf
42b0: 4f 66 66 73 65 74 3b 0a 0a 20 20 69 6e 74 20 69  Offset;..  int i
42c0: 50 67 69 64 78 4f 66 66 3b 20 20 20 20 20 20 20  PgidxOff;       
42d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
42e0: 78 74 20 6f 66 66 73 65 74 20 69 6e 20 70 67 69  xt offset in pgi
42f0: 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  dx */.  int iEnd
4300: 6f 66 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f 2a  ofDoclist;..  /*
4310: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
4320: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20  re only used if 
4330: 74 68 65 20 46 54 53 35 5f 53 45 47 49 54 45 52  the FTS5_SEGITER
4340: 5f 52 45 56 45 52 53 45 20 66 6c 61 67 20 69 73  _REVERSE flag is
4350: 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   set. */.  int i
4360: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4380: 72 72 65 6e 74 20 65 6e 74 72 79 20 69 6e 20 61  rrent entry in a
4390: 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 2a 2f  RowidOffset[] */
43a0: 0a 20 20 69 6e 74 20 6e 52 6f 77 69 64 4f 66 66  .  int nRowidOff
43b0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
43c0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
43d0: 73 69 7a 65 20 6f 66 20 61 52 6f 77 69 64 4f 66  size of aRowidOf
43e0: 66 73 65 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  fset[] array */.
43f0: 20 20 69 6e 74 20 2a 61 52 6f 77 69 64 4f 66 66    int *aRowidOff
4400: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
4410: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 66    /* Array of of
4420: 66 73 65 74 20 74 6f 20 72 6f 77 69 64 20 66 69  fset to rowid fi
4430: 65 6c 64 73 20 2a 2f 0a 0a 20 20 46 74 73 35 44  elds */..  Fts5D
4440: 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
4450: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;          /* If
4460: 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c   there is a docl
4470: 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20 20  ist-index */..  
4480: 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 70 6f 70  /* Variables pop
4490: 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20  ulated based on 
44a0: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 2a  current entry. *
44b0: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
44c0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
44d0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74      /* Current t
44e0: 65 72 6d 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  erm */.  i64 iRo
44f0: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
4500: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4510: 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69  ent rowid */.  i
4520: 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20 20  nt nPos;        
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4540: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
4550: 73 20 69 6e 20 63 75 72 72 65 6e 74 20 70 6f 73  s in current pos
4560: 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20  ition list */.  
4570: 75 38 20 62 44 65 6c 3b 20 20 20 20 20 20 20 20  u8 bDel;        
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4590: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 64  /* True if the d
45a0: 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73 65  elete flag is se
45b0: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
45c0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
45d0: 6e 74 65 72 20 74 6f 20 61 6e 20 46 74 73 35 44  nter to an Fts5D
45e0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 74 68  ata structure th
45f0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 0a 2a  at contains a .*
4600: 2a 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2f 0a  * leaf page..*/.
4610: 23 64 65 66 69 6e 65 20 41 53 53 45 52 54 5f 53  #define ASSERT_S
4620: 5a 4c 45 41 46 5f 4f 4b 28 78 29 20 61 73 73 65  ZLEAF_OK(x) asse
4630: 72 74 28 20 5c 0a 20 20 20 20 28 78 29 2d 3e 73  rt( \.    (x)->s
4640: 7a 4c 65 61 66 3d 3d 28 78 29 2d 3e 6e 6e 20 7c  zLeaf==(x)->nn |
4650: 7c 20 28 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d 66  | (x)->szLeaf==f
4660: 74 73 35 47 65 74 55 31 36 28 26 28 78 29 2d 3e  ts5GetU16(&(x)->
4670: 70 5b 32 5d 29 20 5c 0a 29 0a 0a 23 64 65 66 69  p[2]) \.)..#defi
4680: 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  ne FTS5_SEGITER_
4690: 4f 4e 45 54 45 52 4d 20 30 78 30 31 0a 23 64 65  ONETERM 0x01.#de
46a0: 66 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45  fine FTS5_SEGITE
46b0: 52 5f 52 45 56 45 52 53 45 20 30 78 30 32 0a 0a  R_REVERSE 0x02..
46c0: 2f 2a 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  /* .** Argument 
46d0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
46e0: 61 6e 20 46 74 73 35 44 61 74 61 20 73 74 72 75  an Fts5Data stru
46f0: 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
4700: 69 6e 73 20 61 20 6c 65 61 66 0a 2a 2a 20 70 61  ins a leaf.** pa
4710: 67 65 2e 20 54 68 69 73 20 6d 61 63 72 6f 20 65  ge. This macro e
4720: 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75 65  valuates to true
4730: 20 69 66 20 74 68 65 20 6c 65 61 66 20 63 6f 6e   if the leaf con
4740: 74 61 69 6e 73 20 6e 6f 20 74 65 72 6d 73 2c 20  tains no terms, 
4750: 6f 72 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  or.** false if i
4760: 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  t contains at le
4770: 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 0a 2a 2f  ast one term..*/
4780: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c 65 61  .#define fts5Lea
4790: 66 49 73 54 65 72 6d 6c 65 73 73 28 78 29 20 28  fIsTermless(x) (
47a0: 28 78 29 2d 3e 73 7a 4c 65 61 66 20 3e 3d 20 28  (x)->szLeaf >= (
47b0: 78 29 2d 3e 6e 6e 29 0a 0a 23 64 65 66 69 6e 65  x)->nn)..#define
47c0: 20 66 74 73 35 4c 65 61 66 54 65 72 6d 4f 66 66   fts5LeafTermOff
47d0: 28 78 2c 20 69 29 20 28 66 74 73 35 47 65 74 55  (x, i) (fts5GetU
47e0: 31 36 28 26 28 78 29 2d 3e 70 5b 28 78 29 2d 3e  16(&(x)->p[(x)->
47f0: 73 7a 4c 65 61 66 20 2b 20 28 69 29 2a 32 5d 29  szLeaf + (i)*2])
4800: 29 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c  )..#define fts5L
4810: 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
4820: 28 78 29 20 28 66 74 73 35 47 65 74 55 31 36 28  (x) (fts5GetU16(
4830: 28 78 29 2d 3e 70 29 29 0a 0a 2f 2a 0a 2a 2a 20  (x)->p))../*.** 
4840: 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72 61  Object for itera
4850: 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65  ting through the
4860: 20 6d 65 72 67 65 64 20 72 65 73 75 6c 74 73 20   merged results 
4870: 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  of one or more s
4880: 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20 76 69 73 69  egments,.** visi
4890: 74 69 6e 67 20 65 61 63 68 20 74 65 72 6d 2f 72  ting each term/r
48a0: 6f 77 69 64 20 70 61 69 72 20 69 6e 20 74 68 65  owid pair in the
48b0: 20 6d 65 72 67 65 64 20 64 61 74 61 2e 0a 2a 2a   merged data..**
48c0: 0a 2a 2a 20 6e 53 65 67 20 69 73 20 61 6c 77 61  .** nSeg is alwa
48d0: 79 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  ys a power of tw
48e0: 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  o greater than o
48f0: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e  r equal to the n
4900: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 65 67 6d  umber of.** segm
4910: 65 6e 74 73 20 74 68 61 74 20 74 68 69 73 20 6f  ents that this o
4920: 62 6a 65 63 74 20 69 73 20 6d 65 72 67 69 6e 67  bject is merging
4930: 20 64 61 74 61 20 66 72 6f 6d 2e 20 42 6f 74 68   data from. Both
4940: 20 74 68 65 20 61 53 65 67 5b 5d 20 61 6e 64 0a   the aSeg[] and.
4950: 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  ** aFirst[] arra
4960: 79 73 20 61 72 65 20 73 69 7a 65 64 20 61 74 20  ys are sized at 
4970: 6e 53 65 67 20 65 6e 74 72 69 65 73 2e 20 54 68  nSeg entries. Th
4980: 65 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20 69  e aSeg[] array i
4990: 73 20 70 61 64 64 65 64 0a 2a 2a 20 77 69 74 68  s padded.** with
49a0: 20 7a 65 72 6f 65 64 20 6f 62 6a 65 63 74 73 20   zeroed objects 
49b0: 2d 20 74 68 65 73 65 20 61 72 65 20 68 61 6e 64  - these are hand
49c0: 6c 65 64 20 61 73 20 69 66 20 74 68 65 79 20 77  led as if they w
49d0: 65 72 65 20 69 74 65 72 61 74 6f 72 73 20 6f 70  ere iterators op
49e0: 65 6e 65 64 0a 2a 2a 20 6f 6e 20 65 6d 70 74 79  ened.** on empty
49f0: 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a   segments..**.**
4a00: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
4a10: 63 6f 6d 70 61 72 69 6e 67 20 73 65 67 6d 65 6e  comparing segmen
4a20: 74 73 20 61 53 65 67 5b 4e 5d 20 61 6e 64 20 61  ts aSeg[N] and a
4a30: 53 65 67 5b 4e 2b 31 5d 2c 20 77 68 65 72 65 20  Seg[N+1], where 
4a40: 4e 20 69 73 20 61 6e 0a 2a 2a 20 65 76 65 6e 20  N is an.** even 
4a50: 6e 75 6d 62 65 72 2c 20 69 73 20 73 74 6f 72 65  number, is store
4a60: 64 20 69 6e 20 61 46 69 72 73 74 5b 28 6e 53 65  d in aFirst[(nSe
4a70: 67 2b 4e 29 2f 32 5d 2e 20 54 68 65 20 22 72 65  g+N)/2]. The "re
4a80: 73 75 6c 74 22 20 6f 66 20 74 68 65 20 0a 2a 2a  sult" of the .**
4a90: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 74   comparison in t
4aa0: 68 69 73 20 63 6f 6e 74 65 78 74 20 69 73 20 74  his context is t
4ab0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
4ac0: 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 63 75  iterator that cu
4ad0: 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
4ae0: 73 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 72  s to the smaller
4af0: 20 74 65 72 6d 2f 72 6f 77 69 64 20 63 6f 6d 62   term/rowid comb
4b00: 69 6e 61 74 69 6f 6e 2e 20 49 74 65 72 61 74 6f  ination. Iterato
4b10: 72 73 20 61 74 20 45 4f 46 20 61 72 65 0a 2a 2a  rs at EOF are.**
4b20: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
4b30: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  e greater than a
4b40: 6c 6c 20 6f 74 68 65 72 20 69 74 65 72 61 74 6f  ll other iterato
4b50: 72 73 2e 0a 2a 2a 0a 2a 2a 20 61 46 69 72 73 74  rs..**.** aFirst
4b60: 5b 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  [1] contains the
4b70: 20 69 6e 64 65 78 20 69 6e 20 61 53 65 67 5b 5d   index in aSeg[]
4b80: 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   of the iterator
4b90: 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 0a   that points to.
4ba0: 2a 2a 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  ** the smallest 
4bb0: 6b 65 79 20 6f 76 65 72 61 6c 6c 2e 20 61 46 69  key overall. aFi
4bc0: 72 73 74 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  rst[0] is unused
4bd0: 2e 20 0a 2a 2a 0a 2a 2a 20 70 6f 73 6c 69 73 74  . .**.** poslist
4be0: 3a 0a 2a 2a 20 20 20 55 73 65 64 20 62 79 20 73  :.**   Used by s
4bf0: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f  qlite3Fts5IterPo
4c00: 73 6c 69 73 74 28 29 20 77 68 65 6e 20 74 68 65  slist() when the
4c10: 20 70 6f 73 6c 69 73 74 20 6e 65 65 64 73 20 74   poslist needs t
4c20: 6f 20 62 65 20 62 75 66 66 65 72 65 64 2e 0a 2a  o be buffered..*
4c30: 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  *   There is no 
4c40: 77 61 79 20 74 6f 20 74 65 6c 6c 20 69 66 20 74  way to tell if t
4c50: 68 69 73 20 69 73 20 70 6f 70 75 6c 61 74 65 64  his is populated
4c60: 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 72 75   or not..*/.stru
4c70: 63 74 20 46 74 73 35 49 74 65 72 20 7b 0a 20 20  ct Fts5Iter {.  
4c80: 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 62 61  Fts5IndexIter ba
4c90: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
4ca0: 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20 63 6f  /* Base class co
4cb0: 6e 74 61 69 6e 69 6e 67 20 6f 75 74 70 75 74 20  ntaining output 
4cc0: 76 61 72 73 20 2a 2f 0a 0a 20 20 46 74 73 35 49  vars */..  Fts5I
4cd0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
4ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
4cf0: 64 65 78 20 74 68 61 74 20 6f 77 6e 73 20 74 68  dex that owns th
4d00: 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  is iterator */. 
4d10: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
4d20: 70 53 74 72 75 63 74 3b 20 20 20 20 20 20 20 20  pStruct;        
4d30: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 74 72   /* Database str
4d40: 75 63 74 75 72 65 20 66 6f 72 20 74 68 69 73 20  ucture for this 
4d50: 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 46 74  iterator */.  Ft
4d60: 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69 73 74  s5Buffer poslist
4d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4d80: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
4d90: 6e 67 20 63 75 72 72 65 6e 74 20 70 6f 73 6c 69  ng current posli
4da0: 73 74 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73  st */.  Fts5Cols
4db0: 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20  et *pColset;    
4dc0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
4dd0: 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74  ict matches to t
4de0: 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  hese columns */.
4df0: 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 64 20 74 6f  .  /* Invoked to
4e00: 20 73 65 74 20 6f 75 74 70 75 74 20 76 61 72 69   set output vari
4e10: 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 76 6f 69 64  ables. */.  void
4e20: 20 28 2a 78 53 65 74 4f 75 74 70 75 74 73 29 28   (*xSetOutputs)(
4e30: 46 74 73 35 49 74 65 72 2a 2c 20 46 74 73 35 53  Fts5Iter*, Fts5S
4e40: 65 67 49 74 65 72 2a 29 3b 0a 0a 20 20 69 6e 74  egIter*);..  int
4e50: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e70: 53 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d 20 61  Size of aSeg[] a
4e80: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  rray */.  int bR
4e90: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
4ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4eb0: 65 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e 20  e to iterate in 
4ec0: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
4ed0: 0a 20 20 75 38 20 62 53 6b 69 70 45 6d 70 74 79  .  u8 bSkipEmpty
4ee0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4ef0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 6b     /* True to sk
4f00: 69 70 20 64 65 6c 65 74 65 64 20 65 6e 74 72 69  ip deleted entri
4f10: 65 73 20 2a 2f 0a 0a 20 20 69 36 34 20 69 53 77  es */..  i64 iSw
4f20: 69 74 63 68 52 6f 77 69 64 3b 20 20 20 20 20 20  itchRowid;      
4f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
4f40: 74 65 73 74 20 72 6f 77 69 64 20 6f 66 20 6f 74  test rowid of ot
4f50: 68 65 72 20 74 68 61 6e 20 61 46 69 72 73 74 5b  her than aFirst[
4f60: 31 5d 20 2a 2f 0a 20 20 46 74 73 35 43 52 65 73  1] */.  Fts5CRes
4f70: 75 6c 74 20 2a 61 46 69 72 73 74 3b 20 20 20 20  ult *aFirst;    
4f80: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4f90: 6e 74 20 6d 65 72 67 65 20 73 74 61 74 65 20 28  nt merge state (
4fa0: 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a 20 20  see above) */.  
4fb0: 46 74 73 35 53 65 67 49 74 65 72 20 61 53 65 67  Fts5SegIter aSeg
4fc0: 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [1];            
4fd0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65 67 6d  /* Array of segm
4fe0: 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 2a 2f  ent iterators */
4ff0: 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  .};.../*.** An i
5000: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
5010: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69 73  ollowing type is
5020: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
5030: 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e   through the con
5040: 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20 64 6f  tents.** of a do
5050: 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f  clist-index reco
5060: 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74 61 3a  rd..**.** pData:
5070: 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20 63 6f 6e  .**   Record con
5080: 74 61 69 6e 69 6e 67 20 74 68 65 20 64 6f 63 6c  taining the docl
5090: 69 73 74 2d 69 6e 64 65 78 20 64 61 74 61 2e 0a  ist-index data..
50a0: 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a 20 20  **.** bEof:.**  
50b0: 20 53 65 74 20 74 6f 20 74 72 75 65 20 6f 6e 63   Set to true onc
50c0: 65 20 69 74 65 72 61 74 6f 72 20 68 61 73 20 72  e iterator has r
50d0: 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a 0a 2a  eached EOF..**.*
50e0: 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53 65 74  * iOff:.**   Set
50f0: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
5100: 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 72 65  offset within re
5110: 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f 0a 73  cord pData..*/.s
5120: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 4c  truct Fts5DlidxL
5130: 76 6c 20 7b 0a 20 20 46 74 73 35 44 61 74 61 20  vl {.  Fts5Data 
5140: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
5150: 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
5160: 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 6f 66   current page of
5170: 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20   this level */. 
5180: 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20   int iOff;      
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51a0: 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74  * Current offset
51b0: 20 69 6e 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20   into pData */. 
51c0: 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20   int bEof;      
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51e0: 2a 20 41 74 20 45 4f 46 20 61 6c 72 65 61 64 79  * At EOF already
51f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
5200: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
5210: 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 72      /* Used by r
5220: 65 76 65 72 73 65 20 69 74 65 72 61 74 6f 72 73  everse iterators
5230: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74   */..  /* Output
5240: 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20   variables */.  
5250: 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 3b 20 20  int iLeafPgno;  
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5270: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
5280: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
5290: 65 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69  e */.  i64 iRowi
52a0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
52b0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 6f       /* First ro
52c0: 77 69 64 20 6f 6e 20 6c 65 61 66 20 69 4c 65 61  wid on leaf iLea
52d0: 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73 74 72 75  fPgno */.};.stru
52e0: 63 74 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  ct Fts5DlidxIter
52f0: 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c 3b 0a 20   {.  int nLvl;. 
5300: 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 46   int iSegid;.  F
5310: 74 73 35 44 6c 69 64 78 4c 76 6c 20 61 4c 76 6c  ts5DlidxLvl aLvl
5320: 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  [1];.};..static 
5330: 76 6f 69 64 20 66 74 73 35 50 75 74 55 31 36 28  void fts5PutU16(
5340: 75 38 20 2a 61 4f 75 74 2c 20 75 31 36 20 69 56  u8 *aOut, u16 iV
5350: 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30 5d 20 3d  al){.  aOut[0] =
5360: 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20 20 61 4f   (iVal>>8);.  aO
5370: 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c 26 30 78  ut[1] = (iVal&0x
5380: 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75  FF);.}..static u
5390: 31 36 20 66 74 73 35 47 65 74 55 31 36 28 63 6f  16 fts5GetU16(co
53a0: 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b 0a 20 20  nst u8 *aIn){.  
53b0: 72 65 74 75 72 6e 20 28 28 75 31 36 29 61 49 6e  return ((u16)aIn
53c0: 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61 49 6e 5b  [0] << 8) + aIn[
53d0: 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a 2a 2a 20 41 6c  1];.} ../*.** Al
53e0: 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
53f0: 6e 20 61 20 62 75 66 66 65 72 20 61 74 20 6c 65  n a buffer at le
5400: 61 73 74 20 6e 42 79 74 65 20 62 79 74 65 73 20  ast nByte bytes 
5410: 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
5420: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69  f an OOM error i
5430: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 72  s encountered, r
5440: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 73  eturn NULL and s
5450: 65 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  et the error cod
5460: 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 74 73 35  e in.** the Fts5
5470: 49 6e 64 65 78 20 68 61 6e 64 6c 65 20 70 61 73  Index handle pas
5480: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
5490: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
54a0: 61 74 69 63 20 76 6f 69 64 20 2a 66 74 73 35 49  atic void *fts5I
54b0: 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35 49 6e 64  dxMalloc(Fts5Ind
54c0: 65 78 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69  ex *p, sqlite3_i
54d0: 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 72  nt64 nByte){.  r
54e0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74 73  eturn sqlite3Fts
54f0: 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e  5MallocZero(&p->
5500: 72 63 2c 20 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f  rc, nByte);.}../
5510: 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
5520: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
5530: 20 70 4c 65 66 74 20 62 75 66 66 65 72 20 77 69   pLeft buffer wi
5540: 74 68 20 74 68 65 20 70 52 69 67 68 74 2f 6e 52  th the pRight/nR
5550: 69 67 68 74 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a  ight blob..**.**
5560: 20 52 65 74 75 72 6e 20 2d 76 65 20 69 66 20 70   Return -ve if p
5570: 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c 65 72 20  Left is smaller 
5580: 74 68 61 6e 20 70 52 69 67 68 74 2c 20 30 20 69  than pRight, 0 i
5590: 66 20 74 68 65 79 20 61 72 65 20 65 71 75 61 6c  f they are equal
55a0: 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52   or.** +ve if pR
55b0: 69 67 68 74 20 69 73 20 73 6d 61 6c 6c 65 72 20  ight is smaller 
55c0: 74 68 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f  than pLeft. In o
55d0: 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a  ther words:.**.*
55e0: 2a 20 20 20 20 20 72 65 73 20 3d 20 2a 70 4c 65  *     res = *pLe
55f0: 66 74 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a  ft - *pRight.*/.
5600: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
5610: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 66  BUG.static int f
5620: 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65  ts5BufferCompare
5630: 42 6c 6f 62 28 0a 20 20 46 74 73 35 42 75 66 66  Blob(.  Fts5Buff
5640: 65 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20  er *pLeft,      
5650: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20          /* Left 
5660: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d  hand side of com
5670: 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  parison */.  con
5680: 73 74 20 75 38 20 2a 70 52 69 67 68 74 2c 20 69  st u8 *pRight, i
5690: 6e 74 20 6e 52 69 67 68 74 20 20 20 20 2f 2a 20  nt nRight    /* 
56a0: 52 69 67 68 74 20 68 61 6e 64 20 73 69 64 65 20  Right hand side 
56b0: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f  of comparison */
56c0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d  .){.  int nCmp =
56d0: 20 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20 6e   MIN(pLeft->n, n
56e0: 52 69 67 68 74 29 3b 0a 20 20 69 6e 74 20 72 65  Right);.  int re
56f0: 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74  s = memcmp(pLeft
5700: 2d 3e 70 2c 20 70 52 69 67 68 74 2c 20 6e 43 6d  ->p, pRight, nCm
5710: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65  p);.  return (re
5720: 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e 6e  s==0 ? (pLeft->n
5730: 20 2d 20 6e 52 69 67 68 74 29 20 3a 20 72 65 73   - nRight) : res
5740: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
5750: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 63  ** Compare the c
5760: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 74  ontents of the t
5770: 77 6f 20 62 75 66 66 65 72 73 20 75 73 69 6e 67  wo buffers using
5780: 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20 6f 6e   memcmp(). If on
5790: 65 20 62 75 66 66 65 72 0a 2a 2a 20 69 73 20 61  e buffer.** is a
57a0: 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f   prefix of the o
57b0: 74 68 65 72 2c 20 69 74 20 69 73 20 63 6f 6e 73  ther, it is cons
57c0: 69 64 65 72 65 64 20 74 68 65 20 6c 65 73 73 65  idered the lesse
57d0: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
57e0: 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69 73 20  -ve if pLeft is 
57f0: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 52 69  smaller than pRi
5800: 67 68 74 2c 20 30 20 69 66 20 74 68 65 79 20 61  ght, 0 if they a
5810: 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b  re equal or.** +
5820: 76 65 20 69 66 20 70 52 69 67 68 74 20 69 73 20  ve if pRight is 
5830: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65  smaller than pLe
5840: 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ft. In other wor
5850: 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65  ds:.**.**     re
5860: 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52  s = *pLeft - *pR
5870: 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ight.*/.static i
5880: 6e 74 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d  nt fts5BufferCom
5890: 70 61 72 65 28 46 74 73 35 42 75 66 66 65 72 20  pare(Fts5Buffer 
58a0: 2a 70 4c 65 66 74 2c 20 46 74 73 35 42 75 66 66  *pLeft, Fts5Buff
58b0: 65 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  er *pRight){.  i
58c0: 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c  nt nCmp = MIN(pL
58d0: 65 66 74 2d 3e 6e 2c 20 70 52 69 67 68 74 2d 3e  eft->n, pRight->
58e0: 6e 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20  n);.  int res = 
58f0: 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c  memcmp(pLeft->p,
5900: 20 70 52 69 67 68 74 2d 3e 70 2c 20 6e 43 6d 70   pRight->p, nCmp
5910: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65 73  );.  return (res
5920: 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e 6e 20  ==0 ? (pLeft->n 
5930: 2d 20 70 52 69 67 68 74 2d 3e 6e 29 20 3a 20 72  - pRight->n) : r
5940: 65 73 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  es);.}..static i
5950: 6e 74 20 66 74 73 35 4c 65 61 66 46 69 72 73 74  nt fts5LeafFirst
5960: 54 65 72 6d 4f 66 66 28 46 74 73 35 44 61 74 61  TermOff(Fts5Data
5970: 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69 6e 74 20   *pLeaf){.  int 
5980: 72 65 74 3b 0a 20 20 66 74 73 35 47 65 74 56 61  ret;.  fts5GetVa
5990: 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70  rint32(&pLeaf->p
59a0: 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c  [pLeaf->szLeaf],
59b0: 20 72 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20   ret);.  return 
59c0: 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ret;.}../*.** Cl
59d0: 6f 73 65 20 74 68 65 20 72 65 61 64 2d 6f 6e 6c  ose the read-onl
59e0: 79 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2c 20 69  y blob handle, i
59f0: 66 20 69 74 20 69 73 20 6f 70 65 6e 2e 0a 2a 2f  f it is open..*/
5a00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
5a10: 35 43 6c 6f 73 65 52 65 61 64 65 72 28 46 74 73  5CloseReader(Fts
5a20: 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 66  5Index *p){.  if
5a30: 28 20 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a  ( p->pReader ){.
5a40: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
5a50: 20 2a 70 52 65 61 64 65 72 20 3d 20 70 2d 3e 70   *pReader = p->p
5a60: 52 65 61 64 65 72 3b 0a 20 20 20 20 70 2d 3e 70  Reader;.    p->p
5a70: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  Reader = 0;.    
5a80: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f  sqlite3_blob_clo
5a90: 73 65 28 70 52 65 61 64 65 72 29 3b 0a 20 20 7d  se(pReader);.  }
5aa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65  .}../*.** Retrie
5ab0: 76 65 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d  ve a record from
5ac0: 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
5ad0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  e..**.** If an e
5ae0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
5af0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
5b00: 64 20 61 6e 20 65 72 72 6f 72 20 6c 65 66 74 20  d an error left 
5b10: 69 6e 20 74 68 65 20 0a 2a 2a 20 46 74 73 35 49  in the .** Fts5I
5b20: 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ndex object..*/.
5b30: 73 74 61 74 69 63 20 46 74 73 35 44 61 74 61 20  static Fts5Data 
5b40: 2a 66 74 73 35 44 61 74 61 52 65 61 64 28 46 74  *fts5DataRead(Ft
5b50: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20  s5Index *p, i64 
5b60: 69 52 6f 77 69 64 29 7b 0a 20 20 46 74 73 35 44  iRowid){.  Fts5D
5b70: 61 74 61 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20  ata *pRet = 0;. 
5b80: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
5b90: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
5ba0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
5bb0: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65  ..    if( p->pRe
5bc0: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ader ){.      /*
5bd0: 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 79 20 72   This call may r
5be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f  eturn SQLITE_ABO
5bf0: 52 54 20 69 66 20 74 68 65 72 65 20 68 61 73 20  RT if there has 
5c00: 62 65 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  been a savepoint
5c10: 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  .      ** rollba
5c20: 63 6b 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ck since it was 
5c30: 6c 61 73 74 20 75 73 65 64 2e 20 49 6e 20 74 68  last used. In th
5c40: 69 73 20 63 61 73 65 20 61 20 6e 65 77 20 62 6c  is case a new bl
5c50: 6f 62 20 68 61 6e 64 6c 65 0a 20 20 20 20 20 20  ob handle.      
5c60: 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ** is required. 
5c70: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
5c80: 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20  3_blob *pBlob = 
5c90: 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20 20 20  p->pReader;.    
5ca0: 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30    p->pReader = 0
5cb0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
5cc0: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e  ite3_blob_reopen
5cd0: 28 70 42 6c 6f 62 2c 20 69 52 6f 77 69 64 29 3b  (pBlob, iRowid);
5ce0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
5cf0: 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a  ->pReader==0 );.
5d00: 20 20 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72        p->pReader
5d10: 20 3d 20 70 42 6c 6f 62 3b 0a 20 20 20 20 20 20   = pBlob;.      
5d20: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5d30: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  K ){.        fts
5d40: 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b  5CloseReader(p);
5d50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5d60: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 41 42  f( rc==SQLITE_AB
5d70: 4f 52 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ORT ) rc = SQLIT
5d80: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
5d90: 20 2f 2a 20 49 66 20 74 68 65 20 62 6c 6f 62 20   /* If the blob 
5da0: 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74 20 6f 70  handle is not op
5db0: 65 6e 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  en at this point
5dc0: 2c 20 6f 70 65 6e 20 69 74 20 61 6e 64 20 73 65  , open it and se
5dd0: 65 6b 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ek .    ** to th
5de0: 65 20 72 65 71 75 65 73 74 65 64 20 65 6e 74 72  e requested entr
5df0: 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  y.  */.    if( p
5e00: 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 26 26 20  ->pReader==0 && 
5e10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5e20: 0a 20 20 20 20 20 20 46 74 73 35 43 6f 6e 66 69  .      Fts5Confi
5e30: 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
5e40: 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 20 20 72  pConfig;.      r
5e50: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
5e60: 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67 2d 3e 64  _open(pConfig->d
5e70: 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 43  b, .          pC
5e80: 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a  onfig->zDb, p->z
5e90: 44 61 74 61 54 62 6c 2c 20 22 62 6c 6f 63 6b 22  DataTbl, "block"
5ea0: 2c 20 69 52 6f 77 69 64 2c 20 30 2c 20 26 70 2d  , iRowid, 0, &p-
5eb0: 3e 70 52 65 61 64 65 72 0a 20 20 20 20 20 20 29  >pReader.      )
5ec0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5ed0: 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  If either of the
5ee0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70   sqlite3_blob_op
5ef0: 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f  en() or sqlite3_
5f00: 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29 20 63 61  blob_reopen() ca
5f10: 6c 6c 73 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  lls.    ** above
5f20: 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45   returned SQLITE
5f30: 5f 45 52 52 4f 52 2c 20 72 65 74 75 72 6e 20 53  _ERROR, return S
5f40: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
5f50: 41 42 20 69 6e 73 74 65 61 64 2e 0a 20 20 20 20  AB instead..    
5f60: 2a 2a 20 41 6c 6c 20 74 68 65 20 72 65 61 73 6f  ** All the reaso
5f70: 6e 73 20 74 68 6f 73 65 20 66 75 6e 63 74 69 6f  ns those functio
5f80: 6e 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  ns might return 
5f90: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 2d 20 6d  SQLITE_ERROR - m
5fa0: 69 73 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74 61  issing.    ** ta
5fb0: 62 6c 65 2c 20 6d 69 73 73 69 6e 67 20 72 6f 77  ble, missing row
5fc0: 2c 20 6e 6f 6e 2d 62 6c 6f 62 2f 74 65 78 74 20  , non-blob/text 
5fd0: 69 6e 20 62 6c 6f 63 6b 20 63 6f 6c 75 6d 6e 20  in block column 
5fe0: 2d 20 69 6e 64 69 63 61 74 65 20 0a 20 20 20 20  - indicate .    
5ff0: 2a 2a 20 62 61 63 6b 69 6e 67 20 73 74 6f 72 65  ** backing store
6000: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f   corruption.  */
6010: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
6020: 49 54 45 5f 45 52 52 4f 52 20 29 20 72 63 20 3d  ITE_ERROR ) rc =
6030: 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a   FTS5_CORRUPT;..
6040: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6050: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
6060: 38 20 2a 61 4f 75 74 20 3d 20 30 3b 20 20 20 20  8 *aOut = 0;    
6070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
6080: 61 64 20 62 6c 6f 62 20 64 61 74 61 20 69 6e 74  ad blob data int
6090: 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
60a0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
60b0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
60c0: 62 79 74 65 73 28 70 2d 3e 70 52 65 61 64 65 72  bytes(p->pReader
60d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
60e0: 5f 69 6e 74 36 34 20 6e 41 6c 6c 6f 63 20 3d 20  _int64 nAlloc = 
60f0: 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29  sizeof(Fts5Data)
6100: 20 2b 20 6e 42 79 74 65 20 2b 20 46 54 53 35 5f   + nByte + FTS5_
6110: 44 41 54 41 5f 50 41 44 44 49 4e 47 3b 0a 20 20  DATA_PADDING;.  
6120: 20 20 20 20 70 52 65 74 20 3d 20 28 46 74 73 35      pRet = (Fts5
6130: 44 61 74 61 2a 29 73 71 6c 69 74 65 33 5f 6d 61  Data*)sqlite3_ma
6140: 6c 6c 6f 63 36 34 28 6e 41 6c 6c 6f 63 29 3b 0a  lloc64(nAlloc);.
6150: 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
6160: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  {.        pRet->
6170: 6e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  nn = nByte;.    
6180: 20 20 20 20 61 4f 75 74 20 3d 20 70 52 65 74 2d      aOut = pRet-
6190: 3e 70 20 3d 20 28 75 38 2a 29 26 70 52 65 74 5b  >p = (u8*)&pRet[
61a0: 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1];.      }else{
61b0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
61c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
61d0: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72    }..      if( r
61e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
61f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
6200: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70  ite3_blob_read(p
6210: 2d 3e 70 52 65 61 64 65 72 2c 20 61 4f 75 74 2c  ->pReader, aOut,
6220: 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 20 20   nByte, 0);.    
6230: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
6240: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
6250: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
6260: 72 65 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20  ree(pRet);.     
6270: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
6280: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6290: 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 46 69 78 20    /* TODO1: Fix 
62a0: 74 68 69 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  this */.        
62b0: 70 52 65 74 2d 3e 70 5b 6e 42 79 74 65 5d 20 3d  pRet->p[nByte] =
62c0: 20 30 78 30 30 3b 0a 20 20 20 20 20 20 20 20 70   0x00;.        p
62d0: 52 65 74 2d 3e 73 7a 4c 65 61 66 20 3d 20 66 74  Ret->szLeaf = ft
62e0: 73 35 47 65 74 55 31 36 28 26 70 52 65 74 2d 3e  s5GetU16(&pRet->
62f0: 70 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  p[2]);.      }. 
6300: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63 20 3d     }.    p->rc =
6310: 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 61   rc;.    p->nRea
6320: 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  d++;.  }..  asse
6330: 72 74 28 20 28 70 52 65 74 3d 3d 30 29 3d 3d 28  rt( (pRet==0)==(
6340: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
6350: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ) );.  return pR
6360: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  et;.}../*.** Rel
6370: 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63 65  ease a reference
6380: 20 74 6f 20 64 61 74 61 20 72 65 63 6f 72 64 20   to data record 
6390: 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65  returned by an e
63a0: 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 0a 2a  arlier call to.*
63b0: 2a 20 66 74 73 35 44 61 74 61 52 65 61 64 28 29  * fts5DataRead()
63c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
63d0: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
63e0: 28 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61  (Fts5Data *pData
63f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ){.  sqlite3_fre
6400: 65 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 73 74 61  e(pData);.}..sta
6410: 74 69 63 20 46 74 73 35 44 61 74 61 20 2a 66 74  tic Fts5Data *ft
6420: 73 35 4c 65 61 66 52 65 61 64 28 46 74 73 35 49  s5LeafRead(Fts5I
6430: 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f  ndex *p, i64 iRo
6440: 77 69 64 29 7b 0a 20 20 46 74 73 35 44 61 74 61  wid){.  Fts5Data
6450: 20 2a 70 52 65 74 20 3d 20 66 74 73 35 44 61 74   *pRet = fts5Dat
6460: 61 52 65 61 64 28 70 2c 20 69 52 6f 77 69 64 29  aRead(p, iRowid)
6470: 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a  ;.  if( pRet ){.
6480: 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e 73 7a      if( pRet->sz
6490: 4c 65 61 66 3e 70 52 65 74 2d 3e 6e 6e 20 29 7b  Leaf>pRet->nn ){
64a0: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46  .      p->rc = F
64b0: 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
64c0: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
64d0: 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20  se(pRet);.      
64e0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pRet = 0;.    }.
64f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
6500: 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  t;.}..static int
6510: 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
6520: 65 53 74 6d 74 28 0a 20 20 46 74 73 35 49 6e 64  eStmt(.  Fts5Ind
6530: 65 78 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33  ex *p,.  sqlite3
6540: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a  _stmt **ppStmt,.
6550: 20 20 63 68 61 72 20 2a 7a 53 71 6c 0a 29 7b 0a    char *zSql.){.
6560: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
6570: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
6580: 28 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20  ( zSql ){.      
6590: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
65a0: 70 72 65 70 61 72 65 5f 76 33 28 70 2d 3e 70 43  prepare_v3(p->pC
65b0: 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c  onfig->db, zSql,
65c0: 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20 53   -1,.          S
65d0: 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 50 45  QLITE_PREPARE_PE
65e0: 52 53 49 53 54 45 4e 54 7c 53 51 4c 49 54 45 5f  RSISTENT|SQLITE_
65f0: 50 52 45 50 41 52 45 5f 4e 4f 5f 56 54 41 42 2c  PREPARE_NO_VTAB,
6600: 0a 20 20 20 20 20 20 20 20 20 20 70 70 53 74 6d  .          ppStm
6610: 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, 0);.    }else
6620: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
6630: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6640: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
6650: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
6660: 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
6670: 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53 45 52 54 20 4f  ../*.** INSERT O
6680: 52 20 52 45 50 4c 41 43 45 20 61 20 72 65 63 6f  R REPLACE a reco
6690: 72 64 20 69 6e 74 6f 20 74 68 65 20 25 5f 64 61  rd into the %_da
66a0: 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ta table..*/.sta
66b0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74  tic void fts5Dat
66c0: 61 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78  aWrite(Fts5Index
66d0: 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 2c   *p, i64 iRowid,
66e0: 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61   const u8 *pData
66f0: 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20  , int nData){.  
6700: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
6710: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a  E_OK ) return;..
6720: 20 20 69 66 28 20 70 2d 3e 70 57 72 69 74 65 72    if( p->pWriter
6730: 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43  ==0 ){.    Fts5C
6740: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
6750: 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
6760: 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
6770: 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 57 72  eStmt(p, &p->pWr
6780: 69 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70  iter, sqlite3_mp
6790: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
67a0: 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27   "REPLACE INTO '
67b0: 25 71 27 2e 27 25 71 5f 64 61 74 61 27 28 69 64  %q'.'%q_data'(id
67c0: 2c 20 62 6c 6f 63 6b 29 20 56 41 4c 55 45 53 28  , block) VALUES(
67d0: 3f 2c 3f 29 22 2c 20 0a 20 20 20 20 20 20 20 20  ?,?)", .        
67e0: 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
67f0: 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
6800: 20 20 20 29 29 3b 0a 20 20 20 20 69 66 28 20 70     ));.    if( p
6810: 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->rc ) return;. 
6820: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 69   }..  sqlite3_bi
6830: 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 57 72 69  nd_int64(p->pWri
6840: 74 65 72 2c 20 31 2c 20 69 52 6f 77 69 64 29 3b  ter, 1, iRowid);
6850: 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
6860: 62 6c 6f 62 28 70 2d 3e 70 57 72 69 74 65 72 2c  blob(p->pWriter,
6870: 20 32 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61   2, pData, nData
6880: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
6890: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
68a0: 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20  (p->pWriter);.  
68b0: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
68c0: 72 65 73 65 74 28 70 2d 3e 70 57 72 69 74 65 72  reset(p->pWriter
68d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
68e0: 64 5f 6e 75 6c 6c 28 70 2d 3e 70 57 72 69 74 65  d_null(p->pWrite
68f0: 72 2c 20 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r, 2);.}../*.** 
6900: 45 78 65 63 75 74 65 20 74 68 65 20 66 6f 6c 6c  Execute the foll
6910: 6f 77 69 6e 67 20 53 51 4c 3a 0a 2a 2a 0a 2a 2a  owing SQL:.**.**
6920: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
6930: 20 25 5f 64 61 74 61 20 57 48 45 52 45 20 69 64   %_data WHERE id
6940: 20 42 45 54 57 45 45 4e 20 24 69 46 69 72 73 74   BETWEEN $iFirst
6950: 20 41 4e 44 20 24 69 4c 61 73 74 0a 2a 2f 0a 73   AND $iLast.*/.s
6960: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
6970: 61 74 61 44 65 6c 65 74 65 28 46 74 73 35 49 6e  ataDelete(Fts5In
6980: 64 65 78 20 2a 70 2c 20 69 36 34 20 69 46 69 72  dex *p, i64 iFir
6990: 73 74 2c 20 69 36 34 20 69 4c 61 73 74 29 7b 0a  st, i64 iLast){.
69a0: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
69b0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b  ITE_OK ) return;
69c0: 0a 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 6c 65  ..  if( p->pDele
69d0: 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74  ter==0 ){.    Ft
69e0: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
69f0: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
6a00: 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d      char *zSql =
6a10: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
6a20: 28 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54  (.        "DELET
6a30: 45 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f  E FROM '%q'.'%q_
6a40: 64 61 74 61 27 20 57 48 45 52 45 20 69 64 3e 3d  data' WHERE id>=
6a50: 3f 20 41 4e 44 20 69 64 3c 3d 3f 22 2c 20 0a 20  ? AND id<=?", . 
6a60: 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
6a70: 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
6a80: 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20  zName.    );.   
6a90: 20 69 66 28 20 66 74 73 35 49 6e 64 65 78 50 72   if( fts5IndexPr
6aa0: 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d  epareStmt(p, &p-
6ab0: 3e 70 44 65 6c 65 74 65 72 2c 20 7a 53 71 6c 29  >pDeleter, zSql)
6ac0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a   ) return;.  }..
6ad0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
6ae0: 6e 74 36 34 28 70 2d 3e 70 44 65 6c 65 74 65 72  nt64(p->pDeleter
6af0: 2c 20 31 2c 20 69 46 69 72 73 74 29 3b 0a 20 20  , 1, iFirst);.  
6b00: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
6b10: 36 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20  64(p->pDeleter, 
6b20: 32 2c 20 69 4c 61 73 74 29 3b 0a 20 20 73 71 6c  2, iLast);.  sql
6b30: 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 44 65  ite3_step(p->pDe
6b40: 6c 65 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20  leter);.  p->rc 
6b50: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
6b60: 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 7d 0a  p->pDeleter);.}.
6b70: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c  ./*.** Remove al
6b80: 6c 20 72 65 63 6f 72 64 73 20 61 73 73 6f 63 69  l records associ
6b90: 61 74 65 64 20 77 69 74 68 20 73 65 67 6d 65 6e  ated with segmen
6ba0: 74 20 69 53 65 67 69 64 2e 0a 2a 2f 0a 73 74 61  t iSegid..*/.sta
6bb0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74  tic void fts5Dat
6bc0: 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28 46  aRemoveSegment(F
6bd0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
6be0: 20 69 53 65 67 69 64 29 7b 0a 20 20 69 36 34 20   iSegid){.  i64 
6bf0: 69 46 69 72 73 74 20 3d 20 46 54 53 35 5f 53 45  iFirst = FTS5_SE
6c00: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67  GMENT_ROWID(iSeg
6c10: 69 64 2c 20 30 29 3b 0a 20 20 69 36 34 20 69 4c  id, 0);.  i64 iL
6c20: 61 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  ast = FTS5_SEGME
6c30: 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2b  NT_ROWID(iSegid+
6c40: 31 2c 20 30 29 2d 31 3b 0a 20 20 66 74 73 35 44  1, 0)-1;.  fts5D
6c50: 61 74 61 44 65 6c 65 74 65 28 70 2c 20 69 46 69  ataDelete(p, iFi
6c60: 72 73 74 2c 20 69 4c 61 73 74 29 3b 0a 20 20 69  rst, iLast);.  i
6c70: 66 28 20 70 2d 3e 70 49 64 78 44 65 6c 65 74 65  f( p->pIdxDelete
6c80: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35  r==0 ){.    Fts5
6c90: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
6ca0: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
6cb0: 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61    fts5IndexPrepa
6cc0: 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49  reStmt(p, &p->pI
6cd0: 64 78 44 65 6c 65 74 65 72 2c 20 73 71 6c 69 74  dxDeleter, sqlit
6ce0: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
6cf0: 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
6d00: 4f 4d 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27  OM '%q'.'%q_idx'
6d10: 20 57 48 45 52 45 20 73 65 67 69 64 3d 3f 22 2c   WHERE segid=?",
6d20: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66  .          pConf
6d30: 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67  ig->zDb, pConfig
6d40: 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a  ->zName.    ));.
6d50: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d    }.  if( p->rc=
6d60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6d70: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
6d80: 6e 74 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65  nt(p->pIdxDelete
6d90: 72 2c 20 31 2c 20 69 53 65 67 69 64 29 3b 0a 20  r, 1, iSegid);. 
6da0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
6db0: 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 29 3b  p->pIdxDeleter);
6dc0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
6dd0: 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 49  ite3_reset(p->pI
6de0: 64 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 7d 0a  dxDeleter);.  }.
6df0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
6e00: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
6e10: 61 6e 20 46 74 73 35 53 74 72 75 63 74 75 72 65  an Fts5Structure
6e20: 20 6f 62 6a 65 63 74 20 72 65 74 75 72 6e 65 64   object returned
6e30: 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 0a   by an earlier .
6e40: 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 74 73 35 53  ** call to fts5S
6e50: 74 72 75 63 74 75 72 65 52 65 61 64 28 29 20 6f  tructureRead() o
6e60: 72 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  r fts5StructureD
6e70: 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  ecode()..*/.stat
6e80: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
6e90: 63 74 75 72 65 52 65 6c 65 61 73 65 28 46 74 73  ctureRelease(Fts
6ea0: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
6eb0: 75 63 74 29 7b 0a 20 20 69 66 28 20 70 53 74 72  uct){.  if( pStr
6ec0: 75 63 74 20 26 26 20 30 3e 3d 28 2d 2d 70 53 74  uct && 0>=(--pSt
6ed0: 72 75 63 74 2d 3e 6e 52 65 66 29 20 29 7b 0a 20  ruct->nRef) ){. 
6ee0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73     int i;.    as
6ef0: 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e  sert( pStruct->n
6f00: 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f  Ref==0 );.    fo
6f10: 72 28 69 3d 30 3b 20 69 3c 70 53 74 72 75 63 74  r(i=0; i<pStruct
6f20: 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a  ->nLevel; i++){.
6f30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
6f40: 65 65 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  ee(pStruct->aLev
6f50: 65 6c 5b 69 5d 2e 61 53 65 67 29 3b 0a 20 20 20  el[i].aSeg);.   
6f60: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
6f70: 72 65 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ree(pStruct);.  
6f80: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
6f90: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
6fa0: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 20  f(Fts5Structure 
6fb0: 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 70 53 74  *pStruct){.  pSt
6fc0: 72 75 63 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a  ruct->nRef++;.}.
6fd0: 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69  ./*.** Deseriali
6fe0: 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ze and return th
6ff0: 65 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f  e structure reco
7000: 72 64 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  rd currently sto
7010: 72 65 64 20 69 6e 20 73 65 72 69 61 6c 69 7a 65  red in serialize
7020: 64 0a 2a 2a 20 66 6f 72 6d 20 77 69 74 68 69 6e  d.** form within
7030: 20 62 75 66 66 65 72 20 70 44 61 74 61 2f 6e 44   buffer pData/nD
7040: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46  ata..**.** The F
7050: 74 73 35 53 74 72 75 63 74 75 72 65 2e 61 4c 65  ts5Structure.aLe
7060: 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20 46  vel[] and each F
7070: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
7080: 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a  l.aSeg[] array.*
7090: 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63  * are over-alloc
70a0: 61 74 65 64 20 62 79 20 6f 6e 65 20 73 6c 6f 74  ated by one slot
70b0: 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68  . This allows th
70c0: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
70d0: 65 6e 74 73 0a 2a 2a 20 74 6f 20 62 65 20 6d 6f  ents.** to be mo
70e0: 72 65 20 65 61 73 69 6c 79 20 65 64 69 74 65 64  re easily edited
70f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
7100: 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 4f  ror occurs, *ppO
7110: 75 74 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ut is set to NUL
7120: 4c 20 61 6e 64 20 61 6e 20 53 51 4c 69 74 65 20  L and an SQLite 
7130: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 72 65  error code.** re
7140: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
7150: 65 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74  e, *ppOut is set
7160: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
7170: 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 0a   new object and.
7180: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
7190: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
71a0: 20 69 6e 74 20 66 74 73 35 53 74 72 75 63 74 75   int fts5Structu
71b0: 72 65 44 65 63 6f 64 65 28 0a 20 20 63 6f 6e 73  reDecode(.  cons
71c0: 74 20 75 38 20 2a 70 44 61 74 61 2c 20 20 20 20  t u8 *pData,    
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
71e0: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
71f0: 20 73 65 72 69 61 6c 69 7a 65 64 20 73 74 72 75   serialized stru
7200: 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  cture */.  int n
7210: 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20  Data,           
7220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
7230: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 44 61  ze of buffer pDa
7240: 74 61 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  ta in bytes */. 
7250: 20 69 6e 74 20 2a 70 69 43 6f 6f 6b 69 65 2c 20   int *piCookie, 
7260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7270: 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f   /* Configuratio
7280: 6e 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a  n cookie value *
7290: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
72a0: 65 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20  e **ppOut       
72b0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 65 73 65      /* OUT: Dese
72c0: 72 69 61 6c 69 7a 65 64 20 6f 62 6a 65 63 74 20  rialized object 
72d0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
72e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
72f0: 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  t i = 0;.  int i
7300: 4c 76 6c 3b 0a 20 20 69 6e 74 20 6e 4c 65 76 65  Lvl;.  int nLeve
7310: 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53 65  l = 0;.  int nSe
7320: 67 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 73 71 6c  gment = 0;.  sql
7330: 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
7340: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
7350: 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  Bytes of space t
7360: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 74 20 70 52  o allocate at pR
7370: 65 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  et */.  Fts5Stru
7380: 63 74 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b  cture *pRet = 0;
7390: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63          /* Struc
73a0: 74 75 72 65 20 6f 62 6a 65 63 74 20 74 6f 20 72  ture object to r
73b0: 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 47  eturn */..  /* G
73c0: 72 61 62 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  rab the cookie v
73d0: 61 6c 75 65 20 2a 2f 0a 20 20 69 66 28 20 70 69  alue */.  if( pi
73e0: 43 6f 6f 6b 69 65 20 29 20 2a 70 69 43 6f 6f 6b  Cookie ) *piCook
73f0: 69 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  ie = sqlite3Fts5
7400: 47 65 74 33 32 28 70 44 61 74 61 29 3b 0a 20 20  Get32(pData);.  
7410: 69 20 3d 20 34 3b 0a 0a 20 20 2f 2a 20 52 65 61  i = 4;..  /* Rea
7420: 64 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  d the total numb
7430: 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 61 6e 64  er of levels and
7440: 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74   segments from t
7450: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a  he start of the.
7460: 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 20 72    ** structure r
7470: 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 69 20 2b  ecord.  */.  i +
7480: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
7490: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 4c 65  2(&pData[i], nLe
74a0: 76 65 6c 29 3b 0a 20 20 69 20 2b 3d 20 66 74 73  vel);.  i += fts
74b0: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44  5GetVarint32(&pD
74c0: 61 74 61 5b 69 5d 2c 20 6e 53 65 67 6d 65 6e 74  ata[i], nSegment
74d0: 29 3b 0a 20 20 69 66 28 20 6e 4c 65 76 65 6c 3e  );.  if( nLevel>
74e0: 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54  FTS5_MAX_SEGMENT
74f0: 20 20 20 7c 7c 20 6e 4c 65 76 65 6c 3c 30 0a 20     || nLevel<0. 
7500: 20 20 7c 7c 20 6e 53 65 67 6d 65 6e 74 3e 46 54    || nSegment>FT
7510: 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20 7c  S5_MAX_SEGMENT |
7520: 7c 20 6e 53 65 67 6d 65 6e 74 3c 30 0a 20 20 29  | nSegment<0.  )
7530: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 54 53  {.    return FTS
7540: 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20  5_CORRUPT;.  }. 
7550: 20 6e 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20   nByte = (.     
7560: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
7570: 63 74 75 72 65 29 20 2b 20 20 20 20 20 20 20 20  cture) +        
7580: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
7590: 61 69 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ain structure */
75a0: 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74  .      sizeof(Ft
75b0: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
75c0: 29 20 2a 20 28 6e 4c 65 76 65 6c 2d 31 29 20 20  ) * (nLevel-1)  
75d0: 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72    /* aLevel[] ar
75e0: 72 61 79 20 2a 2f 0a 20 20 29 3b 0a 20 20 70 52  ray */.  );.  pR
75f0: 65 74 20 3d 20 28 46 74 73 35 53 74 72 75 63 74  et = (Fts5Struct
7600: 75 72 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35  ure*)sqlite3Fts5
7610: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
7620: 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70  nByte);..  if( p
7630: 52 65 74 20 29 7b 0a 20 20 20 20 70 52 65 74 2d  Ret ){.    pRet-
7640: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  >nRef = 1;.    p
7650: 52 65 74 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 4c  Ret->nLevel = nL
7660: 65 76 65 6c 3b 0a 20 20 20 20 70 52 65 74 2d 3e  evel;.    pRet->
7670: 6e 53 65 67 6d 65 6e 74 20 3d 20 6e 53 65 67 6d  nSegment = nSegm
7680: 65 6e 74 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71  ent;.    i += sq
7690: 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
76a0: 6e 74 28 26 70 44 61 74 61 5b 69 5d 2c 20 26 70  nt(&pData[i], &p
76b0: 52 65 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74  Ret->nWriteCount
76c0: 65 72 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 4c  er);..    for(iL
76d0: 76 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  vl=0; rc==SQLITE
76e0: 5f 4f 4b 20 26 26 20 69 4c 76 6c 3c 6e 4c 65 76  _OK && iLvl<nLev
76f0: 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
7700: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
7710: 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
7720: 52 65 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  Ret->aLevel[iLvl
7730: 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  ];.      int nTo
7740: 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  tal = 0;.      i
7750: 6e 74 20 69 53 65 67 3b 0a 0a 20 20 20 20 20 20  nt iSeg;..      
7760: 69 66 28 20 69 3e 3d 6e 44 61 74 61 20 29 7b 0a  if( i>=nData ){.
7770: 20 20 20 20 20 20 20 20 72 63 20 3d 20 46 54 53          rc = FTS
7780: 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
7790: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
77a0: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
77b0: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
77c0: 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20  pLvl->nMerge);. 
77d0: 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35         i += fts5
77e0: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
77f0: 74 61 5b 69 5d 2c 20 6e 54 6f 74 61 6c 29 3b 0a  ta[i], nTotal);.
7800: 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 74          if( nTot
7810: 61 6c 3c 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20  al<pLvl->nMerge 
7820: 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ) rc = FTS5_CORR
7830: 55 50 54 3b 0a 20 20 20 20 20 20 20 20 70 4c 76  UPT;.        pLv
7840: 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74 73 35 53  l->aSeg = (Fts5S
7850: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 2a  tructureSegment*
7860: 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
7870: 6f 63 5a 65 72 6f 28 26 72 63 2c 20 0a 20 20 20  ocZero(&rc, .   
7880: 20 20 20 20 20 20 20 20 20 6e 54 6f 74 61 6c 20           nTotal 
7890: 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
78a0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 0a 20  uctureSegment). 
78b0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
78c0: 20 20 6e 53 65 67 6d 65 6e 74 20 2d 3d 20 6e 54    nSegment -= nT
78d0: 6f 74 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  otal;.      }.. 
78e0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
78f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7900: 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e    pLvl->nSeg = n
7910: 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 66  Total;.        f
7920: 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
7930: 6e 54 6f 74 61 6c 3b 20 69 53 65 67 2b 2b 29 7b  nTotal; iSeg++){
7940: 0a 20 20 20 20 20 20 20 20 20 20 46 74 73 35 53  .          Fts5S
7950: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
7960: 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61  *pSeg = &pLvl->a
7970: 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20  Seg[iSeg];.     
7980: 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 44 61 74       if( i>=nDat
7990: 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  a ){.           
79a0: 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
79b0: 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
79c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
79d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b   }.          i +
79e0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
79f0: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 53 65  2(&pData[i], pSe
7a00: 67 2d 3e 69 53 65 67 69 64 29 3b 0a 20 20 20 20  g->iSegid);.    
7a10: 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47        i += fts5G
7a20: 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74  etVarint32(&pDat
7a30: 61 5b 69 5d 2c 20 70 53 65 67 2d 3e 70 67 6e 6f  a[i], pSeg->pgno
7a40: 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20  First);.        
7a50: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
7a60: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
7a70: 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  , pSeg->pgnoLast
7a80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
7a90: 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3c   pSeg->pgnoLast<
7aa0: 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
7ab0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
7ac0: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
7ad0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
7ae0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
7af0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7b00: 20 20 20 69 66 28 20 69 4c 76 6c 3e 30 20 26 26     if( iLvl>0 &&
7b10: 20 70 4c 76 6c 5b 2d 31 5d 2e 6e 4d 65 72 67 65   pLvl[-1].nMerge
7b20: 20 26 26 20 6e 54 6f 74 61 6c 3d 3d 30 20 29 20   && nTotal==0 ) 
7b30: 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
7b40: 54 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  T;.        if( i
7b50: 4c 76 6c 3d 3d 6e 4c 65 76 65 6c 2d 31 20 26 26  Lvl==nLevel-1 &&
7b60: 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 20   pLvl->nMerge ) 
7b70: 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
7b80: 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  T;.      }.    }
7b90: 0a 20 20 20 20 69 66 28 20 6e 53 65 67 6d 65 6e  .    if( nSegmen
7ba0: 74 21 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  t!=0 && rc==SQLI
7bb0: 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 46 54 53  TE_OK ) rc = FTS
7bc0: 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20  5_CORRUPT;..    
7bd0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7be0: 4b 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  K ){.      fts5S
7bf0: 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
7c00: 70 52 65 74 29 3b 0a 20 20 20 20 20 20 70 52 65  pRet);.      pRe
7c10: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
7c20: 0a 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 52 65  ..  *ppOut = pRe
7c30: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
7c40: 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  }../*.**.*/.stat
7c50: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
7c60: 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 69 6e  ctureAddLevel(in
7c70: 74 20 2a 70 52 63 2c 20 46 74 73 35 53 74 72 75  t *pRc, Fts5Stru
7c80: 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74  cture **ppStruct
7c90: 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  ){.  if( *pRc==S
7ca0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7cb0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
7cc0: 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
7cd0: 63 74 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 76  ct;.    int nLev
7ce0: 65 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c  el = pStruct->nL
7cf0: 65 76 65 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65  evel;.    sqlite
7d00: 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20  3_int64 nByte = 
7d10: 28 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66  (.        sizeof
7d20: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29 20  (Fts5Structure) 
7d30: 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
7d40: 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72 75 63     /* Main struc
7d50: 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ture */.        
7d60: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
7d70: 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c  tureLevel) * (nL
7d80: 65 76 65 6c 2b 31 29 20 20 2f 2a 20 61 4c 65 76  evel+1)  /* aLev
7d90: 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  el[] array */.  
7da0: 20 20 29 3b 0a 0a 20 20 20 20 70 53 74 72 75 63    );..    pStruc
7db0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  t = sqlite3_real
7dc0: 6c 6f 63 36 34 28 70 53 74 72 75 63 74 2c 20 6e  loc64(pStruct, n
7dd0: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
7de0: 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20  Struct ){.      
7df0: 6d 65 6d 73 65 74 28 26 70 53 74 72 75 63 74 2d  memset(&pStruct-
7e00: 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76 65 6c 5d 2c  >aLevel[nLevel],
7e10: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
7e20: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 29 3b  tructureLevel));
7e30: 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e  .      pStruct->
7e40: 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20  nLevel++;.      
7e50: 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72  *ppStruct = pStr
7e60: 75 63 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  uct;.    }else{.
7e70: 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c        *pRc = SQL
7e80: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
7e90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  .  }.}../*.** Ex
7ea0: 74 65 6e 64 20 6c 65 76 65 6c 20 69 4c 76 6c 20  tend level iLvl 
7eb0: 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69 73  so that there is
7ec0: 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20 6c 65 61   room for at lea
7ed0: 73 74 20 6e 45 78 74 72 61 20 6d 6f 72 65 0a 2a  st nExtra more.*
7ee0: 2a 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  * segments..*/.s
7ef0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
7f00: 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65  tructureExtendLe
7f10: 76 65 6c 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c  vel(.  int *pRc,
7f20: 20 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72   .  Fts5Structur
7f30: 65 20 2a 70 53 74 72 75 63 74 2c 20 0a 20 20 69  e *pStruct, .  i
7f40: 6e 74 20 69 4c 76 6c 2c 20 0a 20 20 69 6e 74 20  nt iLvl, .  int 
7f50: 6e 45 78 74 72 61 2c 20 0a 20 20 69 6e 74 20 62  nExtra, .  int b
7f60: 49 6e 73 65 72 74 0a 29 7b 0a 20 20 69 66 28 20  Insert.){.  if( 
7f70: 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
7f80: 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ){.    Fts5Struc
7f90: 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
7fa0: 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
7fb0: 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 46 74  el[iLvl];.    Ft
7fc0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
7fd0: 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 73 71  nt *aNew;.    sq
7fe0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74  lite3_int64 nByt
7ff0: 65 3b 0a 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  e;..    nByte = 
8000: 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2b 20 6e 45  (pLvl->nSeg + nE
8010: 78 74 72 61 29 20 2a 20 73 69 7a 65 6f 66 28 46  xtra) * sizeof(F
8020: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
8030: 65 6e 74 29 3b 0a 20 20 20 20 61 4e 65 77 20 3d  ent);.    aNew =
8040: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
8050: 36 34 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 6e  64(pLvl->aSeg, n
8060: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 61  Byte);.    if( a
8070: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  New ){.      if(
8080: 20 62 49 6e 73 65 72 74 3d 3d 30 20 29 7b 0a 20   bInsert==0 ){. 
8090: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61         memset(&a
80a0: 4e 65 77 5b 70 4c 76 6c 2d 3e 6e 53 65 67 5d 2c  New[pLvl->nSeg],
80b0: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
80c0: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
80d0: 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20   * nExtra);.    
80e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
80f0: 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 70 4c 76   int nMove = pLv
8100: 6c 2d 3e 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66  l->nSeg * sizeof
8110: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
8120: 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  gment);.        
8130: 6d 65 6d 6d 6f 76 65 28 26 61 4e 65 77 5b 6e 45  memmove(&aNew[nE
8140: 78 74 72 61 5d 2c 20 61 4e 65 77 2c 20 6e 4d 6f  xtra], aNew, nMo
8150: 76 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ve);.        mem
8160: 73 65 74 28 61 4e 65 77 2c 20 30 2c 20 73 69 7a  set(aNew, 0, siz
8170: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
8180: 65 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74  eSegment) * nExt
8190: 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ra);.      }.   
81a0: 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20     pLvl->aSeg = 
81b0: 61 4e 65 77 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  aNew;.    }else{
81c0: 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51  .      *pRc = SQ
81d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
81e0: 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  }.  }.}..static 
81f0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 66  Fts5Structure *f
8200: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
8210: 55 6e 63 61 63 68 65 64 28 46 74 73 35 49 6e 64  Uncached(Fts5Ind
8220: 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74  ex *p){.  Fts5St
8230: 72 75 63 74 75 72 65 20 2a 70 52 65 74 20 3d 20  ructure *pRet = 
8240: 30 3b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  0;.  Fts5Config 
8250: 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
8260: 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20 69 43 6f  onfig;.  int iCo
8270: 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20 20 20  okie;           
8280: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
8290: 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65  iguration cookie
82a0: 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a   */.  Fts5Data *
82b0: 70 44 61 74 61 3b 0a 0a 20 20 70 44 61 74 61 20  pData;..  pData 
82c0: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
82d0: 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45  , FTS5_STRUCTURE
82e0: 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66 28 20 70  _ROWID);.  if( p
82f0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
8300: 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  ){.    /* TODO: 
8310: 44 6f 20 77 65 20 6e 65 65 64 20 74 68 69 73 20  Do we need this 
8320: 69 66 20 74 68 65 20 6c 65 61 66 2d 69 6e 64 65  if the leaf-inde
8330: 78 20 69 73 20 61 70 70 65 6e 64 65 64 3f 20 50  x is appended? P
8340: 72 6f 62 61 62 6c 79 2e 2e 2e 20 2a 2f 0a 20 20  robably... */.  
8350: 20 20 6d 65 6d 73 65 74 28 26 70 44 61 74 61 2d    memset(&pData-
8360: 3e 70 5b 70 44 61 74 61 2d 3e 6e 6e 5d 2c 20 30  >p[pData->nn], 0
8370: 2c 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44  , FTS5_DATA_PADD
8380: 49 4e 47 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20  ING);.    p->rc 
8390: 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  = fts5StructureD
83a0: 65 63 6f 64 65 28 70 44 61 74 61 2d 3e 70 2c 20  ecode(pData->p, 
83b0: 70 44 61 74 61 2d 3e 6e 6e 2c 20 26 69 43 6f 6f  pData->nn, &iCoo
83c0: 6b 69 65 2c 20 26 70 52 65 74 29 3b 0a 20 20 20  kie, &pRet);.   
83d0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
83e0: 54 45 5f 4f 4b 20 26 26 20 70 43 6f 6e 66 69 67  TE_OK && pConfig
83f0: 2d 3e 69 43 6f 6f 6b 69 65 21 3d 69 43 6f 6f 6b  ->iCookie!=iCook
8400: 69 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  ie ){.      p->r
8410: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43  c = sqlite3Fts5C
8420: 6f 6e 66 69 67 4c 6f 61 64 28 70 43 6f 6e 66 69  onfigLoad(pConfi
8430: 67 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a 20 20 20  g, iCookie);.   
8440: 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61 52   }.    fts5DataR
8450: 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20  elease(pData);. 
8460: 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51     if( p->rc!=SQ
8470: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8480: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
8490: 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20  lease(pRet);.   
84a0: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
84b0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
84c0: 20 70 52 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63   pRet;.}..static
84d0: 20 69 36 34 20 66 74 73 35 49 6e 64 65 78 44 61   i64 fts5IndexDa
84e0: 74 61 56 65 72 73 69 6f 6e 28 46 74 73 35 49 6e  taVersion(Fts5In
84f0: 64 65 78 20 2a 70 29 7b 0a 20 20 69 36 34 20 69  dex *p){.  i64 i
8500: 56 65 72 73 69 6f 6e 20 3d 20 30 3b 0a 0a 20 20  Version = 0;..  
8510: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
8520: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
8530: 70 2d 3e 70 44 61 74 61 56 65 72 73 69 6f 6e 3d  p->pDataVersion=
8540: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  =0 ){.      p->r
8550: 63 20 3d 20 66 74 73 35 49 6e 64 65 78 50 72 65  c = fts5IndexPre
8560: 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e  pareStmt(p, &p->
8570: 70 44 61 74 61 56 65 72 73 69 6f 6e 2c 20 0a 20  pDataVersion, . 
8580: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8590: 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
85a0: 20 25 51 2e 64 61 74 61 5f 76 65 72 73 69 6f 6e   %Q.data_version
85b0: 22 2c 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 7a  ", p->pConfig->z
85c0: 44 62 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b  Db).          );
85d0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
85e0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
85f0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 53 51 4c 49   }..    if( SQLI
8600: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
8610: 73 74 65 70 28 70 2d 3e 70 44 61 74 61 56 65 72  step(p->pDataVer
8620: 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 69  sion) ){.      i
8630: 56 65 72 73 69 6f 6e 20 3d 20 73 71 6c 69 74 65  Version = sqlite
8640: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
8650: 2d 3e 70 44 61 74 61 56 65 72 73 69 6f 6e 2c 20  ->pDataVersion, 
8660: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  0);.    }.    p-
8670: 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
8680: 73 65 74 28 70 2d 3e 70 44 61 74 61 56 65 72 73  set(p->pDataVers
8690: 69 6f 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ion);.  }..  ret
86a0: 75 72 6e 20 69 56 65 72 73 69 6f 6e 3b 0a 7d 0a  urn iVersion;.}.
86b0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 2c 20 64 65 73  ./*.** Read, des
86c0: 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74  erialize and ret
86d0: 75 72 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  urn the structur
86e0: 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  e record..**.** 
86f0: 54 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72  The Fts5Structur
8700: 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65  e.aLevel[] and e
8710: 61 63 68 20 46 74 73 35 53 74 72 75 63 74 75 72  ach Fts5Structur
8720: 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72  eLevel.aSeg[] ar
8730: 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d  ray.** are over-
8740: 61 6c 6c 6f 63 61 74 65 64 20 61 73 20 64 65 73  allocated as des
8750: 63 72 69 62 65 64 20 66 6f 72 20 66 75 6e 63 74  cribed for funct
8760: 69 6f 6e 20 66 74 73 35 53 74 72 75 63 74 75 72  ion fts5Structur
8770: 65 44 65 63 6f 64 65 28 29 20 0a 2a 2a 20 61 62  eDecode() .** ab
8780: 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ove..**.** If an
8790: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
87a0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
87b0: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
87c0: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a  e left in the.**
87d0: 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c   Fts5Index handl
87e0: 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  e. If an error h
87f0: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
8800: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
8810: 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c  nction.** is cal
8820: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
8830: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74  op..*/.static Ft
8840: 73 35 53 74 72 75 63 74 75 72 65 20 2a 66 74 73  s5Structure *fts
8850: 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 46  5StructureRead(F
8860: 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 0a 20  ts5Index *p){.. 
8870: 20 69 66 28 20 70 2d 3e 70 53 74 72 75 63 74 3d   if( p->pStruct=
8880: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 69 53 74  =0 ){.    p->iSt
8890: 72 75 63 74 56 65 72 73 69 6f 6e 20 3d 20 66 74  ructVersion = ft
88a0: 73 35 49 6e 64 65 78 44 61 74 61 56 65 72 73 69  s5IndexDataVersi
88b0: 6f 6e 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70  on(p);.    if( p
88c0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
88d0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 53 74 72  ){.      p->pStr
88e0: 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
88f0: 75 72 65 52 65 61 64 55 6e 63 61 63 68 65 64 28  ureReadUncached(
8900: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  p);.    }.  }..#
8910: 69 66 20 30 0a 20 20 65 6c 73 65 7b 0a 20 20 20  if 0.  else{.   
8920: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
8930: 70 54 65 73 74 20 3d 20 66 74 73 35 53 74 72 75  pTest = fts5Stru
8940: 63 74 75 72 65 52 65 61 64 55 6e 63 61 63 68 65  ctureReadUncache
8950: 64 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 54  d(p);.    if( pT
8960: 65 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  est ){.      int
8970: 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 61 73 73   i, j;.      ass
8980: 65 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74 72 75  ert_nc( p->pStru
8990: 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 70 54  ct->nSegment==pT
89a0: 65 73 74 2d 3e 6e 53 65 67 6d 65 6e 74 20 29 3b  est->nSegment );
89b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63  .      assert_nc
89c0: 28 20 70 2d 3e 70 53 74 72 75 63 74 2d 3e 6e 4c  ( p->pStruct->nL
89d0: 65 76 65 6c 3d 3d 70 54 65 73 74 2d 3e 6e 4c 65  evel==pTest->nLe
89e0: 76 65 6c 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  vel );.      for
89f0: 28 69 3d 30 3b 20 69 3c 70 54 65 73 74 2d 3e 6e  (i=0; i<pTest->n
8a00: 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  Level; i++){.   
8a10: 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
8a20: 70 2d 3e 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  p->pStruct->aLev
8a30: 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 3d 3d 70 54  el[i].nMerge==pT
8a40: 65 73 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e  est->aLevel[i].n
8a50: 4d 65 72 67 65 20 29 3b 0a 20 20 20 20 20 20 20  Merge );.       
8a60: 20 61 73 73 65 72 74 5f 6e 63 28 20 70 2d 3e 70   assert_nc( p->p
8a70: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
8a80: 5d 2e 6e 53 65 67 3d 3d 70 54 65 73 74 2d 3e 61  ].nSeg==pTest->a
8a90: 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65 67 20 29 3b  Level[i].nSeg );
8aa0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
8ab0: 3b 20 6a 3c 70 54 65 73 74 2d 3e 61 4c 65 76 65  ; j<pTest->aLeve
8ac0: 6c 5b 69 5d 2e 6e 53 65 67 3b 20 6a 2b 2b 29 7b  l[i].nSeg; j++){
8ad0: 0a 20 20 20 20 20 20 20 20 20 20 46 74 73 35 53  .          Fts5S
8ae0: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
8af0: 2a 70 31 20 3d 20 26 70 54 65 73 74 2d 3e 61 4c  *p1 = &pTest->aL
8b00: 65 76 65 6c 5b 69 5d 2e 61 53 65 67 5b 6a 5d 3b  evel[i].aSeg[j];
8b10: 0a 20 20 20 20 20 20 20 20 20 20 46 74 73 35 53  .          Fts5S
8b20: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
8b30: 2a 70 32 20 3d 20 26 70 2d 3e 70 53 74 72 75 63  *p2 = &p->pStruc
8b40: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65  t->aLevel[i].aSe
8b50: 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  g[j];.          
8b60: 61 73 73 65 72 74 5f 6e 63 28 20 70 31 2d 3e 69  assert_nc( p1->i
8b70: 53 65 67 69 64 3d 3d 70 32 2d 3e 69 53 65 67 69  Segid==p2->iSegi
8b80: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  d );.          a
8b90: 73 73 65 72 74 5f 6e 63 28 20 70 31 2d 3e 70 67  ssert_nc( p1->pg
8ba0: 6e 6f 46 69 72 73 74 3d 3d 70 32 2d 3e 70 67 6e  noFirst==p2->pgn
8bb0: 6f 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20  oFirst );.      
8bc0: 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70      assert_nc( p
8bd0: 31 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d 70 32 2d  1->pgnoLast==p2-
8be0: 3e 70 67 6e 6f 4c 61 73 74 20 29 3b 0a 20 20 20  >pgnoLast );.   
8bf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
8c00: 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
8c10: 72 65 52 65 6c 65 61 73 65 28 70 54 65 73 74 29  reRelease(pTest)
8c20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
8c30: 69 66 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 21  if..  if( p->rc!
8c40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
8c50: 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28  urn 0;.  assert(
8c60: 20 70 2d 3e 69 53 74 72 75 63 74 56 65 72 73 69   p->iStructVersi
8c70: 6f 6e 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  on!=0 );.  asser
8c80: 74 28 20 70 2d 3e 70 53 74 72 75 63 74 21 3d 30  t( p->pStruct!=0
8c90: 20 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74   );.  fts5Struct
8ca0: 75 72 65 52 65 66 28 70 2d 3e 70 53 74 72 75 63  ureRef(p->pStruc
8cb0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  t);.  return p->
8cc0: 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 73 74 61 74  pStruct;.}..stat
8cd0: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
8ce0: 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28  ctureInvalidate(
8cf0: 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
8d00: 20 69 66 28 20 70 2d 3e 70 53 74 72 75 63 74 20   if( p->pStruct 
8d10: 29 7b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  ){.    fts5Struc
8d20: 74 75 72 65 52 65 6c 65 61 73 65 28 70 2d 3e 70  tureRelease(p->p
8d30: 53 74 72 75 63 74 29 3b 0a 20 20 20 20 70 2d 3e  Struct);.    p->
8d40: 70 53 74 72 75 63 74 20 3d 20 30 3b 0a 20 20 7d  pStruct = 0;.  }
8d50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
8d60: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
8d70: 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e  r of segments in
8d80: 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
8d90: 20 70 53 74 72 75 63 74 2e 20 54 68 69 73 0a 2a   pStruct. This.*
8da0: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  * function is on
8db0: 6c 79 20 65 76 65 72 20 75 73 65 64 20 61 73 20  ly ever used as 
8dc0: 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29  part of assert()
8dd0: 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 2a 2f 0a   conditions..*/.
8de0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
8df0: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 66  BUG.static int f
8e00: 74 73 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e  ts5StructureCoun
8e10: 74 53 65 67 6d 65 6e 74 73 28 46 74 73 35 53 74  tSegments(Fts5St
8e20: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
8e30: 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  ){.  int nSegmen
8e40: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
8e50: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
8e60: 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
8e70: 20 2a 2f 0a 20 20 69 66 28 20 70 53 74 72 75 63   */.  if( pStruc
8e80: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76  t ){.    int iLv
8e90: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8ea0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
8eb0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
8ec0: 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20  h levels */.    
8ed0: 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
8ee0: 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
8ef0: 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
8f00: 20 6e 53 65 67 6d 65 6e 74 20 2b 3d 20 70 53 74   nSegment += pSt
8f10: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
8f20: 6c 5d 2e 6e 53 65 67 3b 0a 20 20 20 20 7d 0a 20  l].nSeg;.    }. 
8f30: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 53 65   }..  return nSe
8f40: 67 6d 65 6e 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a  gment;.}.#endif.
8f50: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42 75 66  .#define fts5Buf
8f60: 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
8f70: 62 28 70 42 75 66 2c 20 70 42 6c 6f 62 2c 20 6e  b(pBuf, pBlob, n
8f80: 42 6c 6f 62 29 20 7b 20 20 20 20 20 5c 0a 20 20  Blob) {     \.  
8f90: 61 73 73 65 72 74 28 20 28 70 42 75 66 29 2d 3e  assert( (pBuf)->
8fa0: 6e 53 70 61 63 65 3e 3d 28 28 70 42 75 66 29 2d  nSpace>=((pBuf)-
8fb0: 3e 6e 2b 6e 42 6c 6f 62 29 20 29 3b 20 20 20 20  >n+nBlob) );    
8fc0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6d 65 6d           \.  mem
8fd0: 63 70 79 28 26 28 70 42 75 66 29 2d 3e 70 5b 28  cpy(&(pBuf)->p[(
8fe0: 70 42 75 66 29 2d 3e 6e 5d 2c 20 70 42 6c 6f 62  pBuf)->n], pBlob
8ff0: 2c 20 6e 42 6c 6f 62 29 3b 20 20 20 20 20 20 20  , nBlob);       
9000: 20 20 20 20 20 20 5c 0a 20 20 28 70 42 75 66 29        \.  (pBuf)
9010: 2d 3e 6e 20 2b 3d 20 6e 42 6c 6f 62 3b 20 20 20  ->n += nBlob;   
9020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9040: 20 20 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20     \.}..#define 
9050: 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
9060: 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c  pendVarint(pBuf,
9070: 20 69 56 61 6c 29 20 7b 20 20 20 20 20 20 20 20   iVal) {        
9080: 20 20 20 20 20 20 20 20 5c 0a 20 20 28 70 42 75          \.  (pBu
9090: 66 29 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33  f)->n += sqlite3
90a0: 46 74 73 35 50 75 74 56 61 72 69 6e 74 28 26 28  Fts5PutVarint(&(
90b0: 70 42 75 66 29 2d 3e 70 5b 28 70 42 75 66 29 2d  pBuf)->p[(pBuf)-
90c0: 3e 6e 5d 2c 20 28 69 56 61 6c 29 29 3b 20 20 5c  >n], (iVal));  \
90d0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 75 66  .  assert( (pBuf
90e0: 29 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 42 75 66  )->nSpace>=(pBuf
90f0: 29 2d 3e 6e 20 29 3b 20 20 20 20 20 20 20 20 20  )->n );         
9100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9110: 20 5c 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 72   \.}.../*.** Ser
9120: 69 61 6c 69 7a 65 20 61 6e 64 20 73 74 6f 72 65  ialize and store
9130: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 22   the "structure"
9140: 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49   record..**.** I
9150: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
9160: 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
9170: 72 20 63 6f 64 65 20 69 6e 20 74 68 65 20 46 74  r code in the Ft
9180: 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 20  s5Index object. 
9190: 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 68  If an.** error h
91a0: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
91b0: 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
91c0: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
91d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
91e0: 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65  s5StructureWrite
91f0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
9200: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
9210: 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20 70 2d  truct){.  if( p-
9220: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
9230: 7b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  {.    Fts5Buffer
9240: 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20   buf;           
9250: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
9260: 20 73 65 72 69 61 6c 69 7a 65 20 72 65 63 6f 72   serialize recor
9270: 64 20 69 6e 74 6f 20 2a 2f 0a 20 20 20 20 69 6e  d into */.    in
9280: 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20  t iLvl;         
9290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
92a0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
92b0: 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f  hrough levels */
92c0: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65  .    int iCookie
92d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
92e0: 20 20 20 2f 2a 20 43 6f 6f 6b 69 65 20 76 61 6c     /* Cookie val
92f0: 75 65 20 74 6f 20 73 74 6f 72 65 20 2a 2f 0a 0a  ue to store */..
9300: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72      assert( pStr
9310: 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66  uct->nSegment==f
9320: 74 73 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e  ts5StructureCoun
9330: 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63  tSegments(pStruc
9340: 74 29 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  t) );.    memset
9350: 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66  (&buf, 0, sizeof
9360: 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a  (Fts5Buffer));..
9370: 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68      /* Append th
9380: 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 66 69 67  e current config
9390: 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a  uration cookie *
93a0: 2f 0a 20 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20  /.    iCookie = 
93b0: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f  p->pConfig->iCoo
93c0: 6b 69 65 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  kie;.    if( iCo
93d0: 6f 6b 69 65 3c 30 20 29 20 69 43 6f 6f 6b 69 65  okie<0 ) iCookie
93e0: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 30   = 0;..    if( 0
93f0: 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 42 75 66  ==sqlite3Fts5Buf
9400: 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20  ferSize(&p->rc, 
9410: 26 62 75 66 2c 20 34 2b 39 2b 39 2b 39 29 20 29  &buf, 4+9+9+9) )
9420: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
9430: 74 73 35 50 75 74 33 32 28 62 75 66 2e 70 2c 20  ts5Put32(buf.p, 
9440: 69 43 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 20 20  iCookie);.      
9450: 62 75 66 2e 6e 20 3d 20 34 3b 0a 20 20 20 20 20  buf.n = 4;.     
9460: 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
9470: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62 75 66  ppendVarint(&buf
9480: 2c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  , pStruct->nLeve
9490: 6c 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  l);.      fts5Bu
94a0: 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
94b0: 72 69 6e 74 28 26 62 75 66 2c 20 70 53 74 72 75  rint(&buf, pStru
94c0: 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 29 3b 0a 20  ct->nSegment);. 
94d0: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
94e0: 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28  afeAppendVarint(
94f0: 26 62 75 66 2c 20 28 69 36 34 29 70 53 74 72 75  &buf, (i64)pStru
9500: 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  ct->nWriteCounte
9510: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  r);.    }..    f
9520: 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
9530: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
9540: 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
9550: 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20 20 20  int iSeg;       
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9570: 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
9580: 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74   through segment
9590: 73 20 2a 2f 0a 20 20 20 20 20 20 46 74 73 35 53  s */.      Fts5S
95a0: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
95b0: 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
95c0: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
95d0: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
95e0: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
95f0: 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e  c, &buf, pLvl->n
9600: 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 66 74  Merge);.      ft
9610: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
9620: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
9630: 66 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a  f, pLvl->nSeg);.
9640: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
9650: 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c  vl->nMerge<=pLvl
9660: 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 20 20 20  ->nSeg );..     
9670: 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
9680: 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53  g<pLvl->nSeg; iS
9690: 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66  eg++){.        f
96a0: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
96b0: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
96c0: 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  uf, pLvl->aSeg[i
96d0: 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20  Seg].iSegid);.  
96e0: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
96f0: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
9700: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
9710: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f  >aSeg[iSeg].pgno
9720: 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20  First);.        
9730: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
9740: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
9750: 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  buf, pLvl->aSeg[
9760: 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b  iSeg].pgnoLast);
9770: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
9780: 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74      fts5DataWrit
9790: 65 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54  e(p, FTS5_STRUCT
97a0: 55 52 45 5f 52 4f 57 49 44 2c 20 62 75 66 2e 70  URE_ROWID, buf.p
97b0: 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20 20 66 74  , buf.n);.    ft
97c0: 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75  s5BufferFree(&bu
97d0: 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 30  f);.  }.}..#if 0
97e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
97f0: 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28  5DebugStructure(
9800: 69 6e 74 2a 2c 46 74 73 35 42 75 66 66 65 72 2a  int*,Fts5Buffer*
9810: 2c 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29  ,Fts5Structure*)
9820: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ;.static void ft
9830: 73 35 50 72 69 6e 74 53 74 72 75 63 74 75 72 65  s5PrintStructure
9840: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 61  (const char *zCa
9850: 70 74 69 6f 6e 2c 20 46 74 73 35 53 74 72 75 63  ption, Fts5Struc
9860: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
9870: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
9880: 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 42 75 66 66  E_OK;.  Fts5Buff
9890: 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74  er buf;.  memset
98a0: 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66  (&buf, 0, sizeof
98b0: 28 62 75 66 29 29 3b 0a 20 20 66 74 73 35 44 65  (buf));.  fts5De
98c0: 62 75 67 53 74 72 75 63 74 75 72 65 28 26 72 63  bugStructure(&rc
98d0: 2c 20 26 62 75 66 2c 20 70 53 74 72 75 63 74 29  , &buf, pStruct)
98e0: 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f  ;.  fprintf(stdo
98f0: 75 74 2c 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20  ut, "%s: %s\n", 
9900: 7a 43 61 70 74 69 6f 6e 2c 20 62 75 66 2e 70 29  zCaption, buf.p)
9910: 3b 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75  ;.  fflush(stdou
9920: 74 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  t);.  fts5Buffer
9930: 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 23 65  Free(&buf);.}.#e
9940: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73  lse.# define fts
9950: 35 50 72 69 6e 74 53 74 72 75 63 74 75 72 65 28  5PrintStructure(
9960: 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61  x,y).#endif..sta
9970: 74 69 63 20 69 6e 74 20 66 74 73 35 53 65 67 6d  tic int fts5Segm
9980: 65 6e 74 53 69 7a 65 28 46 74 73 35 53 74 72 75  entSize(Fts5Stru
9990: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
99a0: 65 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 31 20  eg){.  return 1 
99b0: 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  + pSeg->pgnoLast
99c0: 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72   - pSeg->pgnoFir
99d0: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  st;.}../*.** Ret
99e0: 75 72 6e 20 61 20 63 6f 70 79 20 6f 66 20 69 6e  urn a copy of in
99f0: 64 65 78 20 73 74 72 75 63 74 75 72 65 20 70 53  dex structure pS
9a00: 74 72 75 63 74 2e 20 45 78 63 65 70 74 2c 20 70  truct. Except, p
9a10: 72 6f 6d 6f 74 65 20 61 73 20 6d 61 6e 79 20 0a  romote as many .
9a20: 2a 2a 20 73 65 67 6d 65 6e 74 73 20 61 73 20 70  ** segments as p
9a30: 6f 73 73 69 62 6c 65 20 74 6f 20 6c 65 76 65 6c  ossible to level
9a40: 20 69 50 72 6f 6d 6f 74 65 2e 20 49 66 20 61 6e   iPromote. If an
9a50: 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 4e 55 4c   OOM occurs, NUL
9a60: 4c 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  L is .** returne
9a70: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
9a80: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50  d fts5StructureP
9a90: 72 6f 6d 6f 74 65 54 6f 28 0a 20 20 46 74 73 35  romoteTo(.  Fts5
9aa0: 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 6e 74 20  Index *p,.  int 
9ab0: 69 50 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e 74 20  iPromote,.  int 
9ac0: 73 7a 50 72 6f 6d 6f 74 65 2c 0a 20 20 46 74 73  szPromote,.  Fts
9ad0: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
9ae0: 75 63 74 0a 29 7b 0a 20 20 69 6e 74 20 69 6c 2c  uct.){.  int il,
9af0: 20 69 73 3b 0a 20 20 46 74 73 35 53 74 72 75 63   is;.  Fts5Struc
9b00: 74 75 72 65 4c 65 76 65 6c 20 2a 70 4f 75 74 20  tureLevel *pOut 
9b10: 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
9b20: 65 6c 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a 0a 20  el[iPromote];.. 
9b30: 20 69 66 28 20 70 4f 75 74 2d 3e 6e 4d 65 72 67   if( pOut->nMerg
9b40: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  e==0 ){.    for(
9b50: 69 6c 3d 69 50 72 6f 6d 6f 74 65 2b 31 3b 20 69  il=iPromote+1; i
9b60: 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
9b70: 6c 3b 20 69 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  l; il++){.      
9b80: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
9b90: 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72  el *pLvl = &pStr
9ba0: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c 5d 3b  uct->aLevel[il];
9bb0: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d  .      if( pLvl-
9bc0: 3e 6e 4d 65 72 67 65 20 29 20 72 65 74 75 72 6e  >nMerge ) return
9bd0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 73 3d 70  ;.      for(is=p
9be0: 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 73 3e  Lvl->nSeg-1; is>
9bf0: 3d 30 3b 20 69 73 2d 2d 29 7b 0a 20 20 20 20 20  =0; is--){.     
9c00: 20 20 20 69 6e 74 20 73 7a 20 3d 20 66 74 73 35     int sz = fts5
9c10: 53 65 67 6d 65 6e 74 53 69 7a 65 28 26 70 4c 76  SegmentSize(&pLv
9c20: 6c 2d 3e 61 53 65 67 5b 69 73 5d 29 3b 0a 20 20  l->aSeg[is]);.  
9c30: 20 20 20 20 20 20 69 66 28 20 73 7a 3e 73 7a 50        if( sz>szP
9c40: 72 6f 6d 6f 74 65 20 29 20 72 65 74 75 72 6e 3b  romote ) return;
9c50: 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 74 72  .        fts5Str
9c60: 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65  uctureExtendLeve
9c70: 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63  l(&p->rc, pStruc
9c80: 74 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 31 2c 20  t, iPromote, 1, 
9c90: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
9ca0: 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a  p->rc ) return;.
9cb0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
9cc0: 4f 75 74 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c  Out->aSeg, &pLvl
9cd0: 2d 3e 61 53 65 67 5b 69 73 5d 2c 20 73 69 7a 65  ->aSeg[is], size
9ce0: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
9cf0: 53 65 67 6d 65 6e 74 29 29 3b 0a 20 20 20 20 20  Segment));.     
9d00: 20 20 20 70 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b     pOut->nSeg++;
9d10: 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e  .        pLvl->n
9d20: 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  Seg--;.      }. 
9d30: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
9d40: 2a 20 41 20 6e 65 77 20 73 65 67 6d 65 6e 74 20  * A new segment 
9d50: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 77 72  has just been wr
9d60: 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 69  itten to level i
9d70: 4c 76 6c 20 6f 66 20 69 6e 64 65 78 20 73 74 72  Lvl of index str
9d80: 75 63 74 75 72 65 0a 2a 2a 20 70 53 74 72 75 63  ucture.** pStruc
9d90: 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  t. This function
9da0: 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
9db0: 6e 79 20 73 65 67 6d 65 6e 74 73 20 73 68 6f 75  ny segments shou
9dc0: 6c 64 20 62 65 20 70 72 6f 6d 6f 74 65 64 0a 2a  ld be promoted.*
9dd0: 2a 20 61 73 20 61 20 72 65 73 75 6c 74 2e 20 53  * as a result. S
9de0: 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d  egments are prom
9df0: 6f 74 65 64 20 69 6e 20 74 77 6f 20 73 63 65 6e  oted in two scen
9e00: 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  arios:.**.**   a
9e10: 29 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74  ) If the segment
9e20: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69 73   just written is
9e30: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 6e   smaller than on
9e40: 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e  e or more segmen
9e50: 74 73 0a 2a 2a 20 20 20 20 20 20 77 69 74 68 69  ts.**      withi
9e60: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  n the previous p
9e70: 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20  opulated level, 
9e80: 69 74 20 69 73 20 70 72 6f 6d 6f 74 65 64 20 74  it is promoted t
9e90: 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a  o the previous.*
9ea0: 2a 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64  *      populated
9eb0: 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20   level..**.**   
9ec0: 62 29 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e  b) If the segmen
9ed0: 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69  t just written i
9ee0: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
9ef0: 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74  e newest segment
9f00: 20 6f 6e 0a 2a 2a 20 20 20 20 20 20 74 68 65 20   on.**      the 
9f10: 6e 65 78 74 20 70 6f 70 75 6c 61 74 65 64 20 6c  next populated l
9f20: 65 76 65 6c 2c 20 74 68 65 6e 20 74 68 61 74 20  evel, then that 
9f30: 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20 61 6e 79  segment, and any
9f40: 20 6f 74 68 65 72 20 61 64 6a 61 63 65 6e 74 0a   other adjacent.
9f50: 2a 2a 20 20 20 20 20 20 73 65 67 6d 65 6e 74 73  **      segments
9f60: 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73   that are also s
9f70: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
9f80: 6f 6e 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e  one just written
9f90: 2c 20 61 72 65 20 0a 2a 2a 20 20 20 20 20 20 70  , are .**      p
9fa0: 72 6f 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  romoted. .**.** 
9fb0: 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  If one or more s
9fc0: 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d  egments are prom
9fd0: 6f 74 65 64 2c 20 74 68 65 20 73 74 72 75 63 74  oted, the struct
9fe0: 75 72 65 20 6f 62 6a 65 63 74 20 69 73 20 75 70  ure object is up
9ff0: 64 61 74 65 64 0a 2a 2a 20 74 6f 20 72 65 66 6c  dated.** to refl
a000: 65 63 74 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61  ect this..*/.sta
a010: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72  tic void fts5Str
a020: 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 0a 20  ucturePromote(. 
a030: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a050: 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
a060: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
a070: 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20   iLvl,          
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a090: 49 6e 64 65 78 20 6c 65 76 65 6c 20 6a 75 73 74  Index level just
a0a0: 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 46 74   updated */.  Ft
a0b0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
a0c0: 72 75 63 74 20 20 20 20 20 20 20 20 20 20 2f 2a  ruct          /*
a0d0: 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
a0e0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
a0f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
a100: 0a 20 20 20 20 69 6e 74 20 69 54 73 74 3b 0a 20  .    int iTst;. 
a110: 20 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 20     int iPromote 
a120: 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 73 7a  = -1;.    int sz
a130: 50 72 6f 6d 6f 74 65 20 3d 20 30 3b 20 20 20 20  Promote = 0;    
a140: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 6d 6f          /* Promo
a150: 74 65 20 61 6e 79 74 68 69 6e 67 20 74 68 69 73  te anything this
a160: 20 73 69 7a 65 20 6f 72 20 73 6d 61 6c 6c 65 72   size or smaller
a170: 20 2a 2f 0a 20 20 20 20 46 74 73 35 53 74 72 75   */.    Fts5Stru
a180: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
a190: 65 67 3b 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74  eg;   /* Segment
a1a0: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f   just written */
a1b0: 0a 20 20 20 20 69 6e 74 20 73 7a 53 65 67 3b 20  .    int szSeg; 
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1d0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 65     /* Size of se
a1e0: 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74  gment just writt
a1f0: 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53  en */.    int nS
a200: 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c  eg = pStruct->aL
a210: 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
a220: 0a 0a 20 20 20 20 69 66 28 20 6e 53 65 67 3d 3d  ..    if( nSeg==
a230: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
a240: 70 53 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d  pSeg = &pStruct-
a250: 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53  >aLevel[iLvl].aS
a260: 65 67 5b 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  eg[pStruct->aLev
a270: 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 2d 31 5d  el[iLvl].nSeg-1]
a280: 3b 0a 20 20 20 20 73 7a 53 65 67 20 3d 20 28 31  ;.    szSeg = (1
a290: 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73   + pSeg->pgnoLas
a2a0: 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69  t - pSeg->pgnoFi
a2b0: 72 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  rst);..    /* Ch
a2c0: 65 63 6b 20 66 6f 72 20 63 6f 6e 64 69 74 69 6f  eck for conditio
a2d0: 6e 20 28 61 29 20 2a 2f 0a 20 20 20 20 66 6f 72  n (a) */.    for
a2e0: 28 69 54 73 74 3d 69 4c 76 6c 2d 31 3b 20 69 54  (iTst=iLvl-1; iT
a2f0: 73 74 3e 3d 30 20 26 26 20 70 53 74 72 75 63 74  st>=0 && pStruct
a300: 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d 2e 6e  ->aLevel[iTst].n
a310: 53 65 67 3d 3d 30 3b 20 69 54 73 74 2d 2d 29 3b  Seg==0; iTst--);
a320: 0a 20 20 20 20 69 66 28 20 69 54 73 74 3e 3d 30  .    if( iTst>=0
a330: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
a340: 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 4d 61 78  .      int szMax
a350: 20 3d 20 30 3b 0a 20 20 20 20 20 20 46 74 73 35   = 0;.      Fts5
a360: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
a370: 70 54 73 74 20 3d 20 26 70 53 74 72 75 63 74 2d  pTst = &pStruct-
a380: 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d 3b 0a 20  >aLevel[iTst];. 
a390: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 73       assert( pTs
a3a0: 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 3b 0a  t->nMerge==0 );.
a3b0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
a3c0: 3c 70 54 73 74 2d 3e 6e 53 65 67 3b 20 69 2b 2b  <pTst->nSeg; i++
a3d0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  ){.        int s
a3e0: 7a 20 3d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69  z = pTst->aSeg[i
a3f0: 5d 2e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 54 73  ].pgnoLast - pTs
a400: 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 46  t->aSeg[i].pgnoF
a410: 69 72 73 74 20 2b 20 31 3b 0a 20 20 20 20 20 20  irst + 1;.      
a420: 20 20 69 66 28 20 73 7a 3e 73 7a 4d 61 78 20 29    if( sz>szMax )
a430: 20 73 7a 4d 61 78 20 3d 20 73 7a 3b 0a 20 20 20   szMax = sz;.   
a440: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
a450: 7a 4d 61 78 3e 3d 73 7a 53 65 67 20 29 7b 0a 20  zMax>=szSeg ){. 
a460: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74         /* Condit
a470: 69 6f 6e 20 28 61 29 20 69 73 20 74 72 75 65 2e  ion (a) is true.
a480: 20 50 72 6f 6d 6f 74 65 20 74 68 65 20 6e 65 77   Promote the new
a490: 65 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e 20 6c  est segment on l
a4a0: 65 76 65 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a  evel .        **
a4b0: 20 69 4c 76 6c 20 74 6f 20 6c 65 76 65 6c 20 69   iLvl to level i
a4c0: 54 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  Tst.  */.       
a4d0: 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69 54 73 74   iPromote = iTst
a4e0: 3b 0a 20 20 20 20 20 20 20 20 73 7a 50 72 6f 6d  ;.        szProm
a4f0: 6f 74 65 20 3d 20 73 7a 4d 61 78 3b 0a 20 20 20  ote = szMax;.   
a500: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
a510: 2f 2a 20 49 66 20 63 6f 6e 64 69 74 69 6f 6e 20  /* If condition 
a520: 28 61 29 20 69 73 20 6e 6f 74 20 6d 65 74 2c 20  (a) is not met, 
a530: 61 73 73 75 6d 65 20 28 62 29 20 69 73 20 74 72  assume (b) is tr
a540: 75 65 2e 20 53 74 72 75 63 74 75 72 65 50 72 6f  ue. StructurePro
a550: 6d 6f 74 65 54 6f 28 29 0a 20 20 20 20 2a 2a 20  moteTo().    ** 
a560: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 69 74  is a no-op if it
a570: 20 69 73 20 6e 6f 74 2e 20 20 2a 2f 0a 20 20 20   is not.  */.   
a580: 20 69 66 28 20 69 50 72 6f 6d 6f 74 65 3c 30 20   if( iPromote<0 
a590: 29 7b 0a 20 20 20 20 20 20 69 50 72 6f 6d 6f 74  ){.      iPromot
a5a0: 65 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20  e = iLvl;.      
a5b0: 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 53 65  szPromote = szSe
a5c0: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  g;.    }.    fts
a5d0: 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74  5StructurePromot
a5e0: 65 54 6f 28 70 2c 20 69 50 72 6f 6d 6f 74 65 2c  eTo(p, iPromote,
a5f0: 20 73 7a 50 72 6f 6d 6f 74 65 2c 20 70 53 74 72   szPromote, pStr
a600: 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  uct);.  }.}.../*
a610: 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
a620: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
a630: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
a640: 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 65 6e 64  ment. If the end
a650: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c   of the .** docl
a660: 69 73 74 2d 69 6e 64 65 78 20 70 61 67 65 20 69  ist-index page i
a670: 73 20 72 65 61 63 68 65 64 2c 20 72 65 74 75 72  s reached, retur
a680: 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
a690: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
a6a0: 69 64 78 4c 76 6c 4e 65 78 74 28 46 74 73 35 44  idxLvlNext(Fts5D
a6b0: 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a  lidxLvl *pLvl){.
a6c0: 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
a6d0: 61 20 3d 20 70 4c 76 6c 2d 3e 70 44 61 74 61 3b  a = pLvl->pData;
a6e0: 0a 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e 69 4f  ..  if( pLvl->iO
a6f0: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ff==0 ){.    ass
a700: 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d  ert( pLvl->bEof=
a710: 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  =0 );.    pLvl->
a720: 69 4f 66 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c  iOff = 1;.    pL
a730: 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35  vl->iOff += fts5
a740: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
a750: 74 61 2d 3e 70 5b 31 5d 2c 20 70 4c 76 6c 2d 3e  ta->p[1], pLvl->
a760: 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20  iLeafPgno);.    
a770: 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66 74  pLvl->iOff += ft
a780: 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61  s5GetVarint(&pDa
a790: 74 61 2d 3e 70 5b 70 4c 76 6c 2d 3e 69 4f 66 66  ta->p[pLvl->iOff
a7a0: 5d 2c 20 28 75 36 34 2a 29 26 70 4c 76 6c 2d 3e  ], (u64*)&pLvl->
a7b0: 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 4c 76  iRowid);.    pLv
a7c0: 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 3d 20 70  l->iFirstOff = p
a7d0: 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 20 20 7d 65 6c  Lvl->iOff;.  }el
a7e0: 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66  se{.    int iOff
a7f0: 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66 66 3d 70  ;.    for(iOff=p
a800: 4c 76 6c 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c  Lvl->iOff; iOff<
a810: 70 44 61 74 61 2d 3e 6e 6e 3b 20 69 4f 66 66 2b  pData->nn; iOff+
a820: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44  +){.      if( pD
a830: 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 20 29 20 62  ata->p[iOff] ) b
a840: 72 65 61 6b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20  reak; .    }..  
a850: 20 20 69 66 28 20 69 4f 66 66 3c 70 44 61 74 61    if( iOff<pData
a860: 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 20 20 69 36  ->nn ){.      i6
a870: 34 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 70 4c  4 iVal;.      pL
a880: 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d  vl->iLeafPgno +=
a890: 20 28 69 4f 66 66 20 2d 20 70 4c 76 6c 2d 3e 69   (iOff - pLvl->i
a8a0: 4f 66 66 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  Off) + 1;.      
a8b0: 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
a8c0: 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b  arint(&pData->p[
a8d0: 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56  iOff], (u64*)&iV
a8e0: 61 6c 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d  al);.      pLvl-
a8f0: 3e 69 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b  >iRowid += iVal;
a900: 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66  .      pLvl->iOf
a910: 66 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 7d 65  f = iOff;.    }e
a920: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 76 6c 2d  lse{.      pLvl-
a930: 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d  >bEof = 1;.    }
a940: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
a950: 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a  Lvl->bEof;.}../*
a960: 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
a970: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
a980: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
a990: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
a9a0: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65  int fts5DlidxIte
a9b0: 72 4e 65 78 74 52 28 46 74 73 35 49 6e 64 65 78  rNextR(Fts5Index
a9c0: 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74   *p, Fts5DlidxIt
a9d0: 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69  er *pIter, int i
a9e0: 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69 64  Lvl){.  Fts5Dlid
a9f0: 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49  xLvl *pLvl = &pI
aa00: 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b  ter->aLvl[iLvl];
aa10: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c  ..  assert( iLvl
aa20: 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a  <pIter->nLvl );.
aa30: 20 20 69 66 28 20 66 74 73 35 44 6c 69 64 78 4c    if( fts5DlidxL
aa40: 76 6c 4e 65 78 74 28 70 4c 76 6c 29 20 29 7b 0a  vlNext(pLvl) ){.
aa50: 20 20 20 20 69 66 28 20 28 69 4c 76 6c 2b 31 29      if( (iLvl+1)
aa60: 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29   < pIter->nLvl )
aa70: 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  {.      fts5Dlid
aa80: 78 49 74 65 72 4e 65 78 74 52 28 70 2c 20 70 49  xIterNextR(p, pI
aa90: 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20  ter, iLvl+1);.  
aaa0: 20 20 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e      if( pLvl[1].
aab0: 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  bEof==0 ){.     
aac0: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
aad0: 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b  se(pLvl->pData);
aae0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
aaf0: 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pLvl, 0, sizeof(
ab00: 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a  Fts5DlidxLvl));.
ab10: 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44          pLvl->pD
ab20: 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65  ata = fts5DataRe
ab30: 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20  ad(p, .         
ab40: 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f     FTS5_DLIDX_RO
ab50: 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67 69  WID(pIter->iSegi
ab60: 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d  d, iLvl, pLvl[1]
ab70: 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20  .iLeafPgno).    
ab80: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
ab90: 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29  f( pLvl->pData )
aba0: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78   fts5DlidxLvlNex
abb0: 74 28 70 4c 76 6c 29 3b 0a 20 20 20 20 20 20 7d  t(pLvl);.      }
abc0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
abd0: 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c  turn pIter->aLvl
abe0: 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74  [0].bEof;.}.stat
abf0: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
ac00: 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64  IterNext(Fts5Ind
ac10: 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78  ex *p, Fts5Dlidx
ac20: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
ac30: 72 65 74 75 72 6e 20 66 74 73 35 44 6c 69 64 78  return fts5Dlidx
ac40: 49 74 65 72 4e 65 78 74 52 28 70 2c 20 70 49 74  IterNextR(p, pIt
ac50: 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  er, 0);.}../*.**
ac60: 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   The iterator pa
ac70: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
ac80: 74 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 74  t argument has t
ac90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
aca0: 6c 64 73 20 73 65 74 0a 2a 2a 20 61 73 20 66 6f  lds set.** as fo
acb0: 6c 6c 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63  llows. This func
acc0: 74 69 6f 6e 20 73 65 74 73 20 75 70 20 74 68 65  tion sets up the
acd0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 69 74 65   rest of the ite
ace0: 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74  rator so that it
acf0: 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
ad00: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e  e first rowid in
ad10: 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64   the doclist-ind
ad20: 65 78 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 44 61 74  ex..**.**   pDat
ad30: 61 3a 0a 2a 2a 20 20 20 20 20 70 6f 69 6e 74 65  a:.**     pointe
ad40: 72 20 74 6f 20 64 6f 63 6c 69 73 74 2d 69 6e 64  r to doclist-ind
ad50: 65 78 20 72 65 63 6f 72 64 2c 20 0a 2a 2a 0a 2a  ex record, .**.*
ad60: 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
ad70: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 70  tion is called p
ad80: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
ad90: 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  is the page numb
ada0: 65 72 20 74 68 65 0a 2a 2a 20 64 6f 63 6c 69 73  er the.** doclis
adb0: 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 20  t is associated 
adc0: 77 69 74 68 20 28 74 68 65 20 6f 6e 65 20 66 65  with (the one fe
add0: 61 74 75 72 69 6e 67 20 74 68 65 20 74 65 72 6d  aturing the term
ade0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
adf0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 69   fts5DlidxIterFi
ae00: 72 73 74 28 46 74 73 35 44 6c 69 64 78 49 74 65  rst(Fts5DlidxIte
ae10: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
ae20: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
ae30: 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b  <pIter->nLvl; i+
ae40: 2b 29 7b 0a 20 20 20 20 66 74 73 35 44 6c 69 64  +){.    fts5Dlid
ae50: 78 4c 76 6c 4e 65 78 74 28 26 70 49 74 65 72 2d  xLvlNext(&pIter-
ae60: 3e 61 4c 76 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20  >aLvl[i]);.  }. 
ae70: 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61   return pIter->a
ae80: 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a  Lvl[0].bEof;.}..
ae90: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
aea0: 44 6c 69 64 78 49 74 65 72 45 6f 66 28 46 74 73  DlidxIterEof(Fts
aeb0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44  5Index *p, Fts5D
aec0: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
aed0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  {.  return p->rc
aee0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
aef0: 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45  Iter->aLvl[0].bE
af00: 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  of;.}..static vo
af10: 69 64 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  id fts5DlidxIter
af20: 4c 61 73 74 28 46 74 73 35 49 6e 64 65 78 20 2a  Last(Fts5Index *
af30: 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  p, Fts5DlidxIter
af40: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
af50: 69 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  i;..  /* Advance
af60: 20 65 61 63 68 20 6c 65 76 65 6c 20 74 6f 20 74   each level to t
af70: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 6f 6e  he last entry on
af80: 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 2a   the last page *
af90: 2f 0a 20 20 66 6f 72 28 69 3d 70 49 74 65 72 2d  /.  for(i=pIter-
afa0: 3e 6e 4c 76 6c 2d 31 3b 20 70 2d 3e 72 63 3d 3d  >nLvl-1; p->rc==
afb0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3e 3d  SQLITE_OK && i>=
afc0: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 46 74 73  0; i--){.    Fts
afd0: 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20  5DlidxLvl *pLvl 
afe0: 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69  = &pIter->aLvl[i
aff0: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 66 74  ];.    while( ft
b000: 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70  s5DlidxLvlNext(p
b010: 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Lvl)==0 );.    p
b020: 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 0a  Lvl->bEof = 0;..
b030: 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20      if( i>0 ){. 
b040: 20 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76       Fts5DlidxLv
b050: 6c 20 2a 70 43 68 69 6c 64 20 3d 20 26 70 4c 76  l *pChild = &pLv
b060: 6c 5b 2d 31 5d 3b 0a 20 20 20 20 20 20 66 74 73  l[-1];.      fts
b070: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 43 68  5DataRelease(pCh
b080: 69 6c 64 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  ild->pData);.   
b090: 20 20 20 6d 65 6d 73 65 74 28 70 43 68 69 6c 64     memset(pChild
b0a0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
b0b0: 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20  DlidxLvl));.    
b0c0: 20 20 70 43 68 69 6c 64 2d 3e 70 44 61 74 61 20    pChild->pData 
b0d0: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
b0e0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46 54 53  , .          FTS
b0f0: 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49  5_DLIDX_ROWID(pI
b100: 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2d 31  ter->iSegid, i-1
b110: 2c 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e  , pLvl->iLeafPgn
b120: 6f 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  o).      );.    
b130: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  }.  }.}../*.** M
b140: 6f 76 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ove the iterator
b150: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
b160: 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  nly argument to 
b170: 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74  the previous ent
b180: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
b190: 74 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 50 72  t fts5DlidxLvlPr
b1a0: 65 76 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 20  ev(Fts5DlidxLvl 
b1b0: 2a 70 4c 76 6c 29 7b 0a 20 20 69 6e 74 20 69 4f  *pLvl){.  int iO
b1c0: 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b  ff = pLvl->iOff;
b1d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c  ..  assert( pLvl
b1e0: 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 69  ->bEof==0 );.  i
b1f0: 66 28 20 69 4f 66 66 3c 3d 70 4c 76 6c 2d 3e 69  f( iOff<=pLvl->i
b200: 46 69 72 73 74 4f 66 66 20 29 7b 0a 20 20 20 20  FirstOff ){.    
b210: 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a  pLvl->bEof = 1;.
b220: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20    }else{.    u8 
b230: 2a 61 20 3d 20 70 4c 76 6c 2d 3e 70 44 61 74 61  *a = pLvl->pData
b240: 2d 3e 70 3b 0a 20 20 20 20 69 36 34 20 69 56 61  ->p;.    i64 iVa
b250: 6c 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69  l;.    int iLimi
b260: 74 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  t;.    int ii;. 
b270: 20 20 20 69 6e 74 20 6e 5a 65 72 6f 20 3d 20 30     int nZero = 0
b280: 3b 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72 65 6e  ;..    /* Curren
b290: 74 6c 79 20 69 4f 66 66 20 70 6f 69 6e 74 73 20  tly iOff points 
b2a0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
b2b0: 65 20 6f 66 20 61 20 76 61 72 69 6e 74 2e 20 54  e of a varint. T
b2c0: 68 69 73 20 62 6c 6f 63 6b 20 0a 20 20 20 20 2a  his block .    *
b2d0: 2a 20 64 65 63 72 65 6d 65 6e 74 73 20 69 4f 66  * decrements iOf
b2e0: 66 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74  f until it point
b2f0: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  s to the first b
b300: 79 74 65 20 6f 66 20 74 68 65 20 70 72 65 76 69  yte of the previ
b310: 6f 75 73 20 0a 20 20 20 20 2a 2a 20 76 61 72 69  ous .    ** vari
b320: 6e 74 2e 20 54 61 6b 69 6e 67 20 63 61 72 65 20  nt. Taking care 
b330: 6e 6f 74 20 74 6f 20 72 65 61 64 20 61 6e 79 20  not to read any 
b340: 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73  memory locations
b350: 20 74 68 61 74 20 6f 63 63 75 72 0a 20 20 20 20   that occur.    
b360: 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 62 75  ** before the bu
b370: 66 66 65 72 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  ffer in memory. 
b380: 20 2a 2f 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d   */.    iLimit =
b390: 20 28 69 4f 66 66 3e 39 20 3f 20 69 4f 66 66 2d   (iOff>9 ? iOff-
b3a0: 39 20 3a 20 30 29 3b 0a 20 20 20 20 66 6f 72 28  9 : 0);.    for(
b3b0: 69 4f 66 66 2d 2d 3b 20 69 4f 66 66 3e 69 4c 69  iOff--; iOff>iLi
b3c0: 6d 69 74 3b 20 69 4f 66 66 2d 2d 29 7b 0a 20 20  mit; iOff--){.  
b3d0: 20 20 20 20 69 66 28 20 28 61 5b 69 4f 66 66 2d      if( (a[iOff-
b3e0: 31 5d 20 26 20 30 78 38 30 29 3d 3d 30 20 29 20  1] & 0x80)==0 ) 
b3f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
b400: 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28    fts5GetVarint(
b410: 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  &a[iOff], (u64*)
b420: 26 69 56 61 6c 29 3b 0a 20 20 20 20 70 4c 76 6c  &iVal);.    pLvl
b430: 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 56 61 6c  ->iRowid -= iVal
b440: 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61  ;.    pLvl->iLea
b450: 66 50 67 6e 6f 2d 2d 3b 0a 0a 20 20 20 20 2f 2a  fPgno--;..    /*
b460: 20 53 6b 69 70 20 62 61 63 6b 77 61 72 64 73 20   Skip backwards 
b470: 70 61 73 74 20 61 6e 79 20 30 78 30 30 20 76 61  past any 0x00 va
b480: 72 69 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 66 6f  rints. */.    fo
b490: 72 28 69 69 3d 69 4f 66 66 2d 31 3b 20 69 69 3e  r(ii=iOff-1; ii>
b4a0: 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66  =pLvl->iFirstOff
b4b0: 20 26 26 20 61 5b 69 69 5d 3d 3d 30 78 30 30 3b   && a[ii]==0x00;
b4c0: 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20 6e 5a   ii--){.      nZ
b4d0: 65 72 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ero++;.    }.   
b4e0: 20 69 66 28 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69   if( ii>=pLvl->i
b4f0: 46 69 72 73 74 4f 66 66 20 26 26 20 28 61 5b 69  FirstOff && (a[i
b500: 69 5d 20 26 20 30 78 38 30 29 20 29 7b 0a 20 20  i] & 0x80) ){.  
b510: 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 20      /* The byte 
b520: 69 6d 6d 65 64 69 61 74 65 6c 79 20 62 65 66 6f  immediately befo
b530: 72 65 20 74 68 65 20 6c 61 73 74 20 30 78 30 30  re the last 0x00
b540: 20 62 79 74 65 20 68 61 73 20 74 68 65 20 30 78   byte has the 0x
b550: 38 30 20 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  80 bit.      ** 
b560: 73 65 74 2e 20 53 6f 20 74 68 65 20 6c 61 73 74  set. So the last
b570: 20 30 78 30 30 20 69 73 20 6f 6e 6c 79 20 61 20   0x00 is only a 
b580: 76 61 72 69 6e 74 20 30 20 69 66 20 74 68 65 72  varint 0 if ther
b590: 65 20 61 72 65 20 38 20 6d 6f 72 65 20 30 78 38  e are 8 more 0x8
b5a0: 30 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73  0.      ** bytes
b5b0: 20 62 65 66 6f 72 65 20 61 5b 69 69 5d 2e 20 2a   before a[ii]. *
b5c0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 5a 65 72  /.      int bZer
b5d0: 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  o = 0;          
b5e0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6c      /* True if l
b5f0: 61 73 74 20 30 78 30 30 20 63 6f 75 6e 74 73 20  ast 0x00 counts 
b600: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 69 69  */.      if( (ii
b610: 2d 38 29 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73  -8)>=pLvl->iFirs
b620: 74 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  tOff ){.        
b630: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66  int j;.        f
b640: 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 38 20 26 26 20  or(j=1; j<=8 && 
b650: 28 61 5b 69 69 2d 6a 5d 20 26 20 30 78 38 30 29  (a[ii-j] & 0x80)
b660: 3b 20 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20  ; j++);.        
b670: 62 5a 65 72 6f 20 3d 20 28 6a 3e 38 29 3b 0a 20  bZero = (j>8);. 
b680: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b690: 20 62 5a 65 72 6f 3d 3d 30 20 29 20 6e 5a 65 72   bZero==0 ) nZer
b6a0: 6f 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  o--;.    }.    p
b6b0: 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2d  Lvl->iLeafPgno -
b6c0: 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 4c 76  = nZero;.    pLv
b6d0: 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66 20 2d  l->iOff = iOff -
b6e0: 20 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 0a 20 20 72   nZero;.  }..  r
b6f0: 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66  eturn pLvl->bEof
b700: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
b710: 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65  fts5DlidxIterPre
b720: 76 52 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  vR(Fts5Index *p,
b730: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
b740: 70 49 74 65 72 2c 20 69 6e 74 20 69 4c 76 6c 29  pIter, int iLvl)
b750: 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c  {.  Fts5DlidxLvl
b760: 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d   *pLvl = &pIter-
b770: 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20  >aLvl[iLvl];..  
b780: 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 49 74  assert( iLvl<pIt
b790: 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69 66  er->nLvl );.  if
b7a0: 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 50 72  ( fts5DlidxLvlPr
b7b0: 65 76 28 70 4c 76 6c 29 20 29 7b 0a 20 20 20 20  ev(pLvl) ){.    
b7c0: 69 66 28 20 28 69 4c 76 6c 2b 31 29 20 3c 20 70  if( (iLvl+1) < p
b7d0: 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20  Iter->nLvl ){.  
b7e0: 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
b7f0: 72 50 72 65 76 52 28 70 2c 20 70 49 74 65 72 2c  rPrevR(p, pIter,
b800: 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20 20 20 20   iLvl+1);.      
b810: 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66  if( pLvl[1].bEof
b820: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
b830: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
b840: 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  Lvl->pData);.   
b850: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c       memset(pLvl
b860: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
b870: 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20  DlidxLvl));.    
b880: 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20      pLvl->pData 
b890: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
b8a0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 46  , .            F
b8b0: 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28  TS5_DLIDX_ROWID(
b8c0: 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69  pIter->iSegid, i
b8d0: 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65  Lvl, pLvl[1].iLe
b8e0: 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20  afPgno).        
b8f0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
b900: 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20  Lvl->pData ){.  
b910: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 66          while( f
b920: 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
b930: 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  pLvl)==0 );.    
b940: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66        pLvl->bEof
b950: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
b960: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b970: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65  }..  return pIte
b980: 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b  r->aLvl[0].bEof;
b990: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  .}.static int ft
b9a0: 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28  s5DlidxIterPrev(
b9b0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
b9c0: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
b9d0: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74  er){.  return ft
b9e0: 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 52  s5DlidxIterPrevR
b9f0: 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 7d  (p, pIter, 0);.}
ba00: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 64  ../*.** Free a d
ba10: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 74 65  oclist-index ite
ba20: 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 61 6c 6c  rator object all
ba30: 6f 63 61 74 65 64 20 62 79 20 66 74 73 35 44 6c  ocated by fts5Dl
ba40: 69 64 78 49 74 65 72 49 6e 69 74 28 29 2e 0a 2a  idxIterInit()..*
ba50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
ba60: 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
ba70: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
ba80: 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74  Iter){.  if( pIt
ba90: 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  er ){.    int i;
baa0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
bab0: 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b  pIter->nLvl; i++
bac0: 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  ){.      fts5Dat
bad0: 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
bae0: 61 4c 76 6c 5b 69 5d 2e 70 44 61 74 61 29 3b 0a  aLvl[i].pData);.
baf0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
bb00: 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20  3_free(pIter);. 
bb10: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73   }.}..static Fts
bb20: 35 44 6c 69 64 78 49 74 65 72 20 2a 66 74 73 35  5DlidxIter *fts5
bb30: 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 0a 20  DlidxIterInit(. 
bb40: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb60: 20 2f 2a 20 46 74 73 35 20 42 61 63 6b 65 6e 64   /* Fts5 Backend
bb70: 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68   to iterate with
bb80: 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  in */.  int bRev
bb90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bba0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
bbb0: 66 6f 72 20 4f 52 44 45 52 20 42 59 20 41 53 43  for ORDER BY ASC
bbc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 69 64   */.  int iSegid
bbd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bbe0: 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74        /* Segment
bbf0: 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65   id */.  int iLe
bc00: 61 66 50 67 20 20 20 20 20 20 20 20 20 20 20 20  afPg            
bc10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66           /* Leaf
bc20: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
bc30: 6c 6f 61 64 20 64 6c 69 64 78 20 66 6f 72 20 2a  load dlidx for *
bc40: 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78  /.){.  Fts5Dlidx
bc50: 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b  Iter *pIter = 0;
bc60: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
bc70: 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66 6f  bDone = 0;..  fo
bc80: 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51  r(i=0; p->rc==SQ
bc90: 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e 65  LITE_OK && bDone
bca0: 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ==0; i++){.    s
bcb0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79  qlite3_int64 nBy
bcc0: 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  te = sizeof(Fts5
bcd0: 44 6c 69 64 78 49 74 65 72 29 20 2b 20 69 20 2a  DlidxIter) + i *
bce0: 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
bcf0: 78 4c 76 6c 29 3b 0a 20 20 20 20 46 74 73 35 44  xLvl);.    Fts5D
bd00: 6c 69 64 78 49 74 65 72 20 2a 70 4e 65 77 3b 0a  lidxIter *pNew;.
bd10: 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 46 74 73  .    pNew = (Fts
bd20: 35 44 6c 69 64 78 49 74 65 72 2a 29 73 71 6c 69  5DlidxIter*)sqli
bd30: 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 49  te3_realloc64(pI
bd40: 74 65 72 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ter, nByte);.   
bd50: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
bd60: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
bd70: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
bd80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36 34  }else{.      i64
bd90: 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 44   iRowid = FTS5_D
bda0: 4c 49 44 58 5f 52 4f 57 49 44 28 69 53 65 67 69  LIDX_ROWID(iSegi
bdb0: 64 2c 20 69 2c 20 69 4c 65 61 66 50 67 29 3b 0a  d, i, iLeafPg);.
bdc0: 20 20 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c        Fts5DlidxL
bdd0: 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 4e 65 77  vl *pLvl = &pNew
bde0: 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 20  ->aLvl[i];.     
bdf0: 20 70 49 74 65 72 20 3d 20 70 4e 65 77 3b 0a 20   pIter = pNew;. 
be00: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c       memset(pLvl
be10: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
be20: 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20  DlidxLvl));.    
be30: 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20    pLvl->pData = 
be40: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
be50: 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69  iRowid);.      i
be60: 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 26  f( pLvl->pData &
be70: 26 20 28 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e  & (pLvl->pData->
be80: 70 5b 30 5d 20 26 20 30 78 30 30 30 31 29 3d 3d  p[0] & 0x0001)==
be90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 44 6f  0 ){.        bDo
bea0: 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ne = 1;.      }.
beb0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 4c 76        pIter->nLv
bec0: 6c 20 3d 20 69 2b 31 3b 0a 20 20 20 20 7d 0a 20  l = i+1;.    }. 
bed0: 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
bee0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
bef0: 20 20 70 49 74 65 72 2d 3e 69 53 65 67 69 64 20    pIter->iSegid 
bf00: 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20 69 66  = iSegid;.    if
bf10: 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20  ( bRev==0 ){.   
bf20: 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
bf30: 46 69 72 73 74 28 70 49 74 65 72 29 3b 0a 20 20  First(pIter);.  
bf40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
bf50: 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61 73 74  ts5DlidxIterLast
bf60: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
bf70: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  }.  }..  if( p->
bf80: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
bf90: 0a 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74  .    fts5DlidxIt
bfa0: 65 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20  erFree(pIter);. 
bfb0: 20 20 20 70 49 74 65 72 20 3d 20 30 3b 0a 20 20     pIter = 0;.  
bfc0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65  }..  return pIte
bfd0: 72 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36 34  r;.}..static i64
bfe0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f   fts5DlidxIterRo
bff0: 77 69 64 28 46 74 73 35 44 6c 69 64 78 49 74 65  wid(Fts5DlidxIte
c000: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74  r *pIter){.  ret
c010: 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  urn pIter->aLvl[
c020: 30 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 73 74 61  0].iRowid;.}.sta
c030: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
c040: 78 49 74 65 72 50 67 6e 6f 28 46 74 73 35 44 6c  xIterPgno(Fts5Dl
c050: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
c060: 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
c070: 3e 61 4c 76 6c 5b 30 5d 2e 69 4c 65 61 66 50 67  >aLvl[0].iLeafPg
c080: 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61  no;.}../*.** Loa
c090: 64 20 74 68 65 20 6e 65 78 74 20 6c 65 61 66 20  d the next leaf 
c0a0: 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 73 65  page into the se
c0b0: 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 2e 0a  gment iterator..
c0c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
c0d0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
c0e0: 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ge(.  Fts5Index 
c0f0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
c100: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
c110: 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
c120: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
c130: 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  Iter            
c140: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
c150: 20 61 64 76 61 6e 63 65 20 74 6f 20 6e 65 78 74   advance to next
c160: 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 46 74   page */.){.  Ft
c170: 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20  s5Data *pLeaf;. 
c180: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
c190: 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49  gment *pSeg = pI
c1a0: 74 65 72 2d 3e 70 53 65 67 3b 0a 20 20 66 74 73  ter->pSeg;.  fts
c1b0: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
c1c0: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49  er->pLeaf);.  pI
c1d0: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 2b  ter->iLeafPgno++
c1e0: 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  ;.  if( pIter->p
c1f0: 4e 65 78 74 4c 65 61 66 20 29 7b 0a 20 20 20 20  NextLeaf ){.    
c200: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
c210: 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3b  Iter->pNextLeaf;
c220: 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4e 65 78  .    pIter->pNex
c230: 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d 65 6c  tLeaf = 0;.  }el
c240: 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c  se if( pIter->iL
c250: 65 61 66 50 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70  eafPgno<=pSeg->p
c260: 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70  gnoLast ){.    p
c270: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 66 74  Iter->pLeaf = ft
c280: 73 35 4c 65 61 66 52 65 61 64 28 70 2c 20 0a 20  s5LeafRead(p, . 
c290: 20 20 20 20 20 20 20 46 54 53 35 5f 53 45 47 4d         FTS5_SEGM
c2a0: 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
c2b0: 69 53 65 67 69 64 2c 20 70 49 74 65 72 2d 3e 69  iSegid, pIter->i
c2c0: 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 29 3b  LeafPgno).    );
c2d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
c2e0: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
c2f0: 20 20 7d 0a 20 20 70 4c 65 61 66 20 3d 20 70 49    }.  pLeaf = pI
c300: 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 0a 20 20 69  ter->pLeaf;..  i
c310: 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  f( pLeaf ){.    
c320: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
c330: 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66   = pLeaf->szLeaf
c340: 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35 4c 65  ;.    if( fts5Le
c350: 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 65  afIsTermless(pLe
c360: 61 66 29 20 29 7b 0a 20 20 20 20 20 20 70 49 74  af) ){.      pIt
c370: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
c380: 74 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b  t = pLeaf->nn+1;
c390: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c3a0: 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f    pIter->iPgidxO
c3b0: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
c3c0: 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b  int32(&pLeaf->p[
c3d0: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
c3e0: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ],.          pIt
c3f0: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
c400: 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  t.      );.    }
c410: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72  .  }.}../*.** Ar
c420: 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73 20  gument p points 
c430: 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
c440: 61 69 6e 69 6e 67 20 61 20 76 61 72 69 6e 74 20  aining a varint 
c450: 74 6f 20 62 65 20 69 6e 74 65 72 70 72 65 74 65  to be interprete
c460: 64 20 61 73 20 61 0a 2a 2a 20 70 6f 73 69 74 69  d as a.** positi
c470: 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on list size fie
c480: 6c 64 2e 20 52 65 61 64 20 74 68 65 20 76 61 72  ld. Read the var
c490: 69 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74  int and return t
c4a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
c4b0: 65 73 0a 2a 2a 20 72 65 61 64 2e 20 42 65 66 6f  es.** read. Befo
c4c0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 73 65  re returning, se
c4d0: 74 20 2a 70 6e 53 7a 20 74 6f 20 74 68 65 20 6e  t *pnSz to the n
c4e0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
c4f0: 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 0a 2a  n the position.*
c500: 2a 20 6c 69 73 74 2c 20 61 6e 64 20 2a 70 62 44  * list, and *pbD
c510: 65 6c 20 74 6f 20 74 72 75 65 20 69 66 20 74 68  el to true if th
c520: 65 20 64 65 6c 65 74 65 20 66 6c 61 67 20 69 73  e delete flag is
c530: 20 73 65 74 2c 20 6f 72 20 66 61 6c 73 65 20 6f   set, or false o
c540: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
c550: 74 69 63 20 69 6e 74 20 66 74 73 35 47 65 74 50  tic int fts5GetP
c560: 6f 73 6c 69 73 74 53 69 7a 65 28 63 6f 6e 73 74  oslistSize(const
c570: 20 75 38 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 53   u8 *p, int *pnS
c580: 7a 2c 20 69 6e 74 20 2a 70 62 44 65 6c 29 7b 0a  z, int *pbDel){.
c590: 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 69 6e 74    int nSz;.  int
c5a0: 20 6e 20 3d 20 30 3b 0a 20 20 66 74 73 35 46 61   n = 0;.  fts5Fa
c5b0: 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c  stGetVarint32(p,
c5c0: 20 6e 2c 20 6e 53 7a 29 3b 0a 20 20 61 73 73 65   n, nSz);.  asse
c5d0: 72 74 5f 6e 63 28 20 6e 53 7a 3e 3d 30 20 29 3b  rt_nc( nSz>=0 );
c5e0: 0a 20 20 2a 70 6e 53 7a 20 3d 20 6e 53 7a 2f 32  .  *pnSz = nSz/2
c5f0: 3b 0a 20 20 2a 70 62 44 65 6c 20 3d 20 6e 53 7a  ;.  *pbDel = nSz
c600: 20 26 20 30 78 30 30 30 31 3b 0a 20 20 72 65 74   & 0x0001;.  ret
c610: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
c620: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
c630: 66 4f 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c  fOffset currentl
c640: 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
c650: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 0a  first byte of a.
c660: 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  ** position-list
c670: 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61   size field. Rea
c680: 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  d the value of t
c690: 68 65 20 66 69 65 6c 64 20 61 6e 64 20 73 74 6f  he field and sto
c6a0: 72 65 20 69 74 0a 2a 2a 20 69 6e 20 74 68 65 20  re it.** in the 
c6b0: 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
c6c0: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73  les:.**.**   Fts
c6d0: 35 53 65 67 49 74 65 72 2e 6e 50 6f 73 0a 2a 2a  5SegIter.nPos.**
c6e0: 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 62     Fts5SegIter.b
c6f0: 44 65 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61 76 65 20  Del.**.** Leave 
c700: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
c710: 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 69 6e 67  fOffset pointing
c720: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
c730: 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 6f  te of the .** po
c740: 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  sition list cont
c750: 65 6e 74 20 28 69 66 20 61 6e 79 29 2e 0a 2a 2f  ent (if any)..*/
c760: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
c770: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
c780: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
c790: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
c7a0: 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  r){.  if( p->rc=
c7b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c7c0: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74    int iOff = pIt
c7d0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
c7e0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72    /* Offset to r
c7f0: 65 61 64 20 61 74 20 2a 2f 0a 20 20 20 20 41 53  ead at */.    AS
c800: 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70  SERT_SZLEAF_OK(p
c810: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
c820: 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67    if( p->pConfig
c830: 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
c840: 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
c850: 20 20 20 20 20 69 6e 74 20 69 45 6f 64 20 3d 20       int iEod = 
c860: 4d 49 4e 28 70 49 74 65 72 2d 3e 69 45 6e 64 6f  MIN(pIter->iEndo
c870: 66 44 6f 63 6c 69 73 74 2c 20 70 49 74 65 72 2d  fDoclist, pIter-
c880: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 29 3b  >pLeaf->szLeaf);
c890: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44  .      pIter->bD
c8a0: 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 49  el = 0;.      pI
c8b0: 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 31 3b 0a 20  ter->nPos = 1;. 
c8c0: 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 69 45       if( iOff<iE
c8d0: 6f 64 20 26 26 20 70 49 74 65 72 2d 3e 70 4c 65  od && pIter->pLe
c8e0: 61 66 2d 3e 70 5b 69 4f 66 66 5d 3d 3d 30 20 29  af->p[iOff]==0 )
c8f0: 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  {.        pIter-
c900: 3e 62 44 65 6c 20 3d 20 31 3b 0a 20 20 20 20 20  >bDel = 1;.     
c910: 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20     iOff++;.     
c920: 20 20 20 69 66 28 20 69 4f 66 66 3c 69 45 6f 64     if( iOff<iEod
c930: 20 26 26 20 70 49 74 65 72 2d 3e 70 4c 65 61 66   && pIter->pLeaf
c940: 2d 3e 70 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a  ->p[iOff]==0 ){.
c950: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
c960: 3e 6e 50 6f 73 20 3d 20 31 3b 0a 20 20 20 20 20  >nPos = 1;.     
c970: 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20       iOff++;.   
c980: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c990: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f        pIter->nPo
c9a0: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  s = 0;.        }
c9b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
c9c0: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53  se{.      int nS
c9d0: 7a 3b 0a 20 20 20 20 20 20 66 74 73 35 46 61 73  z;.      fts5Fas
c9e0: 74 47 65 74 56 61 72 69 6e 74 33 32 28 70 49 74  tGetVarint32(pIt
c9f0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 2c 20 69 4f  er->pLeaf->p, iO
ca00: 66 66 2c 20 6e 53 7a 29 3b 0a 20 20 20 20 20 20  ff, nSz);.      
ca10: 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 28 6e  pIter->bDel = (n
ca20: 53 7a 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20  Sz & 0x0001);.  
ca30: 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20      pIter->nPos 
ca40: 3d 20 6e 53 7a 3e 3e 31 3b 0a 20 20 20 20 20 20  = nSz>>1;.      
ca50: 61 73 73 65 72 74 5f 6e 63 28 20 70 49 74 65 72  assert_nc( pIter
ca60: 2d 3e 6e 50 6f 73 3e 3d 30 20 29 3b 0a 20 20 20  ->nPos>=0 );.   
ca70: 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c   }.    pIter->iL
ca80: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
ca90: 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
caa0: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
cab0: 4c 6f 61 64 52 6f 77 69 64 28 46 74 73 35 49 6e  LoadRowid(Fts5In
cac0: 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49  dex *p, Fts5SegI
cad0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 75  ter *pIter){.  u
cae0: 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
caf0: 65 61 66 2d 3e 70 3b 20 20 20 20 20 20 20 20 2f  eaf->p;        /
cb00: 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65 61 64  * Buffer to read
cb10: 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20   data from */.  
cb20: 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72  int iOff = pIter
cb30: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a  ->iLeafOffset;..
cb40: 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f    ASSERT_SZLEAF_
cb50: 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  OK(pIter->pLeaf)
cb60: 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49  ;.  if( iOff>=pI
cb70: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
cb80: 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 53 65  af ){.    fts5Se
cb90: 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
cba0: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28   pIter);.    if(
cbb0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
cbc0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
cbd0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
cbe0: 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
cbf0: 52 52 55 50 54 3b 0a 20 20 20 20 20 20 72 65 74  RRUPT;.      ret
cc00: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
cc10: 4f 66 66 20 3d 20 34 3b 0a 20 20 20 20 61 20 3d  Off = 4;.    a =
cc20: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
cc30: 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 20 2b 3d 20  ;.  }.  iOff += 
cc40: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
cc50: 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28  rint(&a[iOff], (
cc60: 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
cc70: 77 69 64 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69  wid);.  pIter->i
cc80: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
cc90: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35  f;.}../*.** Fts5
cca0: 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66  SegIter.iLeafOff
ccb0: 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  set currently po
ccc0: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
ccd0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a  t byte of the .*
cce0: 2a 20 22 6e 53 75 66 66 69 78 22 20 66 69 65 6c  * "nSuffix" fiel
ccf0: 64 20 6f 66 20 61 20 74 65 72 6d 2e 20 46 75 6e  d of a term. Fun
cd00: 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20  ction parameter 
cd10: 6e 4b 65 65 70 20 63 6f 6e 74 61 69 6e 73 20 74  nKeep contains t
cd20: 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74  he value.** of t
cd30: 68 65 20 22 6e 50 72 65 66 69 78 22 20 66 69 65  he "nPrefix" fie
cd40: 6c 64 20 28 69 66 20 74 68 65 72 65 20 77 61 73  ld (if there was
cd50: 20 6f 6e 65 20 2d 20 69 74 20 69 73 20 70 61 73   one - it is pas
cd60: 73 65 64 20 30 20 69 66 20 74 68 69 73 20 69 73  sed 0 if this is
cd70: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 65  .** the first te
cd80: 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  rm in the segmen
cd90: 74 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  t)..**.** This f
cda0: 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65  unction populate
cdb0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53  s:.**.**   Fts5S
cdc0: 65 67 49 74 65 72 2e 74 65 72 6d 0a 2a 2a 20 20  egIter.term.**  
cdd0: 20 46 74 73 35 53 65 67 49 74 65 72 2e 72 6f 77   Fts5SegIter.row
cde0: 69 64 0a 2a 2a 0a 2a 2a 20 61 63 63 6f 72 64 69  id.**.** accordi
cdf0: 6e 67 6c 79 20 61 6e 64 20 6c 65 61 76 65 73 20  ngly and leaves 
ce00: 28 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65  (Fts5SegIter.iLe
ce10: 61 66 4f 66 66 73 65 74 29 20 73 65 74 20 74 6f  afOffset) set to
ce20: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
ce30: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 6f 73  ** the first pos
ce40: 69 74 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65 20  ition list. The 
ce50: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 62 65  position list be
ce60: 6c 6f 6e 67 69 6e 67 20 74 6f 20 64 6f 63 75 6d  longing to docum
ce70: 65 6e 74 20 0a 2a 2a 20 28 46 74 73 35 53 65 67  ent .** (Fts5Seg
ce80: 49 74 65 72 2e 69 52 6f 77 69 64 29 2e 0a 2a 2f  Iter.iRowid)..*/
ce90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
cea0: 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d  5SegIterLoadTerm
ceb0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
cec0: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
ced0: 72 2c 20 69 6e 74 20 6e 4b 65 65 70 29 7b 0a 20  r, int nKeep){. 
cee0: 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e   u8 *a = pIter->
cef0: 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20 20 20  pLeaf->p;       
cf00: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65   /* Buffer to re
cf10: 61 64 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a  ad data from */.
cf20: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74    int iOff = pIt
cf30: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
cf40: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72    /* Offset to r
cf50: 65 61 64 20 61 74 20 2a 2f 0a 20 20 69 6e 74 20  ead at */.  int 
cf60: 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  nNew;           
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
cf80: 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61  ytes of new data
cf90: 20 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d 20 66   */..  iOff += f
cfa0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
cfb0: 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a  a[iOff], nNew);.
cfc0: 20 20 69 66 28 20 69 4f 66 66 2b 6e 4e 65 77 3e    if( iOff+nNew>
cfd0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
cfe0: 20 7c 7c 20 6e 4b 65 65 70 3e 70 49 74 65 72 2d   || nKeep>pIter-
cff0: 3e 74 65 72 6d 2e 6e 20 29 7b 0a 20 20 20 20 70  >term.n ){.    p
d000: 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
d010: 55 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  UPT;.    return;
d020: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 74 65  .  }.  pIter->te
d030: 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20  rm.n = nKeep;.  
d040: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
d050: 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 49  Blob(&p->rc, &pI
d060: 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c  ter->term, nNew,
d070: 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 61 73   &a[iOff]);.  as
d080: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 74 65 72  sert( pIter->ter
d090: 6d 2e 6e 3c 3d 70 49 74 65 72 2d 3e 74 65 72 6d  m.n<=pIter->term
d0a0: 2e 6e 53 70 61 63 65 20 29 3b 0a 20 20 69 4f 66  .nSpace );.  iOf
d0b0: 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 70 49 74  f += nNew;.  pIt
d0c0: 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66  er->iTermLeafOff
d0d0: 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 70 49  set = iOff;.  pI
d0e0: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
d0f0: 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  no = pIter->iLea
d100: 66 50 67 6e 6f 3b 0a 20 20 70 49 74 65 72 2d 3e  fPgno;.  pIter->
d110: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
d120: 66 66 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72  ff;..  if( pIter
d130: 2d 3e 69 50 67 69 64 78 4f 66 66 3e 3d 70 49 74  ->iPgidxOff>=pIt
d140: 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 29 7b  er->pLeaf->nn ){
d150: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64  .    pIter->iEnd
d160: 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 49 74 65  ofDoclist = pIte
d170: 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a  r->pLeaf->nn+1;.
d180: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
d190: 20 6e 45 78 74 72 61 3b 0a 20 20 20 20 70 49 74   nExtra;.    pIt
d1a0: 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 2b 3d  er->iPgidxOff +=
d1b0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
d1c0: 28 26 61 5b 70 49 74 65 72 2d 3e 69 50 67 69 64  (&a[pIter->iPgid
d1d0: 78 4f 66 66 5d 2c 20 6e 45 78 74 72 61 29 3b 0a  xOff], nExtra);.
d1e0: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
d1f0: 66 44 6f 63 6c 69 73 74 20 2b 3d 20 6e 45 78 74  fDoclist += nExt
d200: 72 61 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53  ra;.  }..  fts5S
d210: 65 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64 28  egIterLoadRowid(
d220: 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 73 74  p, pIter);.}..st
d230: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
d240: 67 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e  gIterNext(Fts5In
d250: 64 65 78 2a 2c 20 46 74 73 35 53 65 67 49 74 65  dex*, Fts5SegIte
d260: 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74 69  r*, int*);.stati
d270: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
d280: 65 72 4e 65 78 74 5f 52 65 76 65 72 73 65 28 46  erNext_Reverse(F
d290: 74 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53  ts5Index*, Fts5S
d2a0: 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a  egIter*, int*);.
d2b0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
d2c0: 53 65 67 49 74 65 72 4e 65 78 74 5f 4e 6f 6e 65  SegIterNext_None
d2d0: 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74 73  (Fts5Index*, Fts
d2e0: 35 53 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29  5SegIter*, int*)
d2f0: 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  ;..static void f
d300: 74 73 35 53 65 67 49 74 65 72 53 65 74 4e 65 78  ts5SegIterSetNex
d310: 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  t(Fts5Index *p, 
d320: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
d330: 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72  er){.  if( pIter
d340: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
d350: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 29  EGITER_REVERSE )
d360: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 78 4e 65  {.    pIter->xNe
d370: 78 74 20 3d 20 66 74 73 35 53 65 67 49 74 65 72  xt = fts5SegIter
d380: 4e 65 78 74 5f 52 65 76 65 72 73 65 3b 0a 20 20  Next_Reverse;.  
d390: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 43 6f  }else if( p->pCo
d3a0: 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46  nfig->eDetail==F
d3b0: 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
d3c0: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 78 4e  ){.    pIter->xN
d3d0: 65 78 74 20 3d 20 66 74 73 35 53 65 67 49 74 65  ext = fts5SegIte
d3e0: 72 4e 65 78 74 5f 4e 6f 6e 65 3b 0a 20 20 7d 65  rNext_None;.  }e
d3f0: 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  lse{.    pIter->
d400: 78 4e 65 78 74 20 3d 20 66 74 73 35 53 65 67 49  xNext = fts5SegI
d410: 74 65 72 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a  terNext;.  }.}..
d420: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
d430: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62   the iterator ob
d440: 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 69 74  ject pIter to it
d450: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
d460: 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a 20  e entries in.** 
d470: 73 65 67 6d 65 6e 74 20 70 53 65 67 2e 20 54 68  segment pSeg. Th
d480: 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65  e iterator is le
d490: 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ft pointing to t
d4a0: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 77  he first entry w
d4b0: 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e  hen .** this fun
d4c0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a  ction returns..*
d4d0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
d4e0: 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64   occurs, Fts5Ind
d4f0: 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20  ex.rc is set to 
d500: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
d510: 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a  rror code. If .*
d520: 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  * an error has a
d530: 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
d540: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
d550: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
d560: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
d570: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
d580: 53 65 67 49 74 65 72 49 6e 69 74 28 0a 20 20 46  SegIterInit(.  F
d590: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d5b0: 2a 20 46 54 53 20 69 6e 64 65 78 20 6f 62 6a 65  * FTS index obje
d5c0: 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
d5d0: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
d5e0: 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  eg,     /* Descr
d5f0: 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e  iption of segmen
d600: 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
d610: 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
d620: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
d630: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a   to populate */.
d640: 29 7b 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 70  ){.  if( pSeg->p
d650: 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20  gnoFirst==0 ){. 
d660: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
d670: 6e 73 20 69 66 20 74 68 65 20 73 65 67 6d 65 6e  ns if the segmen
d680: 74 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20  t is being used 
d690: 61 73 20 61 6e 20 69 6e 70 75 74 20 74 6f 20 61  as an input to a
d6a0: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 20 20  n incremental.  
d6b0: 20 20 2a 2a 20 6d 65 72 67 65 20 61 6e 64 20 61    ** merge and a
d6c0: 6c 6c 20 64 61 74 61 20 68 61 73 20 61 6c 72 65  ll data has alre
d6d0: 61 64 79 20 62 65 65 6e 20 22 74 72 69 6d 6d 65  ady been "trimme
d6e0: 64 22 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e  d". See function
d6f0: 0a 20 20 20 20 2a 2a 20 66 74 73 35 54 72 69 6d  .    ** fts5Trim
d700: 53 65 67 6d 65 6e 74 73 28 29 20 66 6f 72 20 64  Segments() for d
d710: 65 74 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 20  etails. In this 
d720: 63 61 73 65 20 6c 65 61 76 65 20 74 68 65 20 69  case leave the i
d730: 74 65 72 61 74 6f 72 20 65 6d 70 74 79 2e 0a 20  terator empty.. 
d740: 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72     ** The caller
d750: 20 77 69 6c 6c 20 73 65 65 20 74 68 65 20 28 70   will see the (p
d760: 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 29 20  Iter->pLeaf==0) 
d770: 61 6e 64 20 61 73 73 75 6d 65 20 74 68 65 20 69  and assume the i
d780: 74 65 72 61 74 6f 72 20 69 73 0a 20 20 20 20 2a  terator is.    *
d790: 2a 20 61 74 20 45 4f 46 20 61 6c 72 65 61 64 79  * at EOF already
d7a0: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
d7b0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
d7c0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
d7d0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
d7e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
d7f0: 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c     memset(pIter,
d800: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
d810: 72 29 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67  r));.    fts5Seg
d820: 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20 70  IterSetNext(p, p
d830: 49 74 65 72 29 3b 0a 20 20 20 20 70 49 74 65 72  Iter);.    pIter
d840: 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 20  ->pSeg = pSeg;. 
d850: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50     pIter->iLeafP
d860: 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  gno = pSeg->pgno
d870: 46 69 72 73 74 2d 31 3b 0a 20 20 20 20 66 74 73  First-1;.    fts
d880: 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65  5SegIterNextPage
d890: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a  (p, pIter);.  }.
d8a0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
d8b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
d8c0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
d8d0: 74 20 3d 20 34 3b 0a 20 20 20 20 61 73 73 65 72  t = 4;.    asser
d8e0: 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e 70 4c 65  t_nc( pIter->pLe
d8f0: 61 66 2d 3e 6e 6e 3e 34 20 29 3b 0a 20 20 20 20  af->nn>4 );.    
d900: 61 73 73 65 72 74 5f 6e 63 28 20 66 74 73 35 4c  assert_nc( fts5L
d910: 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28  eafFirstTermOff(
d920: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 34  pIter->pLeaf)==4
d930: 20 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   );.    pIter->i
d940: 50 67 69 64 78 4f 66 66 20 3d 20 70 49 74 65 72  PgidxOff = pIter
d950: 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 2b  ->pLeaf->szLeaf+
d960: 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  1;.    fts5SegIt
d970: 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49  erLoadTerm(p, pI
d980: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 66 74 73  ter, 0);.    fts
d990: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
d9a0: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a  (p, pIter);.  }.
d9b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
d9c0: 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65  nction is only e
d9d0: 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74  ver called on it
d9e0: 65 72 61 74 6f 72 73 20 63 72 65 61 74 65 64 20  erators created 
d9f0: 62 79 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46  by calls to.** F
da00: 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 20  ts5IndexQuery() 
da10: 77 69 74 68 20 74 68 65 20 46 54 53 35 49 4e 44  with the FTS5IND
da20: 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 66 6c  EX_QUERY_DESC fl
da30: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ag set..**.** Th
da40: 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 69 6e  e iterator is in
da50: 20 61 6e 20 75 6e 75 73 75 61 6c 20 73 74 61 74   an unusual stat
da60: 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
da70: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 3a 20  tion is called: 
da80: 74 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 49 74  the.** Fts5SegIt
da90: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 76  er.iLeafOffset v
daa0: 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74  ariable is set t
dab0: 6f 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  o the offset of 
dac0: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
dad0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
dae0: 74 20 73 69 7a 65 20 66 69 65 6c 64 20 66 6f 72  t size field for
daf0: 20 74 68 65 20 66 69 72 73 74 20 72 65 6c 65 76   the first relev
db00: 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  ant rowid on the
db10: 20 70 61 67 65 2e 0a 2a 2a 20 46 74 73 35 53 65   page..** Fts5Se
db20: 67 49 74 65 72 2e 72 6f 77 69 64 20 69 73 20 73  gIter.rowid is s
db30: 65 74 2c 20 62 75 74 20 6e 50 6f 73 20 61 6e 64  et, but nPos and
db40: 20 62 44 65 6c 20 61 72 65 20 6e 6f 74 2e 0a 2a   bDel are not..*
db50: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
db60: 6f 6e 20 61 64 76 61 6e 63 65 73 20 74 68 65 20  on advances the 
db70: 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74  iterator so that
db80: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
db90: 65 20 6c 61 73 74 20 0a 2a 2a 20 72 65 6c 65 76  e last .** relev
dba0: 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  ant rowid on the
dbb0: 20 70 61 67 65 20 61 6e 64 2c 20 69 66 20 6e 65   page and, if ne
dbc0: 63 65 73 73 61 72 79 2c 20 69 6e 69 74 69 61 6c  cessary, initial
dbd0: 69 7a 65 73 20 74 68 65 20 0a 2a 2a 20 61 52 6f  izes the .** aRo
dbe0: 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 6e 64 20  widOffset[] and 
dbf0: 69 52 6f 77 69 64 4f 66 66 73 65 74 20 76 61 72  iRowidOffset var
dc00: 69 61 62 6c 65 73 2e 20 41 74 20 74 68 69 73 20  iables. At this 
dc10: 70 6f 69 6e 74 20 74 68 65 20 69 74 65 72 61 74  point the iterat
dc20: 6f 72 0a 2a 2a 20 69 73 20 69 6e 20 69 74 73 20  or.** is in its 
dc30: 72 65 67 75 6c 61 72 20 73 74 61 74 65 20 2d 20  regular state - 
dc40: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
dc50: 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 73 20 74  fOffset points t
dc60: 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 62  o the first.** b
dc70: 79 74 65 20 6f 66 20 74 68 65 20 70 6f 73 69 74  yte of the posit
dc80: 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74  ion list content
dc90: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
dca0: 20 73 61 69 64 20 72 6f 77 69 64 2e 0a 2a 2f 0a   said rowid..*/.
dcb0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
dcc0: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e  SegIterReverseIn
dcd0: 69 74 50 61 67 65 28 46 74 73 35 49 6e 64 65 78  itPage(Fts5Index
dce0: 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
dcf0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
dd00: 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f  eDetail = p->pCo
dd10: 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20  nfig->eDetail;. 
dd20: 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e   int n = pIter->
dd30: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20  pLeaf->szLeaf;. 
dd40: 20 69 6e 74 20 69 20 3d 20 70 49 74 65 72 2d 3e   int i = pIter->
dd50: 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 75  iLeafOffset;.  u
dd60: 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
dd70: 65 61 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 69 52  eaf->p;.  int iR
dd80: 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 30 3b 0a  owidOffset = 0;.
dd90: 0a 20 20 69 66 28 20 6e 3e 70 49 74 65 72 2d 3e  .  if( n>pIter->
dda0: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b  iEndofDoclist ){
ddb0: 0a 20 20 20 20 6e 20 3d 20 70 49 74 65 72 2d 3e  .    n = pIter->
ddc0: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 20  iEndofDoclist;. 
ddd0: 20 7d 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c   }..  ASSERT_SZL
dde0: 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c  EAF_OK(pIter->pL
ddf0: 65 61 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 31  eaf);.  while( 1
de00: 20 29 7b 0a 20 20 20 20 69 36 34 20 69 44 65 6c   ){.    i64 iDel
de10: 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  ta = 0;..    if(
de20: 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44   eDetail==FTS5_D
de30: 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
de40: 20 20 20 20 2f 2a 20 74 6f 64 6f 20 2a 2f 0a 20      /* todo */. 
de50: 20 20 20 20 20 69 66 28 20 69 3c 6e 20 26 26 20       if( i<n && 
de60: 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  a[i]==0 ){.     
de70: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
de80: 69 66 28 20 69 3c 6e 20 26 26 20 61 5b 69 5d 3d  if( i<n && a[i]=
de90: 3d 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20  =0 ) i++;.      
dea0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
deb0: 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
dec0: 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20     int bDummy;. 
ded0: 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65       i += fts5Ge
dee0: 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b  tPoslistSize(&a[
def0: 69 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d  i], &nPos, &bDum
df00: 6d 79 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20  my);.      i += 
df10: 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nPos;.    }.    
df20: 69 66 28 20 69 3e 3d 6e 20 29 20 62 72 65 61 6b  if( i>=n ) break
df30: 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47  ;.    i += fts5G
df40: 65 74 56 61 72 69 6e 74 28 26 61 5b 69 5d 2c 20  etVarint(&a[i], 
df50: 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a  (u64*)&iDelta);.
df60: 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
df70: 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20  d += iDelta;..  
df80: 20 20 2f 2a 20 49 66 20 6e 65 63 65 73 73 61 72    /* If necessar
df90: 79 2c 20 67 72 6f 77 20 74 68 65 20 70 49 74 65  y, grow the pIte
dfa0: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  r->aRowidOffset[
dfb0: 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20  ] array. */.    
dfc0: 69 66 28 20 69 52 6f 77 69 64 4f 66 66 73 65 74  if( iRowidOffset
dfd0: 3e 3d 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f  >=pIter->nRowidO
dfe0: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69  ffset ){.      i
dff0: 6e 74 20 6e 4e 65 77 20 3d 20 70 49 74 65 72 2d  nt nNew = pIter-
e000: 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 2b 20  >nRowidOffset + 
e010: 38 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e  8;.      int *aN
e020: 65 77 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74  ew = (int*)sqlit
e030: 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 49 74  e3_realloc64(pIt
e040: 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74  er->aRowidOffset
e050: 2c 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74  ,nNew*sizeof(int
e060: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e  ));.      if( aN
e070: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
e080: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
e090: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62  NOMEM;.        b
e0a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
e0b0: 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69      pIter->aRowi
e0c0: 64 4f 66 66 73 65 74 20 3d 20 61 4e 65 77 3b 0a  dOffset = aNew;.
e0d0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 6f        pIter->nRo
e0e0: 77 69 64 4f 66 66 73 65 74 20 3d 20 6e 4e 65 77  widOffset = nNew
e0f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 49 74  ;.    }..    pIt
e100: 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74  er->aRowidOffset
e110: 5b 69 52 6f 77 69 64 4f 66 66 73 65 74 2b 2b 5d  [iRowidOffset++]
e120: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
e130: 66 66 73 65 74 3b 0a 20 20 20 20 70 49 74 65 72  ffset;.    pIter
e140: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
e150: 69 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e  i;.  }.  pIter->
e160: 69 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 69  iRowidOffset = i
e170: 52 6f 77 69 64 4f 66 66 73 65 74 3b 0a 20 20 66  RowidOffset;.  f
e180: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
e190: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a  os(p, pIter);.}.
e1a0: 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  ./*.**.*/.static
e1b0: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
e1c0: 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28  rReverseNewPage(
e1d0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
e1e0: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
e1f0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
e200: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
e210: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
e220: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
e230: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
e240: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
e250: 4d 20 29 3b 0a 0a 20 20 66 74 73 35 44 61 74 61  M );..  fts5Data
e260: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
e270: 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e  Leaf);.  pIter->
e280: 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 77 68 69  pLeaf = 0;.  whi
e290: 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
e2a0: 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 69  E_OK && pIter->i
e2b0: 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e  LeafPgno>pIter->
e2c0: 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b  iTermLeafPgno ){
e2d0: 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
e2e0: 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  New;.    pIter->
e2f0: 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20  iLeafPgno--;.   
e300: 20 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61   pNew = fts5Data
e310: 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47  Read(p, FTS5_SEG
e320: 4d 45 4e 54 5f 52 4f 57 49 44 28 0a 20 20 20 20  MENT_ROWID(.    
e330: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 53 65        pIter->pSe
e340: 67 2d 3e 69 53 65 67 69 64 2c 20 70 49 74 65 72  g->iSegid, pIter
e350: 2d 3e 69 4c 65 61 66 50 67 6e 6f 0a 20 20 20 20  ->iLeafPgno.    
e360: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  ));.    if( pNew
e370: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 54 65   ){.      /* iTe
e380: 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 6d 61 79  rmLeafOffset may
e390: 20 62 65 20 65 71 75 61 6c 20 74 6f 20 73 7a 4c   be equal to szL
e3a0: 65 61 66 20 69 66 20 74 68 65 20 74 65 72 6d 20  eaf if the term 
e3b0: 69 73 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20  is the last.    
e3c0: 20 20 2a 2a 20 74 68 69 6e 67 20 6f 6e 20 74 68    ** thing on th
e3d0: 65 20 70 61 67 65 20 2d 20 69 2e 65 2e 20 74 68  e page - i.e. th
e3e0: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 73  e first rowid is
e3f0: 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   on the followin
e400: 67 20 70 61 67 65 2e 0a 20 20 20 20 20 20 2a 2a  g page..      **
e410: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 65   In this case le
e420: 61 76 65 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  ave pIter->pLeaf
e430: 3d 3d 30 2c 20 74 68 69 73 20 69 74 65 72 61 74  ==0, this iterat
e440: 6f 72 20 69 73 20 61 74 20 45 4f 46 2e 20 2a 2f  or is at EOF. */
e450: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
e460: 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74  ->iLeafPgno==pIt
e470: 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  er->iTermLeafPgn
e480: 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  o ){.        ass
e490: 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61  ert( pIter->pLea
e4a0: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  f==0 );.        
e4b0: 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  if( pIter->iTerm
e4c0: 4c 65 61 66 4f 66 66 73 65 74 3c 70 4e 65 77 2d  LeafOffset<pNew-
e4d0: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
e4e0: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
e4f0: 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  f = pNew;.      
e500: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
e510: 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d 3e  Offset = pIter->
e520: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b  iTermLeafOffset;
e530: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e540: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e550: 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20  int iRowidOff;. 
e560: 20 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66         iRowidOff
e570: 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
e580: 52 6f 77 69 64 4f 66 66 28 70 4e 65 77 29 3b 0a  RowidOff(pNew);.
e590: 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77          if( iRow
e5a0: 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20  idOff ){.       
e5b0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
e5c0: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
e5d0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
e5e0: 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66  fset = iRowidOff
e5f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e600: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
e610: 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
e620: 20 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 26         u8 *a = &
e630: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b  pIter->pLeaf->p[
e640: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e650: 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 74  et];.        pIt
e660: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
e670: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
e680: 28 61 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  (a, (u64*)&pIter
e690: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
e6a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e6b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
e6c0: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
e6d0: 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
e6e0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
e6f0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
e700: 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
e710: 44 6f 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d  Doclist = pIter-
e720: 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20  >pLeaf->nn+1;.  
e730: 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
e740: 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20  erseInitPage(p, 
e750: 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pIter);.  }.}../
e760: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
e770: 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   if the iterator
e780: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
e790: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
e7a0: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
e7b0: 74 73 20 74 6f 20 61 20 64 65 6c 65 74 65 20 6d  ts to a delete m
e7c0: 61 72 6b 65 72 2e 20 41 20 64 65 6c 65 74 65 20  arker. A delete 
e7d0: 6d 61 72 6b 65 72 20 69 73 20 61 6e 20 65 6e 74  marker is an ent
e7e0: 72 79 20 77 69 74 68 20 61 20 30 20 62 79 74 65  ry with a 0 byte
e7f0: 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  .** position-lis
e800: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
e810: 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73   fts5MultiIterIs
e820: 45 6d 70 74 79 28 46 74 73 35 49 6e 64 65 78 20  Empty(Fts5Index 
e830: 2a 70 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49  *p, Fts5Iter *pI
e840: 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65 67 49  ter){.  Fts5SegI
e850: 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
e860: 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e  er->aSeg[pIter->
e870: 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
e880: 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  ];.  return (p->
e890: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
e8a0: 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 26 26 20   pSeg->pLeaf && 
e8b0: 70 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30 29 3b 0a  pSeg->nPos==0);.
e8c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
e8d0: 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   iterator pIter 
e8e0: 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
e8f0: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 65  y..**.** This ve
e900: 72 73 69 6f 6e 20 6f 66 20 66 74 73 35 53 65 67  rsion of fts5Seg
e910: 49 74 65 72 4e 65 78 74 28 29 20 69 73 20 6f 6e  IterNext() is on
e920: 6c 79 20 75 73 65 64 20 62 79 20 72 65 76 65 72  ly used by rever
e930: 73 65 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f  se iterators..*/
e940: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
e950: 35 53 65 67 49 74 65 72 4e 65 78 74 5f 52 65 76  5SegIterNext_Rev
e960: 65 72 73 65 28 0a 20 20 46 74 73 35 49 6e 64 65  erse(.  Fts5Inde
e970: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
e980: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
e990: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
e9a0: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
e9b0: 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
e9c0: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
e9d0: 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20  to advance */.  
e9e0: 69 6e 74 20 2a 70 62 55 6e 75 73 65 64 20 20 20  int *pbUnused   
e9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea00: 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 29 7b 0a  /* Unused */.){.
ea10: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
ea20: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
ea30: 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 3b  GITER_REVERSE );
ea40: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
ea50: 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29  ->pNextLeaf==0 )
ea60: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
ea70: 28 70 62 55 6e 75 73 65 64 29 3b 0a 0a 20 20 69  (pbUnused);..  i
ea80: 66 28 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  f( pIter->iRowid
ea90: 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20  Offset>0 ){.    
eaa0: 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
eab0: 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 69 6e 74  Leaf->p;.    int
eac0: 20 69 4f 66 66 3b 0a 20 20 20 20 69 36 34 20 69   iOff;.    i64 i
ead0: 44 65 6c 74 61 3b 0a 0a 20 20 20 20 70 49 74 65  Delta;..    pIte
eae0: 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 2d  r->iRowidOffset-
eaf0: 2d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  -;.    pIter->iL
eb00: 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65  eafOffset = pIte
eb10: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  r->aRowidOffset[
eb20: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66  pIter->iRowidOff
eb30: 73 65 74 5d 3b 0a 20 20 20 20 66 74 73 35 53 65  set];.    fts5Se
eb40: 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
eb50: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69 4f 66   pIter);.    iOf
eb60: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
eb70: 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 66 28 20  Offset;.    if( 
eb80: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
eb90: 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail!=FTS5_DETAIL
eba0: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69  _NONE ){.      i
ebb0: 4f 66 66 20 2b 3d 20 70 49 74 65 72 2d 3e 6e 50  Off += pIter->nP
ebc0: 6f 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  os;.    }.    ft
ebd0: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
ebe0: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  Off], (u64*)&iDe
ebf0: 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  lta);.    pIter-
ec00: 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74  >iRowid -= iDelt
ec10: 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
ec20: 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
ec30: 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74  seNewPage(p, pIt
ec40: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
ec50: 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72 61 74  * Advance iterat
ec60: 6f 72 20 70 49 74 65 72 20 74 6f 20 74 68 65 20  or pIter to the 
ec70: 6e 65 78 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a  next entry..**.*
ec80: 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  * This version o
ec90: 66 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  f fts5SegIterNex
eca0: 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  t() is only used
ecb0: 20 69 66 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20   if detail=none 
ecc0: 61 6e 64 20 74 68 65 0a 2a 2a 20 69 74 65 72 61  and the.** itera
ecd0: 74 6f 72 20 69 73 20 6e 6f 74 20 61 20 72 65 76  tor is not a rev
ece0: 65 72 73 65 20 64 69 72 65 63 74 69 6f 6e 20 69  erse direction i
ecf0: 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  terator..*/.stat
ed00: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
ed10: 74 65 72 4e 65 78 74 5f 4e 6f 6e 65 28 0a 20 20  terNext_None(.  
ed20: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
ed30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed40: 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
ed50: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
ed60: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
ed80: 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
ed90: 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e  ce */.  int *pbN
eda0: 65 77 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  ewTerm          
edb0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
edc0: 53 65 74 20 66 6f 72 20 6e 65 77 20 74 65 72 6d  Set for new term
edd0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 4f 66   */.){.  int iOf
ede0: 66 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  f;..  assert( p-
edf0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
ee00: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 74  ;.  assert( (pIt
ee10: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
ee20: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
ee30: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
ee40: 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  ( p->pConfig->eD
ee50: 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
ee60: 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 41 53  IL_NONE );..  AS
ee70: 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70  SERT_SZLEAF_OK(p
ee80: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
ee90: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
eea0: 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a  eafOffset;..  /*
eeb0: 20 4e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f   Next entry is o
eec0: 6e 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  n the next page 
eed0: 2a 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  */.  if( pIter->
eee0: 70 53 65 67 20 26 26 20 69 4f 66 66 3e 3d 70 49  pSeg && iOff>=pI
eef0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
ef00: 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 53 65  af ){.    fts5Se
ef10: 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
ef20: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28   pIter);.    if(
ef30: 20 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d   p->rc || pIter-
ef40: 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75  >pLeaf==0 ) retu
ef50: 72 6e 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  rn;.    pIter->i
ef60: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 69  Rowid = 0;.    i
ef70: 4f 66 66 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20  Off = 4;.  }..  
ef80: 69 66 28 20 69 4f 66 66 3c 70 49 74 65 72 2d 3e  if( iOff<pIter->
ef90: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b  iEndofDoclist ){
efa0: 0a 20 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74  .    /* Next ent
efb0: 72 79 20 69 73 20 6f 6e 20 74 68 65 20 63 75 72  ry is on the cur
efc0: 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 20  rent page */.   
efd0: 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20   i64 iDelta;.   
efe0: 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33   iOff += sqlite3
eff0: 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  Fts5GetVarint(&p
f000: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69  Iter->pLeaf->p[i
f010: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  Off], (u64*)&iDe
f020: 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  lta);.    pIter-
f030: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
f040: 4f 66 66 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  Off;.    pIter->
f050: 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61  iRowid += iDelta
f060: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70  ;.  }else if( (p
f070: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
f080: 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
f090: 52 4d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  RM)==0 ){.    if
f0a0: 28 20 70 49 74 65 72 2d 3e 70 53 65 67 20 29 7b  ( pIter->pSeg ){
f0b0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 65 70  .      int nKeep
f0c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
f0d0: 69 4f 66 66 21 3d 66 74 73 35 4c 65 61 66 46 69  iOff!=fts5LeafFi
f0e0: 72 73 74 54 65 72 6d 4f 66 66 28 70 49 74 65 72  rstTermOff(pIter
f0f0: 2d 3e 70 4c 65 61 66 29 20 29 7b 0a 20 20 20 20  ->pLeaf) ){.    
f100: 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
f110: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  GetVarint32(&pIt
f120: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  er->pLeaf->p[iOf
f130: 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  f], nKeep);.    
f140: 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d    }.      pIter-
f150: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
f160: 4f 66 66 3b 0a 20 20 20 20 20 20 66 74 73 35 53  Off;.      fts5S
f170: 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70  egIterLoadTerm(p
f180: 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b  , pIter, nKeep);
f190: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f1a0: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73    const u8 *pLis
f1b0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  t = 0;.      con
f1c0: 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d  st char *zTerm =
f1d0: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c   0;.      int nL
f1e0: 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ist;.      sqlit
f1f0: 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65  e3Fts5HashScanNe
f200: 78 74 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20  xt(p->pHash);.  
f210: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
f220: 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e  ashScanEntry(p->
f230: 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26  pHash, &zTerm, &
f240: 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a  pList, &nList);.
f250: 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d        if( pList=
f260: 3d 30 20 29 20 67 6f 74 6f 20 6e 65 78 74 5f 6e  =0 ) goto next_n
f270: 6f 6e 65 5f 65 6f 66 3b 0a 20 20 20 20 20 20 70  one_eof;.      p
f280: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d  Iter->pLeaf->p =
f290: 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20   (u8*)pList;.   
f2a0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d     pIter->pLeaf-
f2b0: 3e 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  >nn = nList;.   
f2c0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d     pIter->pLeaf-
f2d0: 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b  >szLeaf = nList;
f2e0: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45  .      pIter->iE
f2f0: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 6e 4c  ndofDoclist = nL
f300: 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ist;.      sqlit
f310: 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28  e3Fts5BufferSet(
f320: 26 70 2d 3e 72 63 2c 26 70 49 74 65 72 2d 3e 74  &p->rc,&pIter->t
f330: 65 72 6d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e  erm, (int)strlen
f340: 28 7a 54 65 72 6d 29 2c 20 28 75 38 2a 29 7a 54  (zTerm), (u8*)zT
f350: 65 72 6d 29 3b 0a 20 20 20 20 20 20 70 49 74 65  erm);.      pIte
f360: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
f370: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70   fts5GetVarint(p
f380: 4c 69 73 74 2c 20 28 75 36 34 2a 29 26 70 49 74  List, (u64*)&pIt
f390: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
f3a0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 62 4e 65   }..    if( pbNe
f3b0: 77 54 65 72 6d 20 29 20 2a 70 62 4e 65 77 54 65  wTerm ) *pbNewTe
f3c0: 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  rm = 1;.  }else{
f3d0: 0a 20 20 20 20 67 6f 74 6f 20 6e 65 78 74 5f 6e  .    goto next_n
f3e0: 6f 6e 65 5f 65 6f 66 3b 0a 20 20 7d 0a 0a 20 20  one_eof;.  }..  
f3f0: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
f400: 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a  Pos(p, pIter);..
f410: 20 20 72 65 74 75 72 6e 3b 0a 20 6e 65 78 74 5f    return;. next_
f420: 6e 6f 6e 65 5f 65 6f 66 3a 0a 20 20 66 74 73 35  none_eof:.  fts5
f430: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
f440: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74  r->pLeaf);.  pIt
f450: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 7d  er->pLeaf = 0;.}
f460: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  .../*.** Advance
f470: 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   iterator pIter 
f480: 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
f490: 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  y. .**.** If an 
f4a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74  error occurs, Ft
f4b0: 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65  s5Index.rc is se
f4c0: 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69  t to an appropri
f4d0: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ate error code. 
f4e0: 49 74 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  It .** is not co
f4f0: 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f  nsidered an erro
f500: 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  r if the iterato
f510: 72 20 72 65 61 63 68 65 73 20 45 4f 46 2e 20 49  r reaches EOF. I
f520: 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
f530: 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
f540: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
f550: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
f560: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
f570: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f580: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
f590: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
f5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5b0: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
f5c0: 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
f5d0: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
f5e0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
f5f0: 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
f600: 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  vance */.  int *
f610: 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20 20 20  pbNewTerm       
f620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
f630: 54 3a 20 53 65 74 20 66 6f 72 20 6e 65 77 20 74  T: Set for new t
f640: 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  erm */.){.  Fts5
f650: 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49  Data *pLeaf = pI
f660: 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 69 6e  ter->pLeaf;.  in
f670: 74 20 69 4f 66 66 3b 0a 20 20 69 6e 74 20 62 4e  t iOff;.  int bN
f680: 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 69 6e  ewTerm = 0;.  in
f690: 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 75  t nKeep = 0;.  u
f6a0: 38 20 2a 61 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  8 *a;.  int n;..
f6b0: 20 20 61 73 73 65 72 74 28 20 70 62 4e 65 77 54    assert( pbNewT
f6c0: 65 72 6d 3d 3d 30 20 7c 7c 20 2a 70 62 4e 65 77  erm==0 || *pbNew
f6d0: 54 65 72 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Term==0 );.  ass
f6e0: 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  ert( p->pConfig-
f6f0: 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44  >eDetail!=FTS5_D
f700: 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20  ETAIL_NONE );.. 
f710: 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74   /* Search for t
f720: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 6f  he end of the po
f730: 73 69 74 69 6f 6e 20 6c 69 73 74 20 77 69 74 68  sition list with
f740: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  in the current p
f750: 61 67 65 2e 20 2a 2f 0a 20 20 61 20 3d 20 70 4c  age. */.  a = pL
f760: 65 61 66 2d 3e 70 3b 0a 20 20 6e 20 3d 20 70 4c  eaf->p;.  n = pL
f770: 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20  eaf->szLeaf;..  
f780: 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b  ASSERT_SZLEAF_OK
f790: 28 70 4c 65 61 66 29 3b 0a 20 20 69 4f 66 66 20  (pLeaf);.  iOff 
f7a0: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
f7b0: 66 73 65 74 20 2b 20 70 49 74 65 72 2d 3e 6e 50  fset + pIter->nP
f7c0: 6f 73 3b 0a 0a 20 20 69 66 28 20 69 4f 66 66 3c  os;..  if( iOff<
f7d0: 6e 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  n ){.    /* The 
f7e0: 6e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e  next entry is on
f7f0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
f800: 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
f810: 5f 6e 63 28 20 69 4f 66 66 3c 3d 70 49 74 65 72  _nc( iOff<=pIter
f820: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
f830: 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e  );.    if( iOff>
f840: 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f  =pIter->iEndofDo
f850: 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 62  clist ){.      b
f860: 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  NewTerm = 1;.   
f870: 20 20 20 69 66 28 20 69 4f 66 66 21 3d 66 74 73     if( iOff!=fts
f880: 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66  5LeafFirstTermOf
f890: 66 28 70 4c 65 61 66 29 20 29 7b 0a 20 20 20 20  f(pLeaf) ){.    
f8a0: 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
f8b0: 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
f8c0: 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  Off], nKeep);.  
f8d0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
f8e0: 0a 20 20 20 20 20 20 75 36 34 20 69 44 65 6c 74  .      u64 iDelt
f8f0: 61 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  a;.      iOff +=
f900: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
f910: 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20  arint(&a[iOff], 
f920: 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
f930: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d  pIter->iRowid +=
f940: 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 61   iDelta;.      a
f950: 73 73 65 72 74 5f 6e 63 28 20 69 44 65 6c 74 61  ssert_nc( iDelta
f960: 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >0 );.    }.    
f970: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
f980: 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 7d 65  et = iOff;..  }e
f990: 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 70  lse if( pIter->p
f9a0: 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f  Seg==0 ){.    co
f9b0: 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20  nst u8 *pList = 
f9c0: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
f9d0: 72 20 2a 7a 54 65 72 6d 20 3d 20 30 3b 0a 20 20  r *zTerm = 0;.  
f9e0: 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b    int nList = 0;
f9f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 49  .    assert( (pI
fa00: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
fa10: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
fa20: 4d 29 20 7c 7c 20 70 62 4e 65 77 54 65 72 6d 20  M) || pbNewTerm 
fa30: 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  );.    if( 0==(p
fa40: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
fa50: 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
fa60: 52 4d 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  RM) ){.      sql
fa70: 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
fa80: 4e 65 78 74 28 70 2d 3e 70 48 61 73 68 29 3b 0a  Next(p->pHash);.
fa90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
faa0: 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70  5HashScanEntry(p
fab0: 2d 3e 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c  ->pHash, &zTerm,
fac0: 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29   &pList, &nList)
fad0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fae0: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
faf0: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
fb00: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
fb10: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  .      pIter->pL
fb20: 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  eaf = 0;.    }el
fb30: 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  se{.      pIter-
fb40: 3e 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a  >pLeaf->p = (u8*
fb50: 29 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49  )pList;.      pI
fb60: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 3d  ter->pLeaf->nn =
fb70: 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49   nList;.      pI
fb80: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
fb90: 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20  af = nList;.    
fba0: 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
fbb0: 6f 63 6c 69 73 74 20 3d 20 6e 4c 69 73 74 2b 31  oclist = nList+1
fbc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
fbd0: 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
fbe0: 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72  >rc, &pIter->ter
fbf0: 6d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  m, (int)strlen(z
fc00: 54 65 72 6d 29 2c 0a 20 20 20 20 20 20 20 20 20  Term),.         
fc10: 20 28 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20   (u8*)zTerm);.  
fc20: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
fc30: 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74  Offset = fts5Get
fc40: 56 61 72 69 6e 74 28 70 4c 69 73 74 2c 20 28 75  Varint(pList, (u
fc50: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
fc60: 69 64 29 3b 0a 20 20 20 20 20 20 2a 70 62 4e 65  id);.      *pbNe
fc70: 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 7d  wTerm = 1;.    }
fc80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4f  .  }else{.    iO
fc90: 66 66 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 4e  ff = 0;.    /* N
fca0: 65 78 74 20 65 6e 74 72 79 20 69 73 20 6e 6f 74  ext entry is not
fcb0: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
fcc0: 70 61 67 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c  page */.    whil
fcd0: 65 28 20 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  e( iOff==0 ){.  
fce0: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
fcf0: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
fd00: 29 3b 0a 20 20 20 20 20 20 70 4c 65 61 66 20 3d  );.      pLeaf =
fd10: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20   pIter->pLeaf;. 
fd20: 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d       if( pLeaf==
fd30: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
fd40: 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f   ASSERT_SZLEAF_O
fd50: 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  K(pLeaf);.      
fd60: 69 66 28 20 28 69 4f 66 66 20 3d 20 66 74 73 35  if( (iOff = fts5
fd70: 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
fd80: 66 28 70 4c 65 61 66 29 29 20 26 26 20 69 4f 66  f(pLeaf)) && iOf
fd90: 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  f<pLeaf->szLeaf 
fda0: 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ){.        iOff 
fdb0: 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  += sqlite3Fts5Ge
fdc0: 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e  tVarint(&pLeaf->
fdd0: 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  p[iOff], (u64*)&
fde0: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
fdf0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
fe00: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
fe10: 66 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  f;..        if( 
fe20: 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d  pLeaf->nn>pLeaf-
fe30: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
fe40: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69       pIter->iPgi
fe50: 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73  dxOff = pLeaf->s
fe60: 7a 4c 65 61 66 20 2b 20 66 74 73 35 47 65 74 56  zLeaf + fts5GetV
fe70: 61 72 69 6e 74 33 32 28 0a 20 20 20 20 20 20 20  arint32(.       
fe80: 20 20 20 20 20 20 20 26 70 4c 65 61 66 2d 3e 70         &pLeaf->p
fe90: 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c  [pLeaf->szLeaf],
fea0: 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
feb0: 63 6c 69 73 74 0a 20 20 20 20 20 20 20 20 20 20  clist.          
fec0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
fed0: 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20     }.      else 
fee0: 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c  if( pLeaf->nn>pL
fef0: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
ff00: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 50         pIter->iP
ff10: 67 69 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d  gidxOff = pLeaf-
ff20: 3e 73 7a 4c 65 61 66 20 2b 20 66 74 73 35 47 65  >szLeaf + fts5Ge
ff30: 74 56 61 72 69 6e 74 33 32 28 0a 20 20 20 20 20  tVarint32(.     
ff40: 20 20 20 20 20 20 20 26 70 4c 65 61 66 2d 3e 70         &pLeaf->p
ff50: 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c  [pLeaf->szLeaf],
ff60: 20 69 4f 66 66 0a 20 20 20 20 20 20 20 20 29 3b   iOff.        );
ff70: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
ff80: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
ff90: 66 66 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  ff;.        pIte
ffa0: 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
ffb0: 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20   = iOff;.       
ffc0: 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20   bNewTerm = 1;. 
ffd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
ffe0: 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c 70 4c 65  ert_nc( iOff<pLe
fff0: 61 66 2d 3e 73 7a 4c 65 61 66 20 29 3b 0a 20 20  af->szLeaf );.  
10000 20 20 20 20 69 66 28 20 69 4f 66 66 3e 70 4c 65      if( iOff>pLe
10010 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
10020 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
10030 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
10040 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
10050 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
10060 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
10070 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 77   iterator is now
10080 20 61 74 20 45 4f 46 2e 20 49 66 20 73 6f 2c 20   at EOF. If so, 
10090 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f  return early. */
100a0 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c  .  if( pIter->pL
100b0 65 61 66 20 29 7b 0a 20 20 20 20 69 66 28 20 62  eaf ){.    if( b
100c0 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  NewTerm ){.     
100d0 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c 61 67   if( pIter->flag
100e0 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
100f0 5f 4f 4e 45 54 45 52 4d 20 29 7b 0a 20 20 20 20  _ONETERM ){.    
10100 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
10110 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
10120 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  );.        pIter
10130 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  ->pLeaf = 0;.   
10140 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10150 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
10160 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20  dTerm(p, pIter, 
10170 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 20 20  nKeep);.        
10180 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
10190 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
101a0 20 20 20 20 20 20 20 69 66 28 20 70 62 4e 65 77         if( pbNew
101b0 54 65 72 6d 20 29 20 2a 70 62 4e 65 77 54 65 72  Term ) *pbNewTer
101c0 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  m = 1;.      }. 
101d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
101e0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
101f0 20 63 6f 75 6c 64 20 62 65 20 64 6f 6e 65 20 62   could be done b
10200 79 20 63 61 6c 6c 69 6e 67 20 66 74 73 35 53 65  y calling fts5Se
10210 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 29 2e  gIterLoadNPos().
10220 20 42 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   But.      ** th
10230 69 73 20 62 6c 6f 63 6b 20 69 73 20 70 61 72 74  is block is part
10240 69 63 75 6c 61 72 6c 79 20 70 65 72 66 6f 72 6d  icularly perform
10250 61 6e 63 65 20 63 72 69 74 69 63 61 6c 2c 20 73  ance critical, s
10260 6f 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20  o equivalent.   
10270 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 69 6e     ** code is in
10280 6c 69 6e 65 64 2e 20 0a 20 20 20 20 20 20 2a 2a  lined. .      **
10290 0a 20 20 20 20 20 20 2a 2a 20 4c 61 74 65 72 3a  .      ** Later:
102a0 20 53 77 69 74 63 68 65 64 20 62 61 63 6b 20 74   Switched back t
102b0 6f 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61  o fts5SegIterLoa
102c0 64 4e 50 6f 73 28 29 20 62 65 63 61 75 73 65 20  dNPos() because 
102d0 69 74 20 73 75 70 70 6f 72 74 73 0a 20 20 20 20  it supports.    
102e0 20 20 2a 2a 20 64 65 74 61 69 6c 3d 6e 6f 6e 65    ** detail=none
102f0 20 6d 6f 64 65 2e 20 4e 6f 74 20 69 64 65 61 6c   mode. Not ideal
10300 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10310 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 20 20 20 20   int nSz;.      
10320 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
10330 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
10340 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
10350 3e 69 4c 65 61 66 4f 66 66 73 65 74 3c 3d 70 49  >iLeafOffset<=pI
10360 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 29  ter->pLeaf->nn )
10370 3b 0a 20 20 20 20 20 20 66 74 73 35 46 61 73 74  ;.      fts5Fast
10380 47 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65  GetVarint32(pIte
10390 72 2d 3e 70 4c 65 61 66 2d 3e 70 2c 20 70 49 74  r->pLeaf->p, pIt
103a0 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2c  er->iLeafOffset,
103b0 20 6e 53 7a 29 3b 0a 20 20 20 20 20 20 70 49 74   nSz);.      pIt
103c0 65 72 2d 3e 62 44 65 6c 20 3d 20 28 6e 53 7a 20  er->bDel = (nSz 
103d0 26 20 30 78 30 30 30 31 29 3b 0a 20 20 20 20 20  & 0x0001);.     
103e0 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 6e   pIter->nPos = n
103f0 53 7a 3e 3e 31 3b 0a 20 20 20 20 20 20 61 73 73  Sz>>1;.      ass
10400 65 72 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e 6e  ert_nc( pIter->n
10410 50 6f 73 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  Pos>=0 );.    }.
10420 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 53    }.}..#define S
10430 57 41 50 56 41 4c 28 54 2c 20 61 2c 20 62 29 20  WAPVAL(T, a, b) 
10440 7b 20 54 20 74 6d 70 3b 20 74 6d 70 3d 61 3b 20  { T tmp; tmp=a; 
10450 61 3d 62 3b 20 62 3d 74 6d 70 3b 20 7d 0a 0a 23  a=b; b=tmp; }..#
10460 64 65 66 69 6e 65 20 66 74 73 35 49 6e 64 65 78  define fts5Index
10470 53 6b 69 70 56 61 72 69 6e 74 28 61 2c 20 69 4f  SkipVarint(a, iO
10480 66 66 29 20 7b 20 20 20 20 20 20 20 20 20 20 20  ff) {           
10490 20 5c 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20   \.  int iEnd = 
104a0 69 4f 66 66 2b 39 3b 20 20 20 20 20 20 20 20 20  iOff+9;         
104b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104c0 20 20 20 20 20 5c 0a 20 20 77 68 69 6c 65 28 20       \.  while( 
104d0 28 61 5b 69 4f 66 66 2b 2b 5d 20 26 20 30 78 38  (a[iOff++] & 0x8
104e0 30 29 20 26 26 20 69 4f 66 66 3c 69 45 6e 64 20  0) && iOff<iEnd 
104f0 29 3b 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a  );       \.}../*
10500 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
10510 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  er currently poi
10520 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
10530 20 72 6f 77 69 64 20 69 6e 20 61 20 64 6f 63 6c   rowid in a docl
10540 69 73 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ist. This.** fun
10550 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 69  ction sets the i
10560 74 65 72 61 74 6f 72 20 75 70 20 73 6f 20 74 68  terator up so th
10570 61 74 20 69 74 65 72 61 74 65 73 20 69 6e 20 72  at iterates in r
10580 65 76 65 72 73 65 20 6f 72 64 65 72 20 74 68 72  everse order thr
10590 6f 75 67 68 0a 2a 2a 20 74 68 65 20 64 6f 63 6c  ough.** the docl
105a0 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
105b0 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52  oid fts5SegIterR
105c0 65 76 65 72 73 65 28 46 74 73 35 49 6e 64 65 78  everse(Fts5Index
105d0 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
105e0 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35   *pIter){.  Fts5
105f0 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64  DlidxIter *pDlid
10600 78 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69 64  x = pIter->pDlid
10610 78 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  x;.  Fts5Data *p
10620 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Last = 0;.  int 
10630 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 0a 20  pgnoLast = 0;.. 
10640 20 69 66 28 20 70 44 6c 69 64 78 20 29 7b 0a 20   if( pDlidx ){. 
10650 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20     int iSegid = 
10660 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65  pIter->pSeg->iSe
10670 67 69 64 3b 0a 20 20 20 20 70 67 6e 6f 4c 61 73  gid;.    pgnoLas
10680 74 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  t = fts5DlidxIte
10690 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20  rPgno(pDlidx);. 
106a0 20 20 20 70 4c 61 73 74 20 3d 20 66 74 73 35 44     pLast = fts5D
106b0 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f  ataRead(p, FTS5_
106c0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53  SEGMENT_ROWID(iS
106d0 65 67 69 64 2c 20 70 67 6e 6f 4c 61 73 74 29 29  egid, pgnoLast))
106e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46  ;.  }else{.    F
106f0 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d  ts5Data *pLeaf =
10700 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20 20   pIter->pLeaf;  
10710 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
10720 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 0a  t leaf data */..
10730 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79      /* Currently
10740 2c 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c  , Fts5SegIter.iL
10750 65 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 73  eafOffset points
10760 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
10770 74 65 20 6f 66 0a 20 20 20 20 2a 2a 20 70 6f 73  te of.    ** pos
10780 69 74 69 6f 6e 2d 6c 69 73 74 20 63 6f 6e 74 65  ition-list conte
10790 6e 74 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  nt for the curre
107a0 6e 74 20 72 6f 77 69 64 2e 20 42 61 63 6b 20 69  nt rowid. Back i
107b0 74 20 75 70 20 73 6f 20 74 68 61 74 20 69 74 0a  t up so that it.
107c0 20 20 20 20 2a 2a 20 70 6f 69 6e 74 73 20 74 6f      ** points to
107d0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
107e0 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
107f0 73 69 7a 65 20 66 69 65 6c 64 2e 20 2a 2f 0a 20  size field. */. 
10800 20 20 20 69 6e 74 20 69 50 6f 73 6c 69 73 74 3b     int iPoslist;
10810 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
10820 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70  iTermLeafPgno==p
10830 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
10840 29 7b 0a 20 20 20 20 20 20 69 50 6f 73 6c 69 73  ){.      iPoslis
10850 74 20 3d 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  t = pIter->iTerm
10860 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20  LeafOffset;.    
10870 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 50 6f  }else{.      iPo
10880 73 6c 69 73 74 20 3d 20 34 3b 0a 20 20 20 20 7d  slist = 4;.    }
10890 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 53 6b  .    fts5IndexSk
108a0 69 70 56 61 72 69 6e 74 28 70 4c 65 61 66 2d 3e  ipVarint(pLeaf->
108b0 70 2c 20 69 50 6f 73 6c 69 73 74 29 3b 0a 20 20  p, iPoslist);.  
108c0 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
108d0 66 73 65 74 20 3d 20 69 50 6f 73 6c 69 73 74 3b  fset = iPoslist;
108e0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
108f0 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72   condition is tr
10900 75 65 20 74 68 65 6e 20 74 68 65 20 6c 61 72 67  ue then the larg
10910 65 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74 68  est rowid for th
10920 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a  e current.    **
10930 20 74 65 72 6d 20 6d 61 79 20 6e 6f 74 20 62 65   term may not be
10940 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 63   stored on the c
10950 75 72 72 65 6e 74 20 70 61 67 65 2e 20 53 6f 20  urrent page. So 
10960 73 65 61 72 63 68 20 66 6f 72 77 61 72 64 20 74  search forward t
10970 6f 0a 20 20 20 20 2a 2a 20 73 65 65 20 77 68 65  o.    ** see whe
10980 72 65 20 73 61 69 64 20 72 6f 77 69 64 20 72 65  re said rowid re
10990 61 6c 6c 79 20 69 73 2e 20 20 2a 2f 0a 20 20 20  ally is.  */.   
109a0 20 69 66 28 20 70 49 74 65 72 2d 3e 69 45 6e 64   if( pIter->iEnd
109b0 6f 66 44 6f 63 6c 69 73 74 3e 3d 70 4c 65 61 66  ofDoclist>=pLeaf
109c0 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
109d0 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 20 20    int pgno;.    
109e0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
109f0 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70  egment *pSeg = p
10a00 49 74 65 72 2d 3e 70 53 65 67 3b 0a 0a 20 20 20  Iter->pSeg;..   
10a10 20 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 72     /* The last r
10a20 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c  owid in the docl
10a30 69 73 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ist may not be o
10a40 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
10a50 67 65 2e 20 53 65 61 72 63 68 0a 20 20 20 20 20  ge. Search.     
10a60 20 2a 2a 20 66 6f 72 77 61 72 64 20 74 6f 20 66   ** forward to f
10a70 69 6e 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ind the page con
10a80 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 61 73 74  taining the last
10a90 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20   rowid.  */.    
10aa0 20 20 66 6f 72 28 70 67 6e 6f 3d 70 49 74 65 72    for(pgno=pIter
10ab0 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 20 21  ->iLeafPgno+1; !
10ac0 70 2d 3e 72 63 20 26 26 20 70 67 6e 6f 3c 3d 70  p->rc && pgno<=p
10ad0 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 20 70  Seg->pgnoLast; p
10ae0 67 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  gno++){.        
10af0 69 36 34 20 69 41 62 73 20 3d 20 46 54 53 35 5f  i64 iAbs = FTS5_
10b00 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53  SEGMENT_ROWID(pS
10b10 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f  eg->iSegid, pgno
10b20 29 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35 44  );.        Fts5D
10b30 61 74 61 20 2a 70 4e 65 77 20 3d 20 66 74 73 35  ata *pNew = fts5
10b40 44 61 74 61 52 65 61 64 28 70 2c 20 69 41 62 73  DataRead(p, iAbs
10b50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
10b60 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
10b70 20 69 6e 74 20 69 52 6f 77 69 64 2c 20 62 54 65   int iRowid, bTe
10b80 72 6d 6c 65 73 73 3b 0a 20 20 20 20 20 20 20 20  rmless;.        
10b90 20 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4c    iRowid = fts5L
10ba0 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
10bb0 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20  (pNew);.        
10bc0 20 20 62 54 65 72 6d 6c 65 73 73 20 3d 20 66 74    bTermless = ft
10bd0 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73  s5LeafIsTermless
10be0 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20  (pNew);.        
10bf0 20 20 69 66 28 20 69 52 6f 77 69 64 20 29 7b 0a    if( iRowid ){.
10c00 20 20 20 20 20 20 20 20 20 20 20 20 53 57 41 50              SWAP
10c10 56 41 4c 28 46 74 73 35 44 61 74 61 2a 2c 20 70  VAL(Fts5Data*, p
10c20 4e 65 77 2c 20 70 4c 61 73 74 29 3b 0a 20 20 20  New, pLast);.   
10c30 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4c 61 73           pgnoLas
10c40 74 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  t = pgno;.      
10c50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
10c60 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
10c70 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20  pNew);.         
10c80 20 69 66 28 20 62 54 65 72 6d 6c 65 73 73 3d 3d   if( bTermless==
10c90 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
10ca0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10cb0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
10cc0 70 4c 61 73 74 20 69 73 20 4e 55 4c 4c 20 61 74  pLast is NULL at
10cd0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
10ce0 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64  n the last rowid
10cf0 20 66 6f 72 20 74 68 69 73 20 64 6f 63 6c 69 73   for this doclis
10d00 74 0a 20 20 2a 2a 20 6c 69 65 73 20 6f 6e 20 74  t.  ** lies on t
10d10 68 65 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c  he page currentl
10d20 79 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  y indicated by t
10d30 68 65 20 69 74 65 72 61 74 6f 72 2e 20 49 6e 20  he iterator. In 
10d40 74 68 69 73 20 63 61 73 65 20 0a 20 20 2a 2a 20  this case .  ** 
10d50 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
10d60 65 74 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  et is already se
10d70 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
10d80 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
10d90 73 69 7a 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20  size.  ** field 
10da0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
10db0 74 68 65 20 66 69 72 73 74 20 72 65 6c 65 76 61  the first releva
10dc0 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  nt rowid on the 
10dd0 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  page..  **.  ** 
10de0 4f 72 2c 20 69 66 20 70 4c 61 73 74 20 69 73 20  Or, if pLast is 
10df0 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  non-NULL, then i
10e00 74 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68  t is the page th
10e10 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
10e20 6c 61 73 74 0a 20 20 2a 2a 20 72 6f 77 69 64 2e  last.  ** rowid.
10e30 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 63 6f   In this case co
10e40 6e 66 69 67 75 72 65 20 74 68 65 20 69 74 65 72  nfigure the iter
10e50 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  ator so that it 
10e60 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 20 20  points to the.  
10e70 2a 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  ** first rowid o
10e80 6e 20 74 68 69 73 20 70 61 67 65 2e 0a 20 20 2a  n this page..  *
10e90 2f 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29 7b  /.  if( pLast ){
10ea0 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20  .    int iOff;. 
10eb0 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
10ec0 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
10ed0 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65  ;.    pIter->pLe
10ee0 61 66 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20  af = pLast;.    
10ef0 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
10f00 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20   = pgnoLast;.   
10f10 20 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66   iOff = fts5Leaf
10f20 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c  FirstRowidOff(pL
10f30 61 73 74 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b  ast);.    iOff +
10f40 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
10f50 26 70 4c 61 73 74 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLast->p[iOff],
10f60 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
10f70 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 49 74 65  Rowid);.    pIte
10f80 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
10f90 20 69 4f 66 66 3b 0a 0a 20 20 20 20 69 66 28 20   iOff;..    if( 
10fa0 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65  fts5LeafIsTermle
10fb0 73 73 28 70 4c 61 73 74 29 20 29 7b 0a 20 20 20  ss(pLast) ){.   
10fc0 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
10fd0 44 6f 63 6c 69 73 74 20 3d 20 70 4c 61 73 74 2d  Doclist = pLast-
10fe0 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  >nn+1;.    }else
10ff0 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  {.      pIter->i
11000 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 66  EndofDoclist = f
11010 74 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d  ts5LeafFirstTerm
11020 4f 66 66 28 70 4c 61 73 74 29 3b 0a 20 20 20 20  Off(pLast);.    
11030 7d 0a 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65  }..  }..  fts5Se
11040 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
11050 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
11060 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f  }../*.** Iterato
11070 72 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c  r pIter currentl
11080 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
11090 66 69 72 73 74 20 72 6f 77 69 64 20 6f 66 20 61  first rowid of a
110a0 20 64 6f 63 6c 69 73 74 2e 0a 2a 2a 20 54 68 65   doclist..** The
110b0 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d  re is a doclist-
110c0 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
110d0 20 77 69 74 68 20 74 68 65 20 66 69 6e 61 6c 20   with the final 
110e0 74 65 72 6d 20 6f 6e 20 74 68 65 20 63 75 72 72  term on the curr
110f0 65 6e 74 20 0a 2a 2a 20 70 61 67 65 2e 20 49 66  ent .** page. If
11100 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
11110 6d 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 65  m is the last te
11120 72 6d 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  rm on the page, 
11130 6c 6f 61 64 20 74 68 65 20 0a 2a 2a 20 64 6f 63  load the .** doc
11140 6c 69 73 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20  list-index from 
11150 64 69 73 6b 20 61 6e 64 20 69 6e 69 74 69 61 6c  disk and initial
11160 69 7a 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20  ize an iterator 
11170 61 74 20 28 70 49 74 65 72 2d 3e 70 44 6c 69 64  at (pIter->pDlid
11180 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  x)..*/.static vo
11190 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  id fts5SegIterLo
111a0 61 64 44 6c 69 64 78 28 46 74 73 35 49 6e 64 65  adDlidx(Fts5Inde
111b0 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
111c0 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
111d0 20 69 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70   iSeg = pIter->p
111e0 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 69  Seg->iSegid;.  i
111f0 6e 74 20 62 52 65 76 20 3d 20 28 70 49 74 65 72  nt bRev = (pIter
11200 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
11210 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b  EGITER_REVERSE);
11220 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65  .  Fts5Data *pLe
11230 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
11240 66 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65  f; /* Current le
11250 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20 61 73  af data */..  as
11260 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
11270 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
11280 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61  R_ONETERM );.  a
11290 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44  ssert( pIter->pD
112a0 6c 69 64 78 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  lidx==0 );..  /*
112b0 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 63 75   Check if the cu
112c0 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 20 65 6e  rrent doclist en
112d0 64 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e  ds on this page.
112e0 20 49 66 20 69 74 20 64 6f 65 73 2c 20 72 65 74   If it does, ret
112f0 75 72 6e 0a 20 20 2a 2a 20 65 61 72 6c 79 20 77  urn.  ** early w
11300 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 74  ithout loading t
11310 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  he doclist-index
11320 20 28 61 73 20 69 74 20 62 65 6c 6f 6e 67 73 20   (as it belongs 
11330 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 0a 20  to a different. 
11340 20 2a 2a 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 69   ** term. */.  i
11350 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  f( pIter->iTermL
11360 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e  eafPgno==pIter->
11370 69 4c 65 61 66 50 67 6e 6f 20 0a 20 20 20 26 26  iLeafPgno .   &&
11380 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
11390 63 6c 69 73 74 3c 70 4c 65 61 66 2d 3e 73 7a 4c  clist<pLeaf->szL
113a0 65 61 66 20 0a 20 20 29 7b 0a 20 20 20 20 72 65  eaf .  ){.    re
113b0 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 70 49 74  turn;.  }..  pIt
113c0 65 72 2d 3e 70 44 6c 69 64 78 20 3d 20 66 74 73  er->pDlidx = fts
113d0 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70  5DlidxIterInit(p
113e0 2c 20 62 52 65 76 2c 20 69 53 65 67 2c 20 70 49  , bRev, iSeg, pI
113f0 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
11400 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  no);.}../*.** Th
11410 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63  e iterator objec
11420 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
11430 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
11440 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69  currently contai
11450 6e 73 0a 2a 2a 20 6e 6f 20 76 61 6c 69 64 20 76  ns.** no valid v
11460 61 6c 75 65 73 20 65 78 63 65 70 74 20 66 6f 72  alues except for
11470 20 74 68 65 20 46 74 73 35 53 65 67 49 74 65 72   the Fts5SegIter
11480 2e 70 4c 65 61 66 20 6d 65 6d 62 65 72 20 76 61  .pLeaf member va
11490 72 69 61 62 6c 65 2e 20 54 68 69 73 0a 2a 2a 20  riable. This.** 
114a0 66 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65  function searche
114b0 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  s the leaf page 
114c0 66 6f 72 20 61 20 74 65 72 6d 20 6d 61 74 63 68  for a term match
114d0 69 6e 67 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d  ing (pTerm/nTerm
114e0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
114f0 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 20 69  specified term i
11500 73 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 70  s found on the p
11510 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 69 74  age, then the it
11520 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 0a 2a  erator is left.*
11530 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74  * pointing to it
11540 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 47  . If argument bG
11550 65 20 69 73 20 7a 65 72 6f 20 61 6e 64 20 74 68  e is zero and th
11560 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 66 6f  e term is not fo
11570 75 6e 64 2c 0a 2a 2a 20 74 68 65 20 69 74 65 72  und,.** the iter
11580 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  ator is left poi
11590 6e 74 69 6e 67 20 61 74 20 45 4f 46 2e 0a 2a 2a  nting at EOF..**
115a0 0a 2a 2a 20 49 66 20 62 47 65 20 69 73 20 6e 6f  .** If bGe is no
115b0 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 73  n-zero and the s
115c0 70 65 63 69 66 69 65 64 20 74 65 72 6d 20 69 73  pecified term is
115d0 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e   not found, then
115e0 20 74 68 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72   the.** iterator
115f0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
11600 67 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73  g to the smalles
11610 74 20 74 65 72 6d 20 69 6e 20 74 68 65 20 73 65  t term in the se
11620 67 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20 69 73  gment that.** is
11630 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
11640 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 2c   specified term,
11650 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 74 65   even if this te
11660 72 6d 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65  rm is not on the
11670 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 61 67 65  .** current page
11680 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11690 20 66 74 73 35 4c 65 61 66 53 65 65 6b 28 0a 20   fts5LeafSeek(. 
116a0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
116b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116c0 20 2f 2a 20 4c 65 61 76 65 20 61 6e 79 20 65 72   /* Leave any er
116d0 72 6f 72 20 63 6f 64 65 20 68 65 72 65 20 2a 2f  ror code here */
116e0 0a 20 20 69 6e 74 20 62 47 65 2c 20 20 20 20 20  .  int bGe,     
116f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11700 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
11710 20 3e 3d 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   >= search */.  
11720 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
11730 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
11740 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 73  /* Iterator to s
11750 65 65 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  eek */.  const u
11760 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  8 *pTerm, int nT
11770 65 72 6d 20 20 20 20 20 20 2f 2a 20 54 65 72 6d  erm      /* Term
11780 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a   to search for *
11790 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 3b  /.){.  int iOff;
117a0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d  .  const u8 *a =
117b0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
117c0 3b 0a 20 20 69 6e 74 20 73 7a 4c 65 61 66 20 3d  ;.  int szLeaf =
117d0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73   pIter->pLeaf->s
117e0 7a 4c 65 61 66 3b 0a 20 20 69 6e 74 20 6e 20 3d  zLeaf;.  int n =
117f0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e   pIter->pLeaf->n
11800 6e 3b 0a 0a 20 20 75 33 32 20 6e 4d 61 74 63 68  n;..  u32 nMatch
11810 20 3d 20 30 3b 0a 20 20 75 33 32 20 6e 4b 65 65   = 0;.  u32 nKee
11820 70 20 3d 20 30 3b 0a 20 20 75 33 32 20 6e 4e 65  p = 0;.  u32 nNe
11830 77 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 54 65  w = 0;.  u32 iTe
11840 72 6d 4f 66 66 3b 0a 20 20 69 6e 74 20 69 50 67  rmOff;.  int iPg
11850 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  idx;            
11860 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
11870 65 6e 74 20 6f 66 66 73 65 74 20 69 6e 20 70 67  ent offset in pg
11880 69 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6e  idx */.  int bEn
11890 64 4f 66 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20  dOfPage = 0;..  
118a0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
118b0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69  QLITE_OK );..  i
118c0 50 67 69 64 78 20 3d 20 73 7a 4c 65 61 66 3b 0a  Pgidx = szLeaf;.
118d0 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35    iPgidx += fts5
118e0 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
118f0 50 67 69 64 78 5d 2c 20 69 54 65 72 6d 4f 66 66  Pgidx], iTermOff
11900 29 3b 0a 20 20 69 4f 66 66 20 3d 20 69 54 65 72  );.  iOff = iTer
11910 6d 4f 66 66 3b 0a 20 20 69 66 28 20 69 4f 66 66  mOff;.  if( iOff
11920 3e 6e 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  >n ){.    p->rc 
11930 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
11940 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
11950 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a  .  while( 1 ){..
11960 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
11970 74 20 68 6f 77 20 6d 61 6e 79 20 6e 65 77 20 62  t how many new b
11980 79 74 65 73 20 61 72 65 20 69 6e 20 74 68 69 73  ytes are in this
11990 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 66 74 73   term */.    fts
119a0 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32  5FastGetVarint32
119b0 28 61 2c 20 69 4f 66 66 2c 20 6e 4e 65 77 29 3b  (a, iOff, nNew);
119c0 0a 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3c 6e  .    if( nKeep<n
119d0 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 67  Match ){.      g
119e0 6f 74 6f 20 73 65 61 72 63 68 5f 66 61 69 6c 65  oto search_faile
119f0 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  d;.    }..    as
11a00 73 65 72 74 28 20 6e 4b 65 65 70 3e 3d 6e 4d 61  sert( nKeep>=nMa
11a10 74 63 68 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  tch );.    if( n
11a20 4b 65 65 70 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a  Keep==nMatch ){.
11a30 20 20 20 20 20 20 75 33 32 20 6e 43 6d 70 3b 0a        u32 nCmp;.
11a40 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20        u32 i;.   
11a50 20 20 20 6e 43 6d 70 20 3d 20 28 75 33 32 29 4d     nCmp = (u32)M
11a60 49 4e 28 6e 4e 65 77 2c 20 6e 54 65 72 6d 2d 6e  IN(nNew, nTerm-n
11a70 4d 61 74 63 68 29 3b 0a 20 20 20 20 20 20 66 6f  Match);.      fo
11a80 72 28 69 3d 30 3b 20 69 3c 6e 43 6d 70 3b 20 69  r(i=0; i<nCmp; i
11a90 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
11aa0 20 61 5b 69 4f 66 66 2b 69 5d 21 3d 70 54 65 72   a[iOff+i]!=pTer
11ab0 6d 5b 6e 4d 61 74 63 68 2b 69 5d 20 29 20 62 72  m[nMatch+i] ) br
11ac0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
11ad0 20 20 20 6e 4d 61 74 63 68 20 2b 3d 20 69 3b 0a     nMatch += i;.
11ae0 0a 20 20 20 20 20 20 69 66 28 20 28 75 33 32 29  .      if( (u32)
11af0 6e 54 65 72 6d 3d 3d 6e 4d 61 74 63 68 20 29 7b  nTerm==nMatch ){
11b00 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d  .        if( i==
11b10 6e 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  nNew ){.        
11b20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 73 75    goto search_su
11b30 63 63 65 73 73 3b 0a 20 20 20 20 20 20 20 20 7d  ccess;.        }
11b40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
11b50 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61 69 6c  goto search_fail
11b60 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
11b70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 3c      }else if( i<
11b80 6e 4e 65 77 20 26 26 20 61 5b 69 4f 66 66 2b 69  nNew && a[iOff+i
11b90 5d 3e 70 54 65 72 6d 5b 6e 4d 61 74 63 68 5d 20  ]>pTerm[nMatch] 
11ba0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
11bb0 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20  search_failed;. 
11bc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
11bd0 20 20 69 66 28 20 69 50 67 69 64 78 3e 3d 6e 20    if( iPgidx>=n 
11be0 29 7b 0a 20 20 20 20 20 20 62 45 6e 64 4f 66 50  ){.      bEndOfP
11bf0 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  age = 1;.      b
11c00 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
11c10 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47   iPgidx += fts5G
11c20 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50  etVarint32(&a[iP
11c30 67 69 64 78 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20  gidx], nKeep);. 
11c40 20 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20 6e     iTermOff += n
11c50 4b 65 65 70 3b 0a 20 20 20 20 69 4f 66 66 20 3d  Keep;.    iOff =
11c60 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20 20 20 20   iTermOff;..    
11c70 69 66 28 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20  if( iOff>=n ){. 
11c80 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
11c90 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
11ca0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a   return;.    }..
11cb0 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
11cc0 6e 4b 65 65 70 20 66 69 65 6c 64 20 6f 66 20 74  nKeep field of t
11cd0 68 65 20 6e 65 78 74 20 74 65 72 6d 2e 20 2a 2f  he next term. */
11ce0 0a 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74  .    fts5FastGet
11cf0 56 61 72 69 6e 74 33 32 28 61 2c 20 69 4f 66 66  Varint32(a, iOff
11d00 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 7d 0a 0a 20  , nKeep);.  }.. 
11d10 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3a 0a 20  search_failed:. 
11d20 20 69 66 28 20 62 47 65 3d 3d 30 20 29 7b 0a 20   if( bGe==0 ){. 
11d30 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
11d40 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
11d50 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65  ;.    pIter->pLe
11d60 61 66 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  af = 0;.    retu
11d70 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  rn;.  }else if( 
11d80 62 45 6e 64 4f 66 50 61 67 65 20 29 7b 0a 20 20  bEndOfPage ){.  
11d90 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 66 74 73    do {.      fts
11da0 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65  5SegIterNextPage
11db0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
11dc0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
11dd0 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  af==0 ) return;.
11de0 20 20 20 20 20 20 61 20 3d 20 70 49 74 65 72 2d        a = pIter-
11df0 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20  >pLeaf->p;.     
11e00 20 69 66 28 20 66 74 73 35 4c 65 61 66 49 73 54   if( fts5LeafIsT
11e10 65 72 6d 6c 65 73 73 28 70 49 74 65 72 2d 3e 70  ermless(pIter->p
11e20 4c 65 61 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Leaf)==0 ){.    
11e30 20 20 20 20 69 50 67 69 64 78 20 3d 20 70 49 74      iPgidx = pIt
11e40 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  er->pLeaf->szLea
11e50 66 3b 0a 20 20 20 20 20 20 20 20 69 50 67 69 64  f;.        iPgid
11e60 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  x += fts5GetVari
11e70 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 70 4c 65  nt32(&pIter->pLe
11e80 61 66 2d 3e 70 5b 69 50 67 69 64 78 5d 2c 20 69  af->p[iPgidx], i
11e90 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Off);.        if
11ea0 28 20 69 4f 66 66 3c 34 20 7c 7c 20 69 4f 66 66  ( iOff<4 || iOff
11eb0 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  >=pIter->pLeaf->
11ec0 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
11ed0 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
11ee0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
11ef0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
11f00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11f10 20 20 20 20 20 6e 4b 65 65 70 20 3d 20 30 3b 0a       nKeep = 0;.
11f20 20 20 20 20 20 20 20 20 20 20 69 54 65 72 6d 4f            iTermO
11f30 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  ff = iOff;.     
11f40 20 20 20 20 20 6e 20 3d 20 70 49 74 65 72 2d 3e       n = pIter->
11f50 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 20 20 20 20 20  pLeaf->nn;.     
11f60 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
11f70 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
11f80 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20  iOff], nNew);.  
11f90 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
11fa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11fb0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 31 20 29  .    }while( 1 )
11fc0 3b 0a 20 20 7d 0a 0a 20 73 65 61 72 63 68 5f 73  ;.  }.. search_s
11fd0 75 63 63 65 73 73 3a 0a 20 20 70 49 74 65 72 2d  uccess:.  pIter-
11fe0 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
11ff0 4f 66 66 20 2b 20 6e 4e 65 77 3b 0a 20 20 69 66  Off + nNew;.  if
12000 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  ( pIter->iLeafOf
12010 66 73 65 74 3e 6e 20 29 7b 0a 20 20 20 20 70 2d  fset>n ){.    p-
12020 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
12030 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
12040 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 54 65    }.  pIter->iTe
12050 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70  rmLeafOffset = p
12060 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
12070 74 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72  t;.  pIter->iTer
12080 6d 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65  mLeafPgno = pIte
12090 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20  r->iLeafPgno;.. 
120a0 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
120b0 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74  p->rc, &pIter->t
120c0 65 72 6d 2c 20 6e 4b 65 65 70 2c 20 70 54 65 72  erm, nKeep, pTer
120d0 6d 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  m);.  fts5Buffer
120e0 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
120f0 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  c, &pIter->term,
12100 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29   nNew, &a[iOff])
12110 3b 0a 0a 20 20 69 66 28 20 69 50 67 69 64 78 3e  ;..  if( iPgidx>
12120 3d 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  =n ){.    pIter-
12130 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
12140 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e   pIter->pLeaf->n
12150 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n+1;.  }else{.  
12160 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20 20    int nExtra;.  
12170 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35    iPgidx += fts5
12180 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
12190 50 67 69 64 78 5d 2c 20 6e 45 78 74 72 61 29 3b  Pgidx], nExtra);
121a0 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64  .    pIter->iEnd
121b0 6f 66 44 6f 63 6c 69 73 74 20 3d 20 69 54 65 72  ofDoclist = iTer
121c0 6d 4f 66 66 20 2b 20 6e 45 78 74 72 61 3b 0a 20  mOff + nExtra;. 
121d0 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 50 67 69   }.  pIter->iPgi
121e0 64 78 4f 66 66 20 3d 20 69 50 67 69 64 78 3b 0a  dxOff = iPgidx;.
121f0 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  .  fts5SegIterLo
12200 61 64 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72  adRowid(p, pIter
12210 29 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65 72  );.  fts5SegIter
12220 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
12230 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 71  r);.}..static sq
12240 6c 69 74 65 33 5f 73 74 6d 74 20 2a 66 74 73 35  lite3_stmt *fts5
12250 49 64 78 53 65 6c 65 63 74 53 74 6d 74 28 46 74  IdxSelectStmt(Ft
12260 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69  s5Index *p){.  i
12270 66 28 20 70 2d 3e 70 49 64 78 53 65 6c 65 63 74  f( p->pIdxSelect
12280 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43  ==0 ){.    Fts5C
12290 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
122a0 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
122b0 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
122c0 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64  eStmt(p, &p->pId
122d0 78 53 65 6c 65 63 74 2c 20 73 71 6c 69 74 65 33  xSelect, sqlite3
122e0 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
122f0 20 20 20 20 22 53 45 4c 45 43 54 20 70 67 6e 6f      "SELECT pgno
12300 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 69   FROM '%q'.'%q_i
12310 64 78 27 20 57 48 45 52 45 20 22 0a 20 20 20 20  dx' WHERE ".    
12320 20 20 20 20 20 20 22 73 65 67 69 64 3d 3f 20 41        "segid=? A
12330 4e 44 20 74 65 72 6d 3c 3d 3f 20 4f 52 44 45 52  ND term<=? ORDER
12340 20 42 59 20 74 65 72 6d 20 44 45 53 43 20 4c 49   BY term DESC LI
12350 4d 49 54 20 31 22 2c 0a 20 20 20 20 20 20 20 20  MIT 1",.        
12360 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
12370 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
12380 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74     ));.  }.  ret
12390 75 72 6e 20 70 2d 3e 70 49 64 78 53 65 6c 65 63  urn p->pIdxSelec
123a0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  t;.}../*.** Init
123b0 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63  ialize the objec
123c0 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74  t pIter to point
123d0 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e   to term pTerm/n
123e0 54 65 72 6d 20 77 69 74 68 69 6e 20 73 65 67 6d  Term within segm
123f0 65 6e 74 0a 2a 2a 20 70 53 65 67 2e 20 49 66 20  ent.** pSeg. If 
12400 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68  there is no such
12410 20 74 65 72 6d 20 69 6e 20 74 68 65 20 69 6e 64   term in the ind
12420 65 78 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72  ex, the iterator
12430 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a   is set to EOF..
12440 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
12450 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e  r occurs, Fts5In
12460 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f  dex.rc is set to
12470 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
12480 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a  error code. If .
12490 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  ** an error has 
124a0 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
124b0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
124c0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
124d0 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
124e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
124f0 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74  5SegIterSeekInit
12500 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
12510 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12520 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
12530 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  end */.  const u
12540 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  8 *pTerm, int nT
12550 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d  erm,     /* Term
12560 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20   to seek to */. 
12570 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
12580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12590 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35   /* Mask of FTS5
125a0 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67 73 20  INDEX_XXX flags 
125b0 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
125c0 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c  reSegment *pSeg,
125d0 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
125e0 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a  ion of segment *
125f0 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
12600 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
12610 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f      /* Object to
12620 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a   populate */.){.
12630 20 20 69 6e 74 20 69 50 67 20 3d 20 31 3b 0a 20    int iPg = 1;. 
12640 20 69 6e 74 20 62 47 65 20 3d 20 28 66 6c 61 67   int bGe = (flag
12650 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
12660 45 52 59 5f 53 43 41 4e 29 3b 0a 20 20 69 6e 74  ERY_SCAN);.  int
12670 20 62 44 6c 69 64 78 20 3d 20 30 3b 20 20 20 20   bDlidx = 0;    
12680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12690 54 72 75 65 20 69 66 20 74 68 65 72 65 20 69 73  True if there is
126a0 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
126b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
126c0 6d 74 20 2a 70 49 64 78 53 65 6c 65 63 74 20 3d  mt *pIdxSelect =
126d0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 62   0;..  assert( b
126e0 47 65 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20  Ge==0 || (flags 
126f0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
12700 59 5f 44 45 53 43 29 3d 3d 30 20 29 3b 0a 20 20  Y_DESC)==0 );.  
12710 61 73 73 65 72 74 28 20 70 54 65 72 6d 20 26 26  assert( pTerm &&
12720 20 6e 54 65 72 6d 20 29 3b 0a 20 20 6d 65 6d 73   nTerm );.  mems
12730 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a  et(pIter, 0, siz
12740 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20  eof(*pIter));.  
12750 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53  pIter->pSeg = pS
12760 65 67 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62  eg;..  /* This b
12770 6c 6f 63 6b 20 73 65 74 73 20 73 74 61 63 6b 20  lock sets stack 
12780 76 61 72 69 61 62 6c 65 20 69 50 67 20 74 6f 20  variable iPg to 
12790 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 6e 75  the leaf page nu
127a0 6d 62 65 72 20 74 68 61 74 20 6d 61 79 0a 20 20  mber that may.  
127b0 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 65 72 6d 20  ** contain term 
127c0 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c 20 69  (pTerm/nTerm), i
127d0 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 20  f it is present 
127e0 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 20  in the segment. 
127f0 2a 2f 0a 20 20 70 49 64 78 53 65 6c 65 63 74 20  */.  pIdxSelect 
12800 3d 20 66 74 73 35 49 64 78 53 65 6c 65 63 74 53  = fts5IdxSelectS
12810 74 6d 74 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  tmt(p);.  if( p-
12820 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
12830 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
12840 28 70 49 64 78 53 65 6c 65 63 74 2c 20 31 2c 20  (pIdxSelect, 1, 
12850 70 53 65 67 2d 3e 69 53 65 67 69 64 29 3b 0a 20  pSeg->iSegid);. 
12860 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
12870 6f 62 28 70 49 64 78 53 65 6c 65 63 74 2c 20 32  ob(pIdxSelect, 2
12880 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , pTerm, nTerm, 
12890 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
128a0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
128b0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
128c0 49 64 78 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  IdxSelect) ){.  
128d0 20 20 69 36 34 20 76 61 6c 20 3d 20 73 71 6c 69    i64 val = sqli
128e0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
128f0 49 64 78 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  IdxSelect, 0);. 
12900 20 20 20 69 50 67 20 3d 20 28 69 6e 74 29 28 76     iPg = (int)(v
12910 61 6c 3e 3e 31 29 3b 0a 20 20 20 20 62 44 6c 69  al>>1);.    bDli
12920 64 78 20 3d 20 28 76 61 6c 20 26 20 30 78 30 30  dx = (val & 0x00
12930 30 31 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63  01);.  }.  p->rc
12940 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
12950 28 70 49 64 78 53 65 6c 65 63 74 29 3b 0a 20 20  (pIdxSelect);.  
12960 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
12970 6c 28 70 49 64 78 53 65 6c 65 63 74 2c 20 32 29  l(pIdxSelect, 2)
12980 3b 0a 0a 20 20 69 66 28 20 69 50 67 3c 70 53 65  ;..  if( iPg<pSe
12990 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a  g->pgnoFirst ){.
129a0 20 20 20 20 69 50 67 20 3d 20 70 53 65 67 2d 3e      iPg = pSeg->
129b0 70 67 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20 62  pgnoFirst;.    b
129c0 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Dlidx = 0;.  }..
129d0 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
129e0 6e 6f 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20  no = iPg - 1;.  
129f0 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
12a00 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a  age(p, pIter);..
12a10 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
12a20 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 4c 65  af ){.    fts5Le
12a30 61 66 53 65 65 6b 28 70 2c 20 62 47 65 2c 20 70  afSeek(p, bGe, p
12a40 49 74 65 72 2c 20 70 54 65 72 6d 2c 20 6e 54 65  Iter, pTerm, nTe
12a50 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  rm);.  }..  if( 
12a60 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
12a70 20 26 26 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20   && bGe==0 ){.  
12a80 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c    pIter->flags |
12a90 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  = FTS5_SEGITER_O
12aa0 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20  NETERM;.    if( 
12ab0 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a  pIter->pLeaf ){.
12ac0 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20        if( flags 
12ad0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
12ae0 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20  Y_DESC ){.      
12af0 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c    pIter->flags |
12b00 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  = FTS5_SEGITER_R
12b10 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a  EVERSE;.      }.
12b20 20 20 20 20 20 20 69 66 28 20 62 44 6c 69 64 78        if( bDlidx
12b30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
12b40 53 65 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78  SegIterLoadDlidx
12b50 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
12b60 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66 6c    }.      if( fl
12b70 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
12b80 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20  QUERY_DESC ){.  
12b90 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
12ba0 72 52 65 76 65 72 73 65 28 70 2c 20 70 49 74 65  rReverse(p, pIte
12bb0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
12bc0 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67  }.  }..  fts5Seg
12bd0 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20 70  IterSetNext(p, p
12be0 49 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 45 69 74  Iter);..  /* Eit
12bf0 68 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  her:.  **.  **  
12c00 20 31 29 20 61 6e 20 65 72 72 6f 72 20 68 61 73   1) an error has
12c10 20 6f 63 63 75 72 72 65 64 2c 20 6f 72 0a 20 20   occurred, or.  
12c20 2a 2a 20 20 20 32 29 20 74 68 65 20 69 74 65 72  **   2) the iter
12c30 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45  ator points to E
12c40 4f 46 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 33 29  OF, or.  **   3)
12c50 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f   the iterator po
12c60 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
12c70 20 77 69 74 68 20 74 65 72 6d 20 28 70 54 65 72   with term (pTer
12c80 6d 2f 6e 54 65 72 6d 29 2c 20 6f 72 0a 20 20 2a  m/nTerm), or.  *
12c90 2a 20 20 20 34 29 20 74 68 65 20 46 54 53 35 49  *   4) the FTS5I
12ca0 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20  NDEX_QUERY_SCAN 
12cb0 66 6c 61 67 20 77 61 73 20 73 65 74 20 61 6e 64  flag was set and
12cc0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f   the iterator po
12cd0 69 6e 74 73 0a 20 20 2a 2a 20 20 20 20 20 20 74  ints.  **      t
12ce0 6f 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20  o an entry with 
12cf0 61 20 74 65 72 6d 20 67 72 65 61 74 65 72 20 74  a term greater t
12d00 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
12d10 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20  (pTerm/nTerm).. 
12d20 20 2a 2f 0a 20 20 61 73 73 65 72 74 5f 6e 63 28   */.  assert_nc(
12d30 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
12d40 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K               
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2a 2f 0a          /* 1 */.
12d70 20 20 20 7c 7c 20 70 49 74 65 72 2d 3e 70 4c 65     || pIter->pLe
12d80 61 66 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  af==0           
12d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12db0 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 7c      /* 2 */.   |
12dc0 7c 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  | fts5BufferComp
12dd0 61 72 65 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e  areBlob(&pIter->
12de0 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65  term, pTerm, nTe
12df0 72 6d 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20  rm)==0          
12e00 2f 2a 20 33 20 2a 2f 0a 20 20 20 7c 7c 20 28 62  /* 3 */.   || (b
12e10 47 65 20 26 26 20 66 74 73 35 42 75 66 66 65 72  Ge && fts5Buffer
12e20 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70 49 74  CompareBlob(&pIt
12e30 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d 2c  er->term, pTerm,
12e40 20 6e 54 65 72 6d 29 3e 30 29 20 20 2f 2a 20 34   nTerm)>0)  /* 4
12e50 20 2a 2f 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   */.  );.}../*.*
12e60 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
12e70 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f   object pIter to
12e80 20 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20 70   point to term p
12e90 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69  Term/nTerm withi
12ea0 6e 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  n the.** in-memo
12eb0 72 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20 49  ry hash table. I
12ec0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  f there is no su
12ed0 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 68  ch term in the h
12ee0 61 73 68 2d 74 61 62 6c 65 2c 20 74 68 65 20 0a  ash-table, the .
12ef0 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20 73  ** iterator is s
12f00 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  et to EOF..**.**
12f10 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
12f20 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72  urs, Fts5Index.r
12f30 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61  c is set to an a
12f40 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
12f50 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e   code. If .** an
12f60 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
12f70 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
12f80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
12f90 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
12fa0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
12fb0 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
12fc0 74 65 72 48 61 73 68 49 6e 69 74 28 0a 20 20 46  terHashInit(.  F
12fd0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
12fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12ff0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a  * FTS5 backend *
13000 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
13010 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20  erm, int nTerm, 
13020 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
13030 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  eek to */.  int 
13040 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
13050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
13060 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58  ask of FTS5INDEX
13070 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
13080 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
13090 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
130a0 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70  /* Object to pop
130b0 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ulate */.){.  co
130c0 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20  nst u8 *pList = 
130d0 30 3b 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d  0;.  int nList =
130e0 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   0;.  const u8 *
130f0 7a 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d  z = 0;.  int n =
13100 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
13110 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20 61 73 73  ->pHash );.  ass
13120 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
13130 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20  TE_OK );..  if( 
13140 70 54 65 72 6d 3d 3d 30 20 7c 7c 20 28 66 6c 61  pTerm==0 || (fla
13150 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
13160 55 45 52 59 5f 53 43 41 4e 29 20 29 7b 0a 20 20  UERY_SCAN) ){.  
13170 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
13180 33 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69  3Fts5HashScanIni
13190 74 28 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e  t(p->pHash, (con
131a0 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20  st char*)pTerm, 
131b0 6e 54 65 72 6d 29 3b 0a 20 20 20 20 73 71 6c 69  nTerm);.    sqli
131c0 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
131d0 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 28  ntry(p->pHash, (
131e0 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26 7a 2c  const char**)&z,
131f0 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29   &pList, &nList)
13200 3b 0a 20 20 20 20 6e 20 3d 20 28 7a 20 3f 20 28  ;.    n = (z ? (
13210 69 6e 74 29 73 74 72 6c 65 6e 28 28 63 6f 6e 73  int)strlen((cons
13220 74 20 63 68 61 72 2a 29 7a 29 20 3a 20 30 29 3b  t char*)z) : 0);
13230 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
13240 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54  ter->flags |= FT
13250 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
13260 52 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  RM;.    sqlite3F
13270 74 73 35 48 61 73 68 51 75 65 72 79 28 70 2d 3e  ts5HashQuery(p->
13280 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68  pHash, (const ch
13290 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d  ar*)pTerm, nTerm
132a0 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
132b0 29 3b 0a 20 20 20 20 7a 20 3d 20 70 54 65 72 6d  );.    z = pTerm
132c0 3b 0a 20 20 20 20 6e 20 3d 20 6e 54 65 72 6d 3b  ;.    n = nTerm;
132d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69 73  .  }..  if( pLis
132e0 74 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74  t ){.    Fts5Dat
132f0 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20 20 73 71  a *pLeaf;.    sq
13300 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
13310 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65  et(&p->rc, &pIte
13320 72 2d 3e 74 65 72 6d 2c 20 6e 2c 20 7a 29 3b 0a  r->term, n, z);.
13330 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35      pLeaf = fts5
13340 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  IdxMalloc(p, siz
13350 65 6f 66 28 46 74 73 35 44 61 74 61 29 29 3b 0a  eof(Fts5Data));.
13360 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30      if( pLeaf==0
13370 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
13380 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70  Leaf->p = (u8*)p
13390 4c 69 73 74 3b 0a 20 20 20 20 70 4c 65 61 66 2d  List;.    pLeaf-
133a0 3e 6e 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c  >nn = pLeaf->szL
133b0 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  eaf = nList;.   
133c0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
133d0 70 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72  pLeaf;.    pIter
133e0 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
133f0 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c  fts5GetVarint(pL
13400 65 61 66 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70  eaf->p, (u64*)&p
13410 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
13420 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
13430 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61 66 2d  Doclist = pLeaf-
13440 3e 6e 6e 3b 0a 0a 20 20 20 20 69 66 28 20 66 6c  >nn;..    if( fl
13450 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
13460 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20  QUERY_DESC ){.  
13470 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73      pIter->flags
13480 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52   |= FTS5_SEGITER
13490 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20  _REVERSE;.      
134a0 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
134b0 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49  seInitPage(p, pI
134c0 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ter);.    }else{
134d0 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
134e0 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
134f0 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ter);.    }.  }.
13500 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 53 65  .  fts5SegIterSe
13510 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b  tNext(p, pIter);
13520 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74  .}../*.** Zero t
13530 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
13540 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
13550 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
13560 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
13570 74 65 72 43 6c 65 61 72 28 46 74 73 35 53 65 67  terClear(Fts5Seg
13580 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
13590 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
135a0 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 20 20  pIter->term);.  
135b0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
135c0 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
135d0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
135e0 28 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61  (pIter->pNextLea
135f0 66 29 3b 0a 20 20 66 74 73 35 44 6c 69 64 78 49  f);.  fts5DlidxI
13600 74 65 72 46 72 65 65 28 70 49 74 65 72 2d 3e 70  terFree(pIter->p
13610 44 6c 69 64 78 29 3b 0a 20 20 73 71 6c 69 74 65  Dlidx);.  sqlite
13620 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 52  3_free(pIter->aR
13630 6f 77 69 64 4f 66 66 73 65 74 29 3b 0a 20 20 6d  owidOffset);.  m
13640 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
13650 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74  sizeof(Fts5SegIt
13660 65 72 29 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  er));.}..#ifdef 
13670 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 0a 2f 2a  SQLITE_DEBUG../*
13680 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
13690 6e 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72  n is used as par
136a0 74 20 6f 66 20 74 68 65 20 62 69 67 20 61 73 73  t of the big ass
136b0 65 72 74 28 29 20 70 72 6f 63 65 64 75 72 65 20  ert() procedure 
136c0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 0a 2a  implemented by.*
136d0 2a 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74  * fts5AssertMult
136e0 69 49 74 65 72 53 65 74 75 70 28 29 2e 20 49 74  iIterSetup(). It
136f0 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
13700 65 20 72 65 73 75 6c 74 20 63 75 72 72 65 6e 74  e result current
13710 6c 79 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  ly stored.** in 
13720 2a 70 52 65 73 20 69 73 20 74 68 65 20 63 6f 72  *pRes is the cor
13730 72 65 63 74 20 72 65 73 75 6c 74 20 6f 66 20 63  rect result of c
13740 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 63 75 72  omparing the cur
13750 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 6f  rent positions o
13760 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 69 74 65  f the.** two ite
13770 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  rators..*/.stati
13780 63 20 76 6f 69 64 20 66 74 73 35 41 73 73 65 72  c void fts5Asser
13790 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c  tComparisonResul
137a0 74 28 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  t(.  Fts5Iter *p
137b0 49 74 65 72 2c 20 0a 20 20 46 74 73 35 53 65 67  Iter, .  Fts5Seg
137c0 49 74 65 72 20 2a 70 31 2c 0a 20 20 46 74 73 35  Iter *p1,.  Fts5
137d0 53 65 67 49 74 65 72 20 2a 70 32 2c 0a 20 20 46  SegIter *p2,.  F
137e0 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
137f0 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 70  .){.  int i1 = p
13800 31 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b  1 - pIter->aSeg;
13810 0a 20 20 69 6e 74 20 69 32 20 3d 20 70 32 20 2d  .  int i2 = p2 -
13820 20 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a 0a 20   pIter->aSeg;.. 
13830 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 20 7c   if( p1->pLeaf |
13840 7c 20 70 32 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  | p2->pLeaf ){. 
13850 20 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66     if( p1->pLeaf
13860 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
13870 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73  ert( pRes->iFirs
13880 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 7d 65 6c  t==i2 );.    }el
13890 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66  se if( p2->pLeaf
138a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
138b0 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73  ert( pRes->iFirs
138c0 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 7d 65 6c  t==i1 );.    }el
138d0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d  se{.      int nM
138e0 69 6e 20 3d 20 4d 49 4e 28 70 31 2d 3e 74 65 72  in = MIN(p1->ter
138f0 6d 2e 6e 2c 20 70 32 2d 3e 74 65 72 6d 2e 6e 29  m.n, p2->term.n)
13900 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 20  ;.      int res 
13910 3d 20 6d 65 6d 63 6d 70 28 70 31 2d 3e 74 65 72  = memcmp(p1->ter
13920 6d 2e 70 2c 20 70 32 2d 3e 74 65 72 6d 2e 70 2c  m.p, p2->term.p,
13930 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 20 20 69 66   nMin);.      if
13940 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d  ( res==0 ) res =
13950 20 70 31 2d 3e 74 65 72 6d 2e 6e 20 2d 20 70 32   p1->term.n - p2
13960 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a 20 20 20 20 20  ->term.n;..     
13970 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
13980 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13990 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 31 20  Res->bTermEq==1 
139a0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
139b0 74 28 20 70 31 2d 3e 69 52 6f 77 69 64 21 3d 70  t( p1->iRowid!=p
139c0 32 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20  2->iRowid );.   
139d0 20 20 20 20 20 72 65 73 20 3d 20 28 28 70 31 2d       res = ((p1-
139e0 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52  >iRowid > p2->iR
139f0 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
13a00 65 76 29 20 3f 20 2d 31 20 3a 20 31 3b 0a 20 20  ev) ? -1 : 1;.  
13a10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13a20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
13a30 3e 62 54 65 72 6d 45 71 3d 3d 30 20 29 3b 0a 20  >bTermEq==0 );. 
13a40 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
13a50 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20  ( res<0 ){.     
13a60 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
13a70 3e 69 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20  >iFirst==i1 );. 
13a80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13a90 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
13aa0 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a  ->iFirst==i2 );.
13ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13ac0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
13ad0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
13ae0 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51 4c 49 54  -op unless SQLIT
13af0 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
13b00 65 64 20 77 68 65 6e 20 74 68 69 73 20 6d 6f 64  ed when this mod
13b10 75 6c 65 0a 2a 2a 20 69 73 20 63 6f 6d 70 69 6c  ule.** is compil
13b20 65 64 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ed. In that case
13b30 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
13b40 69 73 20 65 73 73 65 6e 74 69 61 6c 6c 79 20 61  is essentially a
13b50 6e 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73  n assert() .** s
13b60 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f  tatement used to
13b70 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
13b80 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
13b90 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 5d   pIter->aFirst[]
13ba0 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 63 6f   array.** are co
13bb0 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrect..*/.static
13bc0 20 76 6f 69 64 20 66 74 73 35 41 73 73 65 72 74   void fts5Assert
13bd0 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 46  MultiIterSetup(F
13be0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
13bf0 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  5Iter *pIter){. 
13c00 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
13c10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
13c20 35 53 65 67 49 74 65 72 20 2a 70 46 69 72 73 74  5SegIter *pFirst
13c30 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
13c40 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
13c50 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
13c60 69 6e 74 20 69 3b 0a 0a 20 20 20 20 61 73 73 65  int i;..    asse
13c70 72 74 28 20 28 70 46 69 72 73 74 2d 3e 70 4c 65  rt( (pFirst->pLe
13c80 61 66 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62  af==0)==pIter->b
13c90 61 73 65 2e 62 45 6f 66 20 29 3b 0a 0a 20 20 20  ase.bEof );..   
13ca0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 70   /* Check that p
13cb0 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
13cc0 69 64 20 69 73 20 73 65 74 20 63 6f 72 72 65 63  id is set correc
13cd0 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  tly. */.    for(
13ce0 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53  i=0; i<pIter->nS
13cf0 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  eg; i++){.      
13d00 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 20  Fts5SegIter *p1 
13d10 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
13d20 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
13d30 20 70 31 3d 3d 70 46 69 72 73 74 20 0a 20 20 20   p1==pFirst .   
13d40 20 20 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e 70          || p1->p
13d50 4c 65 61 66 3d 3d 30 20 0a 20 20 20 20 20 20 20  Leaf==0 .       
13d60 20 20 20 20 7c 7c 20 66 74 73 35 42 75 66 66 65      || fts5Buffe
13d70 72 43 6f 6d 70 61 72 65 28 26 70 46 69 72 73 74  rCompare(&pFirst
13d80 2d 3e 74 65 72 6d 2c 20 26 70 31 2d 3e 74 65 72  ->term, &p1->ter
13d90 6d 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  m) .           |
13da0 7c 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 49  | p1->iRowid==pI
13db0 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
13dc0 64 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  d.           || 
13dd0 28 70 31 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65  (p1->iRowid<pIte
13de0 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29  r->iSwitchRowid)
13df0 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 0a 20 20  ==pIter->bRev.  
13e00 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
13e10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
13e20 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 3d 32 29 7b  er->nSeg; i+=2){
13e30 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
13e40 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d  er *p1 = &pIter-
13e50 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20  >aSeg[i];.      
13e60 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 20  Fts5SegIter *p2 
13e70 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
13e80 2b 31 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 43  +1];.      Fts5C
13e90 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26  Result *pRes = &
13ea0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 28 70  pIter->aFirst[(p
13eb0 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69 29 20  Iter->nSeg + i) 
13ec0 2f 20 32 5d 3b 0a 20 20 20 20 20 20 66 74 73 35  / 2];.      fts5
13ed0 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e  AssertComparison
13ee0 52 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31  Result(pIter, p1
13ef0 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20  , p2, pRes);.   
13f00 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   }..    for(i=1;
13f10 20 69 3c 28 70 49 74 65 72 2d 3e 6e 53 65 67 20   i<(pIter->nSeg 
13f20 2f 20 32 29 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  / 2); i+=2){.   
13f30 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
13f40 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p1 = &pIter->aSe
13f50 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
13f60 5b 69 2a 32 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  [i*2].iFirst ];.
13f70 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
13f80 72 20 2a 70 32 20 3d 20 26 70 49 74 65 72 2d 3e  r *p2 = &pIter->
13f90 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
13fa0 72 73 74 5b 69 2a 32 2b 31 5d 2e 69 46 69 72 73  rst[i*2+1].iFirs
13fb0 74 20 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 43  t ];.      Fts5C
13fc0 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26  Result *pRes = &
13fd0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d  pIter->aFirst[i]
13fe0 3b 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65  ;.      fts5Asse
13ff0 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75  rtComparisonResu
14000 6c 74 28 70 49 74 65 72 2c 20 70 31 2c 20 70 32  lt(pIter, p1, p2
14010 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 20  , pRes);.    }. 
14020 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
14030 69 6e 65 20 66 74 73 35 41 73 73 65 72 74 4d 75  ine fts5AssertMu
14040 6c 74 69 49 74 65 72 53 65 74 75 70 28 78 2c 79  ltiIterSetup(x,y
14050 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
14060 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
14070 6e 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 70  n necessary to p
14080 6f 70 75 6c 61 74 65 20 70 49 74 65 72 2d 3e 61  opulate pIter->a
14090 46 69 72 73 74 5b 69 4f 75 74 5d 2e 0a 2a 2a 0a  First[iOut]..**.
140a0 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
140b0 65 64 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  ed value is non-
140c0 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73  zero, then it is
140d0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 6e   the index of an
140e0 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 74 68 65   entry.** in the
140f0 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 5d 20 61   pIter->aSeg[] a
14100 72 72 61 79 20 74 68 61 74 20 69 73 20 28 61 29  rray that is (a)
14110 20 6e 6f 74 20 61 74 20 45 4f 46 2c 20 61 6e 64   not at EOF, and
14120 20 28 62 29 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   (b) pointing.**
14130 20 74 6f 20 61 20 6b 65 79 20 74 68 61 74 20 69   to a key that i
14140 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  s a duplicate of
14150 20 61 6e 6f 74 68 65 72 2c 20 68 69 67 68 65 72   another, higher
14160 20 70 72 69 6f 72 69 74 79 2c 20 0a 2a 2a 20 73   priority, .** s
14170 65 67 6d 65 6e 74 2d 69 74 65 72 61 74 6f 72 20  egment-iterator 
14180 69 6e 20 74 68 65 20 70 53 65 67 2d 3e 61 53 65  in the pSeg->aSe
14190 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  g[] array..*/.st
141a0 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c  atic int fts5Mul
141b0 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28  tiIterDoCompare(
141c0 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c  Fts5Iter *pIter,
141d0 20 69 6e 74 20 69 4f 75 74 29 7b 0a 20 20 69 6e   int iOut){.  in
141e0 74 20 69 31 3b 20 20 20 20 20 20 20 20 20 20 20  t i1;           
141f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14200 20 49 6e 64 65 78 20 6f 66 20 6c 65 66 74 2d 68   Index of left-h
14210 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20  and Fts5SegIter 
14220 2a 2f 0a 20 20 69 6e 74 20 69 32 3b 20 20 20 20  */.  int i2;    
14230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14240 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
14250 20 72 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35   right-hand Fts5
14260 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74  SegIter */.  int
14270 20 69 52 65 73 3b 0a 20 20 46 74 73 35 53 65 67   iRes;.  Fts5Seg
14280 49 74 65 72 20 2a 70 31 3b 20 20 20 20 20 20 20  Iter *p1;       
14290 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
142a0 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65  -hand Fts5SegIte
142b0 72 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  r */.  Fts5SegIt
142c0 65 72 20 2a 70 32 3b 20 20 20 20 20 20 20 20 20  er *p2;         
142d0 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 2d         /* Right-
142e0 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72  hand Fts5SegIter
142f0 20 2a 2f 0a 20 20 46 74 73 35 43 52 65 73 75 6c   */.  Fts5CResul
14300 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72  t *pRes = &pIter
14310 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 3b 0a  ->aFirst[iOut];.
14320 0a 20 20 61 73 73 65 72 74 28 20 69 4f 75 74 3c  .  assert( iOut<
14330 70 49 74 65 72 2d 3e 6e 53 65 67 20 26 26 20 69  pIter->nSeg && i
14340 4f 75 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Out>0 );.  asser
14350 74 28 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d  t( pIter->bRev==
14360 30 20 7c 7c 20 70 49 74 65 72 2d 3e 62 52 65 76  0 || pIter->bRev
14370 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20 69 4f  ==1 );..  if( iO
14380 75 74 3e 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67  ut>=(pIter->nSeg
14390 2f 32 29 20 29 7b 0a 20 20 20 20 69 31 20 3d 20  /2) ){.    i1 = 
143a0 28 69 4f 75 74 20 2d 20 70 49 74 65 72 2d 3e 6e  (iOut - pIter->n
143b0 53 65 67 2f 32 29 20 2a 20 32 3b 0a 20 20 20 20  Seg/2) * 2;.    
143c0 69 32 20 3d 20 69 31 20 2b 20 31 3b 0a 20 20 7d  i2 = i1 + 1;.  }
143d0 65 6c 73 65 7b 0a 20 20 20 20 69 31 20 3d 20 70  else{.    i1 = p
143e0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75  Iter->aFirst[iOu
143f0 74 2a 32 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20  t*2].iFirst;.   
14400 20 69 32 20 3d 20 70 49 74 65 72 2d 3e 61 46 69   i2 = pIter->aFi
14410 72 73 74 5b 69 4f 75 74 2a 32 2b 31 5d 2e 69 46  rst[iOut*2+1].iF
14420 69 72 73 74 3b 0a 20 20 7d 0a 20 20 70 31 20 3d  irst;.  }.  p1 =
14430 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 31   &pIter->aSeg[i1
14440 5d 3b 0a 20 20 70 32 20 3d 20 26 70 49 74 65 72  ];.  p2 = &pIter
14450 2d 3e 61 53 65 67 5b 69 32 5d 3b 0a 0a 20 20 70  ->aSeg[i2];..  p
14460 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 3d 20 30  Res->bTermEq = 0
14470 3b 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61  ;.  if( p1->pLea
14480 66 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  f==0 ){         
14490 20 20 2f 2a 20 49 66 20 70 31 20 69 73 20 61 74    /* If p1 is at
144a0 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73   EOF */.    iRes
144b0 20 3d 20 69 32 3b 0a 20 20 7d 65 6c 73 65 20 69   = i2;.  }else i
144c0 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20  f( p2->pLeaf==0 
144d0 29 7b 20 20 20 20 20 2f 2a 20 49 66 20 70 32 20  ){     /* If p2 
144e0 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20  is at EOF */.   
144f0 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 7d 65   iRes = i1;.  }e
14500 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  lse{.    int res
14510 20 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d   = fts5BufferCom
14520 70 61 72 65 28 26 70 31 2d 3e 74 65 72 6d 2c 20  pare(&p1->term, 
14530 26 70 32 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20  &p2->term);.    
14540 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
14550 20 20 20 20 61 73 73 65 72 74 28 20 69 32 3e 69      assert( i2>i
14560 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  1 );.      asser
14570 74 28 20 69 32 21 3d 30 20 29 3b 0a 20 20 20 20  t( i2!=0 );.    
14580 20 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20    pRes->bTermEq 
14590 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 1;.      if( p
145a0 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 32 2d 3e 69  1->iRowid==p2->i
145b0 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
145c0 20 70 31 2d 3e 62 44 65 6c 20 3d 20 70 32 2d 3e   p1->bDel = p2->
145d0 62 44 65 6c 3b 0a 20 20 20 20 20 20 20 20 72 65  bDel;.        re
145e0 74 75 72 6e 20 69 32 3b 0a 20 20 20 20 20 20 7d  turn i2;.      }
145f0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 28 28 70  .      res = ((p
14600 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e  1->iRowid > p2->
14610 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e  iRowid)==pIter->
14620 62 52 65 76 29 20 3f 20 2d 31 20 3a 20 2b 31 3b  bRev) ? -1 : +1;
14630 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
14640 74 28 20 72 65 73 21 3d 30 20 29 3b 0a 20 20 20  t( res!=0 );.   
14650 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
14660 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20      iRes = i1;. 
14670 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14680 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 20 20 7d  iRes = i2;.    }
14690 0a 20 20 7d 0a 0a 20 20 70 52 65 73 2d 3e 69 46  .  }..  pRes->iF
146a0 69 72 73 74 20 3d 20 28 75 31 36 29 69 52 65 73  irst = (u16)iRes
146b0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
146c0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
146d0 73 65 67 2d 69 74 65 72 20 73 6f 20 74 68 61 74  seg-iter so that
146e0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
146f0 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
14700 20 70 61 67 65 20 69 4c 65 61 66 50 67 6e 6f 2e   page iLeafPgno.
14710 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20 65 72 72  .** It is an err
14720 6f 72 20 69 66 20 6c 65 61 66 20 69 4c 65 61 66  or if leaf iLeaf
14730 50 67 6e 6f 20 64 6f 65 73 20 6e 6f 74 20 65 78  Pgno does not ex
14740 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 73 20  ist or contains 
14750 6e 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74  no rowids..*/.st
14760 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
14770 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28 0a 20  gIterGotoPage(. 
14780 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
14790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147a0 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
147b0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
147c0 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  5SegIter *pIter,
147d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
147e0 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61  Iterator to adva
147f0 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  nce */.  int iLe
14800 61 66 50 67 6e 6f 0a 29 7b 0a 20 20 61 73 73 65  afPgno.){.  asse
14810 72 74 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49  rt( iLeafPgno>pI
14820 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29  ter->iLeafPgno )
14830 3b 0a 0a 20 20 69 66 28 20 69 4c 65 61 66 50 67  ;..  if( iLeafPg
14840 6e 6f 3e 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e  no>pIter->pSeg->
14850 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20  pgnoLast ){.    
14860 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
14870 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RUPT;.  }else{. 
14880 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
14890 73 65 28 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c  se(pIter->pNextL
148a0 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  eaf);.    pIter-
148b0 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 30 3b 0a  >pNextLeaf = 0;.
148c0 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
148d0 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f  Pgno = iLeafPgno
148e0 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49  -1;.    fts5SegI
148f0 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
14900 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  Iter);.    asser
14910 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  t( p->rc!=SQLITE
14920 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 69 4c  _OK || pIter->iL
14930 65 61 66 50 67 6e 6f 3d 3d 69 4c 65 61 66 50 67  eafPgno==iLeafPg
14940 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  no );..    if( p
14950 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
14960 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66  ){.      int iOf
14970 66 3b 0a 20 20 20 20 20 20 75 38 20 2a 61 20 3d  f;.      u8 *a =
14980 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
14990 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
149a0 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
149b0 4c 65 61 66 3b 0a 0a 20 20 20 20 20 20 69 4f 66  Leaf;..      iOf
149c0 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  f = fts5LeafFirs
149d0 74 52 6f 77 69 64 4f 66 66 28 70 49 74 65 72 2d  tRowidOff(pIter-
149e0 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69  >pLeaf);.      i
149f0 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20 69 4f 66  f( iOff<4 || iOf
14a00 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  f>=n ){.        
14a10 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
14a20 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RUPT;.      }els
14a30 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  e{.        iOff 
14a40 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
14a50 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
14a60 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
14a70 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
14a80 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
14a90 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 66 74 73  Off;.        fts
14aa0 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
14ab0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
14ac0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
14ad0 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
14ae0 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
14af0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
14b00 20 61 72 67 75 6d 65 6e 74 20 75 6e 74 69 6c 20   argument until 
14b10 69 74 20 69 73 20 61 74 20 6f 72 20 0a 2a 2a 20  it is at or .** 
14b20 70 61 73 74 20 72 6f 77 69 64 20 69 46 72 6f 6d  past rowid iFrom
14b30 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
14b40 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 46 72  the value of iFr
14b50 6f 6d 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72  om, the iterator
14b60 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 61 64   is.** always ad
14b70 76 61 6e 63 65 64 20 61 74 20 6c 65 61 73 74 20  vanced at least 
14b80 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  once..*/.static 
14b90 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
14ba0 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74 73 35  NextFrom(.  Fts5
14bb0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
14bc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
14bd0 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
14be0 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ct */.  Fts5SegI
14bf0 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
14c00 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
14c10 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a  tor to advance *
14c20 2f 0a 20 20 69 36 34 20 69 4d 61 74 63 68 20 20  /.  i64 iMatch  
14c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c40 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 69      /* Advance i
14c50 74 65 72 61 74 6f 72 20 61 74 20 6c 65 61 73 74  terator at least
14c60 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 29 7b 0a   this far */.){.
14c70 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28 70 49    int bRev = (pI
14c80 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
14c90 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
14ca0 45 29 3b 0a 20 20 46 74 73 35 44 6c 69 64 78 49  E);.  Fts5DlidxI
14cb0 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 70 49  ter *pDlidx = pI
14cc0 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 69  ter->pDlidx;.  i
14cd0 6e 74 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70  nt iLeafPgno = p
14ce0 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b  Iter->iLeafPgno;
14cf0 0a 20 20 69 6e 74 20 62 4d 6f 76 65 20 3d 20 31  .  int bMove = 1
14d00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ;..  assert( pIt
14d10 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
14d20 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
14d30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
14d40 74 65 72 2d 3e 70 44 6c 69 64 78 20 29 3b 0a 20  ter->pDlidx );. 
14d50 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
14d60 70 4c 65 61 66 20 29 3b 0a 0a 20 20 69 66 28 20  pLeaf );..  if( 
14d70 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 77  bRev==0 ){.    w
14d80 68 69 6c 65 28 20 21 66 74 73 35 44 6c 69 64 78  hile( !fts5Dlidx
14d90 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
14da0 78 29 20 26 26 20 69 4d 61 74 63 68 3e 66 74 73  x) && iMatch>fts
14db0 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28  5DlidxIterRowid(
14dc0 70 44 6c 69 64 78 29 20 29 7b 0a 20 20 20 20 20  pDlidx) ){.     
14dd0 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 66 74 73   iLeafPgno = fts
14de0 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
14df0 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66 74  Dlidx);.      ft
14e00 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28  s5DlidxIterNext(
14e10 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  p, pDlidx);.    
14e20 7d 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28  }.    assert_nc(
14e30 20 69 4c 65 61 66 50 67 6e 6f 3e 3d 70 49 74 65   iLeafPgno>=pIte
14e40 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 7c 7c 20  r->iLeafPgno || 
14e50 70 2d 3e 72 63 20 29 3b 0a 20 20 20 20 69 66 28  p->rc );.    if(
14e60 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72   iLeafPgno>pIter
14e70 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20  ->iLeafPgno ){. 
14e80 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
14e90 47 6f 74 6f 50 61 67 65 28 70 2c 20 70 49 74 65  GotoPage(p, pIte
14ea0 72 2c 20 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20  r, iLeafPgno);. 
14eb0 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a       bMove = 0;.
14ec0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
14ed0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72     assert( pIter
14ee0 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29  ->pNextLeaf==0 )
14ef0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 4d  ;.    assert( iM
14f00 61 74 63 68 3c 70 49 74 65 72 2d 3e 69 52 6f 77  atch<pIter->iRow
14f10 69 64 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  id );.    while(
14f20 20 21 66 74 73 35 44 6c 69 64 78 49 74 65 72 45   !fts5DlidxIterE
14f30 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 20 26 26  of(p, pDlidx) &&
14f40 20 69 4d 61 74 63 68 3c 66 74 73 35 44 6c 69 64   iMatch<fts5Dlid
14f50 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64  xIterRowid(pDlid
14f60 78 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  x) ){.      fts5
14f70 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 70 2c  DlidxIterPrev(p,
14f80 20 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a   pDlidx);.    }.
14f90 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20      iLeafPgno = 
14fa0 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
14fb0 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20 20 20 20  o(pDlidx);..    
14fc0 61 73 73 65 72 74 28 20 66 74 73 35 44 6c 69 64  assert( fts5Dlid
14fd0 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
14fe0 64 78 29 20 7c 7c 20 69 4c 65 61 66 50 67 6e 6f  dx) || iLeafPgno
14ff0 3c 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  <=pIter->iLeafPg
15000 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69  no );..    if( i
15010 4c 65 61 66 50 67 6e 6f 3c 70 49 74 65 72 2d 3e  LeafPgno<pIter->
15020 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20  iLeafPgno ){.   
15030 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50     pIter->iLeafP
15040 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2b  gno = iLeafPgno+
15050 31 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  1;.      fts5Seg
15060 49 74 65 72 52 65 76 65 72 73 65 4e 65 77 50 61  IterReverseNewPa
15070 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
15080 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20      bMove = 0;. 
15090 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a     }.  }..  do{.
150a0 20 20 20 20 69 66 28 20 62 4d 6f 76 65 20 26 26      if( bMove &&
150b0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
150c0 4b 20 29 20 70 49 74 65 72 2d 3e 78 4e 65 78 74  K ) pIter->xNext
150d0 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20  (p, pIter, 0);. 
150e0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c     if( pIter->pL
150f0 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  eaf==0 ) break;.
15100 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20      if( bRev==0 
15110 26 26 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  && pIter->iRowid
15120 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b  >=iMatch ) break
15130 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 21 3d  ;.    if( bRev!=
15140 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f 77  0 && pIter->iRow
15150 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65  id<=iMatch ) bre
15160 61 6b 3b 0a 20 20 20 20 62 4d 6f 76 65 20 3d 20  ak;.    bMove = 
15170 31 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 2d 3e  1;.  }while( p->
15180 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
15190 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  .}.../*.** Free 
151a0 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  the iterator obj
151b0 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
151c0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
151d0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
151e0 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46  d fts5MultiIterF
151f0 72 65 65 28 46 74 73 35 49 74 65 72 20 2a 70 49  ree(Fts5Iter *pI
15200 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65  ter){.  if( pIte
15210 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r ){.    int i;.
15220 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
15230 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29  Iter->nSeg; i++)
15240 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
15250 74 65 72 43 6c 65 61 72 28 26 70 49 74 65 72 2d  terClear(&pIter-
15260 3e 61 53 65 67 5b 69 5d 29 3b 0a 20 20 20 20 7d  >aSeg[i]);.    }
15270 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
15280 72 65 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  reRelease(pIter-
15290 3e 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 66  >pStruct);.    f
152a0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
152b0 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a  Iter->poslist);.
152c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
152d0 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  (pIter);.  }.}..
152e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
152f0 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
15300 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  d(.  Fts5Index *
15310 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
15320 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
15330 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20  kend to iterate 
15340 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35  within */.  Fts5
15350 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
15360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
15370 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64 61 74  terator to updat
15380 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79  e aFirst[] array
15390 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43   for */.  int iC
153a0 68 61 6e 67 65 64 2c 20 20 20 20 20 20 20 20 20  hanged,         
153b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
153c0 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72 61 74  ex of sub-iterat
153d0 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63 65 64  or just advanced
153e0 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 73 65   */.  int iMinse
153f0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
15400 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d        /* Minimum
15410 20 65 6e 74 72 79 20 69 6e 20 61 46 69 72 73 74   entry in aFirst
15420 5b 5d 20 74 6f 20 73 65 74 20 2a 2f 0a 29 7b 0a  [] to set */.){.
15430 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
15440 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43  =(pIter->nSeg+iC
15450 68 61 6e 67 65 64 29 2f 32 3b 20 69 3e 3d 69 4d  hanged)/2; i>=iM
15460 69 6e 73 65 74 20 26 26 20 70 2d 3e 72 63 3d 3d  inset && p->rc==
15470 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 3d 69 2f 32  SQLITE_OK; i=i/2
15480 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 71 3b 0a  ){.    int iEq;.
15490 20 20 20 20 69 66 28 20 28 69 45 71 20 3d 20 66      if( (iEq = f
154a0 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f  ts5MultiIterDoCo
154b0 6d 70 61 72 65 28 70 49 74 65 72 2c 20 69 29 29  mpare(pIter, i))
154c0 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65   ){.      Fts5Se
154d0 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
154e0 49 74 65 72 2d 3e 61 53 65 67 5b 69 45 71 5d 3b  Iter->aSeg[iEq];
154f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15500 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
15510 29 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 78  );.      pSeg->x
15520 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29  Next(p, pSeg, 0)
15530 3b 0a 20 20 20 20 20 20 69 20 3d 20 70 49 74 65  ;.      i = pIte
15540 72 2d 3e 6e 53 65 67 20 2b 20 69 45 71 3b 0a 20  r->nSeg + iEq;. 
15550 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
15560 2a 20 53 75 62 2d 69 74 65 72 61 74 6f 72 20 69  * Sub-iterator i
15570 43 68 61 6e 67 65 64 20 6f 66 20 69 74 65 72 61  Changed of itera
15580 74 6f 72 20 70 49 74 65 72 20 68 61 73 20 6a 75  tor pIter has ju
15590 73 74 20 62 65 65 6e 20 61 64 76 61 6e 63 65 64  st been advanced
155a0 2e 20 49 74 20 73 74 69 6c 6c 0a 2a 2a 20 70 6f  . It still.** po
155b0 69 6e 74 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ints to the same
155c0 20 74 65 72 6d 20 74 68 6f 75 67 68 20 2d 20 6a   term though - j
155d0 75 73 74 20 61 20 64 69 66 66 65 72 65 6e 74 20  ust a different 
155e0 72 6f 77 69 64 2e 20 54 68 69 73 20 66 75 6e 63  rowid. This func
155f0 74 69 6f 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 73  tion.** attempts
15600 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
15610 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
15620 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61  Iter->aFirst[] a
15630 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 20 49  ccordingly..** I
15640 66 20 69 74 20 64 6f 65 73 20 73 6f 20 73 75 63  f it does so suc
15650 63 65 73 73 66 75 6c 6c 79 2c 20 30 20 69 73 20  cessfully, 0 is 
15660 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
15670 69 73 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ise 1..**.** If 
15680 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
15690 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72  rned, the caller
156a0 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 66 74 73   should call fts
156b0 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
156c0 65 64 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 69  ed().** on the i
156d0 74 65 72 61 74 6f 72 20 69 6e 73 74 65 61 64 2e  terator instead.
156e0 20 54 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 64   That function d
156f0 6f 65 73 20 74 68 65 20 73 61 6d 65 20 61 73 20  oes the same as 
15700 74 68 69 73 20 6f 6e 65 2c 20 65 78 63 65 70 74  this one, except
15710 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 65 61 6c  .** that it deal
15720 73 20 77 69 74 68 20 6d 6f 72 65 20 63 6f 6d 70  s with more comp
15730 6c 69 63 61 74 65 64 20 63 61 73 65 73 20 61 73  licated cases as
15740 20 77 65 6c 6c 2e 0a 2a 2f 20 0a 73 74 61 74 69   well..*/ .stati
15750 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49  c int fts5MultiI
15760 74 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28  terAdvanceRowid(
15770 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  .  Fts5Iter *pIt
15780 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
15790 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
157a0 6f 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b  o update aFirst[
157b0 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20  ] array for */. 
157c0 20 69 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20   int iChanged,  
157d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157e0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62   /* Index of sub
157f0 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61  -iterator just a
15800 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20 46 74 73  dvanced */.  Fts
15810 35 53 65 67 49 74 65 72 20 2a 2a 70 70 46 69 72  5SegIter **ppFir
15820 73 74 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 49  st.){.  Fts5SegI
15830 74 65 72 20 2a 70 4e 65 77 20 3d 20 26 70 49 74  ter *pNew = &pIt
15840 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67 65  er->aSeg[iChange
15850 64 5d 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 2d  d];..  if( pNew-
15860 3e 69 52 6f 77 69 64 3d 3d 70 49 74 65 72 2d 3e  >iRowid==pIter->
15870 69 53 77 69 74 63 68 52 6f 77 69 64 0a 20 20 20  iSwitchRowid.   
15880 7c 7c 20 28 70 4e 65 77 2d 3e 69 52 6f 77 69 64  || (pNew->iRowid
15890 3c 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52  <pIter->iSwitchR
158a0 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
158b0 65 76 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  ev.  ){.    int 
158c0 69 3b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  i;.    Fts5SegIt
158d0 65 72 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 49  er *pOther = &pI
158e0 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67  ter->aSeg[iChang
158f0 65 64 20 5e 20 30 78 30 30 30 31 5d 3b 0a 20 20  ed ^ 0x0001];.  
15900 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68    pIter->iSwitch
15910 52 6f 77 69 64 20 3d 20 70 49 74 65 72 2d 3e 62  Rowid = pIter->b
15920 52 65 76 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49  Rev ? SMALLEST_I
15930 4e 54 36 34 20 3a 20 4c 41 52 47 45 53 54 5f 49  NT64 : LARGEST_I
15940 4e 54 36 34 3b 0a 20 20 20 20 66 6f 72 28 69 3d  NT64;.    for(i=
15950 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43 68  (pIter->nSeg+iCh
15960 61 6e 67 65 64 29 2f 32 3b 20 31 3b 20 69 3d 69  anged)/2; 1; i=i
15970 2f 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 43  /2){.      Fts5C
15980 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26  Result *pRes = &
15990 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d  pIter->aFirst[i]
159a0 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
159b0 20 70 4e 65 77 2d 3e 70 4c 65 61 66 20 29 3b 0a   pNew->pLeaf );.
159c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
159d0 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 7c  es->bTermEq==0 |
159e0 7c 20 70 4f 74 68 65 72 2d 3e 70 4c 65 61 66 20  | pOther->pLeaf 
159f0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 52  );..      if( pR
15a00 65 73 2d 3e 62 54 65 72 6d 45 71 20 29 7b 0a 20  es->bTermEq ){. 
15a10 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d         if( pNew-
15a20 3e 69 52 6f 77 69 64 3d 3d 70 4f 74 68 65 72 2d  >iRowid==pOther-
15a30 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  >iRowid ){.     
15a40 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
15a50 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
15a60 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64   (pOther->iRowid
15a70 3e 70 4e 65 77 2d 3e 69 52 6f 77 69 64 29 3d 3d  >pNew->iRowid)==
15a80 70 49 74 65 72 2d 3e 62 52 65 76 20 29 7b 0a 20  pIter->bRev ){. 
15a90 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
15aa0 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70  iSwitchRowid = p
15ab0 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20  Other->iRowid;. 
15ac0 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
15ad0 70 4f 74 68 65 72 3b 0a 20 20 20 20 20 20 20 20  pOther;.        
15ae0 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65  }else if( (pOthe
15af0 72 2d 3e 69 52 6f 77 69 64 3e 70 49 74 65 72 2d  r->iRowid>pIter-
15b00 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d  >iSwitchRowid)==
15b10 70 49 74 65 72 2d 3e 62 52 65 76 20 29 7b 0a 20  pIter->bRev ){. 
15b20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
15b30 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70  iSwitchRowid = p
15b40 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20  Other->iRowid;. 
15b50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15b60 0a 20 20 20 20 20 20 70 52 65 73 2d 3e 69 46 69  .      pRes->iFi
15b70 72 73 74 20 3d 20 28 75 31 36 29 28 70 4e 65 77  rst = (u16)(pNew
15b80 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 29 3b   - pIter->aSeg);
15b90 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20  .      if( i==1 
15ba0 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20  ) break;..      
15bb0 70 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d  pOther = &pIter-
15bc0 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
15bd0 69 72 73 74 5b 69 20 5e 20 30 78 30 30 30 31 5d  irst[i ^ 0x0001]
15be0 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 7d  .iFirst ];.    }
15bf0 0a 20 20 7d 0a 0a 20 20 2a 70 70 46 69 72 73 74  .  }..  *ppFirst
15c00 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72   = pNew;.  retur
15c10 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n 0;.}../*.** Se
15c20 74 20 74 68 65 20 70 49 74 65 72 2d 3e 62 45 6f  t the pIter->bEo
15c30 66 20 76 61 72 69 61 62 6c 65 20 62 61 73 65 64  f variable based
15c40 20 6f 6e 20 74 68 65 20 73 74 61 74 65 20 6f 66   on the state of
15c50 20 74 68 65 20 73 75 62 2d 69 74 65 72 61 74 6f   the sub-iterato
15c60 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rs..*/.static vo
15c70 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
15c80 53 65 74 45 6f 66 28 46 74 73 35 49 74 65 72 20  SetEof(Fts5Iter 
15c90 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53  *pIter){.  Fts5S
15ca0 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
15cb0 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
15cc0 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
15cd0 69 72 73 74 20 5d 3b 0a 20 20 70 49 74 65 72 2d  irst ];.  pIter-
15ce0 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20 70 53 65  >base.bEof = pSe
15cf0 67 2d 3e 70 4c 65 61 66 3d 3d 30 3b 0a 20 20 70  g->pLeaf==0;.  p
15d00 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
15d10 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69  id = pSeg->iRowi
15d20 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  d;.}../*.** Move
15d30 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f   the iterator to
15d40 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e   the next entry.
15d50 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
15d60 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
15d70 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
15d80 74 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72  t in Fts5Index.r
15d90 63 2e 20 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a  c. It is not .**
15da0 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65   considered an e
15db0 72 72 6f 72 20 69 66 20 74 68 65 20 69 74 65 72  rror if the iter
15dc0 61 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46  ator reaches EOF
15dd0 2c 20 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c  , or if it is al
15de0 72 65 61 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46  ready at .** EOF
15df0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
15e00 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
15e10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
15e20 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
15e30 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
15e40 20 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49   .  Fts5Iter *pI
15e50 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d  ter,.  int bFrom
15e60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15e70 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
15e80 66 20 61 72 67 75 6d 65 6e 74 20 69 46 72 6f 6d  f argument iFrom
15e90 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 69   is valid */.  i
15ea0 36 34 20 69 46 72 6f 6d 20 20 20 20 20 20 20 20  64 iFrom        
15eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15ec0 2a 20 41 64 76 61 6e 63 65 20 61 74 20 6c 65 61  * Advance at lea
15ed0 73 74 20 61 73 20 66 61 72 20 61 73 20 74 68 69  st as far as thi
15ee0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 55  s */.){.  int bU
15ef0 73 65 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b 0a  seFrom = bFrom;.
15f00 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
15f10 3e 62 61 73 65 2e 62 45 6f 66 3d 3d 30 20 29 3b  >base.bEof==0 );
15f20 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d  .  while( p->rc=
15f30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15f40 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70    int iFirst = p
15f50 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
15f60 69 46 69 72 73 74 3b 0a 20 20 20 20 69 6e 74 20  iFirst;.    int 
15f70 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20  bNewTerm = 0;.  
15f80 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
15f90 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  Seg = &pIter->aS
15fa0 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20 20  eg[iFirst];.    
15fb0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
15fc0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
15fd0 69 66 28 20 62 55 73 65 46 72 6f 6d 20 26 26 20  if( bUseFrom && 
15fe0 70 53 65 67 2d 3e 70 44 6c 69 64 78 20 29 7b 0a  pSeg->pDlidx ){.
15ff0 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
16000 72 4e 65 78 74 46 72 6f 6d 28 70 2c 20 70 53 65  rNextFrom(p, pSe
16010 67 2c 20 69 46 72 6f 6d 29 3b 0a 20 20 20 20 7d  g, iFrom);.    }
16020 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 53 65 67  else{.      pSeg
16030 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53 65 67 2c  ->xNext(p, pSeg,
16040 20 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20   &bNewTerm);.   
16050 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 53 65 67   }..    if( pSeg
16060 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e  ->pLeaf==0 || bN
16070 65 77 54 65 72 6d 20 0a 20 20 20 20 20 7c 7c 20  ewTerm .     || 
16080 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
16090 61 6e 63 65 52 6f 77 69 64 28 70 49 74 65 72 2c  anceRowid(pIter,
160a0 20 69 46 69 72 73 74 2c 20 26 70 53 65 67 29 0a   iFirst, &pSeg).
160b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 66 74 73      ){.      fts
160c0 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
160d0 65 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69  ed(p, pIter, iFi
160e0 72 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 66  rst, 1);.      f
160f0 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45  ts5MultiIterSetE
16100 6f 66 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20  of(pIter);.     
16110 20 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e   pSeg = &pIter->
16120 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72  aSeg[pIter->aFir
16130 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20  st[1].iFirst];. 
16140 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70       if( pSeg->p
16150 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e  Leaf==0 ) return
16160 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73  ;.    }..    fts
16170 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
16180 53 65 74 75 70 28 70 2c 20 70 49 74 65 72 29 3b  Setup(p, pIter);
16190 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65  .    assert( pSe
161a0 67 3d 3d 26 70 49 74 65 72 2d 3e 61 53 65 67 5b  g==&pIter->aSeg[
161b0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
161c0 2e 69 46 69 72 73 74 5d 20 26 26 20 70 53 65 67  .iFirst] && pSeg
161d0 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20 20 20 69  ->pLeaf );.    i
161e0 66 28 20 70 49 74 65 72 2d 3e 62 53 6b 69 70 45  f( pIter->bSkipE
161f0 6d 70 74 79 3d 3d 30 20 7c 7c 20 70 53 65 67 2d  mpty==0 || pSeg-
16200 3e 6e 50 6f 73 20 29 7b 0a 20 20 20 20 20 20 70  >nPos ){.      p
16210 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74  Iter->xSetOutput
16220 73 28 70 49 74 65 72 2c 20 70 53 65 67 29 3b 0a  s(pIter, pSeg);.
16230 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
16240 20 20 7d 0a 20 20 20 20 62 55 73 65 46 72 6f 6d    }.    bUseFrom
16250 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61   = 0;.  }.}..sta
16260 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
16270 74 69 49 74 65 72 4e 65 78 74 32 28 0a 20 20 46  tiIterNext2(.  F
16280 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
16290 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c  Fts5Iter *pIter,
162a0 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72  .  int *pbNewTer
162b0 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
162c0 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20     /* OUT: True 
162d0 69 66 20 2a 6d 69 67 68 74 2a 20 62 65 20 6e 65  if *might* be ne
162e0 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 61  w term */.){.  a
162f0 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 53  ssert( pIter->bS
16300 6b 69 70 45 6d 70 74 79 20 29 3b 0a 20 20 69 66  kipEmpty );.  if
16310 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
16320 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 62 4e 65 77  OK ){.    *pbNew
16330 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 64 6f  Term = 0;.    do
16340 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46 69 72  {.      int iFir
16350 73 74 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72  st = pIter->aFir
16360 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20  st[1].iFirst;.  
16370 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
16380 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
16390 61 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20  aSeg[iFirst];.  
163a0 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d      int bNewTerm
163b0 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 61 73 73   = 0;..      ass
163c0 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
163d0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70  TE_OK );.      p
163e0 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53  Seg->xNext(p, pS
163f0 65 67 2c 20 26 62 4e 65 77 54 65 72 6d 29 3b 0a  eg, &bNewTerm);.
16400 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e        if( pSeg->
16410 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e 65 77  pLeaf==0 || bNew
16420 54 65 72 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20  Term .       || 
16430 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
16440 61 6e 63 65 52 6f 77 69 64 28 70 49 74 65 72 2c  anceRowid(pIter,
16450 20 69 46 69 72 73 74 2c 20 26 70 53 65 67 29 0a   iFirst, &pSeg).
16460 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
16470 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
16480 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72 2c  vanced(p, pIter,
16490 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20 20   iFirst, 1);.   
164a0 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
164b0 65 72 53 65 74 45 6f 66 28 70 49 74 65 72 29 3b  erSetEof(pIter);
164c0 0a 20 20 20 20 20 20 20 20 2a 70 62 4e 65 77 54  .        *pbNewT
164d0 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  erm = 1;.      }
164e0 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65 72  .      fts5Asser
164f0 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28  tMultiIterSetup(
16500 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 20 20  p, pIter);..    
16510 7d 77 68 69 6c 65 28 20 66 74 73 35 4d 75 6c 74  }while( fts5Mult
16520 69 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20  iIterIsEmpty(p, 
16530 70 49 74 65 72 29 20 29 3b 0a 20 20 7d 0a 7d 0a  pIter) );.  }.}.
16540 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
16550 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
16560 4e 6f 6f 70 28 46 74 73 35 49 74 65 72 20 2a 70  Noop(Fts5Iter *p
16570 55 6e 75 73 65 64 31 2c 20 46 74 73 35 53 65 67  Unused1, Fts5Seg
16580 49 74 65 72 20 2a 70 55 6e 75 73 65 64 32 29 7b  Iter *pUnused2){
16590 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 32  .  UNUSED_PARAM2
165a0 28 70 55 6e 75 73 65 64 31 2c 20 70 55 6e 75 73  (pUnused1, pUnus
165b0 65 64 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ed2);.}..static 
165c0 46 74 73 35 49 74 65 72 20 2a 66 74 73 35 4d 75  Fts5Iter *fts5Mu
165d0 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 0a 20 20  ltiIterAlloc(.  
165e0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
165f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16600 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
16610 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
16620 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 0a  n */.  int nSeg.
16630 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  ){.  Fts5Iter *p
16640 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 53 6c 6f 74  New;.  int nSlot
16650 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16660 20 20 20 20 20 20 20 2f 2a 20 50 6f 77 65 72 20         /* Power 
16670 6f 66 20 74 77 6f 20 3e 3d 20 6e 53 65 67 20 2a  of two >= nSeg *
16680 2f 0a 0a 20 20 66 6f 72 28 6e 53 6c 6f 74 3d 32  /..  for(nSlot=2
16690 3b 20 6e 53 6c 6f 74 3c 6e 53 65 67 3b 20 6e 53  ; nSlot<nSeg; nS
166a0 6c 6f 74 3d 6e 53 6c 6f 74 2a 32 29 3b 0a 20 20  lot=nSlot*2);.  
166b0 70 4e 65 77 20 3d 20 66 74 73 35 49 64 78 4d 61  pNew = fts5IdxMa
166c0 6c 6c 6f 63 28 70 2c 20 0a 20 20 20 20 20 20 73  lloc(p, .      s
166d0 69 7a 65 6f 66 28 46 74 73 35 49 74 65 72 29 20  izeof(Fts5Iter) 
166e0 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
166f0 20 20 20 2f 2a 20 70 4e 65 77 20 2a 2f 0a 20 20     /* pNew */.  
16700 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53      sizeof(Fts5S
16710 65 67 49 74 65 72 29 20 2a 20 28 6e 53 6c 6f 74  egIter) * (nSlot
16720 2d 31 29 20 2b 20 20 20 2f 2a 20 70 4e 65 77 2d  -1) +   /* pNew-
16730 3e 61 53 65 67 5b 5d 20 2a 2f 0a 20 20 20 20 20  >aSeg[] */.     
16740 20 73 69 7a 65 6f 66 28 46 74 73 35 43 52 65 73   sizeof(Fts5CRes
16750 75 6c 74 29 20 2a 20 6e 53 6c 6f 74 20 20 20 20  ult) * nSlot    
16760 20 20 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 46       /* pNew->aF
16770 69 72 73 74 5b 5d 20 2a 2f 0a 20 20 29 3b 0a 20  irst[] */.  );. 
16780 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
16790 20 70 4e 65 77 2d 3e 6e 53 65 67 20 3d 20 6e 53   pNew->nSeg = nS
167a0 6c 6f 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  lot;.    pNew->a
167b0 46 69 72 73 74 20 3d 20 28 46 74 73 35 43 52 65  First = (Fts5CRe
167c0 73 75 6c 74 2a 29 26 70 4e 65 77 2d 3e 61 53 65  sult*)&pNew->aSe
167d0 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 20 20 70 4e  g[nSlot];.    pN
167e0 65 77 2d 3e 70 49 6e 64 65 78 20 3d 20 70 3b 0a  ew->pIndex = p;.
167f0 20 20 20 20 70 4e 65 77 2d 3e 78 53 65 74 4f 75      pNew->xSetOu
16800 74 70 75 74 73 20 3d 20 66 74 73 35 49 74 65 72  tputs = fts5Iter
16810 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6f 70 3b  SetOutputs_Noop;
16820 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
16830 65 77 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  ew;.}..static vo
16840 69 64 20 66 74 73 35 50 6f 73 6c 69 73 74 43 61  id fts5PoslistCa
16850 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e  llback(.  Fts5In
16860 64 65 78 20 2a 70 55 6e 75 73 65 64 2c 20 0a 20  dex *pUnused, . 
16870 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c   void *pContext,
16880 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43   .  const u8 *pC
16890 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b  hunk, int nChunk
168a0 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
168b0 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 61  AM(pUnused);.  a
168c0 73 73 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b  ssert_nc( nChunk
168d0 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 43 68  >=0 );.  if( nCh
168e0 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 66 74 73  unk>0 ){.    fts
168f0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
16900 64 42 6c 6f 62 28 28 46 74 73 35 42 75 66 66 65  dBlob((Fts5Buffe
16910 72 2a 29 70 43 6f 6e 74 65 78 74 2c 20 70 43 68  r*)pContext, pCh
16920 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20 20  unk, nChunk);.  
16930 7d 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  }.}..typedef str
16940 75 63 74 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62  uct PoslistCallb
16950 61 63 6b 43 74 78 20 50 6f 73 6c 69 73 74 43 61  ackCtx PoslistCa
16960 6c 6c 62 61 63 6b 43 74 78 3b 0a 73 74 72 75 63  llbackCtx;.struc
16970 74 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63  t PoslistCallbac
16980 6b 43 74 78 20 7b 0a 20 20 46 74 73 35 42 75 66  kCtx {.  Fts5Buf
16990 66 65 72 20 2a 70 42 75 66 3b 20 20 20 20 20 20  fer *pBuf;      
169a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65           /* Appe
169b0 6e 64 20 74 6f 20 74 68 69 73 20 62 75 66 66 65  nd to this buffe
169c0 72 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65  r */.  Fts5Colse
169d0 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20 20  t *pColset;     
169e0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
169f0 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74 68  ct matches to th
16a00 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  is column */.  i
16a10 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  nt eState;      
16a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16a30 2a 20 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a 7d  * See above */.}
16a40 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  ;..typedef struc
16a50 74 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73  t PoslistOffsets
16a60 43 74 78 20 50 6f 73 6c 69 73 74 4f 66 66 73 65  Ctx PoslistOffse
16a70 74 73 43 74 78 3b 0a 73 74 72 75 63 74 20 50 6f  tsCtx;.struct Po
16a80 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78 20  slistOffsetsCtx 
16a90 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  {.  Fts5Buffer *
16aa0 70 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20  pBuf;           
16ab0 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f      /* Append to
16ac0 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a   this buffer */.
16ad0 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
16ae0 6f 6c 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  olset;          
16af0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61    /* Restrict ma
16b00 74 63 68 65 73 20 74 6f 20 74 68 69 73 20 63 6f  tches to this co
16b10 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 52  lumn */.  int iR
16b20 65 61 64 3b 0a 20 20 69 6e 74 20 69 57 72 69 74  ead;.  int iWrit
16b30 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 4f 44  e;.};../*.** TOD
16b40 4f 3a 20 4d 61 6b 65 20 74 68 69 73 20 6d 6f 72  O: Make this mor
16b50 65 20 65 66 66 69 63 69 65 6e 74 21 0a 2a 2f 0a  e efficient!.*/.
16b60 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
16b70 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 46  ndexColsetTest(F
16b80 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
16b90 65 74 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  et, int iCol){. 
16ba0 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
16bb0 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43  0; i<pColset->nC
16bc0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
16bd0 28 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c  ( pColset->aiCol
16be0 5b 69 5d 3d 3d 69 43 6f 6c 20 29 20 72 65 74 75  [i]==iCol ) retu
16bf0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
16c00 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rn 0;.}..static 
16c10 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73 74  void fts5Poslist
16c20 4f 66 66 73 65 74 73 43 61 6c 6c 62 61 63 6b 28  OffsetsCallback(
16c30 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 55  .  Fts5Index *pU
16c40 6e 75 73 65 64 2c 20 0a 20 20 76 6f 69 64 20 2a  nused, .  void *
16c50 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e  pContext, .  con
16c60 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69  st u8 *pChunk, i
16c70 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 50  nt nChunk.){.  P
16c80 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78  oslistOffsetsCtx
16c90 20 2a 70 43 74 78 20 3d 20 28 50 6f 73 6c 69 73   *pCtx = (Poslis
16ca0 74 4f 66 66 73 65 74 73 43 74 78 2a 29 70 43 6f  tOffsetsCtx*)pCo
16cb0 6e 74 65 78 74 3b 0a 20 20 55 4e 55 53 45 44 5f  ntext;.  UNUSED_
16cc0 50 41 52 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a  PARAM(pUnused);.
16cd0 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43 68    assert_nc( nCh
16ce0 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  unk>=0 );.  if( 
16cf0 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  nChunk>0 ){.    
16d00 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 77  int i = 0;.    w
16d10 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20 29  hile( i<nChunk )
16d20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c  {.      int iVal
16d30 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73  ;.      i += fts
16d40 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 43  5GetVarint32(&pC
16d50 68 75 6e 6b 5b 69 5d 2c 20 69 56 61 6c 29 3b 0a  hunk[i], iVal);.
16d60 20 20 20 20 20 20 69 56 61 6c 20 2b 3d 20 70 43        iVal += pC
16d70 74 78 2d 3e 69 52 65 61 64 20 2d 20 32 3b 0a 20  tx->iRead - 2;. 
16d80 20 20 20 20 20 70 43 74 78 2d 3e 69 52 65 61 64       pCtx->iRead
16d90 20 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 69   = iVal;.      i
16da0 66 28 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73  f( fts5IndexCols
16db0 65 74 54 65 73 74 28 70 43 74 78 2d 3e 70 43 6f  etTest(pCtx->pCo
16dc0 6c 73 65 74 2c 20 69 56 61 6c 29 20 29 7b 0a 20  lset, iVal) ){. 
16dd0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
16de0 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
16df0 74 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 69 56  t(pCtx->pBuf, iV
16e00 61 6c 20 2b 20 32 20 2d 20 70 43 74 78 2d 3e 69  al + 2 - pCtx->i
16e10 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20  Write);.        
16e20 70 43 74 78 2d 3e 69 57 72 69 74 65 20 3d 20 69  pCtx->iWrite = i
16e30 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Val;.      }.   
16e40 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63   }.  }.}..static
16e50 20 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73   void fts5Poslis
16e60 74 46 69 6c 74 65 72 43 61 6c 6c 62 61 63 6b 28  tFilterCallback(
16e70 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 55  .  Fts5Index *pU
16e80 6e 75 73 65 64 2c 0a 20 20 76 6f 69 64 20 2a 70  nused,.  void *p
16e90 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e 73  Context, .  cons
16ea0 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e  t u8 *pChunk, in
16eb0 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 50 6f  t nChunk.){.  Po
16ec0 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78  slistCallbackCtx
16ed0 20 2a 70 43 74 78 20 3d 20 28 50 6f 73 6c 69 73   *pCtx = (Poslis
16ee0 74 43 61 6c 6c 62 61 63 6b 43 74 78 2a 29 70 43  tCallbackCtx*)pC
16ef0 6f 6e 74 65 78 74 3b 0a 20 20 55 4e 55 53 45 44  ontext;.  UNUSED
16f00 5f 50 41 52 41 4d 28 70 55 6e 75 73 65 64 29 3b  _PARAM(pUnused);
16f10 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43  .  assert_nc( nC
16f20 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28  hunk>=0 );.  if(
16f30 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20   nChunk>0 ){.   
16f40 20 2f 2a 20 53 65 61 72 63 68 20 74 68 72 6f 75   /* Search throu
16f50 67 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20 66  gh to find the f
16f60 69 72 73 74 20 76 61 72 69 6e 74 20 77 69 74 68  irst varint with
16f70 20 76 61 6c 75 65 20 31 2e 20 54 68 69 73 20 69   value 1. This i
16f80 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74 61  s the.    ** sta
16f90 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 63  rt of the next c
16fa0 6f 6c 75 6d 6e 73 20 68 69 74 73 2e 20 2a 2f 0a  olumns hits. */.
16fb0 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20      int i = 0;. 
16fc0 20 20 20 69 6e 74 20 69 53 74 61 72 74 20 3d 20     int iStart = 
16fd0 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 74 78  0;..    if( pCtx
16fe0 2d 3e 65 53 74 61 74 65 3d 3d 32 20 29 7b 0a 20  ->eState==2 ){. 
16ff0 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20       int iCol;. 
17000 20 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74       fts5FastGet
17010 56 61 72 69 6e 74 33 32 28 70 43 68 75 6e 6b 2c  Varint32(pChunk,
17020 20 69 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20   i, iCol);.     
17030 20 69 66 28 20 66 74 73 35 49 6e 64 65 78 43 6f   if( fts5IndexCo
17040 6c 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e 70  lsetTest(pCtx->p
17050 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 20 29 7b  Colset, iCol) ){
17060 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65  .        pCtx->e
17070 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20  State = 1;.     
17080 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
17090 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 43  eAppendVarint(pC
170a0 74 78 2d 3e 70 42 75 66 2c 20 31 29 3b 0a 20 20  tx->pBuf, 1);.  
170b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
170c0 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20     pCtx->eState 
170d0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
170e0 20 7d 0a 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   }..    do {.   
170f0 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 43 68 75     while( i<nChu
17100 6e 6b 20 26 26 20 70 43 68 75 6e 6b 5b 69 5d 21  nk && pChunk[i]!
17110 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20  =0x01 ){.       
17120 20 77 68 69 6c 65 28 20 70 43 68 75 6e 6b 5b 69   while( pChunk[i
17130 5d 20 26 20 30 78 38 30 20 29 20 69 2b 2b 3b 0a  ] & 0x80 ) i++;.
17140 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
17150 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
17160 43 74 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Ctx->eState ){. 
17170 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
17180 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
17190 70 43 74 78 2d 3e 70 42 75 66 2c 20 26 70 43 68  pCtx->pBuf, &pCh
171a0 75 6e 6b 5b 69 53 74 61 72 74 5d 2c 20 69 2d 69  unk[iStart], i-i
171b0 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 7d 0a  Start);.      }.
171c0 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43 68 75        if( i<nChu
171d0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  nk ){.        in
171e0 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  t iCol;.        
171f0 69 53 74 61 72 74 20 3d 20 69 3b 0a 20 20 20 20  iStart = i;.    
17200 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
17210 20 69 66 28 20 69 3e 3d 6e 43 68 75 6e 6b 20 29   if( i>=nChunk )
17220 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 74 78  {.          pCtx
17230 2d 3e 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20  ->eState = 2;.  
17240 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17250 20 20 20 20 20 20 20 66 74 73 35 46 61 73 74 47         fts5FastG
17260 65 74 56 61 72 69 6e 74 33 32 28 70 43 68 75 6e  etVarint32(pChun
17270 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  k, i, iCol);.   
17280 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74         pCtx->eSt
17290 61 74 65 20 3d 20 66 74 73 35 49 6e 64 65 78 43  ate = fts5IndexC
172a0 6f 6c 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e  olsetTest(pCtx->
172b0 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 3b 0a  pColset, iCol);.
172c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
172d0 74 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  tx->eState ){.  
172e0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
172f0 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
17300 6f 62 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 26  ob(pCtx->pBuf, &
17310 70 43 68 75 6e 6b 5b 69 53 74 61 72 74 5d 2c 20  pChunk[iStart], 
17320 69 2d 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20  i-iStart);.     
17330 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
17340 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  i;.          }. 
17350 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
17360 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e  .    }while( i<n
17370 43 68 75 6e 6b 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  Chunk );.  }.}..
17380 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
17390 43 68 75 6e 6b 49 74 65 72 61 74 65 28 0a 20 20  ChunkIterate(.  
173a0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
173b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173c0 2f 2a 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  /* Index object 
173d0 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
173e0 20 2a 70 53 65 67 2c 20 20 20 20 20 20 20 20 20   *pSeg,         
173f0 20 20 20 20 20 2f 2a 20 50 6f 73 6c 69 73 74 20       /* Poslist 
17400 6f 66 20 74 68 69 73 20 69 74 65 72 61 74 6f 72  of this iterator
17410 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 74 78   */.  void *pCtx
17420 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17430 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
17440 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 78 43 68   pointer for xCh
17450 75 6e 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  unk callback */.
17460 20 20 76 6f 69 64 20 28 2a 78 43 68 75 6e 6b 29    void (*xChunk)
17470 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 76 6f 69  (Fts5Index*, voi
17480 64 2a 2c 20 63 6f 6e 73 74 20 75 38 2a 2c 20 69  d*, const u8*, i
17490 6e 74 29 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65  nt).){.  int nRe
174a0 6d 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 20  m = pSeg->nPos; 
174b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
174c0 65 72 20 6f 66 20 62 79 74 65 73 20 73 74 69 6c  er of bytes stil
174d0 6c 20 74 6f 20 63 6f 6d 65 20 2a 2f 0a 20 20 46  l to come */.  F
174e0 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 20 3d  ts5Data *pData =
174f0 20 30 3b 0a 20 20 75 38 20 2a 70 43 68 75 6e 6b   0;.  u8 *pChunk
17500 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d   = &pSeg->pLeaf-
17510 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  >p[pSeg->iLeafOf
17520 66 73 65 74 5d 3b 0a 20 20 69 6e 74 20 6e 43 68  fset];.  int nCh
17530 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20  unk = MIN(nRem, 
17540 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  pSeg->pLeaf->szL
17550 65 61 66 20 2d 20 70 53 65 67 2d 3e 69 4c 65 61  eaf - pSeg->iLea
17560 66 4f 66 66 73 65 74 29 3b 0a 20 20 69 6e 74 20  fOffset);.  int 
17570 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 69 4c 65  pgno = pSeg->iLe
17580 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 70 67  afPgno;.  int pg
17590 6e 6f 53 61 76 65 20 3d 20 30 3b 0a 0a 20 20 2f  noSave = 0;..  /
175a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
175b0 64 6f 65 73 20 6e 6f 74 6d 77 6f 72 6b 20 77 69  does notmwork wi
175c0 74 68 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 64  th detail=none d
175d0 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 61  atabases. */.  a
175e0 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69  ssert( p->pConfi
175f0 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35  g->eDetail!=FTS5
17600 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a  _DETAIL_NONE );.
17610 0a 20 20 69 66 28 20 28 70 53 65 67 2d 3e 66 6c  .  if( (pSeg->fl
17620 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
17630 45 52 5f 52 45 56 45 52 53 45 29 3d 3d 30 20 29  ER_REVERSE)==0 )
17640 7b 0a 20 20 20 20 70 67 6e 6f 53 61 76 65 20 3d  {.    pgnoSave =
17650 20 70 67 6e 6f 2b 31 3b 0a 20 20 7d 0a 0a 20 20   pgno+1;.  }..  
17660 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
17670 78 43 68 75 6e 6b 28 70 2c 20 70 43 74 78 2c 20  xChunk(p, pCtx, 
17680 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b  pChunk, nChunk);
17690 0a 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 43 68  .    nRem -= nCh
176a0 75 6e 6b 3b 0a 20 20 20 20 66 74 73 35 44 61 74  unk;.    fts5Dat
176b0 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b  aRelease(pData);
176c0 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3c 3d 30  .    if( nRem<=0
176d0 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
176e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
176f0 20 20 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20    pgno++;.      
17700 70 44 61 74 61 20 3d 20 66 74 73 35 4c 65 61 66  pData = fts5Leaf
17710 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47  Read(p, FTS5_SEG
17720 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
17730 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70  >pSeg->iSegid, p
17740 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28  gno));.      if(
17750 20 70 44 61 74 61 3d 3d 30 20 29 20 62 72 65 61   pData==0 ) brea
17760 6b 3b 0a 20 20 20 20 20 20 70 43 68 75 6e 6b 20  k;.      pChunk 
17770 3d 20 26 70 44 61 74 61 2d 3e 70 5b 34 5d 3b 0a  = &pData->p[4];.
17780 20 20 20 20 20 20 6e 43 68 75 6e 6b 20 3d 20 4d        nChunk = M
17790 49 4e 28 6e 52 65 6d 2c 20 70 44 61 74 61 2d 3e  IN(nRem, pData->
177a0 73 7a 4c 65 61 66 20 2d 20 34 29 3b 0a 20 20 20  szLeaf - 4);.   
177b0 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 70 67 6e     if( pgno==pgn
177c0 6f 53 61 76 65 20 29 7b 0a 20 20 20 20 20 20 20  oSave ){.       
177d0 20 61 73 73 65 72 74 28 20 70 53 65 67 2d 3e 70   assert( pSeg->p
177e0 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20  NextLeaf==0 );. 
177f0 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70 4e 65         pSeg->pNe
17800 78 74 4c 65 61 66 20 3d 20 70 44 61 74 61 3b 0a  xtLeaf = pData;.
17810 20 20 20 20 20 20 20 20 70 44 61 74 61 20 3d 20          pData = 
17820 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
17830 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74  .  }.}../*.** It
17840 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75 72  erator pIter cur
17850 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
17860 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 28   a valid entry (
17870 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69 73 0a 2a  not EOF). This.*
17880 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e  * function appen
17890 64 73 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  ds the position 
178a0 6c 69 73 74 20 64 61 74 61 20 66 6f 72 20 74 68  list data for th
178b0 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  e current entry 
178c0 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75  to.** buffer pBu
178d0 66 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 6d  f. It does not m
178e0 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
178f0 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
17900 73 69 7a 65 0a 2a 2a 20 66 69 65 6c 64 2e 0a 2a  size.** field..*
17910 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
17920 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74  s5SegiterPoslist
17930 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
17940 2c 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  ,.  Fts5SegIter 
17950 2a 70 53 65 67 2c 0a 20 20 46 74 73 35 43 6f 6c  *pSeg,.  Fts5Col
17960 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 0a 20 20  set *pColset,.  
17970 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
17980 0a 29 7b 0a 20 20 69 66 28 20 30 3d 3d 66 74 73  .){.  if( 0==fts
17990 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e  5BufferGrow(&p->
179a0 72 63 2c 20 70 42 75 66 2c 20 70 53 65 67 2d 3e  rc, pBuf, pSeg->
179b0 6e 50 6f 73 29 20 29 7b 0a 20 20 20 20 69 66 28  nPos) ){.    if(
179c0 20 70 43 6f 6c 73 65 74 3d 3d 30 20 29 7b 0a 20   pColset==0 ){. 
179d0 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74       fts5ChunkIt
179e0 65 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20 28  erate(p, pSeg, (
179f0 76 6f 69 64 2a 29 70 42 75 66 2c 20 66 74 73 35  void*)pBuf, fts5
17a00 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 29  PoslistCallback)
17a10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17a20 20 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69     if( p->pConfi
17a30 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  g->eDetail==FTS5
17a40 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a  _DETAIL_FULL ){.
17a50 20 20 20 20 20 20 20 20 50 6f 73 6c 69 73 74 43          PoslistC
17a60 61 6c 6c 62 61 63 6b 43 74 78 20 73 43 74 78 3b  allbackCtx sCtx;
17a70 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 70 42  .        sCtx.pB
17a80 75 66 20 3d 20 70 42 75 66 3b 0a 20 20 20 20 20  uf = pBuf;.     
17a90 20 20 20 73 43 74 78 2e 70 43 6f 6c 73 65 74 20     sCtx.pColset 
17aa0 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20 20  = pColset;.     
17ab0 20 20 20 73 43 74 78 2e 65 53 74 61 74 65 20 3d     sCtx.eState =
17ac0 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74   fts5IndexColset
17ad0 54 65 73 74 28 70 43 6f 6c 73 65 74 2c 20 30 29  Test(pColset, 0)
17ae0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
17af0 28 20 73 43 74 78 2e 65 53 74 61 74 65 3d 3d 30  ( sCtx.eState==0
17b00 20 7c 7c 20 73 43 74 78 2e 65 53 74 61 74 65 3d   || sCtx.eState=
17b10 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 66 74  =1 );.        ft
17b20 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70  s5ChunkIterate(p
17b30 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 26  , pSeg, (void*)&
17b40 73 43 74 78 2c 20 66 74 73 35 50 6f 73 6c 69 73  sCtx, fts5Poslis
17b50 74 46 69 6c 74 65 72 43 61 6c 6c 62 61 63 6b 29  tFilterCallback)
17b60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17b70 20 20 20 20 20 20 20 50 6f 73 6c 69 73 74 4f 66         PoslistOf
17b80 66 73 65 74 73 43 74 78 20 73 43 74 78 3b 0a 20  fsetsCtx sCtx;. 
17b90 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73         memset(&s
17ba0 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Ctx, 0, sizeof(s
17bb0 43 74 78 29 29 3b 0a 20 20 20 20 20 20 20 20 73  Ctx));.        s
17bc0 43 74 78 2e 70 42 75 66 20 3d 20 70 42 75 66 3b  Ctx.pBuf = pBuf;
17bd0 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 70 43  .        sCtx.pC
17be0 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b  olset = pColset;
17bf0 0a 20 20 20 20 20 20 20 20 66 74 73 35 43 68 75  .        fts5Chu
17c00 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65  nkIterate(p, pSe
17c10 67 2c 20 28 76 6f 69 64 2a 29 26 73 43 74 78 2c  g, (void*)&sCtx,
17c20 20 66 74 73 35 50 6f 73 6c 69 73 74 4f 66 66 73   fts5PoslistOffs
17c30 65 74 73 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  etsCallback);.  
17c40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17c50 7d 0a 0a 2f 2a 0a 2a 2a 20 49 4e 2f 4f 55 54 20  }../*.** IN/OUT 
17c60 70 61 72 61 6d 65 74 65 72 20 28 2a 70 61 29 20  parameter (*pa) 
17c70 70 6f 69 6e 74 73 20 74 6f 20 61 20 70 6f 73 69  points to a posi
17c80 74 69 6f 6e 20 6c 69 73 74 20 6e 20 62 79 74 65  tion list n byte
17c90 73 20 69 6e 20 73 69 7a 65 2e 20 49 66 0a 2a 2a  s in size. If.**
17ca0 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
17cb0 73 74 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72  st contains entr
17cc0 69 65 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69  ies for column i
17cd0 43 6f 6c 2c 20 74 68 65 6e 20 28 2a 70 61 29 20  Col, then (*pa) 
17ce0 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20 70 6f 69  is set.** to poi
17cf0 6e 74 20 74 6f 20 74 68 65 20 73 75 62 2d 70 6f  nt to the sub-po
17d00 73 69 74 69 6f 6e 2d 6c 69 73 74 20 66 6f 72 20  sition-list for 
17d10 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 6e 64 20  that column and 
17d20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
17d30 20 62 79 74 65 73 20 69 6e 20 69 74 20 72 65 74   bytes in it ret
17d40 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68  urned. Or, if th
17d50 65 20 61 72 67 75 6d 65 6e 74 20 70 6f 73 69 74  e argument posit
17d60 69 6f 6e 20 6c 69 73 74 20 64 6f 65 73 20 6e 6f  ion list does no
17d70 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 6e 79  t.** contain any
17d80 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63 6f 6c   entries for col
17d90 75 6d 6e 20 69 43 6f 6c 2c 20 72 65 74 75 72 6e  umn iCol, return
17da0 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
17db0 74 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61  t fts5IndexExtra
17dc0 63 74 43 6f 6c 28 0a 20 20 63 6f 6e 73 74 20 75  ctCol(.  const u
17dd0 38 20 2a 2a 70 61 2c 20 20 20 20 20 20 20 20 20  8 **pa,         
17de0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
17df0 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70  UT: Pointer to p
17e00 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  oslist */.  int 
17e10 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
17e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
17e30 4e 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73 6c 69  N: Size of posli
17e40 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  st in bytes */. 
17e50 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20   int iCol       
17e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e70 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 65 78   /* Column to ex
17e80 74 72 61 63 74 20 66 72 6f 6d 20 70 6f 73 6c 69  tract from posli
17e90 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  st */.){.  int i
17ea0 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20 20  Current = 0;    
17eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
17ec0 79 74 68 69 6e 67 20 62 65 66 6f 72 65 20 74 68  ything before th
17ed0 65 20 66 69 72 73 74 20 30 78 30 31 20 69 73 20  e first 0x01 is 
17ee0 63 6f 6c 20 30 20 2a 2f 0a 20 20 63 6f 6e 73 74  col 0 */.  const
17ef0 20 75 38 20 2a 70 20 3d 20 2a 70 61 3b 0a 20 20   u8 *p = *pa;.  
17f00 63 6f 6e 73 74 20 75 38 20 2a 70 45 6e 64 20 3d  const u8 *pEnd =
17f10 20 26 70 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20   &p[n];         
17f20 2f 2a 20 4f 6e 65 20 62 79 74 65 20 70 61 73 74  /* One byte past
17f30 20 65 6e 64 20 6f 66 20 70 6f 73 69 74 69 6f 6e   end of position
17f40 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 77 68 69 6c   list */..  whil
17f50 65 28 20 69 43 6f 6c 3e 69 43 75 72 72 65 6e 74  e( iCol>iCurrent
17f60 20 29 7b 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e   ){.    /* Advan
17f70 63 65 20 70 6f 69 6e 74 65 72 20 70 20 75 6e 74  ce pointer p unt
17f80 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  il it points to 
17f90 70 45 6e 64 20 6f 72 20 61 6e 20 30 78 30 31 20  pEnd or an 0x01 
17fa0 62 79 74 65 20 74 68 61 74 20 69 73 0a 20 20 20  byte that is.   
17fb0 20 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   ** not part of 
17fc0 61 20 76 61 72 69 6e 74 2e 20 4e 6f 74 65 20 74  a varint. Note t
17fd0 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  hat it is not po
17fe0 73 73 69 62 6c 65 20 66 6f 72 20 61 20 6e 65 67  ssible for a neg
17ff0 61 74 69 76 65 0a 20 20 20 20 2a 2a 20 6f 72 20  ative.    ** or 
18000 65 78 74 72 65 6d 65 6c 79 20 6c 61 72 67 65 20  extremely large 
18010 76 61 72 69 6e 74 20 74 6f 20 6f 63 63 75 72 20  varint to occur 
18020 77 69 74 68 69 6e 20 61 6e 20 75 6e 63 6f 72 72  within an uncorr
18030 75 70 74 65 64 20 70 6f 73 69 74 69 6f 6e 20 0a  upted position .
18040 20 20 20 20 2a 2a 20 6c 69 73 74 2e 20 53 6f 20      ** list. So 
18050 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66  the last byte of
18060 20 65 61 63 68 20 76 61 72 69 6e 74 20 6d 61 79   each varint may
18070 20 62 65 20 61 73 73 75 6d 65 64 20 74 6f 20 68   be assumed to h
18080 61 76 65 20 61 20 63 6c 65 61 72 0a 20 20 20 20  ave a clear.    
18090 2a 2a 20 30 78 38 30 20 62 69 74 2e 20 20 2a 2f  ** 0x80 bit.  */
180a0 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70 21 3d  .    while( *p!=
180b0 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 77 68  0x01 ){.      wh
180c0 69 6c 65 28 20 2a 70 2b 2b 20 26 20 30 78 38 30  ile( *p++ & 0x80
180d0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 3e   );.      if( p>
180e0 3d 70 45 6e 64 20 29 20 72 65 74 75 72 6e 20 30  =pEnd ) return 0
180f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 61 20  ;.    }.    *pa 
18100 3d 20 70 2b 2b 3b 0a 20 20 20 20 69 43 75 72 72  = p++;.    iCurr
18110 65 6e 74 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20 20  ent = *p++;.    
18120 69 66 28 20 69 43 75 72 72 65 6e 74 20 26 20 30  if( iCurrent & 0
18130 78 38 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 2d  x80 ){.      p--
18140 3b 0a 20 20 20 20 20 20 70 20 2b 3d 20 66 74 73  ;.      p += fts
18150 35 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20  5GetVarint32(p, 
18160 69 43 75 72 72 65 6e 74 29 3b 0a 20 20 20 20 7d  iCurrent);.    }
18170 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 21  .  }.  if( iCol!
18180 3d 69 43 75 72 72 65 6e 74 20 29 20 72 65 74 75  =iCurrent ) retu
18190 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 64 76 61  rn 0;..  /* Adva
181a0 6e 63 65 20 70 6f 69 6e 74 65 72 20 70 20 75 6e  nce pointer p un
181b0 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  til it points to
181c0 20 70 45 6e 64 20 6f 72 20 61 6e 20 30 78 30 31   pEnd or an 0x01
181d0 20 62 79 74 65 20 74 68 61 74 20 69 73 0a 20 20   byte that is.  
181e0 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  ** not part of a
181f0 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 77 68 69   varint */.  whi
18200 6c 65 28 20 70 3c 70 45 6e 64 20 26 26 20 2a 70  le( p<pEnd && *p
18210 21 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 77 68  !=0x01 ){.    wh
18220 69 6c 65 28 20 2a 70 2b 2b 20 26 20 30 78 38 30  ile( *p++ & 0x80
18230 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   );.  }..  retur
18240 6e 20 70 20 2d 20 28 2a 70 61 29 3b 0a 7d 0a 0a  n p - (*pa);.}..
18250 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
18260 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 73  IndexExtractCols
18270 65 74 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 0a  et(.  int *pRc,.
18280 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
18290 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  olset,          
182a0 20 20 2f 2a 20 43 6f 6c 73 65 74 20 74 6f 20 66    /* Colset to f
182b0 69 6c 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 63 6f  ilter on */.  co
182c0 6e 73 74 20 75 38 20 2a 70 50 6f 73 2c 20 69 6e  nst u8 *pPos, in
182d0 74 20 6e 50 6f 73 2c 20 20 20 20 20 20 20 2f 2a  t nPos,       /*
182e0 20 50 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a   Position list *
182f0 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
18300 70 42 75 66 20 20 20 20 20 20 20 20 20 20 20 20  pBuf            
18310 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
18320 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ffer */.){.  if(
18330 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
18340 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
18350 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
18360 6f 28 70 42 75 66 29 3b 0a 20 20 20 20 66 6f 72  o(pBuf);.    for
18370 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d  (i=0; i<pColset-
18380 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
18390 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 75     const u8 *pSu
183a0 62 20 3d 20 70 50 6f 73 3b 0a 20 20 20 20 20 20  b = pPos;.      
183b0 69 6e 74 20 6e 53 75 62 20 3d 20 66 74 73 35 49  int nSub = fts5I
183c0 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28 26  ndexExtractCol(&
183d0 70 53 75 62 2c 20 6e 50 6f 73 2c 20 70 43 6f 6c  pSub, nPos, pCol
183e0 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 29 3b 0a  set->aiCol[i]);.
183f0 20 20 20 20 20 20 69 66 28 20 6e 53 75 62 20 29        if( nSub )
18400 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  {.        fts5Bu
18410 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 70  fferAppendBlob(p
18420 52 63 2c 20 70 42 75 66 2c 20 6e 53 75 62 2c 20  Rc, pBuf, nSub, 
18430 70 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSub);.      }. 
18440 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
18450 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20 63 61  * xSetOutputs ca
18460 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 64  llback used by d
18470 65 74 61 69 6c 3d 6e 6f 6e 65 20 74 61 62 6c 65  etail=none table
18480 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
18490 64 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  d fts5IterSetOut
184a0 70 75 74 73 5f 4e 6f 6e 65 28 46 74 73 35 49 74  puts_None(Fts5It
184b0 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53  er *pIter, Fts5S
184c0 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 20  egIter *pSeg){. 
184d0 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
184e0 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d  pIndex->pConfig-
184f0 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44  >eDetail==FTS5_D
18500 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 20 20  ETAIL_NONE );.  
18510 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77  pIter->base.iRow
18520 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69  id = pSeg->iRowi
18530 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65  d;.  pIter->base
18540 2e 6e 44 61 74 61 20 3d 20 70 53 65 67 2d 3e 6e  .nData = pSeg->n
18550 50 6f 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53  Pos;.}../*.** xS
18560 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61  etOutputs callba
18570 63 6b 20 75 73 65 64 20 62 79 20 64 65 74 61 69  ck used by detai
18580 6c 3d 66 75 6c 6c 20 61 6e 64 20 64 65 74 61 69  l=full and detai
18590 6c 3d 63 6f 6c 20 74 61 62 6c 65 73 20 77 68 65  l=col tables whe
185a0 6e 20 6e 6f 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 66  n no.** column f
185b0 69 6c 74 65 72 73 20 61 72 65 20 73 70 65 63 69  ilters are speci
185c0 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fied..*/.static 
185d0 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65 74  void fts5IterSet
185e0 4f 75 74 70 75 74 73 5f 4e 6f 63 6f 6c 73 65 74  Outputs_Nocolset
185f0 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72  (Fts5Iter *pIter
18600 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
18610 53 65 67 29 7b 0a 20 20 70 49 74 65 72 2d 3e 62  Seg){.  pIter->b
18620 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65  ase.iRowid = pSe
18630 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70 49 74  g->iRowid;.  pIt
18640 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d  er->base.nData =
18650 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 0a 20 20   pSeg->nPos;..  
18660 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
18670 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e  Index->pConfig->
18680 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44 45  eDetail!=FTS5_DE
18690 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61  TAIL_NONE );.  a
186a0 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 43  ssert( pIter->pC
186b0 6f 6c 73 65 74 3d 3d 30 20 29 3b 0a 0a 20 20 69  olset==0 );..  i
186c0 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  f( pSeg->iLeafOf
186d0 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3c  fset+pSeg->nPos<
186e0 3d 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a  =pSeg->pLeaf->sz
186f0 4c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20 41  Leaf ){.    /* A
18700 6c 6c 20 64 61 74 61 20 69 73 20 73 74 6f 72 65  ll data is store
18710 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  d on the current
18720 20 70 61 67 65 2e 20 50 6f 70 75 6c 61 74 65 20   page. Populate 
18730 74 68 65 20 6f 75 74 70 75 74 20 0a 20 20 20 20  the output .    
18740 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20  ** variables to 
18750 70 6f 69 6e 74 20 69 6e 74 6f 20 74 68 65 20 62  point into the b
18760 6f 64 79 20 6f 66 20 74 68 65 20 70 61 67 65 20  ody of the page 
18770 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20 70  object. */.    p
18780 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61  Iter->base.pData
18790 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d   = &pSeg->pLeaf-
187a0 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  >p[pSeg->iLeafOf
187b0 66 73 65 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  fset];.  }else{.
187c0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20      /* The data 
187d0 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 6f  is distributed o
187e0 76 65 72 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ver two or more 
187f0 70 61 67 65 73 2e 20 43 6f 70 79 20 69 74 20 69  pages. Copy it i
18800 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 46  nto the.    ** F
18810 74 73 35 49 74 65 72 2e 70 6f 73 6c 69 73 74 20  ts5Iter.poslist 
18820 62 75 66 66 65 72 20 61 6e 64 20 74 68 65 6e 20  buffer and then 
18830 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 70  set the output p
18840 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 0a  ointer to point.
18850 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 62      ** to this b
18860 75 66 66 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66  uffer.  */.    f
18870 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
18880 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a  Iter->poslist);.
18890 20 20 20 20 66 74 73 35 53 65 67 69 74 65 72 50      fts5SegiterP
188a0 6f 73 6c 69 73 74 28 70 49 74 65 72 2d 3e 70 49  oslist(pIter->pI
188b0 6e 64 65 78 2c 20 70 53 65 67 2c 20 30 2c 20 26  ndex, pSeg, 0, &
188c0 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
188d0 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65  .    pIter->base
188e0 2e 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e  .pData = pIter->
188f0 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 7d 0a 7d  poslist.p;.  }.}
18900 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70  ../*.** xSetOutp
18910 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65  uts callback use
18920 64 20 77 68 65 6e 20 74 68 65 20 46 74 73 35 43  d when the Fts5C
18930 6f 6c 73 65 74 20 6f 62 6a 65 63 74 20 68 61 73  olset object has
18940 20 6e 43 6f 6c 3d 3d 30 20 28 6d 61 74 63 68 0a   nCol==0 (match.
18950 2a 2a 20 61 67 61 69 6e 73 74 20 6e 6f 20 63 6f  ** against no co
18960 6c 75 6d 6e 73 20 61 74 20 61 6c 6c 29 2e 0a 2a  lumns at all)..*
18970 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
18980 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
18990 5f 5a 65 72 6f 43 6f 6c 73 65 74 28 46 74 73 35  _ZeroColset(Fts5
189a0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73  Iter *pIter, Fts
189b0 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b  5SegIter *pSeg){
189c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  .  UNUSED_PARAM(
189d0 70 53 65 67 29 3b 0a 20 20 70 49 74 65 72 2d 3e  pSeg);.  pIter->
189e0 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 30 3b 0a  base.nData = 0;.
189f0 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74  }../*.** xSetOut
18a00 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73  puts callback us
18a10 65 64 20 62 79 20 64 65 74 61 69 6c 3d 63 6f 6c  ed by detail=col
18a20 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
18a30 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 0a 2a   column filter.*
18a40 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
18a50 31 30 30 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75  100 or more colu
18a60 6d 6e 73 2e 20 41 6c 73 6f 20 63 61 6c 6c 65 64  mns. Also called
18a70 20 61 73 20 61 20 66 61 6c 6c 62 61 63 6b 20 66   as a fallback f
18a80 72 6f 6d 0a 2a 2a 20 66 74 73 35 49 74 65 72 53  rom.** fts5IterS
18a90 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 31 30 30  etOutputs_Col100
18aa0 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 6c   if the column-l
18ab0 69 73 74 20 73 70 61 6e 73 20 6d 6f 72 65 20 74  ist spans more t
18ac0 68 61 6e 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f  han one page..*/
18ad0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
18ae0 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
18af0 43 6f 6c 28 46 74 73 35 49 74 65 72 20 2a 70 49  Col(Fts5Iter *pI
18b00 74 65 72 2c 20 46 74 73 35 53 65 67 49 74 65 72  ter, Fts5SegIter
18b10 20 2a 70 53 65 67 29 7b 0a 20 20 66 74 73 35 42   *pSeg){.  fts5B
18b20 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72  ufferZero(&pIter
18b30 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 66 74  ->poslist);.  ft
18b40 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74  s5SegiterPoslist
18b50 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
18b60 70 53 65 67 2c 20 70 49 74 65 72 2d 3e 70 43 6f  pSeg, pIter->pCo
18b70 6c 73 65 74 2c 20 26 70 49 74 65 72 2d 3e 70 6f  lset, &pIter->po
18b80 73 6c 69 73 74 29 3b 0a 20 20 70 49 74 65 72 2d  slist);.  pIter-
18b90 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70  >base.iRowid = p
18ba0 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70  Seg->iRowid;.  p
18bb0 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61  Iter->base.pData
18bc0 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73   = pIter->poslis
18bd0 74 2e 70 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61  t.p;.  pIter->ba
18be0 73 65 2e 6e 44 61 74 61 20 3d 20 70 49 74 65 72  se.nData = pIter
18bf0 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 7d 0a 0a  ->poslist.n;.}..
18c00 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74  /*.** xSetOutput
18c10 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  s callback used 
18c20 77 68 65 6e 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a  when: .**.**   *
18c30 20 64 65 74 61 69 6c 3d 63 6f 6c 2c 0a 2a 2a 20   detail=col,.** 
18c40 20 20 2a 20 74 68 65 72 65 20 69 73 20 61 20 63    * there is a c
18c50 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 2c 20 61 6e  olumn filter, an
18c60 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 74 61 62  d.**   * the tab
18c70 6c 65 20 63 6f 6e 74 61 69 6e 73 20 31 30 30 20  le contains 100 
18c80 6f 72 20 66 65 77 65 72 20 63 6f 6c 75 6d 6e 73  or fewer columns
18c90 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 61 73  . .**.** The las
18ca0 74 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 65 6e  t point is to en
18cb0 73 75 72 65 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20  sure all column 
18cc0 6e 75 6d 62 65 72 73 20 61 72 65 20 73 74 6f 72  numbers are stor
18cd0 65 64 20 61 73 20 0a 2a 2a 20 73 69 6e 67 6c 65  ed as .** single
18ce0 2d 62 79 74 65 20 76 61 72 69 6e 74 73 2e 0a 2a  -byte varints..*
18cf0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
18d00 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
18d10 5f 43 6f 6c 31 30 30 28 46 74 73 35 49 74 65 72  _Col100(Fts5Iter
18d20 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65 67   *pIter, Fts5Seg
18d30 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 0a 20 20  Iter *pSeg){..  
18d40 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
18d50 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e  Index->pConfig->
18d60 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
18d70 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20 29 3b 0a  TAIL_COLUMNS );.
18d80 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
18d90 3e 70 43 6f 6c 73 65 74 20 29 3b 0a 0a 20 20 69  >pColset );..  i
18da0 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  f( pSeg->iLeafOf
18db0 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3e  fset+pSeg->nPos>
18dc0 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  pSeg->pLeaf->szL
18dd0 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 49  eaf ){.    fts5I
18de0 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f  terSetOutputs_Co
18df0 6c 28 70 49 74 65 72 2c 20 70 53 65 67 29 3b 0a  l(pIter, pSeg);.
18e00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20    }else{.    u8 
18e10 2a 61 20 3d 20 28 75 38 2a 29 26 70 53 65 67 2d  *a = (u8*)&pSeg-
18e20 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e  >pLeaf->p[pSeg->
18e30 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20  iLeafOffset];.  
18e40 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 28 75 38    u8 *pEnd = (u8
18e50 2a 29 26 61 5b 70 53 65 67 2d 3e 6e 50 6f 73 5d  *)&a[pSeg->nPos]
18e60 3b 20 0a 20 20 20 20 69 6e 74 20 69 50 72 65 76  ; .    int iPrev
18e70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 2a 61   = 0;.    int *a
18e80 69 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 70 43  iCol = pIter->pC
18e90 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 3b 0a 20 20  olset->aiCol;.  
18ea0 20 20 69 6e 74 20 2a 61 69 43 6f 6c 45 6e 64 20    int *aiColEnd 
18eb0 3d 20 26 61 69 43 6f 6c 5b 70 49 74 65 72 2d 3e  = &aiCol[pIter->
18ec0 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 5d 3b 0a  pColset->nCol];.
18ed0 0a 20 20 20 20 75 38 20 2a 61 4f 75 74 20 3d 20  .    u8 *aOut = 
18ee0 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70  pIter->poslist.p
18ef0 3b 0a 20 20 20 20 69 6e 74 20 69 50 72 65 76 4f  ;.    int iPrevO
18f00 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 70 49 74  ut = 0;..    pIt
18f10 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20  er->base.iRowid 
18f20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a  = pSeg->iRowid;.
18f30 0a 20 20 20 20 77 68 69 6c 65 28 20 61 3c 70 45  .    while( a<pE
18f40 6e 64 20 29 7b 0a 20 20 20 20 20 20 69 50 72 65  nd ){.      iPre
18f50 76 20 2b 3d 20 28 69 6e 74 29 61 2b 2b 5b 30 5d  v += (int)a++[0]
18f60 20 2d 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c   - 2;.      whil
18f70 65 28 20 2a 61 69 43 6f 6c 3c 69 50 72 65 76 20  e( *aiCol<iPrev 
18f80 29 7b 0a 20 20 20 20 20 20 20 20 61 69 43 6f 6c  ){.        aiCol
18f90 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ++;.        if( 
18fa0 61 69 43 6f 6c 3d 3d 61 69 43 6f 6c 45 6e 64 20  aiCol==aiColEnd 
18fb0 29 20 67 6f 74 6f 20 73 65 74 6f 75 74 70 75 74  ) goto setoutput
18fc0 73 5f 63 6f 6c 5f 6f 75 74 3b 0a 20 20 20 20 20  s_col_out;.     
18fd0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 2a 61 69   }.      if( *ai
18fe0 43 6f 6c 3d 3d 69 50 72 65 76 20 29 7b 0a 20 20  Col==iPrev ){.  
18ff0 20 20 20 20 20 20 2a 61 4f 75 74 2b 2b 20 3d 20        *aOut++ = 
19000 28 75 38 29 28 28 69 50 72 65 76 20 2d 20 69 50  (u8)((iPrev - iP
19010 72 65 76 4f 75 74 29 20 2b 20 32 29 3b 0a 20 20  revOut) + 2);.  
19020 20 20 20 20 20 20 69 50 72 65 76 4f 75 74 20 3d        iPrevOut =
19030 20 69 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a   iPrev;.      }.
19040 20 20 20 20 7d 0a 0a 73 65 74 6f 75 74 70 75 74      }..setoutput
19050 73 5f 63 6f 6c 5f 6f 75 74 3a 0a 20 20 20 20 70  s_col_out:.    p
19060 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61  Iter->base.pData
19070 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73   = pIter->poslis
19080 74 2e 70 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  t.p;.    pIter->
19090 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 61 4f 75  base.nData = aOu
190a0 74 20 2d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  t - pIter->posli
190b0 73 74 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  st.p;.  }.}../*.
190c0 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20 63  ** xSetOutputs c
190d0 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20  allback used by 
190e0 64 65 74 61 69 6c 3d 66 75 6c 6c 20 77 68 65 6e  detail=full when
190f0 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6c 75   there is a colu
19100 6d 6e 20 66 69 6c 74 65 72 2e 0a 2a 2f 0a 73 74  mn filter..*/.st
19110 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74  atic void fts5It
19120 65 72 53 65 74 4f 75 74 70 75 74 73 5f 46 75 6c  erSetOutputs_Ful
19130 6c 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  l(Fts5Iter *pIte
19140 72 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  r, Fts5SegIter *
19150 70 53 65 67 29 7b 0a 20 20 46 74 73 35 43 6f 6c  pSeg){.  Fts5Col
19160 73 65 74 20 2a 70 43 6f 6c 73 65 74 20 3d 20 70  set *pColset = p
19170 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 3b 0a 20  Iter->pColset;. 
19180 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f   pIter->base.iRo
19190 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77  wid = pSeg->iRow
191a0 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  id;..  assert( p
191b0 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43  Iter->pIndex->pC
191c0 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
191d0 46 54 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c  FTS5_DETAIL_FULL
191e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
191f0 6f 6c 73 65 74 20 29 3b 0a 0a 20 20 69 66 28 20  olset );..  if( 
19200 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
19210 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53  t+pSeg->nPos<=pS
19220 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  eg->pLeaf->szLea
19230 66 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20  f ){.    /* All 
19240 64 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 6f  data is stored o
19250 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
19260 67 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  ge. Populate the
19270 20 6f 75 74 70 75 74 20 0a 20 20 20 20 2a 2a 20   output .    ** 
19280 76 61 72 69 61 62 6c 65 73 20 74 6f 20 70 6f 69  variables to poi
19290 6e 74 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79  nt into the body
192a0 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 62 6a   of the page obj
192b0 65 63 74 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  ect. */.    cons
192c0 74 20 75 38 20 2a 61 20 3d 20 26 70 53 65 67 2d  t u8 *a = &pSeg-
192d0 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e  >pLeaf->p[pSeg->
192e0 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20  iLeafOffset];.  
192f0 20 20 69 66 28 20 70 43 6f 6c 73 65 74 2d 3e 6e    if( pColset->n
19300 43 6f 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Col==1 ){.      
19310 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74  pIter->base.nDat
19320 61 20 3d 20 66 74 73 35 49 6e 64 65 78 45 78 74  a = fts5IndexExt
19330 72 61 63 74 43 6f 6c 28 26 61 2c 20 70 53 65 67  ractCol(&a, pSeg
19340 2d 3e 6e 50 6f 73 2c 70 43 6f 6c 73 65 74 2d 3e  ->nPos,pColset->
19350 61 69 43 6f 6c 5b 30 5d 29 3b 0a 20 20 20 20 20  aiCol[0]);.     
19360 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61   pIter->base.pDa
19370 74 61 20 3d 20 61 3b 0a 20 20 20 20 7d 65 6c 73  ta = a;.    }els
19380 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 70 52  e{.      int *pR
19390 63 20 3d 20 26 70 49 74 65 72 2d 3e 70 49 6e 64  c = &pIter->pInd
193a0 65 78 2d 3e 72 63 3b 0a 20 20 20 20 20 20 66 74  ex->rc;.      ft
193b0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49  s5BufferZero(&pI
193c0 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20  ter->poslist);. 
193d0 20 20 20 20 20 66 74 73 35 49 6e 64 65 78 45 78       fts5IndexEx
193e0 74 72 61 63 74 43 6f 6c 73 65 74 28 70 52 63 2c  tractColset(pRc,
193f0 20 70 43 6f 6c 73 65 74 2c 20 61 2c 20 70 53 65   pColset, a, pSe
19400 67 2d 3e 6e 50 6f 73 2c 20 26 70 49 74 65 72 2d  g->nPos, &pIter-
19410 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20  >poslist);.     
19420 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61   pIter->base.pDa
19430 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c  ta = pIter->posl
19440 69 73 74 2e 70 3b 0a 20 20 20 20 20 20 70 49 74  ist.p;.      pIt
19450 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d  er->base.nData =
19460 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
19470 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  n;.    }.  }else
19480 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74  {.    /* The dat
19490 61 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  a is distributed
194a0 20 6f 76 65 72 20 74 77 6f 20 6f 72 20 6d 6f 72   over two or mor
194b0 65 20 70 61 67 65 73 2e 20 43 6f 70 79 20 69 74  e pages. Copy it
194c0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a   into the.    **
194d0 20 46 74 73 35 49 74 65 72 2e 70 6f 73 6c 69 73   Fts5Iter.poslis
194e0 74 20 62 75 66 66 65 72 20 61 6e 64 20 74 68 65  t buffer and the
194f0 6e 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74  n set the output
19500 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e   pointer to poin
19510 74 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73  t.    ** to this
19520 20 62 75 66 66 65 72 2e 20 20 2a 2f 0a 20 20 20   buffer.  */.   
19530 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
19540 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
19550 3b 0a 20 20 20 20 66 74 73 35 53 65 67 69 74 65  ;.    fts5Segite
19560 72 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d 3e  rPoslist(pIter->
19570 70 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 70 43  pIndex, pSeg, pC
19580 6f 6c 73 65 74 2c 20 26 70 49 74 65 72 2d 3e 70  olset, &pIter->p
19590 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 70 49 74  oslist);.    pIt
195a0 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d  er->base.pData =
195b0 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
195c0 70 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61  p;.    pIter->ba
195d0 73 65 2e 6e 44 61 74 61 20 3d 20 70 49 74 65 72  se.nData = pIter
195e0 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 7d  ->poslist.n;.  }
195f0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
19600 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
19610 74 43 62 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  tCb(int *pRc, Ft
19620 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  s5Iter *pIter){.
19630 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
19640 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
19650 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
19660 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78   = pIter->pIndex
19670 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 69  ->pConfig;.    i
19680 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  f( pConfig->eDet
19690 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
196a0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70  _NONE ){.      p
196b0 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74  Iter->xSetOutput
196c0 73 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f  s = fts5IterSetO
196d0 75 74 70 75 74 73 5f 4e 6f 6e 65 3b 0a 20 20 20  utputs_None;.   
196e0 20 7d 0a 0a 20 20 20 20 65 6c 73 65 20 69 66 28   }..    else if(
196f0 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 3d   pIter->pColset=
19700 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  =0 ){.      pIte
19710 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d  r->xSetOutputs =
19720 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
19730 75 74 73 5f 4e 6f 63 6f 6c 73 65 74 3b 0a 20 20  uts_Nocolset;.  
19740 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65 20 69 66    }..    else if
19750 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74  ( pIter->pColset
19760 2d 3e 6e 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  ->nCol==0 ){.   
19770 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75     pIter->xSetOu
19780 74 70 75 74 73 20 3d 20 66 74 73 35 49 74 65 72  tputs = fts5Iter
19790 53 65 74 4f 75 74 70 75 74 73 5f 5a 65 72 6f 43  SetOutputs_ZeroC
197a0 6f 6c 73 65 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  olset;.    }..  
197b0 20 20 65 6c 73 65 20 69 66 28 20 70 43 6f 6e 66    else if( pConf
197c0 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
197d0 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 7b  5_DETAIL_FULL ){
197e0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53  .      pIter->xS
197f0 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35  etOutputs = fts5
19800 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 46  IterSetOutputs_F
19810 75 6c 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ull;.    }..    
19820 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
19830 72 74 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65  rt( pConfig->eDe
19840 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
19850 4c 5f 43 4f 4c 55 4d 4e 53 20 29 3b 0a 20 20 20  L_COLUMNS );.   
19860 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e     if( pConfig->
19870 6e 43 6f 6c 3c 3d 31 30 30 20 29 7b 0a 20 20 20  nCol<=100 ){.   
19880 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74       pIter->xSet
19890 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35 49 74  Outputs = fts5It
198a0 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c  erSetOutputs_Col
198b0 31 30 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  100;.        sql
198c0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69  ite3Fts5BufferSi
198d0 7a 65 28 70 52 63 2c 20 26 70 49 74 65 72 2d 3e  ze(pRc, &pIter->
198e0 70 6f 73 6c 69 73 74 2c 20 70 43 6f 6e 66 69 67  poslist, pConfig
198f0 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d  ->nCol);.      }
19900 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49  else{.        pI
19910 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73  ter->xSetOutputs
19920 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75   = fts5IterSetOu
19930 74 70 75 74 73 5f 43 6f 6c 3b 0a 20 20 20 20 20  tputs_Col;.     
19940 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
19950 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
19960 61 20 6e 65 77 20 46 74 73 35 49 74 65 72 20 6f  a new Fts5Iter o
19970 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bject..**.** The
19980 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c   new object will
19990 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72   be used to iter
199a0 61 74 65 20 74 68 72 6f 75 67 68 20 64 61 74 61  ate through data
199b0 20 69 6e 20 73 74 72 75 63 74 75 72 65 20 70 53   in structure pS
199c0 74 72 75 63 74 2e 0a 2a 2a 20 49 66 20 69 4c 65  truct..** If iLe
199d0 76 65 6c 20 69 73 20 2d 76 65 2c 20 74 68 65 6e  vel is -ve, then
199e0 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 61 6c 6c   all data in all
199f0 20 73 65 67 6d 65 6e 74 73 20 69 73 20 6d 65 72   segments is mer
19a00 67 65 64 2e 20 4f 72 2c 20 69 66 20 69 4c 65 76  ged. Or, if iLev
19a10 65 6c 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 6f 72  el.** is zero or
19a20 20 67 72 65 61 74 65 72 2c 20 64 61 74 61 20 66   greater, data f
19a30 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 6e 53  rom the first nS
19a40 65 67 6d 65 6e 74 20 73 65 67 6d 65 6e 74 73 20  egment segments 
19a50 6f 6e 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 0a  on level iLevel.
19a60 2a 2a 20 69 73 20 6d 65 72 67 65 64 2e 0a 2a 2a  ** is merged..**
19a70 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72  .** The iterator
19a80 20 69 6e 69 74 69 61 6c 6c 79 20 70 6f 69 6e 74   initially point
19a90 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 74  s to the first t
19aa0 65 72 6d 2f 72 6f 77 69 64 20 65 6e 74 72 79 20  erm/rowid entry 
19ab0 69 6e 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61  in the .** itera
19ac0 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61  ted data..*/.sta
19ad0 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
19ae0 74 69 49 74 65 72 4e 65 77 28 0a 20 20 46 74 73  tiIterNew(.  Fts
19af0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
19b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19b10 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20  FTS5 backend to 
19b20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a  iterate within *
19b30 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
19b40 65 20 2a 70 53 74 72 75 63 74 2c 20 20 20 20 20  e *pStruct,     
19b50 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65      /* Structure
19b60 20 6f 66 20 73 70 65 63 69 66 69 63 20 69 6e 64   of specific ind
19b70 65 78 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ex */.  int flag
19b80 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
19b90 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 49          /* FTS5I
19ba0 4e 44 45 58 5f 51 55 45 52 59 5f 58 58 58 20 66  NDEX_QUERY_XXX f
19bb0 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f  lags */.  Fts5Co
19bc0 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20  lset *pColset,  
19bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
19be0 73 65 74 20 74 6f 20 66 69 6c 74 65 72 20 6f 6e  set to filter on
19bf0 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20   (or NULL) */.  
19c00 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c  const u8 *pTerm,
19c10 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20   int nTerm,     
19c20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20  /* Term to seek 
19c30 74 6f 20 28 6f 72 20 4e 55 4c 4c 2f 30 29 20 2a  to (or NULL/0) *
19c40 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20  /.  int iLevel, 
19c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c60 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20      /* Level to 
19c70 69 74 65 72 61 74 65 20 28 2d 31 20 66 6f 72 20  iterate (-1 for 
19c80 61 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  all) */.  int nS
19c90 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 20 20 20  egment,         
19ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
19cb0 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
19cc0 74 6f 20 6d 65 72 67 65 20 28 69 4c 65 76 65 6c  to merge (iLevel
19cd0 3e 3d 30 29 20 2a 2f 0a 20 20 46 74 73 35 49 74  >=0) */.  Fts5It
19ce0 65 72 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20  er **ppOut      
19cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
19d00 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
19d10 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b 20 20 20  int nSeg = 0;   
19d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67  /* Number of seg
19d40 6d 65 6e 74 2d 69 74 65 72 73 20 69 6e 20 75 73  ment-iters in us
19d50 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 74 65 72  e */.  int iIter
19d60 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
19d70 20 20 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 69         /* */.  i
19d80 6e 74 20 69 53 65 67 3b 20 20 20 20 20 20 20 20  nt iSeg;        
19d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19da0 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
19db0 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e  e through segmen
19dc0 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ts */.  Fts5Stru
19dd0 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
19de0 3b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 4e  ;.  Fts5Iter *pN
19df0 65 77 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  ew;..  assert( (
19e00 70 54 65 72 6d 3d 3d 30 20 26 26 20 6e 54 65 72  pTerm==0 && nTer
19e10 6d 3d 3d 30 29 20 7c 7c 20 69 4c 65 76 65 6c 3c  m==0) || iLevel<
19e20 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  0 );..  /* Alloc
19e30 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
19e40 65 20 6e 65 77 20 6d 75 6c 74 69 2d 73 65 67 2d  e new multi-seg-
19e50 69 74 65 72 61 74 6f 72 2e 20 2a 2f 0a 20 20 69  iterator. */.  i
19e60 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
19e70 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 69  _OK ){.    if( i
19e80 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 20  Level<0 ){.     
19e90 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74   assert( pStruct
19ea0 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35  ->nSegment==fts5
19eb0 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65  StructureCountSe
19ec0 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29 20  gments(pStruct) 
19ed0 29 3b 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20  );.      nSeg = 
19ee0 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
19ef0 74 3b 0a 20 20 20 20 20 20 6e 53 65 67 20 2b 3d  t;.      nSeg +=
19f00 20 28 70 2d 3e 70 48 61 73 68 20 3f 20 31 20 3a   (p->pHash ? 1 :
19f10 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
19f20 20 20 20 20 20 20 6e 53 65 67 20 3d 20 4d 49 4e        nSeg = MIN
19f30 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  (pStruct->aLevel
19f40 5b 69 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c 20 6e  [iLevel].nSeg, n
19f50 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 7d 0a  Segment);.    }.
19f60 20 20 7d 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70    }.  *ppOut = p
19f70 4e 65 77 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  New = fts5MultiI
19f80 74 65 72 41 6c 6c 6f 63 28 70 2c 20 6e 53 65 67  terAlloc(p, nSeg
19f90 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
19fa0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4e 65   ) return;.  pNe
19fb0 77 2d 3e 62 52 65 76 20 3d 20 28 30 21 3d 28 66  w->bRev = (0!=(f
19fc0 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
19fd0 5f 51 55 45 52 59 5f 44 45 53 43 29 29 3b 0a 20  _QUERY_DESC));. 
19fe0 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74   pNew->bSkipEmpt
19ff0 79 20 3d 20 28 30 21 3d 28 66 6c 61 67 73 20 26  y = (0!=(flags &
1a000 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
1a010 5f 53 4b 49 50 45 4d 50 54 59 29 29 3b 0a 20 20  _SKIPEMPTY));.  
1a020 70 4e 65 77 2d 3e 70 53 74 72 75 63 74 20 3d 20  pNew->pStruct = 
1a030 70 53 74 72 75 63 74 3b 0a 20 20 70 4e 65 77 2d  pStruct;.  pNew-
1a040 3e 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73  >pColset = pCols
1a050 65 74 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  et;.  fts5Struct
1a060 75 72 65 52 65 66 28 70 53 74 72 75 63 74 29 3b  ureRef(pStruct);
1a070 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20  .  if( (flags & 
1a080 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
1a090 4e 4f 4f 55 54 50 55 54 29 3d 3d 30 20 29 7b 0a  NOOUTPUT)==0 ){.
1a0a0 20 20 20 20 66 74 73 35 49 74 65 72 53 65 74 4f      fts5IterSetO
1a0b0 75 74 70 75 74 43 62 28 26 70 2d 3e 72 63 2c 20  utputCb(&p->rc, 
1a0c0 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pNew);.  }..  /*
1a0d0 20 49 6e 69 74 69 61 6c 69 7a 65 20 65 61 63 68   Initialize each
1a0e0 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 6e 65 6e   of the componen
1a0f0 74 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74  t segment iterat
1a100 6f 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ors. */.  if( p-
1a110 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1a120 7b 0a 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c  {.    if( iLevel
1a130 3c 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  <0 ){.      Fts5
1a140 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
1a150 70 45 6e 64 20 3d 20 26 70 53 74 72 75 63 74 2d  pEnd = &pStruct-
1a160 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d  >aLevel[pStruct-
1a170 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 20 20  >nLevel];.      
1a180 69 66 28 20 70 2d 3e 70 48 61 73 68 20 29 7b 0a  if( p->pHash ){.
1a190 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61          /* Add a
1a1a0 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f   segment iterato
1a1b0 72 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  r for the curren
1a1c0 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  t contents of th
1a1d0 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f  e hash table. */
1a1e0 0a 20 20 20 20 20 20 20 20 46 74 73 35 53 65 67  .        Fts5Seg
1a1f0 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70  Iter *pIter = &p
1a200 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b  New->aSeg[iIter+
1a210 2b 5d 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  +];.        fts5
1a220 53 65 67 49 74 65 72 48 61 73 68 49 6e 69 74 28  SegIterHashInit(
1a230 70 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  p, pTerm, nTerm,
1a240 20 66 6c 61 67 73 2c 20 70 49 74 65 72 29 3b 0a   flags, pIter);.
1a250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
1a260 72 28 70 4c 76 6c 3d 26 70 53 74 72 75 63 74 2d  r(pLvl=&pStruct-
1a270 3e 61 4c 65 76 65 6c 5b 30 5d 3b 20 70 4c 76 6c  >aLevel[0]; pLvl
1a280 3c 70 45 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b 0a  <pEnd; pLvl++){.
1a290 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67          for(iSeg
1a2a0 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69  =pLvl->nSeg-1; i
1a2b0 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b  Seg>=0; iSeg--){
1a2c0 0a 20 20 20 20 20 20 20 20 20 20 46 74 73 35 53  .          Fts5S
1a2d0 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
1a2e0 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61  *pSeg = &pLvl->a
1a2f0 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20  Seg[iSeg];.     
1a300 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72       Fts5SegIter
1a310 20 2a 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d   *pIter = &pNew-
1a320 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a  >aSeg[iIter++];.
1a330 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
1a340 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  erm==0 ){.      
1a350 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
1a360 72 49 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 70  rInit(p, pSeg, p
1a370 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Iter);.         
1a380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a390 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 53      fts5SegIterS
1a3a0 65 65 6b 49 6e 69 74 28 70 2c 20 70 54 65 72 6d  eekInit(p, pTerm
1a3b0 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20  , nTerm, flags, 
1a3c0 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20  pSeg, pIter);.  
1a3d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a3e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1a3f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 76  }else{.      pLv
1a400 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
1a410 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20  evel[iLevel];.  
1a420 20 20 20 20 66 6f 72 28 69 53 65 67 3d 6e 53 65      for(iSeg=nSe
1a430 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53  g-1; iSeg>=0; iS
1a440 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 66  eg--){.        f
1a450 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28 70  ts5SegIterInit(p
1a460 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  , &pLvl->aSeg[iS
1a470 65 67 5d 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67  eg], &pNew->aSeg
1a480 5b 69 49 74 65 72 2b 2b 5d 29 3b 0a 20 20 20 20  [iIter++]);.    
1a490 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
1a4a0 73 65 72 74 28 20 69 49 74 65 72 3d 3d 6e 53 65  sert( iIter==nSe
1a4b0 67 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  g );.  }..  /* I
1a4c0 66 20 74 68 65 20 61 62 6f 76 65 20 77 61 73 20  f the above was 
1a4d0 73 75 63 63 65 73 73 66 75 6c 2c 20 65 61 63 68  successful, each
1a4e0 20 63 6f 6d 70 6f 6e 65 6e 74 20 69 74 65 72 61   component itera
1a4f0 74 6f 72 73 20 6e 6f 77 20 70 6f 69 6e 74 73 20  tors now points 
1a500 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  .  ** to the fir
1a510 73 74 20 65 6e 74 72 79 20 69 6e 20 69 74 73 20  st entry in its 
1a520 73 65 67 6d 65 6e 74 2e 20 49 6e 20 74 68 69 73  segment. In this
1a530 20 63 61 73 65 20 69 6e 69 74 69 61 6c 69 7a 65   case initialize
1a540 20 74 68 65 20 0a 20 20 2a 2a 20 61 46 69 72 73   the .  ** aFirs
1a550 74 5b 5d 20 61 72 72 61 79 2e 20 4f 72 2c 20 69  t[] array. Or, i
1a560 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  f an error has o
1a570 63 63 75 72 72 65 64 2c 20 66 72 65 65 20 74 68  ccurred, free th
1a580 65 20 69 74 65 72 61 74 6f 72 0a 20 20 2a 2a 20  e iterator.  ** 
1a590 6f 62 6a 65 63 74 20 61 6e 64 20 73 65 74 20 74  object and set t
1a5a0 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
1a5b0 6c 65 20 74 6f 20 4e 55 4c 4c 2e 20 20 2a 2f 0a  le to NULL.  */.
1a5c0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1a5d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 6f  ITE_OK ){.    fo
1a5e0 72 28 69 49 74 65 72 3d 70 4e 65 77 2d 3e 6e 53  r(iIter=pNew->nS
1a5f0 65 67 2d 31 3b 20 69 49 74 65 72 3e 30 3b 20 69  eg-1; iIter>0; i
1a600 49 74 65 72 2d 2d 29 7b 0a 20 20 20 20 20 20 69  Iter--){.      i
1a610 6e 74 20 69 45 71 3b 0a 20 20 20 20 20 20 69 66  nt iEq;.      if
1a620 28 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c  ( (iEq = fts5Mul
1a630 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28  tiIterDoCompare(
1a640 70 4e 65 77 2c 20 69 49 74 65 72 29 29 20 29 7b  pNew, iIter)) ){
1a650 0a 20 20 20 20 20 20 20 20 46 74 73 35 53 65 67  .        Fts5Seg
1a660 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 4e  Iter *pSeg = &pN
1a670 65 77 2d 3e 61 53 65 67 5b 69 45 71 5d 3b 0a 20  ew->aSeg[iEq];. 
1a680 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
1a690 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 53  ==SQLITE_OK ) pS
1a6a0 65 67 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53 65  eg->xNext(p, pSe
1a6b0 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66  g, 0);.        f
1a6c0 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
1a6d0 6e 63 65 64 28 70 2c 20 70 4e 65 77 2c 20 69 45  nced(p, pNew, iE
1a6e0 71 2c 20 69 49 74 65 72 29 3b 0a 20 20 20 20 20  q, iIter);.     
1a6f0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73   }.    }.    fts
1a700 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66  5MultiIterSetEof
1a710 28 70 4e 65 77 29 3b 0a 20 20 20 20 66 74 73 35  (pNew);.    fts5
1a720 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53  AssertMultiIterS
1a730 65 74 75 70 28 70 2c 20 70 4e 65 77 29 3b 0a 0a  etup(p, pNew);..
1a740 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 62 53      if( pNew->bS
1a750 6b 69 70 45 6d 70 74 79 20 26 26 20 66 74 73 35  kipEmpty && fts5
1a760 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79  MultiIterIsEmpty
1a770 28 70 2c 20 70 4e 65 77 29 20 29 7b 0a 20 20 20  (p, pNew) ){.   
1a780 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
1a790 4e 65 78 74 28 70 2c 20 70 4e 65 77 2c 20 30 2c  Next(p, pNew, 0,
1a7a0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   0);.    }else i
1a7b0 66 28 20 70 4e 65 77 2d 3e 62 61 73 65 2e 62 45  f( pNew->base.bE
1a7c0 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 46  of==0 ){.      F
1a7d0 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
1a7e0 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 70   = &pNew->aSeg[p
1a7f0 4e 65 77 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  New->aFirst[1].i
1a800 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 70 4e  First];.      pN
1a810 65 77 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 28  ew->xSetOutputs(
1a820 70 4e 65 77 2c 20 70 53 65 67 29 3b 0a 20 20 20  pNew, pSeg);.   
1a830 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   }..  }else{.   
1a840 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
1a850 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 2a 70  ee(pNew);.    *p
1a860 70 4f 75 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  pOut = 0;.  }.}.
1a870 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e  ./*.** Create an
1a880 20 46 74 73 35 49 74 65 72 20 74 68 61 74 20 69   Fts5Iter that i
1a890 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68 20  terates through 
1a8a0 74 68 65 20 64 6f 63 6c 69 73 74 20 70 72 6f 76  the doclist prov
1a8b0 69 64 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73  ided.** as the s
1a8c0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
1a8d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1a8e0 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 32  ts5MultiIterNew2
1a8f0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1a900 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a910 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
1a920 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
1a930 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 44  ithin */.  Fts5D
1a940 61 74 61 20 2a 70 44 61 74 61 2c 20 20 20 20 20  ata *pData,     
1a950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
1a960 63 6c 69 73 74 20 74 6f 20 69 74 65 72 61 74 65  clist to iterate
1a970 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e   through */.  in
1a980 74 20 62 44 65 73 63 2c 20 20 20 20 20 20 20 20  t bDesc,        
1a990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a9a0 20 54 72 75 65 20 66 6f 72 20 64 65 73 63 65 6e   True for descen
1a9b0 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72  ding rowid order
1a9c0 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a   */.  Fts5Iter *
1a9d0 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 20 20  *ppOut          
1a9e0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a        /* New obj
1a9f0 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  ect */.){.  Fts5
1aa00 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e  Iter *pNew;.  pN
1aa10 65 77 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  ew = fts5MultiIt
1aa20 65 72 41 6c 6c 6f 63 28 70 2c 20 32 29 3b 0a 20  erAlloc(p, 2);. 
1aa30 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
1aa40 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
1aa50 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65  ter = &pNew->aSe
1aa60 67 5b 31 5d 3b 0a 0a 20 20 20 20 70 49 74 65 72  g[1];..    pIter
1aa70 2d 3e 66 6c 61 67 73 20 3d 20 46 54 53 35 5f 53  ->flags = FTS5_S
1aa80 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a  EGITER_ONETERM;.
1aa90 20 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e 73      if( pData->s
1aaa0 7a 4c 65 61 66 3e 30 20 29 7b 0a 20 20 20 20 20  zLeaf>0 ){.     
1aab0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
1aac0 70 44 61 74 61 3b 0a 20 20 20 20 20 20 70 49 74  pData;.      pIt
1aad0 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
1aae0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
1aaf0 70 44 61 74 61 2d 3e 70 2c 20 28 75 36 34 2a 29  pData->p, (u64*)
1ab00 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
1ab10 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45  .      pIter->iE
1ab20 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 44  ndofDoclist = pD
1ab30 61 74 61 2d 3e 6e 6e 3b 0a 20 20 20 20 20 20 70  ata->nn;.      p
1ab40 4e 65 77 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  New->aFirst[1].i
1ab50 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  First = 1;.     
1ab60 20 69 66 28 20 62 44 65 73 63 20 29 7b 0a 20 20   if( bDesc ){.  
1ab70 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 52 65 76        pNew->bRev
1ab80 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 49   = 1;.        pI
1ab90 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54  ter->flags |= FT
1aba0 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
1abb0 53 45 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  SE;.        fts5
1abc0 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e  SegIterReverseIn
1abd0 69 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  itPage(p, pIter)
1abe0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1abf0 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
1ac00 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
1ac10 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
1ac20 20 20 20 20 70 44 61 74 61 20 3d 20 30 3b 0a 20      pData = 0;. 
1ac30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ac40 70 4e 65 77 2d 3e 62 61 73 65 2e 62 45 6f 66 20  pNew->base.bEof 
1ac50 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  = 1;.    }.    f
1ac60 74 73 35 53 65 67 49 74 65 72 53 65 74 4e 65 78  ts5SegIterSetNex
1ac70 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20  t(p, pIter);..  
1ac80 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77 3b    *ppOut = pNew;
1ac90 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61  .  }..  fts5Data
1aca0 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a  Release(pData);.
1acb0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1acc0 74 72 75 65 20 69 66 20 74 68 65 20 69 74 65 72  true if the iter
1acd0 61 74 6f 72 20 69 73 20 61 74 20 45 4f 46 20 6f  ator is at EOF o
1ace0 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61  r if an error ha
1acf0 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 2a 2a 20  s occurred. .** 
1ad00 46 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  False otherwise.
1ad10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1ad20 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
1ad30 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
1ad40 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  s5Iter *pIter){.
1ad50 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20    assert( p->rc 
1ad60 0a 20 20 20 20 20 20 7c 7c 20 28 70 49 74 65 72  .      || (pIter
1ad70 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
1ad80 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
1ad90 5d 2e 70 4c 65 61 66 3d 3d 30 29 3d 3d 70 49 74  ].pLeaf==0)==pIt
1ada0 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20 0a 20  er->base.bEof . 
1adb0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d   );.  return (p-
1adc0 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d 3e 62 61  >rc || pIter->ba
1add0 73 65 2e 62 45 6f 66 29 3b 0a 7d 0a 0a 2f 2a 0a  se.bEof);.}../*.
1ade0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 6f  ** Return the ro
1adf0 77 69 64 20 6f 66 20 74 68 65 20 65 6e 74 72 79  wid of the entry
1ae00 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74   that the iterat
1ae10 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
1ae20 6e 74 73 0a 2a 2a 20 74 6f 2e 20 49 66 20 74 68  nts.** to. If th
1ae30 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74  e iterator point
1ae40 73 20 74 6f 20 45 4f 46 20 77 68 65 6e 20 74 68  s to EOF when th
1ae50 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1ae60 61 6c 6c 65 64 20 74 68 65 0a 2a 2a 20 72 65 73  alled the.** res
1ae70 75 6c 74 73 20 61 72 65 20 75 6e 64 65 66 69 6e  ults are undefin
1ae80 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ed..*/.static i6
1ae90 34 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52  4 fts5MultiIterR
1aea0 6f 77 69 64 28 46 74 73 35 49 74 65 72 20 2a 70  owid(Fts5Iter *p
1aeb0 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  Iter){.  assert(
1aec0 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49   pIter->aSeg[ pI
1aed0 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
1aee0 46 69 72 73 74 20 5d 2e 70 4c 65 61 66 20 29 3b  First ].pLeaf );
1aef0 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
1af00 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
1af10 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
1af20 2e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  .iRowid;.}../*.*
1af30 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61  * Move the itera
1af40 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  tor to the next 
1af50 65 6e 74 72 79 20 61 74 20 6f 72 20 66 6f 6c 6c  entry at or foll
1af60 6f 77 69 6e 67 20 69 4d 61 74 63 68 2e 0a 2a 2f  owing iMatch..*/
1af70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1af80 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72  5MultiIterNextFr
1af90 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  om(.  Fts5Index 
1afa0 2a 70 2c 20 0a 20 20 46 74 73 35 49 74 65 72 20  *p, .  Fts5Iter 
1afb0 2a 70 49 74 65 72 2c 20 0a 20 20 69 36 34 20 69  *pIter, .  i64 i
1afc0 4d 61 74 63 68 0a 29 7b 0a 20 20 77 68 69 6c 65  Match.){.  while
1afd0 28 20 31 20 29 7b 0a 20 20 20 20 69 36 34 20 69  ( 1 ){.    i64 i
1afe0 52 6f 77 69 64 3b 0a 20 20 20 20 66 74 73 35 4d  Rowid;.    fts5M
1aff0 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20  ultiIterNext(p, 
1b000 70 49 74 65 72 2c 20 31 2c 20 69 4d 61 74 63 68  pIter, 1, iMatch
1b010 29 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35 4d  );.    if( fts5M
1b020 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70  ultiIterEof(p, p
1b030 49 74 65 72 29 20 29 20 62 72 65 61 6b 3b 0a 20  Iter) ) break;. 
1b040 20 20 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35     iRowid = fts5
1b050 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70  MultiIterRowid(p
1b060 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Iter);.    if( p
1b070 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20 26 26  Iter->bRev==0 &&
1b080 20 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20   iRowid>=iMatch 
1b090 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
1b0a0 20 70 49 74 65 72 2d 3e 62 52 65 76 21 3d 30 20   pIter->bRev!=0 
1b0b0 26 26 20 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63  && iRowid<=iMatc
1b0c0 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d  h ) break;.  }.}
1b0d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1b0e0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75   pointer to a bu
1b0f0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
1b100 74 68 65 20 74 65 72 6d 20 61 73 73 6f 63 69 61  the term associa
1b110 74 65 64 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  ted with the .**
1b120 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
1b130 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74  iterator current
1b140 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f  ly points to..*/
1b150 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38  .static const u8
1b160 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54   *fts5MultiIterT
1b170 65 72 6d 28 46 74 73 35 49 74 65 72 20 2a 70 49  erm(Fts5Iter *pI
1b180 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20  ter, int *pn){. 
1b190 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 20   Fts5SegIter *p 
1b1a0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  = &pIter->aSeg[ 
1b1b0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
1b1c0 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 2a 70 6e  .iFirst ];.  *pn
1b1d0 20 3d 20 70 2d 3e 74 65 72 6d 2e 6e 3b 0a 20 20   = p->term.n;.  
1b1e0 72 65 74 75 72 6e 20 70 2d 3e 74 65 72 6d 2e 70  return p->term.p
1b1f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
1b200 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e  ate a new segmen
1b210 74 2d 69 64 20 66 6f 72 20 74 68 65 20 73 74 72  t-id for the str
1b220 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 20  ucture pStruct. 
1b230 54 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 0a  The new segment.
1b240 2a 2a 20 69 64 20 6d 75 73 74 20 62 65 20 62 65  ** id must be be
1b250 74 77 65 65 6e 20 31 20 61 6e 64 20 36 35 33 33  tween 1 and 6533
1b260 35 20 69 6e 63 6c 75 73 69 76 65 2c 20 61 6e 64  5 inclusive, and
1b270 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 75 73 65   must not be use
1b280 64 20 62 79 20 0a 2a 2a 20 61 6e 79 20 63 75 72  d by .** any cur
1b290 72 65 6e 74 6c 79 20 65 78 69 73 74 69 6e 67 20  rently existing 
1b2a0 73 65 67 6d 65 6e 74 2e 20 49 66 20 61 20 66 72  segment. If a fr
1b2b0 65 65 20 73 65 67 6d 65 6e 74 20 69 64 20 63 61  ee segment id ca
1b2c0 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 0a 2a  nnot be found,.*
1b2d0 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 69 73  * SQLITE_FULL is
1b2e0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1b2f0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
1b300 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
1b310 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
1b320 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 30 20 69   is a no-op. 0 i
1b330 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69  s .** returned i
1b340 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
1b350 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 41  static int fts5A
1b360 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 46 74 73  llocateSegid(Fts
1b370 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
1b380 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
1b390 74 29 7b 0a 20 20 69 6e 74 20 69 53 65 67 69 64  t){.  int iSegid
1b3a0 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   = 0;..  if( p->
1b3b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b3c0 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74  .    if( pStruct
1b3d0 2d 3e 6e 53 65 67 6d 65 6e 74 3e 3d 46 54 53 35  ->nSegment>=FTS5
1b3e0 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20 29 7b 0a  _MAX_SEGMENT ){.
1b3f0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
1b400 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
1b410 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 46  else{.      /* F
1b420 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20  TS5_MAX_SEGMENT 
1b430 69 73 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66  is currently def
1b440 69 6e 65 64 20 61 73 20 32 30 30 30 2e 20 53 6f  ined as 2000. So
1b450 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
1b460 20 20 20 20 20 2a 2a 20 61 72 72 61 79 20 69 73       ** array is
1b470 20 36 33 20 65 6c 65 6d 65 6e 74 73 2c 20 6f 72   63 elements, or
1b480 20 32 35 32 20 62 79 74 65 73 2c 20 69 6e 20 73   252 bytes, in s
1b490 69 7a 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 75  ize.  */.      u
1b4a0 33 32 20 61 55 73 65 64 5b 28 46 54 53 35 5f 4d  32 aUsed[(FTS5_M
1b4b0 41 58 5f 53 45 47 4d 45 4e 54 2b 33 31 29 20 2f  AX_SEGMENT+31) /
1b4c0 20 33 32 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20   32];.      int 
1b4d0 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20  iLvl, iSeg;.    
1b4e0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 75    int i;.      u
1b4f0 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 6d  32 mask;.      m
1b500 65 6d 73 65 74 28 61 55 73 65 64 2c 20 30 2c 20  emset(aUsed, 0, 
1b510 73 69 7a 65 6f 66 28 61 55 73 65 64 29 29 3b 0a  sizeof(aUsed));.
1b520 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30        for(iLvl=0
1b530 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ; iLvl<pStruct->
1b540 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
1b550 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65  .        for(iSe
1b560 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63  g=0; iSeg<pStruc
1b570 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
1b580 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20  nSeg; iSeg++){. 
1b590 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 49 64           int iId
1b5a0 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76   = pStruct->aLev
1b5b0 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53  el[iLvl].aSeg[iS
1b5c0 65 67 5d 2e 69 53 65 67 69 64 3b 0a 20 20 20 20  eg].iSegid;.    
1b5d0 20 20 20 20 20 20 69 66 28 20 69 49 64 3c 3d 46        if( iId<=F
1b5e0 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20  TS5_MAX_SEGMENT 
1b5f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
1b600 55 73 65 64 5b 28 69 49 64 2d 31 29 20 2f 20 33  Used[(iId-1) / 3
1b610 32 5d 20 7c 3d 20 28 75 33 32 29 31 20 3c 3c 20  2] |= (u32)1 << 
1b620 28 28 69 49 64 2d 31 29 20 25 20 33 32 29 3b 0a  ((iId-1) % 32);.
1b630 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b640 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
1b650 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 55       for(i=0; aU
1b660 73 65 64 5b 69 5d 3d 3d 30 78 46 46 46 46 46 46  sed[i]==0xFFFFFF
1b670 46 46 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 20 20  FF; i++);.      
1b680 6d 61 73 6b 20 3d 20 61 55 73 65 64 5b 69 5d 3b  mask = aUsed[i];
1b690 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 69  .      for(iSegi
1b6a0 64 3d 30 3b 20 6d 61 73 6b 20 26 20 28 28 75 33  d=0; mask & ((u3
1b6b0 32 29 31 20 3c 3c 20 69 53 65 67 69 64 29 3b 20  2)1 << iSegid); 
1b6c0 69 53 65 67 69 64 2b 2b 29 3b 0a 20 20 20 20 20  iSegid++);.     
1b6d0 20 69 53 65 67 69 64 20 2b 3d 20 31 20 2b 20 69   iSegid += 1 + i
1b6e0 2a 33 32 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  *32;..#ifdef SQL
1b6f0 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
1b700 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
1b710 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
1b720 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
1b730 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
1b740 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65  Seg<pStruct->aLe
1b750 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20  vel[iLvl].nSeg; 
1b760 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
1b770 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 53     assert_nc( iS
1b780 65 67 69 64 21 3d 70 53 74 72 75 63 74 2d 3e 61  egid!=pStruct->a
1b790 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67  Level[iLvl].aSeg
1b7a0 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 20 29 3b  [iSeg].iSegid );
1b7b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b7c0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f   }.      assert_
1b7d0 6e 63 28 20 69 53 65 67 69 64 3e 30 20 26 26 20  nc( iSegid>0 && 
1b7e0 69 53 65 67 69 64 3c 3d 46 54 53 35 5f 4d 41 58  iSegid<=FTS5_MAX
1b7f0 5f 53 45 47 4d 45 4e 54 20 29 3b 0a 0a 20 20 20  _SEGMENT );..   
1b800 20 20 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c     {.        sql
1b810 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 53  ite3_stmt *pIdxS
1b820 65 6c 65 63 74 20 3d 20 66 74 73 35 49 64 78 53  elect = fts5IdxS
1b830 65 6c 65 63 74 53 74 6d 74 28 70 29 3b 0a 20 20  electStmt(p);.  
1b840 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1b850 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b860 20 20 20 20 20 20 20 20 75 38 20 61 42 6c 6f 62          u8 aBlob
1b870 5b 32 5d 20 3d 20 7b 30 78 66 66 2c 20 30 78 66  [2] = {0xff, 0xf
1b880 66 7d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  f};.          sq
1b890 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
1b8a0 49 64 78 53 65 6c 65 63 74 2c 20 31 2c 20 69 53  IdxSelect, 1, iS
1b8b0 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20  egid);.         
1b8c0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
1b8d0 6f 62 28 70 49 64 78 53 65 6c 65 63 74 2c 20 32  ob(pIdxSelect, 2
1b8e0 2c 20 61 42 6c 6f 62 2c 20 32 2c 20 53 51 4c 49  , aBlob, 2, SQLI
1b8f0 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
1b900 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
1b910 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49   sqlite3_step(pI
1b920 64 78 53 65 6c 65 63 74 29 21 3d 53 51 4c 49 54  dxSelect)!=SQLIT
1b930 45 5f 52 4f 57 20 29 3b 0a 20 20 20 20 20 20 20  E_ROW );.       
1b940 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
1b950 65 33 5f 72 65 73 65 74 28 70 49 64 78 53 65 6c  e3_reset(pIdxSel
1b960 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ect);.          
1b970 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
1b980 6c 28 70 49 64 78 53 65 6c 65 63 74 2c 20 32 29  l(pIdxSelect, 2)
1b990 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b9a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
1b9b0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69  .  }..  return i
1b9c0 53 65 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Segid;.}../*.** 
1b9d0 44 69 73 63 61 72 64 20 61 6c 6c 20 64 61 74 61  Discard all data
1b9e0 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65   currently cache
1b9f0 64 20 69 6e 20 74 68 65 20 68 61 73 68 2d 74 61  d in the hash-ta
1ba00 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bles..*/.static 
1ba10 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 44 69  void fts5IndexDi
1ba20 73 63 61 72 64 44 61 74 61 28 46 74 73 35 49 6e  scardData(Fts5In
1ba30 64 65 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  dex *p){.  asser
1ba40 74 28 20 70 2d 3e 70 48 61 73 68 20 7c 7c 20 70  t( p->pHash || p
1ba50 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d  ->nPendingData==
1ba60 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 48  0 );.  if( p->pH
1ba70 61 73 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ash ){.    sqlit
1ba80 65 33 46 74 73 35 48 61 73 68 43 6c 65 61 72 28  e3Fts5HashClear(
1ba90 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 70  p->pHash);.    p
1baa0 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d  ->nPendingData =
1bab0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
1bac0 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
1bad0 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 2c 20   of the prefix, 
1bae0 69 6e 20 62 79 74 65 73 2c 20 74 68 61 74 20 62  in bytes, that b
1baf0 75 66 66 65 72 20 0a 2a 2a 20 28 70 4e 65 77 2f  uffer .** (pNew/
1bb00 3c 6c 65 6e 67 74 68 2d 75 6e 6b 6e 6f 77 6e 3e  <length-unknown>
1bb10 29 20 73 68 61 72 65 73 20 77 69 74 68 20 62 75  ) shares with bu
1bb20 66 66 65 72 20 28 70 4f 6c 64 2f 6e 4f 6c 64 29  ffer (pOld/nOld)
1bb30 2e 0a 2a 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28  ..**.** Buffer (
1bb40 70 4e 65 77 2f 3c 6c 65 6e 67 74 68 2d 75 6e 6b  pNew/<length-unk
1bb50 6e 6f 77 6e 3e 29 20 69 73 20 67 75 61 72 61 6e  nown>) is guaran
1bb60 74 65 65 64 20 74 6f 20 62 65 20 67 72 65 61 74  teed to be great
1bb70 65 72 20 0a 2a 2a 20 74 68 61 6e 20 62 75 66 66  er .** than buff
1bb80 65 72 20 28 70 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a  er (pOld/nOld)..
1bb90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
1bba0 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73  s5PrefixCompress
1bbb0 28 69 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e 73 74  (int nOld, const
1bbc0 20 75 38 20 2a 70 4f 6c 64 2c 20 63 6f 6e 73 74   u8 *pOld, const
1bbd0 20 75 38 20 2a 70 4e 65 77 29 7b 0a 20 20 69 6e   u8 *pNew){.  in
1bbe0 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1bbf0 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
1bc00 20 20 69 66 28 20 70 4f 6c 64 5b 69 5d 21 3d 70    if( pOld[i]!=p
1bc10 4e 65 77 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a  New[i] ) break;.
1bc20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
1bc30 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
1bc40 74 73 35 57 72 69 74 65 44 6c 69 64 78 43 6c 65  ts5WriteDlidxCle
1bc50 61 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ar(.  Fts5Index 
1bc60 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
1bc70 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20  iter *pWriter,. 
1bc80 20 69 6e 74 20 62 46 6c 75 73 68 20 20 20 20 20   int bFlush     
1bc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bca0 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 77 72 69   /* If true, wri
1bcb0 74 65 20 64 6c 69 64 78 20 74 6f 20 64 69 73 6b  te dlidx to disk
1bcc0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
1bcd0 20 20 61 73 73 65 72 74 28 20 62 46 6c 75 73 68    assert( bFlush
1bce0 3d 3d 30 20 7c 7c 20 28 70 57 72 69 74 65 72 2d  ==0 || (pWriter-
1bcf0 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20 70 57 72  >nDlidx>0 && pWr
1bd00 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e  iter->aDlidx[0].
1bd10 62 75 66 2e 6e 3e 30 29 20 29 3b 0a 20 20 66 6f  buf.n>0) );.  fo
1bd20 72 28 69 3d 30 3b 20 69 3c 70 57 72 69 74 65 72  r(i=0; i<pWriter
1bd30 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a  ->nDlidx; i++){.
1bd40 20 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69      Fts5DlidxWri
1bd50 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70  ter *pDlidx = &p
1bd60 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69  Writer->aDlidx[i
1bd70 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64  ];.    if( pDlid
1bd80 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 20 62 72  x->buf.n==0 ) br
1bd90 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 46 6c  eak;.    if( bFl
1bda0 75 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ush ){.      ass
1bdb0 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 70 67 6e  ert( pDlidx->pgn
1bdc0 6f 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 74  o!=0 );.      ft
1bdd0 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a  s5DataWrite(p, .
1bde0 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44            FTS5_D
1bdf0 4c 49 44 58 5f 52 4f 57 49 44 28 70 57 72 69 74  LIDX_ROWID(pWrit
1be00 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70  er->iSegid, i, p
1be10 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20  Dlidx->pgno),.  
1be20 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e          pDlidx->
1be30 62 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62  buf.p, pDlidx->b
1be40 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20  uf.n.      );.  
1be50 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46    }.    sqlite3F
1be60 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
1be70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20 20  Dlidx->buf);.   
1be80 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61   pDlidx->bPrevVa
1be90 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  lid = 0;.  }.}..
1bea0 2f 2a 0a 2a 2a 20 47 72 6f 77 20 74 68 65 20 70  /*.** Grow the p
1beb0 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 5d  Writer->aDlidx[]
1bec0 20 61 72 72 61 79 20 74 6f 20 61 74 20 6c 65 61   array to at lea
1bed0 73 74 20 6e 4c 76 6c 20 65 6c 65 6d 65 6e 74 73  st nLvl elements
1bee0 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 41 6e 79   in size..** Any
1bef0 20 6e 65 77 20 61 72 72 61 79 20 65 6c 65 6d 65   new array eleme
1bf00 6e 74 73 20 61 72 65 20 7a 65 72 6f 65 64 20 62  nts are zeroed b
1bf10 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1bf20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1bf30 74 73 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f  ts5WriteDlidxGro
1bf40 77 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  w(.  Fts5Index *
1bf50 70 2c 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  p,.  Fts5SegWrit
1bf60 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69  er *pWriter,.  i
1bf70 6e 74 20 6e 4c 76 6c 0a 29 7b 0a 20 20 69 66 28  nt nLvl.){.  if(
1bf80 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1bf90 4b 20 26 26 20 6e 4c 76 6c 3e 3d 70 57 72 69 74  K && nLvl>=pWrit
1bfa0 65 72 2d 3e 6e 44 6c 69 64 78 20 29 7b 0a 20 20  er->nDlidx ){.  
1bfb0 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65    Fts5DlidxWrite
1bfc0 72 20 2a 61 44 6c 69 64 78 20 3d 20 28 46 74 73  r *aDlidx = (Fts
1bfd0 35 44 6c 69 64 78 57 72 69 74 65 72 2a 29 73 71  5DlidxWriter*)sq
1bfe0 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
1bff0 0a 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72  .        pWriter
1c000 2d 3e 61 44 6c 69 64 78 2c 20 73 69 7a 65 6f 66  ->aDlidx, sizeof
1c010 28 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72  (Fts5DlidxWriter
1c020 29 20 2a 20 6e 4c 76 6c 0a 20 20 20 20 29 3b 0a  ) * nLvl.    );.
1c030 20 20 20 20 69 66 28 20 61 44 6c 69 64 78 3d 3d      if( aDlidx==
1c040 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  0 ){.      p->rc
1c050 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1c060 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c070 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69    int nByte = si
1c080 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 57 72  zeof(Fts5DlidxWr
1c090 69 74 65 72 29 20 2a 20 28 6e 4c 76 6c 20 2d 20  iter) * (nLvl - 
1c0a0 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 29  pWriter->nDlidx)
1c0b0 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
1c0c0 61 44 6c 69 64 78 5b 70 57 72 69 74 65 72 2d 3e  aDlidx[pWriter->
1c0d0 6e 44 6c 69 64 78 5d 2c 20 30 2c 20 6e 42 79 74  nDlidx], 0, nByt
1c0e0 65 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65  e);.      pWrite
1c0f0 72 2d 3e 61 44 6c 69 64 78 20 3d 20 61 44 6c 69  r->aDlidx = aDli
1c100 64 78 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65  dx;.      pWrite
1c110 72 2d 3e 6e 44 6c 69 64 78 20 3d 20 6e 4c 76 6c  r->nDlidx = nLvl
1c120 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1c130 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f  turn p->rc;.}../
1c140 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
1c150 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  ent doclist-inde
1c160 78 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 69  x accumulating i
1c170 6e 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  n pWriter->aDlid
1c180 78 5b 5d 20 69 73 20 6c 61 72 67 65 0a 2a 2a 20  x[] is large.** 
1c190 65 6e 6f 75 67 68 2c 20 66 6c 75 73 68 20 69 74  enough, flush it
1c1a0 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 72 65 74   to disk and ret
1c1b0 75 72 6e 20 31 2e 20 4f 74 68 65 72 77 69 73 65  urn 1. Otherwise
1c1c0 20 64 69 73 63 61 72 64 20 69 74 20 61 6e 64 20   discard it and 
1c1d0 72 65 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f 2e 0a  return.** zero..
1c1e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
1c1f0 73 35 57 72 69 74 65 46 6c 75 73 68 44 6c 69 64  s5WriteFlushDlid
1c200 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  x(Fts5Index *p, 
1c210 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1c220 57 72 69 74 65 72 29 7b 0a 20 20 69 6e 74 20 62  Writer){.  int b
1c230 46 6c 61 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Flag = 0;..  /* 
1c240 49 66 20 74 68 65 72 65 20 77 65 72 65 20 46 54  If there were FT
1c250 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a  S5_MIN_DLIDX_SIZ
1c260 45 20 6f 72 20 6d 6f 72 65 20 65 6d 70 74 79 20  E or more empty 
1c270 6c 65 61 66 20 70 61 67 65 73 20 77 72 69 74 74  leaf pages writt
1c280 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64  en.  ** to the d
1c290 61 74 61 62 61 73 65 2c 20 61 6c 73 6f 20 77 72  atabase, also wr
1c2a0 69 74 65 20 74 68 65 20 64 6f 63 6c 69 73 74 2d  ite the doclist-
1c2b0 69 6e 64 65 78 20 74 6f 20 64 69 73 6b 2e 20 20  index to disk.  
1c2c0 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  */.  if( pWriter
1c2d0 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e  ->aDlidx[0].buf.
1c2e0 6e 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e  n>0 && pWriter->
1c2f0 6e 45 6d 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e  nEmpty>=FTS5_MIN
1c300 5f 44 4c 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20  _DLIDX_SIZE ){. 
1c310 20 20 20 62 46 6c 61 67 20 3d 20 31 3b 0a 20 20     bFlag = 1;.  
1c320 7d 0a 20 20 66 74 73 35 57 72 69 74 65 44 6c 69  }.  fts5WriteDli
1c330 64 78 43 6c 65 61 72 28 70 2c 20 70 57 72 69 74  dxClear(p, pWrit
1c340 65 72 2c 20 62 46 6c 61 67 29 3b 0a 20 20 70 57  er, bFlag);.  pW
1c350 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20  riter->nEmpty = 
1c360 30 3b 0a 20 20 72 65 74 75 72 6e 20 62 46 6c 61  0;.  return bFla
1c370 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  g;.}../*.** This
1c380 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1c390 6c 65 64 20 77 68 65 6e 65 76 65 72 20 70 72 6f  led whenever pro
1c3a0 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 64  cessing of the d
1c3b0 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65 20 0a  oclist for the .
1c3c0 2a 2a 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20  ** last term on 
1c3d0 6c 65 61 66 20 70 61 67 65 20 28 70 57 72 69 74  leaf page (pWrit
1c3e0 65 72 2d 3e 69 42 74 50 61 67 65 29 20 69 73 20  er->iBtPage) is 
1c3f0 63 6f 6d 70 6c 65 74 65 64 2e 20 0a 2a 2a 0a 2a  completed. .**.*
1c400 2a 20 54 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  * The doclist-in
1c410 64 65 78 20 66 6f 72 20 74 68 61 74 20 74 65 72  dex for that ter
1c420 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73  m is currently s
1c430 74 6f 72 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20  tored in-memory 
1c440 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 46 74  within the.** Ft
1c450 73 35 53 65 67 57 72 69 74 65 72 2e 61 44 6c 69  s5SegWriter.aDli
1c460 64 78 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 69  dx[] array. If i
1c470 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  t is large enoug
1c480 68 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  h, this function
1c490 0a 2a 2a 20 77 72 69 74 65 73 20 69 74 20 6f 75  .** writes it ou
1c4a0 74 20 74 6f 20 64 69 73 6b 2e 20 4f 72 2c 20 69  t to disk. Or, i
1c4b0 66 20 69 74 20 69 73 20 74 6f 6f 20 73 6d 61 6c  f it is too smal
1c4c0 6c 20 74 6f 20 62 6f 74 68 65 72 20 77 69 74 68  l to bother with
1c4d0 2c 20 64 69 73 63 61 72 64 73 0a 2a 2a 20 69 74  , discards.** it
1c4e0 2e 0a 2a 2a 0a 2a 2a 20 46 74 73 35 53 65 67 57  ..**.** Fts5SegW
1c4f0 72 69 74 65 72 2e 62 74 74 65 72 6d 20 63 75 72  riter.btterm cur
1c500 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20  rently contains 
1c510 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f  the first term o
1c520 6e 20 70 61 67 65 20 69 42 74 50 61 67 65 2e 0a  n page iBtPage..
1c530 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1c540 74 73 35 57 72 69 74 65 46 6c 75 73 68 42 74 72  ts5WriteFlushBtr
1c550 65 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ee(Fts5Index *p,
1c560 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1c570 70 57 72 69 74 65 72 29 7b 0a 20 20 69 6e 74 20  pWriter){.  int 
1c580 62 46 6c 61 67 3b 0a 0a 20 20 61 73 73 65 72 74  bFlag;..  assert
1c590 28 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61  ( pWriter->iBtPa
1c5a0 67 65 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 6e  ge || pWriter->n
1c5b0 45 6d 70 74 79 3d 3d 30 20 29 3b 0a 20 20 69 66  Empty==0 );.  if
1c5c0 28 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61  ( pWriter->iBtPa
1c5d0 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ge==0 ) return;.
1c5e0 20 20 62 46 6c 61 67 20 3d 20 66 74 73 35 57 72    bFlag = fts5Wr
1c5f0 69 74 65 46 6c 75 73 68 44 6c 69 64 78 28 70 2c  iteFlushDlidx(p,
1c600 20 70 57 72 69 74 65 72 29 3b 0a 0a 20 20 69 66   pWriter);..  if
1c610 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1c620 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OK ){.    const 
1c630 63 68 61 72 20 2a 7a 20 3d 20 28 70 57 72 69 74  char *z = (pWrit
1c640 65 72 2d 3e 62 74 74 65 72 6d 2e 6e 3e 30 3f 28  er->btterm.n>0?(
1c650 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 57 72 69  const char*)pWri
1c660 74 65 72 2d 3e 62 74 74 65 72 6d 2e 70 3a 22 22  ter->btterm.p:""
1c670 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  );.    /* The fo
1c680 6c 6c 6f 77 69 6e 67 20 77 61 73 20 61 6c 72 65  llowing was alre
1c690 61 64 79 20 64 6f 6e 65 20 69 6e 20 66 74 73 35  ady done in fts5
1c6a0 57 72 69 74 65 49 6e 69 74 28 29 3a 20 2a 2f 0a  WriteInit(): */.
1c6b0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 62      /* sqlite3_b
1c6c0 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57  ind_int(p->pIdxW
1c6d0 72 69 74 65 72 2c 20 31 2c 20 70 57 72 69 74 65  riter, 1, pWrite
1c6e0 72 2d 3e 69 53 65 67 69 64 29 3b 20 2a 2f 0a 20  r->iSegid); */. 
1c6f0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
1c700 62 6c 6f 62 28 70 2d 3e 70 49 64 78 57 72 69 74  blob(p->pIdxWrit
1c710 65 72 2c 20 32 2c 20 7a 2c 20 70 57 72 69 74 65  er, 2, z, pWrite
1c720 72 2d 3e 62 74 74 65 72 6d 2e 6e 2c 20 53 51 4c  r->btterm.n, SQL
1c730 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
1c740 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
1c750 74 36 34 28 70 2d 3e 70 49 64 78 57 72 69 74 65  t64(p->pIdxWrite
1c760 72 2c 20 33 2c 20 62 46 6c 61 67 20 2b 20 28 28  r, 3, bFlag + ((
1c770 69 36 34 29 70 57 72 69 74 65 72 2d 3e 69 42 74  i64)pWriter->iBt
1c780 50 61 67 65 3c 3c 31 29 29 3b 0a 20 20 20 20 73  Page<<1));.    s
1c790 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70  qlite3_step(p->p
1c7a0 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20 20 20  IdxWriter);.    
1c7b0 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
1c7c0 72 65 73 65 74 28 70 2d 3e 70 49 64 78 57 72 69  reset(p->pIdxWri
1c7d0 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ter);.    sqlite
1c7e0 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 2d 3e 70  3_bind_null(p->p
1c7f0 49 64 78 57 72 69 74 65 72 2c 20 32 29 3b 0a 20  IdxWriter, 2);. 
1c800 20 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42   }.  pWriter->iB
1c810 74 50 61 67 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  tPage = 0;.}../*
1c820 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
1c830 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
1c840 20 6c 65 61 66 20 70 61 67 65 20 65 78 63 65 70   leaf page excep
1c850 74 20 74 68 65 20 66 69 72 73 74 20 74 68 61 74  t the first that
1c860 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74 20   contains.** at 
1c870 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 20  least one term. 
1c880 41 72 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d 2f  Argument (nTerm/
1c890 70 54 65 72 6d 29 20 69 73 20 74 68 65 20 73 70  pTerm) is the sp
1c8a0 6c 69 74 2d 6b 65 79 20 2d 20 61 20 74 65 72 6d  lit-key - a term
1c8b0 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67   that.** is larg
1c8c0 65 72 20 74 68 61 6e 20 61 6c 6c 20 74 65 72 6d  er than all term
1c8d0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 65 61 72  s written to ear
1c8e0 6c 69 65 72 20 6c 65 61 76 65 73 2c 20 61 6e 64  lier leaves, and
1c8f0 20 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20   equal to or.** 
1c900 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
1c910 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74   first term on t
1c920 68 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a  he new leaf..**.
1c930 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1c940 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
1c950 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20  code is left in 
1c960 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 66  Fts5Index.rc. If
1c970 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61 73   an error.** has
1c980 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
1c990 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
1c9a0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
1c9b0 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
1c9c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1c9d0 73 35 57 72 69 74 65 42 74 72 65 65 54 65 72 6d  s5WriteBtreeTerm
1c9e0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1c9f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ca00 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
1ca10 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
1ca20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1ca30 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20  Writer,         
1ca40 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74  /* Writer object
1ca50 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c   */.  int nTerm,
1ca60 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
1ca70 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74        /* First t
1ca80 65 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65 20  erm on new page 
1ca90 2a 2f 0a 29 7b 0a 20 20 66 74 73 35 57 72 69 74  */.){.  fts5Writ
1caa0 65 46 6c 75 73 68 42 74 72 65 65 28 70 2c 20 70  eFlushBtree(p, p
1cab0 57 72 69 74 65 72 29 3b 0a 20 20 69 66 28 20 70  Writer);.  if( p
1cac0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1cad0 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  ){.    fts5Buffe
1cae0 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 57  rSet(&p->rc, &pW
1caf0 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2c 20 6e  riter->btterm, n
1cb00 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
1cb10 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61    pWriter->iBtPa
1cb20 67 65 20 3d 20 70 57 72 69 74 65 72 2d 3e 77 72  ge = pWriter->wr
1cb30 69 74 65 72 2e 70 67 6e 6f 3b 0a 20 20 7d 0a 7d  iter.pgno;.  }.}
1cb40 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1cb50 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1cb60 77 68 65 6e 20 66 6c 75 73 68 69 6e 67 20 61 20  when flushing a 
1cb70 6c 65 61 66 20 70 61 67 65 20 74 68 61 74 20 63  leaf page that c
1cb80 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 74 65  ontains no.** te
1cb90 72 6d 73 20 61 74 20 61 6c 6c 20 74 6f 20 64 69  rms at all to di
1cba0 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  sk..*/.static vo
1cbb0 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72 65  id fts5WriteBtre
1cbc0 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74 73 35 49  eNoTerm(.  Fts5I
1cbd0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
1cbe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
1cbf0 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
1cc00 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72  t */.  Fts5SegWr
1cc10 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 20 20  iter *pWriter   
1cc20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72         /* Writer
1cc30 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
1cc40 2f 2a 20 49 66 20 74 68 65 72 65 20 77 65 72 65  /* If there were
1cc50 20 6e 6f 20 72 6f 77 69 64 73 20 6f 6e 20 74 68   no rowids on th
1cc60 65 20 6c 65 61 66 20 70 61 67 65 20 65 69 74 68  e leaf page eith
1cc70 65 72 20 61 6e 64 20 74 68 65 20 64 6f 63 6c 69  er and the docli
1cc80 73 74 2d 69 6e 64 65 78 0a 20 20 2a 2a 20 68 61  st-index.  ** ha
1cc90 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  s already been s
1cca0 74 61 72 74 65 64 2c 20 61 70 70 65 6e 64 20 61  tarted, append a
1ccb0 6e 20 30 78 30 30 20 62 79 74 65 20 74 6f 20 69  n 0x00 byte to i
1ccc0 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 72  t.  */.  if( pWr
1ccd0 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
1cce0 64 49 6e 50 61 67 65 20 26 26 20 70 57 72 69 74  dInPage && pWrit
1ccf0 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75  er->aDlidx[0].bu
1cd00 66 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 46 74 73  f.n>0 ){.    Fts
1cd10 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44  5DlidxWriter *pD
1cd20 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d  lidx = &pWriter-
1cd30 3e 61 44 6c 69 64 78 5b 30 5d 3b 0a 20 20 20 20  >aDlidx[0];.    
1cd40 61 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e  assert( pDlidx->
1cd50 62 50 72 65 76 56 61 6c 69 64 20 29 3b 0a 20 20  bPrevValid );.  
1cd60 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1cd70 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1cd80 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d  &p->rc, &pDlidx-
1cd90 3e 62 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  >buf, 0);.  }.. 
1cda0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1cdb0 65 20 22 6e 75 6d 62 65 72 20 6f 66 20 73 65 71  e "number of seq
1cdc0 75 65 6e 74 69 61 6c 20 6c 65 61 76 65 73 20 77  uential leaves w
1cdd0 69 74 68 6f 75 74 20 61 20 74 65 72 6d 22 20 63  ithout a term" c
1cde0 6f 75 6e 74 65 72 2e 20 2a 2f 0a 20 20 70 57 72  ounter. */.  pWr
1cdf0 69 74 65 72 2d 3e 6e 45 6d 70 74 79 2b 2b 3b 0a  iter->nEmpty++;.
1ce00 7d 0a 0a 73 74 61 74 69 63 20 69 36 34 20 66 74  }..static i64 ft
1ce10 73 35 44 6c 69 64 78 45 78 74 72 61 63 74 46 69  s5DlidxExtractFi
1ce20 72 73 74 52 6f 77 69 64 28 46 74 73 35 42 75 66  rstRowid(Fts5Buf
1ce30 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20 69 36  fer *pBuf){.  i6
1ce40 34 20 69 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20  4 iRowid;.  int 
1ce50 69 4f 66 66 3b 0a 0a 20 20 69 4f 66 66 20 3d 20  iOff;..  iOff = 
1ce60 31 20 2b 20 66 74 73 35 47 65 74 56 61 72 69 6e  1 + fts5GetVarin
1ce70 74 28 26 70 42 75 66 2d 3e 70 5b 31 5d 2c 20 28  t(&pBuf->p[1], (
1ce80 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20  u64*)&iRowid);. 
1ce90 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
1cea0 70 42 75 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28  pBuf->p[iOff], (
1ceb0 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20  u64*)&iRowid);. 
1cec0 20 72 65 74 75 72 6e 20 69 52 6f 77 69 64 3b 0a   return iRowid;.
1ced0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64 20 69  }../*.** Rowid i
1cee0 52 6f 77 69 64 20 68 61 73 20 6a 75 73 74 20 62  Rowid has just b
1cef0 65 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20  een appended to 
1cf00 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
1cf10 20 70 61 67 65 2e 20 49 74 20 69 73 20 74 68 65   page. It is the
1cf20 0a 2a 2a 20 66 69 72 73 74 20 6f 6e 20 74 68 65  .** first on the
1cf30 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63   page. This func
1cf40 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 6e 20  tion appends an 
1cf50 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72  appropriate entr
1cf60 79 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  y to the current
1cf70 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  .** doclist-inde
1cf80 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
1cf90 64 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78  d fts5WriteDlidx
1cfa0 41 70 70 65 6e 64 28 0a 20 20 46 74 73 35 49 6e  Append(.  Fts5In
1cfb0 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
1cfc0 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
1cfd0 72 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64  r, .  i64 iRowid
1cfe0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
1cff0 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20  nt bDone = 0;.. 
1d000 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d   for(i=0; p->rc=
1d010 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44  =SQLITE_OK && bD
1d020 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  one==0; i++){.  
1d030 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20    i64 iVal;.    
1d040 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20  Fts5DlidxWriter 
1d050 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74  *pDlidx = &pWrit
1d060 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 0a  er->aDlidx[i];..
1d070 20 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e      if( pDlidx->
1d080 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69  buf.n>=p->pConfi
1d090 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20  g->pgsz ){.     
1d0a0 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   /* The current 
1d0b0 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 70 61  doclist-index pa
1d0c0 67 65 20 69 73 20 66 75 6c 6c 2e 20 57 72 69 74  ge is full. Writ
1d0d0 65 20 69 74 20 74 6f 20 64 69 73 6b 20 61 6e 64  e it to disk and
1d0e0 20 70 75 73 68 0a 20 20 20 20 20 20 2a 2a 20 61   push.      ** a
1d0f0 20 63 6f 70 79 20 6f 66 20 69 52 6f 77 69 64 20   copy of iRowid 
1d100 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f  (which will beco
1d110 6d 65 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  me the first row
1d120 69 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 0a 20  id on the next. 
1d130 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2d       ** doclist-
1d140 69 6e 64 65 78 20 6c 65 61 66 20 70 61 67 65 29  index leaf page)
1d150 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6e 65 78   up into the nex
1d160 74 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 62  t level of the b
1d170 2d 74 72 65 65 20 0a 20 20 20 20 20 20 2a 2a 20  -tree .      ** 
1d180 68 69 65 72 61 72 63 68 79 2e 20 49 66 20 74 68  hierarchy. If th
1d190 65 20 6e 6f 64 65 20 62 65 69 6e 67 20 66 6c 75  e node being flu
1d1a0 73 68 65 64 20 69 73 20 63 75 72 72 65 6e 74 6c  shed is currentl
1d1b0 79 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2c  y the root node,
1d1c0 0a 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 70  .      ** also p
1d1d0 75 73 68 20 69 74 73 20 66 69 72 73 74 20 72 6f  ush its first ro
1d1e0 77 69 64 20 75 70 77 61 72 64 73 2e 20 2a 2f 0a  wid upwards. */.
1d1f0 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75        pDlidx->bu
1d200 66 2e 70 5b 30 5d 20 3d 20 30 78 30 31 3b 20 20  f.p[0] = 0x01;  
1d210 20 20 2f 2a 20 4e 6f 74 20 74 68 65 20 72 6f 6f    /* Not the roo
1d220 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  t node */.      
1d230 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c  fts5DataWrite(p,
1d240 20 0a 20 20 20 20 20 20 20 20 20 20 46 54 53 35   .          FTS5
1d250 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 57 72  _DLIDX_ROWID(pWr
1d260 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c  iter->iSegid, i,
1d270 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a   pDlidx->pgno),.
1d280 20 20 20 20 20 20 20 20 20 20 70 44 6c 69 64 78            pDlidx
1d290 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d  ->buf.p, pDlidx-
1d2a0 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a  >buf.n.      );.
1d2b0 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 44        fts5WriteD
1d2c0 6c 69 64 78 47 72 6f 77 28 70 2c 20 70 57 72 69  lidxGrow(p, pWri
1d2d0 74 65 72 2c 20 69 2b 32 29 3b 0a 20 20 20 20 20  ter, i+2);.     
1d2e0 20 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74   pDlidx = &pWrit
1d2f0 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20  er->aDlidx[i];. 
1d300 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1d310 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 6c  SQLITE_OK && pDl
1d320 69 64 78 5b 31 5d 2e 62 75 66 2e 6e 3d 3d 30 20  idx[1].buf.n==0 
1d330 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  ){.        i64 i
1d340 46 69 72 73 74 20 3d 20 66 74 73 35 44 6c 69 64  First = fts5Dlid
1d350 78 45 78 74 72 61 63 74 46 69 72 73 74 52 6f 77  xExtractFirstRow
1d360 69 64 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29  id(&pDlidx->buf)
1d370 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
1d380 69 73 20 77 61 73 20 74 68 65 20 72 6f 6f 74 20  is was the root 
1d390 6e 6f 64 65 2e 20 50 75 73 68 20 69 74 73 20 66  node. Push its f
1d3a0 69 72 73 74 20 72 6f 77 69 64 20 75 70 20 74 6f  irst rowid up to
1d3b0 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2e 20 2a   the new root. *
1d3c0 2f 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64 78  /.        pDlidx
1d3d0 5b 31 5d 2e 70 67 6e 6f 20 3d 20 70 44 6c 69 64  [1].pgno = pDlid
1d3e0 78 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20  x->pgno;.       
1d3f0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1d400 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1d410 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31  p->rc, &pDlidx[1
1d420 5d 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20  ].buf, 0);.     
1d430 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1d440 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1d450 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
1d460 5b 31 5d 2e 62 75 66 2c 20 70 44 6c 69 64 78 2d  [1].buf, pDlidx-
1d470 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
1d480 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1d490 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1d4a0 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d  ->rc, &pDlidx[1]
1d4b0 2e 62 75 66 2c 20 69 46 69 72 73 74 29 3b 0a 20  .buf, iFirst);. 
1d4c0 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d         pDlidx[1]
1d4d0 2e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 31 3b  .bPrevValid = 1;
1d4e0 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b  .        pDlidx[
1d4f0 31 5d 2e 69 50 72 65 76 20 3d 20 69 46 69 72 73  1].iPrev = iFirs
1d500 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  t;.      }..    
1d510 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1d520 66 65 72 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d  ferZero(&pDlidx-
1d530 3e 62 75 66 29 3b 0a 20 20 20 20 20 20 70 44 6c  >buf);.      pDl
1d540 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20  idx->bPrevValid 
1d550 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 6c 69 64  = 0;.      pDlid
1d560 78 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d  x->pgno++;.    }
1d570 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 44 6f 6e  else{.      bDon
1d580 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 1;.    }..  
1d590 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 50    if( pDlidx->bP
1d5a0 72 65 76 56 61 6c 69 64 20 29 7b 0a 20 20 20 20  revValid ){.    
1d5b0 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64 20    iVal = iRowid 
1d5c0 2d 20 70 44 6c 69 64 78 2d 3e 69 50 72 65 76 3b  - pDlidx->iPrev;
1d5d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d5e0 20 20 69 36 34 20 69 50 67 6e 6f 20 3d 20 28 69    i64 iPgno = (i
1d5f0 3d 3d 30 20 3f 20 70 57 72 69 74 65 72 2d 3e 77  ==0 ? pWriter->w
1d600 72 69 74 65 72 2e 70 67 6e 6f 20 3a 20 70 44 6c  riter.pgno : pDl
1d610 69 64 78 5b 2d 31 5d 2e 70 67 6e 6f 29 3b 0a 20  idx[-1].pgno);. 
1d620 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 6c       assert( pDl
1d630 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 3b  idx->buf.n==0 );
1d640 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
1d650 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1d660 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44  rint(&p->rc, &pD
1d670 6c 69 64 78 2d 3e 62 75 66 2c 20 21 62 44 6f 6e  lidx->buf, !bDon
1d680 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
1d690 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
1d6a0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1d6b0 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69 50  &pDlidx->buf, iP
1d6c0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 56 61 6c  gno);.      iVal
1d6d0 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d   = iRowid;.    }
1d6e0 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ..    sqlite3Fts
1d6f0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1d700 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c  int(&p->rc, &pDl
1d710 69 64 78 2d 3e 62 75 66 2c 20 69 56 61 6c 29 3b  idx->buf, iVal);
1d720 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72  .    pDlidx->bPr
1d730 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  evValid = 1;.   
1d740 20 70 44 6c 69 64 78 2d 3e 69 50 72 65 76 20 3d   pDlidx->iPrev =
1d750 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 7d 0a 0a   iRowid;.  }.}..
1d760 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1d770 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 46  WriteFlushLeaf(F
1d780 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
1d790 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1d7a0 74 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ter){.  static c
1d7b0 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20 3d  onst u8 zero[] =
1d7c0 20 7b 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30   { 0x00, 0x00, 0
1d7d0 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20 46  x00, 0x00 };.  F
1d7e0 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
1d7f0 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
1d800 3e 77 72 69 74 65 72 3b 0a 20 20 69 36 34 20 69  >writer;.  i64 i
1d810 52 6f 77 69 64 3b 0a 0a 20 20 61 73 73 65 72 74  Rowid;..  assert
1d820 28 20 28 70 50 61 67 65 2d 3e 70 67 69 64 78 2e  ( (pPage->pgidx.
1d830 6e 3d 3d 30 29 3d 3d 28 70 57 72 69 74 65 72 2d  n==0)==(pWriter-
1d840 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  >bFirstTermInPag
1d850 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  e) );..  /* Set 
1d860 74 68 65 20 73 7a 4c 65 61 66 20 68 65 61 64 65  the szLeaf heade
1d870 72 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 61 73  r field. */.  as
1d880 73 65 72 74 28 20 30 3d 3d 66 74 73 35 47 65 74  sert( 0==fts5Get
1d890 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e  U16(&pPage->buf.
1d8a0 70 5b 32 5d 29 20 29 3b 0a 20 20 66 74 73 35 50  p[2]) );.  fts5P
1d8b0 75 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75  utU16(&pPage->bu
1d8c0 66 2e 70 5b 32 5d 2c 20 28 75 31 36 29 70 50 61  f.p[2], (u16)pPa
1d8d0 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 69  ge->buf.n);..  i
1d8e0 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  f( pWriter->bFir
1d8f0 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a  stTermInPage ){.
1d900 20 20 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77      /* No term w
1d910 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  as written to th
1d920 69 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  is page. */.    
1d930 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
1d940 67 69 64 78 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20  gidx.n==0 );.   
1d950 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 4e   fts5WriteBtreeN
1d960 6f 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72  oTerm(p, pWriter
1d970 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1d980 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70 67  /* Append the pg
1d990 69 64 78 20 74 6f 20 74 68 65 20 70 61 67 65 20  idx to the page 
1d9a0 62 75 66 66 65 72 2e 20 53 65 74 20 74 68 65 20  buffer. Set the 
1d9b0 73 7a 4c 65 61 66 20 68 65 61 64 65 72 20 66 69  szLeaf header fi
1d9c0 65 6c 64 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35  eld. */.    fts5
1d9d0 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1d9e0 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
1d9f0 3e 62 75 66 2c 20 70 50 61 67 65 2d 3e 70 67 69  >buf, pPage->pgi
1da00 64 78 2e 6e 2c 20 70 50 61 67 65 2d 3e 70 67 69  dx.n, pPage->pgi
1da10 64 78 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  dx.p);.  }..  /*
1da20 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
1da30 6f 75 74 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20  out to disk */. 
1da40 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53   iRowid = FTS5_S
1da50 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57 72  EGMENT_ROWID(pWr
1da60 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 70 50  iter->iSegid, pP
1da70 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 66 74  age->pgno);.  ft
1da80 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 69  s5DataWrite(p, i
1da90 52 6f 77 69 64 2c 20 70 50 61 67 65 2d 3e 62 75  Rowid, pPage->bu
1daa0 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  f.p, pPage->buf.
1dab0 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  n);..  /* Initia
1dac0 6c 69 7a 65 20 74 68 65 20 6e 65 78 74 20 70 61  lize the next pa
1dad0 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66  ge. */.  fts5Buf
1dae0 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e  ferZero(&pPage->
1daf0 62 75 66 29 3b 0a 20 20 66 74 73 35 42 75 66 66  buf);.  fts5Buff
1db00 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 70  erZero(&pPage->p
1db10 67 69 64 78 29 3b 0a 20 20 66 74 73 35 42 75 66  gidx);.  fts5Buf
1db20 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1db30 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
1db40 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 70  f, 4, zero);.  p
1db50 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64 78  Page->iPrevPgidx
1db60 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 70   = 0;.  pPage->p
1db70 67 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 6e 63  gno++;..  /* Inc
1db80 72 65 61 73 65 20 74 68 65 20 6c 65 61 76 65 73  rease the leaves
1db90 20 77 72 69 74 74 65 6e 20 63 6f 75 6e 74 65 72   written counter
1dba0 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e   */.  pWriter->n
1dbb0 4c 65 61 66 57 72 69 74 74 65 6e 2b 2b 3b 0a 0a  LeafWritten++;..
1dbc0 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6c 65 61    /* The new lea
1dbd0 66 20 68 6f 6c 64 73 20 6e 6f 20 74 65 72 6d 73  f holds no terms
1dbe0 20 6f 72 20 72 6f 77 69 64 73 20 2a 2f 0a 20 20   or rowids */.  
1dbf0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
1dc00 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20  ermInPage = 1;. 
1dc10 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1dc20 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b  RowidInPage = 1;
1dc30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
1dc40 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72   term pTerm/nTer
1dc50 6d 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74  m to the segment
1dc60 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 62   being written b
1dc70 79 20 74 68 65 20 77 72 69 74 65 72 20 70 61 73  y the writer pas
1dc80 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65  sed.** as the se
1dc90 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
1dca0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1dcb0 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65   occurs, set the
1dcc0 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72   Fts5Index.rc er
1dcd0 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20  ror code. If an 
1dce0 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c  error has .** al
1dcf0 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
1dd00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1dd10 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
1dd20 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
1dd30 74 65 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20  teAppendTerm(.  
1dd40 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
1dd50 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1dd60 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e  pWriter,.  int n
1dd70 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a  Term, const u8 *
1dd80 70 54 65 72 6d 20 0a 29 7b 0a 20 20 69 6e 74 20  pTerm .){.  int 
1dd90 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20  nPrefix;        
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1ddb0 79 74 65 73 20 6f 66 20 70 72 65 66 69 78 20 63  ytes of prefix c
1ddc0 6f 6d 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74  ompression for t
1ddd0 65 72 6d 20 2a 2f 0a 20 20 46 74 73 35 50 61 67  erm */.  Fts5Pag
1dde0 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
1ddf0 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
1de00 72 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  r;.  Fts5Buffer 
1de10 2a 70 50 67 69 64 78 20 3d 20 26 70 57 72 69 74  *pPgidx = &pWrit
1de20 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78  er->writer.pgidx
1de30 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d  ;.  int nMin = M
1de40 49 4e 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e  IN(pPage->term.n
1de50 2c 20 6e 54 65 72 6d 29 3b 0a 0a 20 20 61 73 73  , nTerm);..  ass
1de60 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
1de70 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72  TE_OK );.  asser
1de80 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e  t( pPage->buf.n>
1de90 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =4 );.  assert( 
1dea0 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 7c  pPage->buf.n>4 |
1deb0 7c 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  | pWriter->bFirs
1dec0 74 54 65 72 6d 49 6e 50 61 67 65 20 29 3b 0a 0a  tTermInPage );..
1ded0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72    /* If the curr
1dee0 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 69 73  ent leaf page is
1def0 20 66 75 6c 6c 2c 20 66 6c 75 73 68 20 69 74 20   full, flush it 
1df00 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 69 66  to disk. */.  if
1df10 28 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20  ( (pPage->buf.n 
1df20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 54  + pPgidx->n + nT
1df30 65 72 6d 20 2b 20 32 29 3e 3d 70 2d 3e 70 43 6f  erm + 2)>=p->pCo
1df40 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20  nfig->pgsz ){.  
1df50 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66    if( pPage->buf
1df60 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 66 74  .n>4 ){.      ft
1df70 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
1df80 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
1df90 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53      if( p->rc!=S
1dfa0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1dfb0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  n;.    }.    fts
1dfc0 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e  5BufferGrow(&p->
1dfd0 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
1dfe0 20 6e 54 65 72 6d 2b 46 54 53 35 5f 44 41 54 41   nTerm+FTS5_DATA
1dff0 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 7d 0a 20  _PADDING);.  }. 
1e000 20 0a 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 55 70   .  /* TODO1: Up
1e010 64 61 74 69 6e 67 20 70 67 69 64 78 20 68 65 72  dating pgidx her
1e020 65 2e 20 2a 2f 0a 20 20 70 50 67 69 64 78 2d 3e  e. */.  pPgidx->
1e030 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  n += sqlite3Fts5
1e040 50 75 74 56 61 72 69 6e 74 28 0a 20 20 20 20 20  PutVarint(.     
1e050 20 26 70 50 67 69 64 78 2d 3e 70 5b 70 50 67 69   &pPgidx->p[pPgi
1e060 64 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62  dx->n], pPage->b
1e070 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 69 50  uf.n - pPage->iP
1e080 72 65 76 50 67 69 64 78 0a 20 20 29 3b 0a 20 20  revPgidx.  );.  
1e090 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64  pPage->iPrevPgid
1e0a0 78 20 3d 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  x = pPage->buf.n
1e0b0 3b 0a 23 69 66 20 30 0a 20 20 66 74 73 35 50 75  ;.#if 0.  fts5Pu
1e0c0 74 55 31 36 28 26 70 50 67 69 64 78 2d 3e 70 5b  tU16(&pPgidx->p[
1e0d0 70 50 67 69 64 78 2d 3e 6e 5d 2c 20 70 50 61 67  pPgidx->n], pPag
1e0e0 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 70 50 67  e->buf.n);.  pPg
1e0f0 69 64 78 2d 3e 6e 20 2b 3d 20 32 3b 0a 23 65 6e  idx->n += 2;.#en
1e100 64 69 66 0a 0a 20 20 69 66 28 20 70 57 72 69 74  dif..  if( pWrit
1e110 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
1e120 50 61 67 65 20 29 7b 0a 20 20 20 20 6e 50 72 65  Page ){.    nPre
1e130 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  fix = 0;.    if(
1e140 20 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 31 20   pPage->pgno!=1 
1e150 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
1e160 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65   is the first te
1e170 72 6d 20 6f 6e 20 61 20 6c 65 61 66 20 74 68 61  rm on a leaf tha
1e180 74 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 65 66  t is not the lef
1e190 74 6d 6f 73 74 20 6c 65 61 66 20 69 6e 0a 20 20  tmost leaf in.  
1e1a0 20 20 20 20 2a 2a 20 74 68 65 20 73 65 67 6d 65      ** the segme
1e1b0 6e 74 20 62 2d 74 72 65 65 2e 20 49 6e 20 74 68  nt b-tree. In th
1e1c0 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 65  is case it is ne
1e1d0 63 65 73 73 61 72 79 20 74 6f 20 61 64 64 20 61  cessary to add a
1e1e0 20 74 65 72 6d 20 74 6f 0a 20 20 20 20 20 20 2a   term to.      *
1e1f0 2a 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65  * the b-tree hie
1e200 72 61 72 63 68 79 20 74 68 61 74 20 69 73 20 28  rarchy that is (
1e210 61 29 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  a) larger than t
1e220 68 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20  he largest term 
1e230 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  .      ** alread
1e240 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
1e250 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 28 62 29   segment and (b)
1e260 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72   smaller than or
1e270 20 65 71 75 61 6c 20 74 6f 0a 20 20 20 20 20 20   equal to.      
1e280 2a 2a 20 74 68 69 73 20 74 65 72 6d 2e 20 49 6e  ** this term. In
1e290 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20   other words, a 
1e2a0 70 72 65 66 69 78 20 6f 66 20 28 70 54 65 72 6d  prefix of (pTerm
1e2b0 2f 6e 54 65 72 6d 29 20 74 68 61 74 20 69 73 20  /nTerm) that is 
1e2c0 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  one.      ** byt
1e2d0 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68  e longer than th
1e2e0 65 20 6c 6f 6e 67 65 73 74 20 70 72 65 66 69 78  e longest prefix
1e2f0 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 73   (pTerm/nTerm) s
1e300 68 61 72 65 73 20 77 69 74 68 20 74 68 65 0a 20  hares with the. 
1e310 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
1e320 20 74 65 72 6d 2e 20 0a 20 20 20 20 20 20 2a 2a   term. .      **
1e330 0a 20 20 20 20 20 20 2a 2a 20 55 73 75 61 6c 6c  .      ** Usuall
1e340 79 2c 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  y, the previous 
1e350 74 65 72 6d 20 69 73 20 61 76 61 69 6c 61 62 6c  term is availabl
1e360 65 20 69 6e 20 70 50 61 67 65 2d 3e 74 65 72 6d  e in pPage->term
1e370 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 0a  . The exception.
1e380 20 20 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74        ** is if t
1e390 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
1e3a0 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20 69 6e   term written in
1e3b0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
1e3c0 6d 65 72 67 65 20 73 74 65 70 2e 0a 20 20 20 20  merge step..    
1e3d0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
1e3e0 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74  e the previous t
1e3f0 65 72 6d 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  erm is not avail
1e400 61 62 6c 65 2c 20 73 6f 20 6a 75 73 74 20 77 72  able, so just wr
1e410 69 74 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63  ite a.      ** c
1e420 6f 70 79 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54  opy of (pTerm/nT
1e430 65 72 6d 29 20 69 6e 74 6f 20 74 68 65 20 70 61  erm) into the pa
1e440 72 65 6e 74 20 6e 6f 64 65 2e 20 54 68 69 73 20  rent node. This 
1e450 69 73 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20  is slightly.    
1e460 20 20 2a 2a 20 69 6e 65 66 66 69 63 69 65 6e 74    ** inefficient
1e470 2c 20 62 75 74 20 73 74 69 6c 6c 20 63 6f 72 72  , but still corr
1e480 65 63 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ect.  */.      i
1e490 6e 74 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20  nt n = nTerm;.  
1e4a0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 74      if( pPage->t
1e4b0 65 72 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20  erm.n ){.       
1e4c0 20 6e 20 3d 20 31 20 2b 20 66 74 73 35 50 72 65   n = 1 + fts5Pre
1e4d0 66 69 78 43 6f 6d 70 72 65 73 73 28 6e 4d 69 6e  fixCompress(nMin
1e4e0 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c  , pPage->term.p,
1e4f0 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d   pTerm);.      }
1e500 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
1e510 42 74 72 65 65 54 65 72 6d 28 70 2c 20 70 57 72  BtreeTerm(p, pWr
1e520 69 74 65 72 2c 20 6e 2c 20 70 54 65 72 6d 29 3b  iter, n, pTerm);
1e530 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
1e540 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1e550 74 75 72 6e 3b 0a 20 20 20 20 20 20 70 50 61 67  turn;.      pPag
1e560 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72  e = &pWriter->wr
1e570 69 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  iter;.    }.  }e
1e580 6c 73 65 7b 0a 20 20 20 20 6e 50 72 65 66 69 78  lse{.    nPrefix
1e590 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d   = fts5PrefixCom
1e5a0 70 72 65 73 73 28 6e 4d 69 6e 2c 20 70 50 61 67  press(nMin, pPag
1e5b0 65 2d 3e 74 65 72 6d 2e 70 2c 20 70 54 65 72 6d  e->term.p, pTerm
1e5c0 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
1e5d0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1e5e0 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
1e5f0 66 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d  f, nPrefix);.  }
1e600 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68  ..  /* Append th
1e610 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1e620 73 20 6f 66 20 6e 65 77 20 64 61 74 61 2c 20 74  s of new data, t
1e630 68 65 6e 20 74 68 65 20 74 65 72 6d 20 64 61 74  hen the term dat
1e640 61 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 74 6f  a itself.  ** to
1e650 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
1e660 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1e670 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1e680 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72  pPage->buf, nTer
1e690 6d 20 2d 20 6e 50 72 65 66 69 78 29 3b 0a 20 20  m - nPrefix);.  
1e6a0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1e6b0 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
1e6c0 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20  age->buf, nTerm 
1e6d0 2d 20 6e 50 72 65 66 69 78 2c 20 26 70 54 65 72  - nPrefix, &pTer
1e6e0 6d 5b 6e 50 72 65 66 69 78 5d 29 3b 0a 0a 20 20  m[nPrefix]);..  
1e6f0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 46 74  /* Update the Ft
1e700 73 35 50 61 67 65 57 72 69 74 65 72 2e 74 65 72  s5PageWriter.ter
1e710 6d 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 66 74  m field. */.  ft
1e720 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
1e730 72 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d  rc, &pPage->term
1e740 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
1e750 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  .  pWriter->bFir
1e760 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 30  stTermInPage = 0
1e770 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46  ;..  pWriter->bF
1e780 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
1e790 3d 20 30 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  = 0;.  pWriter->
1e7a0 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63  bFirstRowidInDoc
1e7b0 6c 69 73 74 20 3d 20 31 3b 0a 0a 20 20 61 73 73  list = 1;..  ass
1e7c0 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 28 70  ert( p->rc || (p
1e7d0 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e 30  Writer->nDlidx>0
1e7e0 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c   && pWriter->aDl
1e7f0 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30 29  idx[0].buf.n==0)
1e800 20 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 61   );.  pWriter->a
1e810 44 6c 69 64 78 5b 30 5d 2e 70 67 6e 6f 20 3d 20  Dlidx[0].pgno = 
1e820 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a  pPage->pgno;.}..
1e830 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72  /*.** Append a r
1e840 6f 77 69 64 20 61 6e 64 20 70 6f 73 69 74 69 6f  owid and positio
1e850 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c  n-list size fiel
1e860 64 20 74 6f 20 74 68 65 20 77 72 69 74 65 72 73  d to the writers
1e870 20 6f 75 74 70 75 74 2e 20 0a 2a 2f 0a 73 74 61   output. .*/.sta
1e880 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
1e890 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28 0a 20  teAppendRowid(. 
1e8a0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1e8b0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1e8c0 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 36 34 20  *pWriter,.  i64 
1e8d0 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69 66 28 20  iRowid.){.  if( 
1e8e0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1e8f0 20 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65   ){.    Fts5Page
1e900 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20  Writer *pPage = 
1e910 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  &pWriter->writer
1e920 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 50 61 67  ;..    if( (pPag
1e930 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67 65  e->buf.n + pPage
1e940 2d 3e 70 67 69 64 78 2e 6e 29 3e 3d 70 2d 3e 70  ->pgidx.n)>=p->p
1e950 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a  Config->pgsz ){.
1e960 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46        fts5WriteF
1e970 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69  lushLeaf(p, pWri
1e980 74 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ter);.    }..   
1e990 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
1e9a0 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20 72  o be the first r
1e9b0 6f 77 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20  owid written to 
1e9c0 74 68 65 20 70 61 67 65 2c 20 73 65 74 20 74 68  the page, set th
1e9d0 65 20 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64 2d  e .    ** rowid-
1e9e0 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70  pointer in the p
1e9f0 61 67 65 2d 68 65 61 64 65 72 2e 20 41 6c 73 6f  age-header. Also
1ea00 20 61 70 70 65 6e 64 20 61 20 76 61 6c 75 65 20   append a value 
1ea10 74 6f 20 74 68 65 20 64 6c 69 64 78 0a 20 20 20  to the dlidx.   
1ea20 20 2a 2a 20 62 75 66 66 65 72 2c 20 69 6e 20 63   ** buffer, in c
1ea30 61 73 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e  ase a doclist-in
1ea40 64 65 78 20 69 73 20 72 65 71 75 69 72 65 64 2e  dex is required.
1ea50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72    */.    if( pWr
1ea60 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
1ea70 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20  dInPage ){.     
1ea80 20 66 74 73 35 50 75 74 55 31 36 28 70 50 61 67   fts5PutU16(pPag
1ea90 65 2d 3e 62 75 66 2e 70 2c 20 28 75 31 36 29 70  e->buf.p, (u16)p
1eaa0 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20  Page->buf.n);.  
1eab0 20 20 20 20 66 74 73 35 57 72 69 74 65 44 6c 69      fts5WriteDli
1eac0 64 78 41 70 70 65 6e 64 28 70 2c 20 70 57 72 69  dxAppend(p, pWri
1ead0 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  ter, iRowid);.  
1eae0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74    }..    /* Writ
1eaf0 65 20 74 68 65 20 72 6f 77 69 64 2e 20 2a 2f 0a  e the rowid. */.
1eb00 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d      if( pWriter-
1eb10 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f  >bFirstRowidInDo
1eb20 63 6c 69 73 74 20 7c 7c 20 70 57 72 69 74 65 72  clist || pWriter
1eb30 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
1eb40 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74 73  age ){.      fts
1eb50 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1eb60 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  int(&p->rc, &pPa
1eb70 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 29  ge->buf, iRowid)
1eb80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1eb90 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 2d     assert_nc( p-
1eba0 3e 72 63 20 7c 7c 20 69 52 6f 77 69 64 3e 70 57  >rc || iRowid>pW
1ebb0 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69  riter->iPrevRowi
1ebc0 64 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  d );.      fts5B
1ebd0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1ebe0 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
1ebf0 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 20 2d 20  ->buf, iRowid - 
1ec00 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f  pWriter->iPrevRo
1ec10 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wid);.    }.    
1ec20 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f  pWriter->iPrevRo
1ec30 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  wid = iRowid;.  
1ec40 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
1ec50 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20  tRowidInDoclist 
1ec60 3d 20 30 3b 0a 20 20 20 20 70 57 72 69 74 65 72  = 0;.    pWriter
1ec70 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
1ec80 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  age = 0;.  }.}..
1ec90 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1eca0 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69  WriteAppendPosli
1ecb0 73 74 44 61 74 61 28 0a 20 20 46 74 73 35 49 6e  stData(.  Fts5In
1ecc0 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
1ecd0 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
1ece0 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  r, .  const u8 *
1ecf0 61 44 61 74 61 2c 20 0a 20 20 69 6e 74 20 6e 44  aData, .  int nD
1ed00 61 74 61 0a 29 7b 0a 20 20 46 74 73 35 50 61 67  ata.){.  Fts5Pag
1ed10 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
1ed20 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
1ed30 72 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  r;.  const u8 *a
1ed40 20 3d 20 61 44 61 74 61 3b 0a 20 20 69 6e 74 20   = aData;.  int 
1ed50 6e 20 3d 20 6e 44 61 74 61 3b 0a 20 20 0a 20 20  n = nData;.  .  
1ed60 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66  assert( p->pConf
1ed70 69 67 2d 3e 70 67 73 7a 3e 30 20 29 3b 0a 20 20  ig->pgsz>0 );.  
1ed80 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
1ed90 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20 26 26  LITE_OK .     &&
1eda0 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b   (pPage->buf.n +
1edb0 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 20   pPage->pgidx.n 
1edc0 2b 20 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67  + n)>=p->pConfig
1edd0 2d 3e 70 67 73 7a 20 0a 20 20 29 7b 0a 20 20 20  ->pgsz .  ){.   
1ede0 20 69 6e 74 20 6e 52 65 71 20 3d 20 70 2d 3e 70   int nReq = p->p
1edf0 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2d 20 70  Config->pgsz - p
1ee00 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2d 20 70 50  Page->buf.n - pP
1ee10 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3b 0a 20 20  age->pgidx.n;.  
1ee20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 30 3b    int nCopy = 0;
1ee30 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 43 6f 70  .    while( nCop
1ee40 79 3c 6e 52 65 71 20 29 7b 0a 20 20 20 20 20 20  y<nReq ){.      
1ee50 69 36 34 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20  i64 dummy;.     
1ee60 20 6e 43 6f 70 79 20 2b 3d 20 66 74 73 35 47 65   nCopy += fts5Ge
1ee70 74 56 61 72 69 6e 74 28 26 61 5b 6e 43 6f 70 79  tVarint(&a[nCopy
1ee80 5d 2c 20 28 75 36 34 2a 29 26 64 75 6d 6d 79 29  ], (u64*)&dummy)
1ee90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
1eea0 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1eeb0 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
1eec0 3e 62 75 66 2c 20 6e 43 6f 70 79 2c 20 61 29 3b  >buf, nCopy, a);
1eed0 0a 20 20 20 20 61 20 2b 3d 20 6e 43 6f 70 79 3b  .    a += nCopy;
1eee0 0a 20 20 20 20 6e 20 2d 3d 20 6e 43 6f 70 79 3b  .    n -= nCopy;
1eef0 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c  .    fts5WriteFl
1ef00 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74  ushLeaf(p, pWrit
1ef10 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  er);.  }.  if( n
1ef20 3e 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75  >0 ){.    fts5Bu
1ef30 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1ef40 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
1ef50 75 66 2c 20 6e 2c 20 61 29 3b 0a 20 20 7d 0a 7d  uf, n, a);.  }.}
1ef60 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e  ../*.** Flush an
1ef70 79 20 64 61 74 61 20 63 61 63 68 65 64 20 62 79  y data cached by
1ef80 20 74 68 65 20 77 72 69 74 65 72 20 6f 62 6a 65   the writer obje
1ef90 63 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ct to the databa
1efa0 73 65 2e 20 46 72 65 65 20 61 6e 79 0a 2a 2a 20  se. Free any.** 
1efb0 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f  allocations asso
1efc0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1efd0 77 72 69 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  writer..*/.stati
1efe0 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
1eff0 46 69 6e 69 73 68 28 0a 20 20 46 74 73 35 49 6e  Finish(.  Fts5In
1f000 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
1f010 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
1f020 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  r,         /* Wr
1f030 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  iter object */. 
1f040 20 69 6e 74 20 2a 70 6e 4c 65 61 66 20 20 20 20   int *pnLeaf    
1f050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f060 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20   /* OUT: Number 
1f070 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 69 6e  of leaf pages in
1f080 20 62 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a 20 20   b-tree */.){.  
1f090 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 50 61 67  int i;.  Fts5Pag
1f0a0 65 57 72 69 74 65 72 20 2a 70 4c 65 61 66 20 3d  eWriter *pLeaf =
1f0b0 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
1f0c0 72 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  r;.  if( p->rc==
1f0d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f0e0 20 61 73 73 65 72 74 28 20 70 4c 65 61 66 2d 3e   assert( pLeaf->
1f0f0 70 67 6e 6f 3e 3d 31 20 29 3b 0a 20 20 20 20 69  pgno>=1 );.    i
1f100 66 28 20 70 4c 65 61 66 2d 3e 62 75 66 2e 6e 3e  f( pLeaf->buf.n>
1f110 34 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57  4 ){.      fts5W
1f120 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c  riteFlushLeaf(p,
1f130 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d   pWriter);.    }
1f140 0a 20 20 20 20 2a 70 6e 4c 65 61 66 20 3d 20 70  .    *pnLeaf = p
1f150 4c 65 61 66 2d 3e 70 67 6e 6f 2d 31 3b 0a 20 20  Leaf->pgno-1;.  
1f160 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 70 67 6e    if( pLeaf->pgn
1f170 6f 3e 31 20 29 7b 0a 20 20 20 20 20 20 66 74 73  o>1 ){.      fts
1f180 35 57 72 69 74 65 46 6c 75 73 68 42 74 72 65 65  5WriteFlushBtree
1f190 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
1f1a0 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42 75    }.  }.  fts5Bu
1f1b0 66 66 65 72 46 72 65 65 28 26 70 4c 65 61 66 2d  fferFree(&pLeaf-
1f1c0 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 42 75  >term);.  fts5Bu
1f1d0 66 66 65 72 46 72 65 65 28 26 70 4c 65 61 66 2d  fferFree(&pLeaf-
1f1e0 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42 75 66  >buf);.  fts5Buf
1f1f0 66 65 72 46 72 65 65 28 26 70 4c 65 61 66 2d 3e  ferFree(&pLeaf->
1f200 70 67 69 64 78 29 3b 0a 20 20 66 74 73 35 42 75  pgidx);.  fts5Bu
1f210 66 66 65 72 46 72 65 65 28 26 70 57 72 69 74 65  fferFree(&pWrite
1f220 72 2d 3e 62 74 74 65 72 6d 29 3b 0a 0a 20 20 66  r->btterm);..  f
1f230 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69 74 65  or(i=0; i<pWrite
1f240 72 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b 29 7b  r->nDlidx; i++){
1f250 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
1f260 42 75 66 66 65 72 46 72 65 65 28 26 70 57 72 69  BufferFree(&pWri
1f270 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 2e 62  ter->aDlidx[i].b
1f280 75 66 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  uf);.  }.  sqlit
1f290 65 33 5f 66 72 65 65 28 70 57 72 69 74 65 72 2d  e3_free(pWriter-
1f2a0 3e 61 44 6c 69 64 78 29 3b 0a 7d 0a 0a 73 74 61  >aDlidx);.}..sta
1f2b0 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
1f2c0 74 65 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e  teInit(.  Fts5In
1f2d0 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
1f2e0 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
1f2f0 72 2c 20 0a 20 20 69 6e 74 20 69 53 65 67 69 64  r, .  int iSegid
1f300 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  .){.  const int 
1f310 6e 42 75 66 66 65 72 20 3d 20 70 2d 3e 70 43 6f  nBuffer = p->pCo
1f320 6e 66 69 67 2d 3e 70 67 73 7a 20 2b 20 46 54 53  nfig->pgsz + FTS
1f330 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 3b 0a  5_DATA_PADDING;.
1f340 0a 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65  .  memset(pWrite
1f350 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  r, 0, sizeof(Fts
1f360 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20  5SegWriter));.  
1f370 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 20  pWriter->iSegid 
1f380 3d 20 69 53 65 67 69 64 3b 0a 0a 20 20 66 74 73  = iSegid;..  fts
1f390 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28  5WriteDlidxGrow(
1f3a0 70 2c 20 70 57 72 69 74 65 72 2c 20 31 29 3b 0a  p, pWriter, 1);.
1f3b0 20 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65    pWriter->write
1f3c0 72 2e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 70 57  r.pgno = 1;.  pW
1f3d0 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
1f3e0 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 70  mInPage = 1;.  p
1f3f0 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20  Writer->iBtPage 
1f400 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 1;..  assert( 
1f410 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e  pWriter->writer.
1f420 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 61 73  buf.n==0 );.  as
1f430 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 77  sert( pWriter->w
1f440 72 69 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30  riter.pgidx.n==0
1f450 20 29 3b 0a 0a 20 20 2f 2a 20 47 72 6f 77 20 74   );..  /* Grow t
1f460 68 65 20 74 77 6f 20 62 75 66 66 65 72 73 20 74  he two buffers t
1f470 6f 20 70 67 73 7a 20 2b 20 70 61 64 64 69 6e 67  o pgsz + padding
1f480 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
1f490 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35  */.  sqlite3Fts5
1f4a0 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72  BufferSize(&p->r
1f4b0 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69  c, &pWriter->wri
1f4c0 74 65 72 2e 70 67 69 64 78 2c 20 6e 42 75 66 66  ter.pgidx, nBuff
1f4d0 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74  er);.  sqlite3Ft
1f4e0 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d  s5BufferSize(&p-
1f4f0 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 77  >rc, &pWriter->w
1f500 72 69 74 65 72 2e 62 75 66 2c 20 6e 42 75 66 66  riter.buf, nBuff
1f510 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  er);..  if( p->p
1f520 49 64 78 57 72 69 74 65 72 3d 3d 30 20 29 7b 0a  IdxWriter==0 ){.
1f530 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a      Fts5Config *
1f540 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
1f550 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e  nfig;.    fts5In
1f560 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70  dexPrepareStmt(p
1f570 2c 20 26 70 2d 3e 70 49 64 78 57 72 69 74 65 72  , &p->pIdxWriter
1f580 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  , sqlite3_mprint
1f590 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e  f(.          "IN
1f5a0 53 45 52 54 20 49 4e 54 4f 20 27 25 71 27 2e 27  SERT INTO '%q'.'
1f5b0 25 71 5f 69 64 78 27 28 73 65 67 69 64 2c 74 65  %q_idx'(segid,te
1f5c0 72 6d 2c 70 67 6e 6f 29 20 56 41 4c 55 45 53 28  rm,pgno) VALUES(
1f5d0 3f 2c 3f 2c 3f 29 22 2c 20 0a 20 20 20 20 20 20  ?,?,?)", .      
1f5e0 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62      pConfig->zDb
1f5f0 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65  , pConfig->zName
1f600 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 0a 20 20  .    ));.  }..  
1f610 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1f620 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49  E_OK ){.    /* I
1f630 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 34 2d  nitialize the 4-
1f640 62 79 74 65 20 6c 65 61 66 2d 70 61 67 65 20 68  byte leaf-page h
1f650 65 61 64 65 72 20 74 6f 20 30 78 30 30 2e 20 2a  eader to 0x00. *
1f660 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 57 72  /.    memset(pWr
1f670 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66  iter->writer.buf
1f680 2e 70 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 70  .p, 0, 4);.    p
1f690 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62  Writer->writer.b
1f6a0 75 66 2e 6e 20 3d 20 34 3b 0a 0a 20 20 20 20 2f  uf.n = 4;..    /
1f6b0 2a 20 42 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Bind the curre
1f6c0 6e 74 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  nt output segmen
1f6d0 74 20 69 64 20 74 6f 20 74 68 65 20 69 6e 64 65  t id to the inde
1f6e0 78 2d 77 72 69 74 65 72 2e 20 54 68 69 73 20 69  x-writer. This i
1f6f0 73 20 61 6e 0a 20 20 20 20 2a 2a 20 6f 70 74 69  s an.    ** opti
1f700 6d 69 7a 61 74 69 6f 6e 20 6f 76 65 72 20 62 69  mization over bi
1f710 6e 64 69 6e 67 20 74 68 65 20 73 61 6d 65 20 76  nding the same v
1f720 61 6c 75 65 20 6f 76 65 72 20 61 6e 64 20 6f 76  alue over and ov
1f730 65 72 20 61 73 20 72 6f 77 73 20 61 72 65 0a 20  er as rows are. 
1f740 20 20 20 2a 2a 20 69 6e 73 65 72 74 65 64 20 69     ** inserted i
1f750 6e 74 6f 20 25 5f 69 64 78 20 62 79 20 74 68 65  nto %_idx by the
1f760 20 63 75 72 72 65 6e 74 20 77 72 69 74 65 72 2e   current writer.
1f770 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
1f780 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64  _bind_int(p->pId
1f790 78 57 72 69 74 65 72 2c 20 31 2c 20 70 57 72 69  xWriter, 1, pWri
1f7a0 74 65 72 2d 3e 69 53 65 67 69 64 29 3b 0a 20 20  ter->iSegid);.  
1f7b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61  }.}../*.** Itera
1f7c0 74 6f 72 20 70 49 74 65 72 20 77 61 73 20 75 73  tor pIter was us
1f7d0 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
1f7e0 72 6f 75 67 68 20 74 68 65 20 69 6e 70 75 74 20  rough the input 
1f7f0 73 65 67 6d 65 6e 74 73 20 6f 66 20 6f 6e 20 61  segments of on a
1f800 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c  n.** incremental
1f810 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e   merge operation
1f820 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1f830 69 73 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65  is called if the
1f840 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20   incremental.** 
1f850 6d 65 72 67 65 20 73 74 65 70 20 68 61 73 20 66  merge step has f
1f860 69 6e 69 73 68 65 64 20 62 75 74 20 74 68 65 20  inished but the 
1f870 69 6e 70 75 74 20 68 61 73 20 6e 6f 74 20 62 65  input has not be
1f880 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 78  en completely ex
1f890 68 61 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  hausted..*/.stat
1f8a0 69 63 20 76 6f 69 64 20 66 74 73 35 54 72 69 6d  ic void fts5Trim
1f8b0 53 65 67 6d 65 6e 74 73 28 46 74 73 35 49 6e 64  Segments(Fts5Ind
1f8c0 65 78 20 2a 70 2c 20 46 74 73 35 49 74 65 72 20  ex *p, Fts5Iter 
1f8d0 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69  *pIter){.  int i
1f8e0 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  ;.  Fts5Buffer b
1f8f0 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75  uf;.  memset(&bu
1f900 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  f, 0, sizeof(Fts
1f910 35 42 75 66 66 65 72 29 29 3b 0a 20 20 66 6f 72  5Buffer));.  for
1f920 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
1f930 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  Seg; i++){.    F
1f940 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
1f950 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
1f960 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67  i];.    if( pSeg
1f970 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20  ->pSeg==0 ){.   
1f980 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20     /* no-op */. 
1f990 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65     }else if( pSe
1f9a0 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20  g->pLeaf==0 ){. 
1f9b0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6b 65 79 73       /* All keys
1f9c0 20 66 72 6f 6d 20 74 68 69 73 20 69 6e 70 75 74   from this input
1f9d0 20 73 65 67 6d 65 6e 74 20 68 61 76 65 20 62 65   segment have be
1f9e0 65 6e 20 74 72 61 6e 73 66 65 72 65 64 20 74 6f  en transfered to
1f9f0 20 74 68 65 20 6f 75 74 70 75 74 2e 0a 20 20 20   the output..   
1fa00 20 20 20 2a 2a 20 53 65 74 20 62 6f 74 68 20 74     ** Set both t
1fa10 68 65 20 66 69 72 73 74 20 61 6e 64 20 6c 61 73  he first and las
1fa20 74 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 74  t page-numbers t
1fa30 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 20  o 0 to indicate 
1fa40 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
1fa50 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 6e 6f 77  * segment is now
1fa60 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20   empty. */.     
1fa70 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e   pSeg->pSeg->pgn
1fa80 6f 4c 61 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  oLast = 0;.     
1fa90 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e   pSeg->pSeg->pgn
1faa0 6f 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20  oFirst = 0;.    
1fab0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1fac0 20 69 4f 66 66 20 3d 20 70 53 65 67 2d 3e 69 54   iOff = pSeg->iT
1fad0 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 20 20  ermLeafOffset;  
1fae0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 6e 20     /* Offset on 
1faf0 6e 65 77 20 66 69 72 73 74 20 6c 65 61 66 20 70  new first leaf p
1fb00 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  age */.      i64
1fb10 20 69 4c 65 61 66 52 6f 77 69 64 3b 0a 20 20 20   iLeafRowid;.   
1fb20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61     Fts5Data *pDa
1fb30 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  ta;.      int iI
1fb40 64 20 3d 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e  d = pSeg->pSeg->
1fb50 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 75 38  iSegid;.      u8
1fb60 20 61 48 64 72 5b 34 5d 20 3d 20 7b 30 78 30 30   aHdr[4] = {0x00
1fb70 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
1fb80 30 30 7d 3b 0a 0a 20 20 20 20 20 20 69 4c 65 61  00};..      iLea
1fb90 66 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45  fRowid = FTS5_SE
1fba0 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c  GMENT_ROWID(iId,
1fbb0 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66   pSeg->iTermLeaf
1fbc0 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 44 61  Pgno);.      pDa
1fbd0 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
1fbe0 64 28 70 2c 20 69 4c 65 61 66 52 6f 77 69 64 29  d(p, iLeafRowid)
1fbf0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74  ;.      if( pDat
1fc00 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  a ){.        fts
1fc10 35 42 75 66 66 65 72 5a 65 72 6f 28 26 62 75 66  5BufferZero(&buf
1fc20 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
1fc30 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63  ufferGrow(&p->rc
1fc40 2c 20 26 62 75 66 2c 20 70 44 61 74 61 2d 3e 6e  , &buf, pData->n
1fc50 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  n);.        fts5
1fc60 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1fc70 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 73  (&p->rc, &buf, s
1fc80 69 7a 65 6f 66 28 61 48 64 72 29 2c 20 61 48 64  izeof(aHdr), aHd
1fc90 72 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  r);.        fts5
1fca0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1fcb0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
1fcc0 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 29 3b 0a   pSeg->term.n);.
1fcd0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1fce0 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1fcf0 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d  >rc, &buf, pSeg-
1fd00 3e 74 65 72 6d 2e 6e 2c 20 70 53 65 67 2d 3e 74  >term.n, pSeg->t
1fd10 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20 20 20  erm.p);.        
1fd20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1fd30 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75  Blob(&p->rc, &bu
1fd40 66 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66  f, pData->szLeaf
1fd50 2d 69 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70  -iOff, &pData->p
1fd60 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 20  [iOff]);.       
1fd70 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1fd80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1fd90 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 73 7a     /* Set the sz
1fda0 4c 65 61 66 20 66 69 65 6c 64 20 2a 2f 0a 20 20  Leaf field */.  
1fdb0 20 20 20 20 20 20 20 20 66 74 73 35 50 75 74 55          fts5PutU
1fdc0 31 36 28 26 62 75 66 2e 70 5b 32 5d 2c 20 28 75  16(&buf.p[2], (u
1fdd0 31 36 29 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20  16)buf.n);.     
1fde0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
1fdf0 20 53 65 74 20 75 70 20 74 68 65 20 6e 65 77 20   Set up the new 
1fe00 70 61 67 65 2d 69 6e 64 65 78 20 61 72 72 61 79  page-index array
1fe10 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35   */.        fts5
1fe20 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1fe30 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
1fe40 20 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   4);.        if(
1fe50 20 70 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f   pSeg->iLeafPgno
1fe60 3d 3d 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61  ==pSeg->iTermLea
1fe70 66 50 67 6e 6f 20 0a 20 20 20 20 20 20 20 20 20  fPgno .         
1fe80 26 26 20 70 53 65 67 2d 3e 69 45 6e 64 6f 66 44  && pSeg->iEndofD
1fe90 6f 63 6c 69 73 74 3c 70 44 61 74 61 2d 3e 73 7a  oclist<pData->sz
1fea0 4c 65 61 66 20 0a 20 20 20 20 20 20 20 20 29 7b  Leaf .        ){
1feb0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
1fec0 44 69 66 66 20 3d 20 70 44 61 74 61 2d 3e 73 7a  Diff = pData->sz
1fed0 4c 65 61 66 20 2d 20 70 53 65 67 2d 3e 69 45 6e  Leaf - pSeg->iEn
1fee0 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20  dofDoclist;.    
1fef0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1ff00 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1ff10 3e 72 63 2c 20 26 62 75 66 2c 20 62 75 66 2e 6e  >rc, &buf, buf.n
1ff20 20 2d 20 31 20 2d 20 6e 44 69 66 66 20 2d 20 34   - 1 - nDiff - 4
1ff30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  );.          fts
1ff40 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1ff50 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  b(&p->rc, &buf, 
1ff60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1ff70 44 61 74 61 2d 3e 6e 6e 20 2d 20 70 53 65 67 2d  Data->nn - pSeg-
1ff80 3e 69 50 67 69 64 78 4f 66 66 2c 20 26 70 44 61  >iPgidxOff, &pDa
1ff90 74 61 2d 3e 70 5b 70 53 65 67 2d 3e 69 50 67 69  ta->p[pSeg->iPgi
1ffa0 64 78 4f 66 66 5d 0a 20 20 20 20 20 20 20 20 20  dxOff].         
1ffb0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   );.        }.. 
1ffc0 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
1ffd0 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20  elease(pData);. 
1ffe0 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65         pSeg->pSe
1fff0 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 70  g->pgnoFirst = p
20000 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  Seg->iTermLeafPg
20010 6e 6f 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  no;.        fts5
20020 44 61 74 61 44 65 6c 65 74 65 28 70 2c 20 46 54  DataDelete(p, FT
20030 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
20040 28 69 49 64 2c 20 31 29 2c 20 69 4c 65 61 66 52  (iId, 1), iLeafR
20050 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66  owid);.        f
20060 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
20070 69 4c 65 61 66 52 6f 77 69 64 2c 20 62 75 66 2e  iLeafRowid, buf.
20080 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20  p, buf.n);.     
20090 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66   }.    }.  }.  f
200a0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62  ts5BufferFree(&b
200b0 75 66 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  uf);.}..static v
200c0 6f 69 64 20 66 74 73 35 4d 65 72 67 65 43 68 75  oid fts5MergeChu
200d0 6e 6b 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74  nkCallback(.  Ft
200e0 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 76  s5Index *p, .  v
200f0 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 63 6f  oid *pCtx, .  co
20100 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20  nst u8 *pChunk, 
20110 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20  int nChunk.){.  
20120 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
20130 57 72 69 74 65 72 20 3d 20 28 46 74 73 35 53 65  Writer = (Fts5Se
20140 67 57 72 69 74 65 72 2a 29 70 43 74 78 3b 0a 20  gWriter*)pCtx;. 
20150 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64   fts5WriteAppend
20160 50 6f 73 6c 69 73 74 44 61 74 61 28 70 2c 20 70  PoslistData(p, p
20170 57 72 69 74 65 72 2c 20 70 43 68 75 6e 6b 2c 20  Writer, pChunk, 
20180 6e 43 68 75 6e 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChunk);.}../*.*
20190 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
201a0 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c   fts5IndexMergeL
201b0 65 76 65 6c 28 0a 20 20 46 74 73 35 49 6e 64 65  evel(.  Fts5Inde
201c0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
201d0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
201e0 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
201f0 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
20200 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20  e **ppStruct,   
20210 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53      /* IN/OUT: S
20220 74 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78  tucture of index
20230 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20   */.  int iLvl, 
20240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20250 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74        /* Level t
20260 6f 20 72 65 61 64 20 69 6e 70 75 74 20 66 72 6f  o read input fro
20270 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52 65  m */.  int *pnRe
20280 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
20290 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
202a0 75 70 20 74 6f 20 74 68 69 73 20 6d 61 6e 79 20  up to this many 
202b0 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20 2a 2f  output leaves */
202c0 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  .){.  Fts5Struct
202d0 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a  ure *pStruct = *
202e0 70 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35  ppStruct;.  Fts5
202f0 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
20300 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
20310 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20  >aLevel[iLvl];. 
20320 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
20330 76 65 6c 20 2a 70 4c 76 6c 4f 75 74 3b 0a 20 20  vel *pLvlOut;.  
20340 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 20  Fts5Iter *pIter 
20350 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 49 74  = 0;       /* It
20360 65 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20 69  erator to read i
20370 6e 70 75 74 20 64 61 74 61 20 2a 2f 0a 20 20 69  nput data */.  i
20380 6e 74 20 6e 52 65 6d 20 3d 20 70 6e 52 65 6d 20  nt nRem = pnRem 
20390 3f 20 2a 70 6e 52 65 6d 20 3a 20 30 3b 20 20 2f  ? *pnRem : 0;  /
203a0 2a 20 4f 75 74 70 75 74 20 6c 65 61 66 20 70 61  * Output leaf pa
203b0 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69 74  ges left to writ
203c0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70 75  e */.  int nInpu
203d0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
203e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
203f0 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e   of input segmen
20400 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57  ts */.  Fts5SegW
20410 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20  riter writer;   
20420 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
20430 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  r object */.  Ft
20440 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
20450 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a  nt *pSeg;     /*
20460 20 4f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20   Output segment 
20470 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
20480 74 65 72 6d 3b 0a 20 20 69 6e 74 20 62 4f 6c 64  term;.  int bOld
20490 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  est;            
204a0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
204b0 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 73 65  if the output se
204c0 67 6d 65 6e 74 20 69 73 20 74 68 65 20 6f 6c 64  gment is the old
204d0 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  est */.  int eDe
204e0 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  tail = p->pConfi
204f0 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 63 6f  g->eDetail;.  co
20500 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
20510 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
20520 4e 4f 4f 55 54 50 55 54 3b 0a 20 20 69 6e 74 20  NOOUTPUT;.  int 
20530 62 54 65 72 6d 57 72 69 74 74 65 6e 20 3d 20 30  bTermWritten = 0
20540 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
20550 72 75 65 20 69 66 20 63 75 72 72 65 6e 74 20 74  rue if current t
20560 65 72 6d 20 61 6c 72 65 61 64 79 20 6f 75 74 70  erm already outp
20570 75 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ut */..  assert(
20580 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
20590 4c 65 76 65 6c 20 29 3b 0a 20 20 61 73 73 65 72  Level );.  asser
205a0 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c  t( pLvl->nMerge<
205b0 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a  =pLvl->nSeg );..
205c0 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65 72    memset(&writer
205d0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
205e0 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20 6d  SegWriter));.  m
205f0 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20  emset(&term, 0, 
20600 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
20610 72 29 29 3b 0a 20 20 69 66 28 20 70 4c 76 6c 2d  r));.  if( pLvl-
20620 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 70  >nMerge ){.    p
20630 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75 63  LvlOut = &pStruc
20640 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31  t->aLevel[iLvl+1
20650 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
20660 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3e 30 20 29  LvlOut->nSeg>0 )
20670 3b 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d 20 70  ;.    nInput = p
20680 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20  Lvl->nMerge;.   
20690 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74   pSeg = &pLvlOut
206a0 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e  ->aSeg[pLvlOut->
206b0 6e 53 65 67 2d 31 5d 3b 0a 0a 20 20 20 20 66 74  nSeg-1];..    ft
206c0 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26  s5WriteInit(p, &
206d0 77 72 69 74 65 72 2c 20 70 53 65 67 2d 3e 69 53  writer, pSeg->iS
206e0 65 67 69 64 29 3b 0a 20 20 20 20 77 72 69 74 65  egid);.    write
206f0 72 2e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20  r.writer.pgno = 
20700 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b 31  pSeg->pgnoLast+1
20710 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 69 42 74  ;.    writer.iBt
20720 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Page = 0;.  }els
20730 65 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69  e{.    int iSegi
20740 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65  d = fts5Allocate
20750 53 65 67 69 64 28 70 2c 20 70 53 74 72 75 63 74  Segid(p, pStruct
20760 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e  );..    /* Exten
20770 64 20 74 68 65 20 46 74 73 35 53 74 72 75 63 74  d the Fts5Struct
20780 75 72 65 20 6f 62 6a 65 63 74 20 61 73 20 72 65  ure object as re
20790 71 75 69 72 65 64 20 74 6f 20 65 6e 73 75 72 65  quired to ensure
207a0 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20   the output.    
207b0 2a 2a 20 73 65 67 6d 65 6e 74 20 65 78 69 73 74  ** segment exist
207c0 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4c  s. */.    if( iL
207d0 76 6c 3d 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65  vl==pStruct->nLe
207e0 76 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 66  vel-1 ){.      f
207f0 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c  ts5StructureAddL
20800 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 70 53  evel(&p->rc, ppS
20810 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70 53  truct);.      pS
20820 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
20830 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  t;.    }.    fts
20840 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64  5StructureExtend
20850 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53  Level(&p->rc, pS
20860 74 72 75 63 74 2c 20 69 4c 76 6c 2b 31 2c 20 31  truct, iLvl+1, 1
20870 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  , 0);.    if( p-
20880 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
20890 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63    pLvl = &pStruc
208a0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
208b0 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26  .    pLvlOut = &
208c0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
208d0 69 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66 74  iLvl+1];..    ft
208e0 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26  s5WriteInit(p, &
208f0 77 72 69 74 65 72 2c 20 69 53 65 67 69 64 29 3b  writer, iSegid);
20900 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
20910 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 74 6f 20   new segment to 
20920 74 68 65 20 6f 75 74 70 75 74 20 6c 65 76 65 6c  the output level
20930 20 2a 2f 0a 20 20 20 20 70 53 65 67 20 3d 20 26   */.    pSeg = &
20940 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c  pLvlOut->aSeg[pL
20950 76 6c 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20  vlOut->nSeg];.  
20960 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b    pLvlOut->nSeg+
20970 2b 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70 67 6e  +;.    pSeg->pgn
20980 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20  oFirst = 1;.    
20990 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69  pSeg->iSegid = i
209a0 53 65 67 69 64 3b 0a 20 20 20 20 70 53 74 72 75  Segid;.    pStru
209b0 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a  ct->nSegment++;.
209c0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 69 6e 70  .    /* Read inp
209d0 75 74 20 66 72 6f 6d 20 61 6c 6c 20 73 65 67 6d  ut from all segm
209e0 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75  ents in the inpu
209f0 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 6e  t level */.    n
20a00 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53  Input = pLvl->nS
20a10 65 67 3b 0a 20 20 7d 0a 20 20 62 4f 6c 64 65 73  eg;.  }.  bOldes
20a20 74 20 3d 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53  t = (pLvlOut->nS
20a30 65 67 3d 3d 31 20 26 26 20 70 53 74 72 75 63 74  eg==1 && pStruct
20a40 2d 3e 6e 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32  ->nLevel==iLvl+2
20a50 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  );..  assert( iL
20a60 76 6c 3e 3d 30 20 29 3b 0a 20 20 66 6f 72 28 66  vl>=0 );.  for(f
20a70 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28  ts5MultiIterNew(
20a80 70 2c 20 70 53 74 72 75 63 74 2c 20 66 6c 61 67  p, pStruct, flag
20a90 73 2c 20 30 2c 20 30 2c 20 30 2c 20 69 4c 76 6c  s, 0, 0, 0, iLvl
20aa0 2c 20 6e 49 6e 70 75 74 2c 20 26 70 49 74 65 72  , nInput, &pIter
20ab0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  );.      fts5Mul
20ac0 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74  tiIterEof(p, pIt
20ad0 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74  er)==0;.      ft
20ae0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
20af0 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29 0a  p, pIter, 0, 0).
20b00 20 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67    ){.    Fts5Seg
20b10 49 74 65 72 20 2a 70 53 65 67 49 74 65 72 20 3d  Iter *pSegIter =
20b20 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   &pIter->aSeg[ p
20b30 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
20b40 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 69 6e  iFirst ];.    in
20b50 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20 20 20  t nPos;         
20b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
20b70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a  osition-list siz
20b80 65 20 66 69 65 6c 64 20 76 61 6c 75 65 20 2a 2f  e field value */
20b90 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a  .    int nTerm;.
20ba0 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54      const u8 *pT
20bb0 65 72 6d 3b 0a 0a 20 20 20 20 70 54 65 72 6d 20  erm;..    pTerm 
20bc0 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54  = fts5MultiIterT
20bd0 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 54 65 72  erm(pIter, &nTer
20be0 6d 29 3b 0a 20 20 20 20 69 66 28 20 6e 54 65 72  m);.    if( nTer
20bf0 6d 21 3d 74 65 72 6d 2e 6e 20 7c 7c 20 6d 65 6d  m!=term.n || mem
20c00 63 6d 70 28 70 54 65 72 6d 2c 20 74 65 72 6d 2e  cmp(pTerm, term.
20c10 70 2c 20 6e 54 65 72 6d 29 20 29 7b 0a 20 20 20  p, nTerm) ){.   
20c20 20 20 20 69 66 28 20 70 6e 52 65 6d 20 26 26 20     if( pnRem && 
20c30 77 72 69 74 65 72 2e 6e 4c 65 61 66 57 72 69 74  writer.nLeafWrit
20c40 74 65 6e 3e 6e 52 65 6d 20 29 7b 0a 20 20 20 20  ten>nRem ){.    
20c50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
20c60 20 7d 0a 20 20 20 20 20 20 66 74 73 35 42 75 66   }.      fts5Buf
20c70 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26  ferSet(&p->rc, &
20c80 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65  term, nTerm, pTe
20c90 72 6d 29 3b 0a 20 20 20 20 20 20 62 54 65 72 6d  rm);.      bTerm
20ca0 57 72 69 74 74 65 6e 20 3d 30 3b 0a 20 20 20 20  Written =0;.    
20cb0 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
20cc0 66 6f 72 20 6b 65 79 20 61 6e 6e 69 68 69 6c 61  for key annihila
20cd0 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  tion. */.    if(
20ce0 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 3d   pSegIter->nPos=
20cf0 3d 30 20 26 26 20 28 62 4f 6c 64 65 73 74 20 7c  =0 && (bOldest |
20d00 7c 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c  | pSegIter->bDel
20d10 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ==0) ) continue;
20d20 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ..    if( p->rc=
20d30 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 54  =SQLITE_OK && bT
20d40 65 72 6d 57 72 69 74 74 65 6e 3d 3d 30 20 29 7b  ermWritten==0 ){
20d50 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
20d60 73 20 61 20 6e 65 77 20 74 65 72 6d 2e 20 41 70  s a new term. Ap
20d70 70 65 6e 64 20 61 20 74 65 72 6d 20 74 6f 20 74  pend a term to t
20d80 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  he output segmen
20d90 74 2e 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35  t. */.      fts5
20da0 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28  WriteAppendTerm(
20db0 70 2c 20 26 77 72 69 74 65 72 2c 20 6e 54 65 72  p, &writer, nTer
20dc0 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  m, pTerm);.     
20dd0 20 62 54 65 72 6d 57 72 69 74 74 65 6e 20 3d 20   bTermWritten = 
20de0 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
20df0 20 41 70 70 65 6e 64 20 74 68 65 20 72 6f 77 69   Append the rowi
20e00 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  d to the output 
20e10 2a 2f 0a 20 20 20 20 2f 2a 20 57 52 49 54 45 50  */.    /* WRITEP
20e20 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20  OSLISTSIZE */.  
20e30 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e    fts5WriteAppen
20e40 64 52 6f 77 69 64 28 70 2c 20 26 77 72 69 74 65  dRowid(p, &write
20e50 72 2c 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  r, fts5MultiIter
20e60 52 6f 77 69 64 28 70 49 74 65 72 29 29 3b 0a 0a  Rowid(pIter));..
20e70 20 20 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d      if( eDetail=
20e80 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e  =FTS5_DETAIL_NON
20e90 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
20ea0 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 20 29 7b  SegIter->bDel ){
20eb0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
20ec0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
20ed0 26 70 2d 3e 72 63 2c 20 26 77 72 69 74 65 72 2e  &p->rc, &writer.
20ee0 77 72 69 74 65 72 2e 62 75 66 2c 20 30 29 3b 0a  writer.buf, 0);.
20ef0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65 67          if( pSeg
20f00 49 74 65 72 2d 3e 6e 50 6f 73 3e 30 20 29 7b 0a  Iter->nPos>0 ){.
20f10 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
20f20 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
20f30 28 26 70 2d 3e 72 63 2c 20 26 77 72 69 74 65 72  (&p->rc, &writer
20f40 2e 77 72 69 74 65 72 2e 62 75 66 2c 20 30 29 3b  .writer.buf, 0);
20f50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20f60 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
20f70 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68      /* Append th
20f80 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
20f90 64 61 74 61 20 74 6f 20 74 68 65 20 6f 75 74 70  data to the outp
20fa0 75 74 20 2a 2f 0a 20 20 20 20 20 20 6e 50 6f 73  ut */.      nPos
20fb0 20 3d 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f   = pSegIter->nPo
20fc0 73 2a 32 20 2b 20 70 53 65 67 49 74 65 72 2d 3e  s*2 + pSegIter->
20fd0 62 44 65 6c 3b 0a 20 20 20 20 20 20 66 74 73 35  bDel;.      fts5
20fe0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
20ff0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77 72 69 74  nt(&p->rc, &writ
21000 65 72 2e 77 72 69 74 65 72 2e 62 75 66 2c 20 6e  er.writer.buf, n
21010 50 6f 73 29 3b 0a 20 20 20 20 20 20 66 74 73 35  Pos);.      fts5
21020 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20  ChunkIterate(p, 
21030 70 53 65 67 49 74 65 72 2c 20 28 76 6f 69 64 2a  pSegIter, (void*
21040 29 26 77 72 69 74 65 72 2c 20 66 74 73 35 4d 65  )&writer, fts5Me
21050 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62 61 63 6b  rgeChunkCallback
21060 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
21070 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 6c 61 73  /* Flush the las
21080 74 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 64  t leaf page to d
21090 69 73 6b 2e 20 53 65 74 20 74 68 65 20 6f 75 74  isk. Set the out
210a0 70 75 74 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  put segment b-tr
210b0 65 65 20 68 65 69 67 68 74 0a 20 20 2a 2a 20 61  ee height.  ** a
210c0 6e 64 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67  nd last leaf pag
210d0 65 20 6e 75 6d 62 65 72 20 61 74 20 74 68 65 20  e number at the 
210e0 73 61 6d 65 20 74 69 6d 65 2e 20 20 2a 2f 0a 20  same time.  */. 
210f0 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68   fts5WriteFinish
21100 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70 53  (p, &writer, &pS
21110 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a  eg->pgnoLast);..
21120 20 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49    if( fts5MultiI
21130 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29  terEof(p, pIter)
21140 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a   ){.    int i;..
21150 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
21160 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d  e redundant segm
21170 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 25 5f  ents from the %_
21180 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20  data table */.  
21190 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e    for(i=0; i<nIn
211a0 70 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  put; i++){.     
211b0 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53   fts5DataRemoveS
211c0 65 67 6d 65 6e 74 28 70 2c 20 70 4c 76 6c 2d 3e  egment(p, pLvl->
211d0 61 53 65 67 5b 69 5d 2e 69 53 65 67 69 64 29 3b  aSeg[i].iSegid);
211e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
211f0 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64  emove the redund
21200 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f  ant segments fro
21210 6d 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65  m the input leve
21220 6c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 76  l */.    if( pLv
21230 6c 2d 3e 6e 53 65 67 21 3d 6e 49 6e 70 75 74 20  l->nSeg!=nInput 
21240 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f  ){.      int nMo
21250 76 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67  ve = (pLvl->nSeg
21260 20 2d 20 6e 49 6e 70 75 74 29 20 2a 20 73 69 7a   - nInput) * siz
21270 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
21280 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20  eSegment);.     
21290 20 6d 65 6d 6d 6f 76 65 28 70 4c 76 6c 2d 3e 61   memmove(pLvl->a
212a0 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67  Seg, &pLvl->aSeg
212b0 5b 6e 49 6e 70 75 74 5d 2c 20 6e 4d 6f 76 65 29  [nInput], nMove)
212c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 74 72  ;.    }.    pStr
212d0 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 20 2d 3d  uct->nSegment -=
212e0 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76   nInput;.    pLv
212f0 6c 2d 3e 6e 53 65 67 20 2d 3d 20 6e 49 6e 70 75  l->nSeg -= nInpu
21300 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65  t;.    pLvl->nMe
21310 72 67 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rge = 0;.    if(
21320 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3d   pSeg->pgnoLast=
21330 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 76 6c  =0 ){.      pLvl
21340 4f 75 74 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20  Out->nSeg--;.   
21350 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67     pStruct->nSeg
21360 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  ment--;.    }.  
21370 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
21380 74 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  t( pSeg->pgnoLas
21390 74 3e 30 20 29 3b 0a 20 20 20 20 66 74 73 35 54  t>0 );.    fts5T
213a0 72 69 6d 53 65 67 6d 65 6e 74 73 28 70 2c 20 70  rimSegments(p, p
213b0 49 74 65 72 29 3b 0a 20 20 20 20 70 4c 76 6c 2d  Iter);.    pLvl-
213c0 3e 6e 4d 65 72 67 65 20 3d 20 6e 49 6e 70 75 74  >nMerge = nInput
213d0 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 4d 75 6c  ;.  }..  fts5Mul
213e0 74 69 49 74 65 72 46 72 65 65 28 70 49 74 65 72  tiIterFree(pIter
213f0 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  );.  fts5BufferF
21400 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 69 66  ree(&term);.  if
21410 28 20 70 6e 52 65 6d 20 29 20 2a 70 6e 52 65 6d  ( pnRem ) *pnRem
21420 20 2d 3d 20 77 72 69 74 65 72 2e 6e 4c 65 61 66   -= writer.nLeaf
21430 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  Written;.}../*.*
21440 2a 20 44 6f 20 75 70 20 74 6f 20 6e 50 67 20 70  * Do up to nPg p
21450 61 67 65 73 20 6f 66 20 61 75 74 6f 6d 65 72 67  ages of automerg
21460 65 20 77 6f 72 6b 20 6f 6e 20 74 68 65 20 69 6e  e work on the in
21470 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  dex..**.** Retur
21480 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20 63 68  n true if any ch
21490 61 6e 67 65 73 20 77 65 72 65 20 61 63 74 75 61  anges were actua
214a0 6c 6c 79 20 6d 61 64 65 2c 20 6f 72 20 66 61 6c  lly made, or fal
214b0 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  se otherwise..*/
214c0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
214d0 49 6e 64 65 78 4d 65 72 67 65 28 0a 20 20 46 74  IndexMerge(.  Ft
214e0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
214f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21500 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
21510 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
21520 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75  ructure **ppStru
21530 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ct,       /* IN/
21540 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72  OUT: Current str
21550 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20  ucture of index 
21560 2a 2f 0a 20 20 69 6e 74 20 6e 50 67 2c 20 20 20  */.  int nPg,   
21570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21580 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 6f 66       /* Pages of
21590 20 77 6f 72 6b 20 74 6f 20 64 6f 20 2a 2f 0a 20   work to do */. 
215a0 20 69 6e 74 20 6e 4d 69 6e 20 20 20 20 20 20 20   int nMin       
215b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215c0 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62   /* Minimum numb
215d0 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74  er of segments t
215e0 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20  o merge */.){.  
215f0 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 50 67 3b 0a  int nRem = nPg;.
21600 20 20 69 6e 74 20 62 52 65 74 20 3d 20 30 3b 0a    int bRet = 0;.
21610 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
21620 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74  *pStruct = *ppSt
21630 72 75 63 74 3b 0a 20 20 77 68 69 6c 65 28 20 6e  ruct;.  while( n
21640 52 65 6d 3e 30 20 26 26 20 70 2d 3e 72 63 3d 3d  Rem>0 && p->rc==
21650 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21660 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20   int iLvl;      
21670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21680 54 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  To iterate throu
21690 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20  gh levels */.   
216a0 20 69 6e 74 20 69 42 65 73 74 4c 76 6c 20 3d 20   int iBestLvl = 
216b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
216c0 4c 65 76 65 6c 20 6f 66 66 65 72 69 6e 67 20 74  Level offering t
216d0 68 65 20 6d 6f 73 74 20 69 6e 70 75 74 20 73 65  he most input se
216e0 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e  gments */.    in
216f0 74 20 6e 42 65 73 74 20 3d 20 30 3b 20 20 20 20  t nBest = 0;    
21700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
21710 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
21720 6d 65 6e 74 73 20 6f 6e 20 62 65 73 74 20 6c 65  ments on best le
21730 76 65 6c 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  vel */..    /* S
21740 65 74 20 69 42 65 73 74 4c 76 6c 20 74 6f 20 74  et iBestLvl to t
21750 68 65 20 6c 65 76 65 6c 20 74 6f 20 72 65 61 64  he level to read
21760 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
21770 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20 61 73 73  from. */.    ass
21780 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c  ert( pStruct->nL
21790 65 76 65 6c 3e 30 20 29 3b 0a 20 20 20 20 66 6f  evel>0 );.    fo
217a0 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
217b0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
217c0 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46  iLvl++){.      F
217d0 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
217e0 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75  l *pLvl = &pStru
217f0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
21800 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c  ;.      if( pLvl
21810 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20  ->nMerge ){.    
21820 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d      if( pLvl->nM
21830 65 72 67 65 3e 6e 42 65 73 74 20 29 7b 0a 20 20  erge>nBest ){.  
21840 20 20 20 20 20 20 20 20 69 42 65 73 74 4c 76 6c          iBestLvl
21850 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 20   = iLvl;.       
21860 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d     nBest = pLvl-
21870 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 20 20 20  >nMerge;.       
21880 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
21890 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
218a0 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e 6e  if( pLvl->nSeg>n
218b0 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Best ){.        
218c0 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53  nBest = pLvl->nS
218d0 65 67 3b 0a 20 20 20 20 20 20 20 20 69 42 65 73  eg;.        iBes
218e0 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20  tLvl = iLvl;.   
218f0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
21900 2f 2a 20 49 66 20 6e 42 65 73 74 20 69 73 20 73  /* If nBest is s
21910 74 69 6c 6c 20 30 2c 20 74 68 65 6e 20 74 68 65  till 0, then the
21920 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20 65   index must be e
21930 6d 70 74 79 2e 20 2a 2f 0a 23 69 66 64 65 66 20  mpty. */.#ifdef 
21940 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
21950 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 6e 42 65   for(iLvl=0; nBe
21960 73 74 3d 3d 30 20 26 26 20 69 4c 76 6c 3c 70 53  st==0 && iLvl<pS
21970 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
21980 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  Lvl++){.      as
21990 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 61  sert( pStruct->a
219a0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
219b0 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ==0 );.    }.#en
219c0 64 69 66 0a 0a 20 20 20 20 69 66 28 20 6e 42 65  dif..    if( nBe
219d0 73 74 3c 6e 4d 69 6e 20 26 26 20 70 53 74 72 75  st<nMin && pStru
219e0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74  ct->aLevel[iBest
219f0 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29  Lvl].nMerge==0 )
21a00 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
21a10 20 20 20 7d 0a 20 20 20 20 62 52 65 74 20 3d 20     }.    bRet = 
21a20 31 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  1;.    fts5Index
21a30 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26 70  MergeLevel(p, &p
21a40 53 74 72 75 63 74 2c 20 69 42 65 73 74 4c 76 6c  Struct, iBestLvl
21a50 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20 69 66  , &nRem);.    if
21a60 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
21a70 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61  OK && pStruct->a
21a80 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e  Level[iBestLvl].
21a90 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20  nMerge==0 ){.   
21aa0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
21ab0 50 72 6f 6d 6f 74 65 28 70 2c 20 69 42 65 73 74  Promote(p, iBest
21ac0 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63 74 29 3b  Lvl+1, pStruct);
21ad0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70  .    }.  }.  *pp
21ae0 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74  Struct = pStruct
21af0 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 3b  ;.  return bRet;
21b00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 6f 74 61  .}../*.** A tota
21b10 6c 20 6f 66 20 6e 4c 65 61 66 20 6c 65 61 66 20  l of nLeaf leaf 
21b20 70 61 67 65 73 20 6f 66 20 64 61 74 61 20 68 61  pages of data ha
21b30 73 20 6a 75 73 74 20 62 65 65 6e 20 66 6c 75 73  s just been flus
21b40 68 65 64 20 74 6f 20 61 20 6c 65 76 65 6c 2d 30  hed to a level-0
21b50 0a 2a 2a 20 73 65 67 6d 65 6e 74 2e 20 54 68 69  .** segment. Thi
21b60 73 20 66 75 6e 63 74 69 6f 6e 20 75 70 64 61 74  s function updat
21b70 65 73 20 74 68 65 20 77 72 69 74 65 2d 63 6f 75  es the write-cou
21b80 6e 74 65 72 20 61 63 63 6f 72 64 69 6e 67 6c 79  nter accordingly
21b90 20 61 6e 64 2c 20 69 66 0a 2a 2a 20 6e 65 63 65   and, if.** nece
21ba0 73 73 61 72 79 2c 20 70 65 72 66 6f 72 6d 73 20  ssary, performs 
21bb0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67  incremental merg
21bc0 65 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  e work..**.** If
21bd0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
21be0 2c 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e  , set the Fts5In
21bf0 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64  dex.rc error cod
21c00 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  e. If an error h
21c10 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  as .** already o
21c20 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75  ccurred, this fu
21c30 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
21c40 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
21c50 64 20 66 74 73 35 49 6e 64 65 78 41 75 74 6f 6d  d fts5IndexAutom
21c60 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65  erge(.  Fts5Inde
21c70 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
21c80 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
21c90 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
21ca0 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
21cb0 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20  e **ppStruct,   
21cc0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43      /* IN/OUT: C
21cd0 75 72 72 65 6e 74 20 73 74 72 75 63 74 75 72 65  urrent structure
21ce0 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   of index */.  i
21cf0 6e 74 20 6e 4c 65 61 66 20 20 20 20 20 20 20 20  nt nLeaf        
21d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21d10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  * Number of outp
21d20 75 74 20 6c 65 61 76 65 73 20 6a 75 73 74 20 77  ut leaves just w
21d30 72 69 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20 20 69  ritten */.){.  i
21d40 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
21d50 5f 4f 4b 20 26 26 20 70 2d 3e 70 43 6f 6e 66 69  _OK && p->pConfi
21d60 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 3e 30 20  g->nAutomerge>0 
21d70 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ){.    Fts5Struc
21d80 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
21d90 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20 75  *ppStruct;.    u
21da0 36 34 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  64 nWrite;      
21db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21dc0 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66  Initial value of
21dd0 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 2a   write-counter *
21de0 2f 0a 20 20 20 20 69 6e 74 20 6e 57 6f 72 6b 3b  /.    int nWork;
21df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
21e10 20 77 6f 72 6b 2d 71 75 61 6e 74 61 20 74 6f 20   work-quanta to 
21e20 70 65 72 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 69  perform */.    i
21e30 6e 74 20 6e 52 65 6d 3b 20 20 20 20 20 20 20 20  nt nRem;        
21e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21e50 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  Number of leaf p
21e60 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69  ages left to wri
21e70 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 55 70  te */..    /* Up
21e80 64 61 74 65 20 74 68 65 20 77 72 69 74 65 2d 63  date the write-c
21e90 6f 75 6e 74 65 72 2e 20 57 68 69 6c 65 20 64 6f  ounter. While do
21ea0 69 6e 67 20 73 6f 2c 20 73 65 74 20 6e 57 6f 72  ing so, set nWor
21eb0 6b 2e 20 2a 2f 0a 20 20 20 20 6e 57 72 69 74 65  k. */.    nWrite
21ec0 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69   = pStruct->nWri
21ed0 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20 6e  teCounter;.    n
21ee0 57 6f 72 6b 20 3d 20 28 69 6e 74 29 28 28 28 6e  Work = (int)(((n
21ef0 57 72 69 74 65 20 2b 20 6e 4c 65 61 66 29 20 2f  Write + nLeaf) /
21f00 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 20 2d   p->nWorkUnit) -
21f10 20 28 6e 57 72 69 74 65 20 2f 20 70 2d 3e 6e 57   (nWrite / p->nW
21f20 6f 72 6b 55 6e 69 74 29 29 3b 0a 20 20 20 20 70  orkUnit));.    p
21f30 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f  Struct->nWriteCo
21f40 75 6e 74 65 72 20 2b 3d 20 6e 4c 65 61 66 3b 0a  unter += nLeaf;.
21f50 20 20 20 20 6e 52 65 6d 20 3d 20 28 69 6e 74 29      nRem = (int)
21f60 28 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 2a 20  (p->nWorkUnit * 
21f70 6e 57 6f 72 6b 20 2a 20 70 53 74 72 75 63 74 2d  nWork * pStruct-
21f80 3e 6e 4c 65 76 65 6c 29 3b 0a 0a 20 20 20 20 66  >nLevel);..    f
21f90 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 70 2c  ts5IndexMerge(p,
21fa0 20 70 70 53 74 72 75 63 74 2c 20 6e 52 65 6d 2c   ppStruct, nRem,
21fb0 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75   p->pConfig->nAu
21fc0 74 6f 6d 65 72 67 65 29 3b 0a 20 20 7d 0a 7d 0a  tomerge);.  }.}.
21fd0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
21fe0 35 49 6e 64 65 78 43 72 69 73 69 73 6d 65 72 67  5IndexCrisismerg
21ff0 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
22000 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
22010 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
22020 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
22030 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
22040 2a 70 70 53 74 72 75 63 74 20 20 20 20 20 20 20  *ppStruct       
22050 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72   /* IN/OUT: Curr
22060 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f 66  ent structure of
22070 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 63   index */.){.  c
22080 6f 6e 73 74 20 69 6e 74 20 6e 43 72 69 73 69 73  onst int nCrisis
22090 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e   = p->pConfig->n
220a0 43 72 69 73 69 73 4d 65 72 67 65 3b 0a 20 20 46  CrisisMerge;.  F
220b0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
220c0 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
220d0 74 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20  t;.  int iLvl = 
220e0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
220f0 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
22100 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  | pStruct->nLeve
22110 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  l>0 );.  while( 
22120 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
22130 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65   && pStruct->aLe
22140 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 3d  vel[iLvl].nSeg>=
22150 6e 43 72 69 73 69 73 20 29 7b 0a 20 20 20 20 66  nCrisis ){.    f
22160 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76  ts5IndexMergeLev
22170 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20  el(p, &pStruct, 
22180 69 4c 76 6c 2c 20 30 29 3b 0a 20 20 20 20 61 73  iLvl, 0);.    as
22190 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c  sert( p->rc!=SQL
221a0 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 72 75 63  ITE_OK || pStruc
221b0 74 2d 3e 6e 4c 65 76 65 6c 3e 28 69 4c 76 6c 2b  t->nLevel>(iLvl+
221c0 31 29 20 29 3b 0a 20 20 20 20 66 74 73 35 53 74  1) );.    fts5St
221d0 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70  ructurePromote(p
221e0 2c 20 69 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63  , iLvl+1, pStruc
221f0 74 29 3b 0a 20 20 20 20 69 4c 76 6c 2b 2b 3b 0a  t);.    iLvl++;.
22200 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74 20    }.  *ppStruct 
22210 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 73 74  = pStruct;.}..st
22220 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64  atic int fts5Ind
22230 65 78 52 65 74 75 72 6e 28 46 74 73 35 49 6e 64  exReturn(Fts5Ind
22240 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ex *p){.  int rc
22250 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 70 2d 3e 72   = p->rc;.  p->r
22260 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
22270 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74   return rc;.}..t
22280 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
22290 73 35 46 6c 75 73 68 43 74 78 20 46 74 73 35 46  s5FlushCtx Fts5F
222a0 6c 75 73 68 43 74 78 3b 0a 73 74 72 75 63 74 20  lushCtx;.struct 
222b0 46 74 73 35 46 6c 75 73 68 43 74 78 20 7b 0a 20  Fts5FlushCtx {. 
222c0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49 64 78   Fts5Index *pIdx
222d0 3b 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  ;.  Fts5SegWrite
222e0 72 20 77 72 69 74 65 72 3b 20 0a 7d 3b 0a 0a 2f  r writer; .};../
222f0 2a 0a 2a 2a 20 42 75 66 66 65 72 20 61 42 75 66  *.** Buffer aBuf
22300 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 61 20 6c 69  [] contains a li
22310 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2c 20 61  st of varints, a
22320 6c 6c 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  ll small enough 
22330 74 6f 20 66 69 74 0a 2a 2a 20 69 6e 20 61 20 33  to fit.** in a 3
22340 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20 52  2-bit integer. R
22350 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
22360 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 70 72  f the largest pr
22370 65 66 69 78 20 6f 66 20 74 68 69 73 20 0a 2a 2a  efix of this .**
22380 20 6c 69 73 74 20 6e 4d 61 78 20 62 79 74 65 73   list nMax bytes
22390 20 6f 72 20 6c 65 73 73 20 69 6e 20 73 69 7a 65   or less in size
223a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
223b0 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65 66 69  fts5PoslistPrefi
223c0 78 28 63 6f 6e 73 74 20 75 38 20 2a 61 42 75 66  x(const u8 *aBuf
223d0 2c 20 69 6e 74 20 6e 4d 61 78 29 7b 0a 20 20 69  , int nMax){.  i
223e0 6e 74 20 72 65 74 3b 0a 20 20 75 33 32 20 64 75  nt ret;.  u32 du
223f0 6d 6d 79 3b 0a 20 20 72 65 74 20 3d 20 66 74 73  mmy;.  ret = fts
22400 35 47 65 74 56 61 72 69 6e 74 33 32 28 61 42 75  5GetVarint32(aBu
22410 66 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 69 66 28  f, dummy);.  if(
22420 20 72 65 74 3c 6e 4d 61 78 20 29 7b 0a 20 20 20   ret<nMax ){.   
22430 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
22440 20 20 20 69 6e 74 20 69 20 3d 20 66 74 73 35 47     int i = fts5G
22450 65 74 56 61 72 69 6e 74 33 32 28 26 61 42 75 66  etVarint32(&aBuf
22460 5b 72 65 74 5d 2c 20 64 75 6d 6d 79 29 3b 0a 20  [ret], dummy);. 
22470 20 20 20 20 20 69 66 28 20 28 72 65 74 20 2b 20       if( (ret + 
22480 69 29 20 3e 20 6e 4d 61 78 20 29 20 62 72 65 61  i) > nMax ) brea
22490 6b 3b 0a 20 20 20 20 20 20 72 65 74 20 2b 3d 20  k;.      ret += 
224a0 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  i;.    }.  }.  r
224b0 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
224c0 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 63 6f  .** Flush the co
224d0 6e 74 65 6e 74 73 20 6f 66 20 69 6e 2d 6d 65 6d  ntents of in-mem
224e0 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 20 69  ory hash table i
224f0 48 61 73 68 20 74 6f 20 61 20 6e 65 77 20 6c 65  Hash to a new le
22500 76 65 6c 2d 30 20 0a 2a 2a 20 73 65 67 6d 65 6e  vel-0 .** segmen
22510 74 20 6f 6e 20 64 69 73 6b 2e 20 41 6c 73 6f 20  t on disk. Also 
22520 75 70 64 61 74 65 20 74 68 65 20 63 6f 72 72 65  update the corre
22530 73 70 6f 6e 64 69 6e 67 20 73 74 72 75 63 74 75  sponding structu
22540 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  re record..**.**
22550 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
22560 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73  urs, set the Fts
22570 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20  5Index.rc error 
22580 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  code. If an erro
22590 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64  r has .** alread
225a0 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
225b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
225c0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
225d0 76 6f 69 64 20 66 74 73 35 46 6c 75 73 68 4f 6e  void fts5FlushOn
225e0 65 48 61 73 68 28 46 74 73 35 49 6e 64 65 78 20  eHash(Fts5Index 
225f0 2a 70 29 7b 0a 20 20 46 74 73 35 48 61 73 68 20  *p){.  Fts5Hash 
22600 2a 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61 73  *pHash = p->pHas
22610 68 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  h;.  Fts5Structu
22620 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 69  re *pStruct;.  i
22630 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 69 6e 74  nt iSegid;.  int
22640 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 20 20   pgnoLast = 0;  
22650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22660 2a 20 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65  * Last leaf page
22670 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65   number in segme
22680 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61  nt */..  /* Obta
22690 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  in a reference t
226a0 6f 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  o the index stru
226b0 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 6f 63 61  cture and alloca
226c0 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74  te a new segment
226d0 2d 69 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  -id.  ** for the
226e0 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 73 65 67   new level-0 seg
226f0 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20 70 53 74 72  ment.  */.  pStr
22700 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
22710 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 69 53  ureRead(p);.  iS
22720 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63  egid = fts5Alloc
22730 61 74 65 53 65 67 69 64 28 70 2c 20 70 53 74 72  ateSegid(p, pStr
22740 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75  uct);.  fts5Stru
22750 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28  ctureInvalidate(
22760 70 29 3b 0a 0a 20 20 69 66 28 20 69 53 65 67 69  p);..  if( iSegi
22770 64 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  d ){.    const i
22780 6e 74 20 70 67 73 7a 20 3d 20 70 2d 3e 70 43 6f  nt pgsz = p->pCo
22790 6e 66 69 67 2d 3e 70 67 73 7a 3b 0a 20 20 20 20  nfig->pgsz;.    
227a0 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d  int eDetail = p-
227b0 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
227c0 6c 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  l;.    Fts5Struc
227d0 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
227e0 67 3b 20 20 20 2f 2a 20 4e 65 77 20 73 65 67 6d  g;   /* New segm
227f0 65 6e 74 20 77 69 74 68 69 6e 20 70 53 74 72 75  ent within pStru
22800 63 74 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75  ct */.    Fts5Bu
22810 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20 20 20  ffer *pBuf;     
22820 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
22830 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 61 73  r in which to as
22840 73 65 6d 62 6c 65 20 6c 65 61 66 20 70 61 67 65  semble leaf page
22850 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66   */.    Fts5Buff
22860 65 72 20 2a 70 50 67 69 64 78 3b 20 20 20 20 20  er *pPgidx;     
22870 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
22880 69 6e 20 77 68 69 63 68 20 74 6f 20 61 73 73 65  in which to asse
22890 6d 62 6c 65 20 70 67 69 64 78 20 2a 2f 0a 0a 20  mble pgidx */.. 
228a0 20 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72     Fts5SegWriter
228b0 20 77 72 69 74 65 72 3b 0a 20 20 20 20 66 74 73   writer;.    fts
228c0 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77  5WriteInit(p, &w
228d0 72 69 74 65 72 2c 20 69 53 65 67 69 64 29 3b 0a  riter, iSegid);.
228e0 0a 20 20 20 20 70 42 75 66 20 3d 20 26 77 72 69  .    pBuf = &wri
228f0 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66 3b 0a  ter.writer.buf;.
22900 20 20 20 20 70 50 67 69 64 78 20 3d 20 26 77 72      pPgidx = &wr
22910 69 74 65 72 2e 77 72 69 74 65 72 2e 70 67 69 64  iter.writer.pgid
22920 78 3b 0a 0a 20 20 20 20 2f 2a 20 66 74 73 35 57  x;..    /* fts5W
22930 72 69 74 65 49 6e 69 74 28 29 20 73 68 6f 75 6c  riteInit() shoul
22940 64 20 68 61 76 65 20 69 6e 69 74 69 61 6c 69 7a  d have initializ
22950 65 64 20 74 68 65 20 62 75 66 66 65 72 73 20 74  ed the buffers t
22960 6f 20 28 6d 6f 73 74 20 6c 69 6b 65 6c 79 29 0a  o (most likely).
22970 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d      ** the maxim
22980 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65  um space require
22990 64 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  d. */.    assert
229a0 28 20 70 2d 3e 72 63 20 7c 7c 20 70 42 75 66 2d  ( p->rc || pBuf-
229b0 3e 6e 53 70 61 63 65 3e 3d 28 70 67 73 7a 20 2b  >nSpace>=(pgsz +
229c0 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49   FTS5_DATA_PADDI
229d0 4e 47 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  NG) );.    asser
229e0 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70 50 67 69  t( p->rc || pPgi
229f0 64 78 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 67 73  dx->nSpace>=(pgs
22a00 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41  z + FTS5_DATA_PA
22a10 44 44 49 4e 47 29 20 29 3b 0a 0a 20 20 20 20 2f  DDING) );..    /
22a20 2a 20 42 65 67 69 6e 20 73 63 61 6e 6e 69 6e 67  * Begin scanning
22a30 20 74 68 72 6f 75 67 68 20 68 61 73 68 20 74 61   through hash ta
22a40 62 6c 65 20 65 6e 74 72 69 65 73 2e 20 54 68 69  ble entries. Thi
22a50 73 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65  s loop runs once
22a60 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a   for each.    **
22a70 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20 63 75   term/doclist cu
22a80 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 77  rrently stored w
22a90 69 74 68 69 6e 20 74 68 65 20 68 61 73 68 20 74  ithin the hash t
22aa0 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  able. */.    if(
22ab0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
22ac0 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  K ){.      p->rc
22ad0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61   = sqlite3Fts5Ha
22ae0 73 68 53 63 61 6e 49 6e 69 74 28 70 48 61 73 68  shScanInit(pHash
22af0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
22b00 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
22b10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
22b20 3d 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68  =sqlite3Fts5Hash
22b30 53 63 61 6e 45 6f 66 28 70 48 61 73 68 29 20 29  ScanEof(pHash) )
22b40 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
22b50 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20 20  ar *zTerm;      
22b60 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
22b70 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20 2a 2f  ntaining term */
22b80 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
22b90 2a 70 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20  *pDoclist;      
22ba0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
22bb0 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 69   doclist for thi
22bc0 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20  s term */.      
22bd0 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20  int nDoclist;   
22be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
22bf0 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 69  ize of doclist i
22c00 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 20 20  n bytes */..    
22c10 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 74    /* Write the t
22c20 65 72 6d 20 66 6f 72 20 74 68 69 73 20 65 6e 74  erm for this ent
22c30 72 79 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20  ry to disk. */. 
22c40 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
22c50 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70 48  HashScanEntry(pH
22c60 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 44  ash, &zTerm, &pD
22c70 6f 63 6c 69 73 74 2c 20 26 6e 44 6f 63 6c 69 73  oclist, &nDoclis
22c80 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72  t);.      fts5Wr
22c90 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c  iteAppendTerm(p,
22ca0 20 26 77 72 69 74 65 72 2c 20 28 69 6e 74 29 73   &writer, (int)s
22cb0 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 20 28 63  trlen(zTerm), (c
22cc0 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b  onst u8*)zTerm);
22cd0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
22ce0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72  !=SQLITE_OK ) br
22cf0 65 61 6b 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  eak;..      asse
22d00 72 74 28 20 77 72 69 74 65 72 2e 62 46 69 72 73  rt( writer.bFirs
22d10 74 52 6f 77 69 64 49 6e 50 61 67 65 3d 3d 30 20  tRowidInPage==0 
22d20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 73  );.      if( pgs
22d30 7a 3e 3d 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50  z>=(pBuf->n + pP
22d40 67 69 64 78 2d 3e 6e 20 2b 20 6e 44 6f 63 6c 69  gidx->n + nDocli
22d50 73 74 20 2b 20 31 29 20 29 7b 0a 20 20 20 20 20  st + 1) ){.     
22d60 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65     /* The entire
22d70 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c 20 66 69   doclist will fi
22d80 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  t on the current
22d90 20 6c 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20   leaf. */.      
22da0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
22db0 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c  AppendBlob(pBuf,
22dc0 20 70 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c   pDoclist, nDocl
22dd0 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ist);.      }els
22de0 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  e{.        i64 i
22df0 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 20  Rowid = 0;.     
22e00 20 20 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20     i64 iDelta = 
22e10 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  0;.        int i
22e20 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  Off = 0;..      
22e30 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20    /* The entire 
22e40 64 6f 63 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74  doclist will not
22e50 20 66 69 74 20 6f 6e 20 74 68 69 73 20 6c 65 61   fit on this lea
22e60 66 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  f. The following
22e70 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f   .        ** loo
22e80 70 20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75  p iterates throu
22e90 67 68 20 74 68 65 20 70 6f 73 6c 69 73 74 73 20  gh the poslists 
22ea0 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
22eb0 20 63 75 72 72 65 6e 74 20 0a 20 20 20 20 20 20   current .      
22ec0 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2e 20 20 2a    ** doclist.  *
22ed0 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  /.        while(
22ee0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
22ef0 4b 20 26 26 20 69 4f 66 66 3c 6e 44 6f 63 6c 69  K && iOff<nDocli
22f00 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
22f10 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
22f20 61 72 69 6e 74 28 26 70 44 6f 63 6c 69 73 74 5b  arint(&pDoclist[
22f30 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44  iOff], (u64*)&iD
22f40 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20  elta);.         
22f50 20 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74   iRowid += iDelt
22f60 61 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20  a;.          .  
22f70 20 20 20 20 20 20 20 20 69 66 28 20 77 72 69 74          if( writ
22f80 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  er.bFirstRowidIn
22f90 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
22fa0 20 20 20 20 66 74 73 35 50 75 74 55 31 36 28 26      fts5PutU16(&
22fb0 70 42 75 66 2d 3e 70 5b 30 5d 2c 20 28 75 31 36  pBuf->p[0], (u16
22fc0 29 70 42 75 66 2d 3e 6e 29 3b 20 20 20 2f 2a 20  )pBuf->n);   /* 
22fd0 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 70  first rowid on p
22fe0 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  age */.         
22ff0 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71     pBuf->n += sq
23000 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72 69  lite3Fts5PutVari
23010 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66  nt(&pBuf->p[pBuf
23020 2d 3e 6e 5d 2c 20 69 52 6f 77 69 64 29 3b 0a 20  ->n], iRowid);. 
23030 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 65             write
23040 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  r.bFirstRowidInP
23050 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
23060 20 20 20 20 20 66 74 73 35 57 72 69 74 65 44 6c       fts5WriteDl
23070 69 64 78 41 70 70 65 6e 64 28 70 2c 20 26 77 72  idxAppend(p, &wr
23080 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20  iter, iRowid);. 
23090 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
230a0 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66              pBuf
230b0 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
230c0 73 35 50 75 74 56 61 72 69 6e 74 28 26 70 42 75  s5PutVarint(&pBu
230d0 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69  f->p[pBuf->n], i
230e0 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20  Delta);.        
230f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73    }.          as
23100 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70  sert( pBuf->n<=p
23110 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 0a  Buf->nSpace );..
23120 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 44            if( eD
23130 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
23140 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  IL_NONE ){.     
23150 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c         if( iOff<
23160 6e 44 6f 63 6c 69 73 74 20 26 26 20 70 44 6f 63  nDoclist && pDoc
23170 6c 69 73 74 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b  list[iOff]==0 ){
23180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
23190 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b  Buf->p[pBuf->n++
231a0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
231b0 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20       iOff++;.   
231c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
231d0 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20 26 26 20  Off<nDoclist && 
231e0 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3d 3d  pDoclist[iOff]==
231f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
23200 20 20 20 20 20 70 42 75 66 2d 3e 70 5b 70 42 75       pBuf->p[pBu
23210 66 2d 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20  f->n++] = 0;.   
23220 20 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66               iOf
23230 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  f++;.           
23240 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
23250 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
23260 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50  f( (pBuf->n + pP
23270 67 69 64 78 2d 3e 6e 29 3e 3d 70 67 73 7a 20 29  gidx->n)>=pgsz )
23280 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23290 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
232a0 61 66 28 70 2c 20 26 77 72 69 74 65 72 29 3b 0a  af(p, &writer);.
232b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
232c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
232d0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62             int b
232e0 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20  Dummy;.         
232f0 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
23300 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f           int nCo
23310 70 79 20 3d 20 66 74 73 35 47 65 74 50 6f 73 6c  py = fts5GetPosl
23320 69 73 74 53 69 7a 65 28 26 70 44 6f 63 6c 69 73  istSize(&pDoclis
23330 74 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20  t[iOff], &nPos, 
23340 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20  &bDummy);.      
23350 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 6e        nCopy += n
23360 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pos;.           
23370 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20   if( (pBuf->n + 
23380 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 43 6f 70  pPgidx->n + nCop
23390 79 29 20 3c 3d 20 70 67 73 7a 20 29 7b 0a 20 20  y) <= pgsz ){.  
233a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
233b0 68 65 20 65 6e 74 69 72 65 20 70 6f 73 6c 69 73  he entire poslis
233c0 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
233d0 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20  e current leaf. 
233e0 53 6f 20 63 6f 70 79 0a 20 20 20 20 20 20 20 20  So copy.        
233f0 20 20 20 20 20 20 2a 2a 20 69 74 20 69 6e 20 6f        ** it in o
23400 6e 65 20 67 6f 2e 20 2a 2f 0a 20 20 20 20 20 20  ne go. */.      
23410 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
23420 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
23430 28 70 42 75 66 2c 20 26 70 44 6f 63 6c 69 73 74  (pBuf, &pDoclist
23440 5b 69 4f 66 66 5d 2c 20 6e 43 6f 70 79 29 3b 0a  [iOff], nCopy);.
23450 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
23460 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
23470 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70   /* The entire p
23480 6f 73 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20  oslist will not 
23490 66 69 74 20 6f 6e 20 74 68 69 73 20 6c 65 61 66  fit on this leaf
234a0 2e 20 53 6f 20 69 74 20 6e 65 65 64 73 0a 20 20  . So it needs.  
234b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
234c0 6f 20 62 65 20 62 72 6f 6b 65 6e 20 69 6e 74 6f  o be broken into
234d0 20 73 65 63 74 69 6f 6e 73 2e 20 54 68 65 20 6f   sections. The o
234e0 6e 6c 79 20 71 75 61 6c 69 66 69 63 61 74 69 6f  nly qualificatio
234f0 6e 20 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20  n being.        
23500 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 65 61        ** that ea
23510 63 68 20 76 61 72 69 6e 74 20 6d 75 73 74 20 62  ch varint must b
23520 65 20 73 74 6f 72 65 64 20 63 6f 6e 74 69 67 75  e stored contigu
23530 6f 75 73 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 20  ously.  */.     
23540 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75           const u
23550 38 20 2a 70 50 6f 73 6c 69 73 74 20 3d 20 26 70  8 *pPoslist = &p
23560 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3b 0a 20  Doclist[iOff];. 
23570 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
23580 20 69 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20   iPos = 0;.     
23590 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
235a0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
235b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
235c0 20 20 20 20 69 6e 74 20 6e 53 70 61 63 65 20 3d      int nSpace =
235d0 20 70 67 73 7a 20 2d 20 70 42 75 66 2d 3e 6e 20   pgsz - pBuf->n 
235e0 2d 20 70 50 67 69 64 78 2d 3e 6e 3b 0a 20 20 20  - pPgidx->n;.   
235f0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
23600 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   n = 0;.        
23610 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 43 6f          if( (nCo
23620 70 79 20 2d 20 69 50 6f 73 29 3c 3d 6e 53 70 61  py - iPos)<=nSpa
23630 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ce ){.          
23640 20 20 20 20 20 20 20 20 6e 20 3d 20 6e 43 6f 70          n = nCop
23650 79 20 2d 20 69 50 6f 73 3b 0a 20 20 20 20 20 20  y - iPos;.      
23660 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
23670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23680 20 20 20 6e 20 3d 20 66 74 73 35 50 6f 73 6c 69     n = fts5Posli
23690 73 74 50 72 65 66 69 78 28 26 70 50 6f 73 6c 69  stPrefix(&pPosli
236a0 73 74 5b 69 50 6f 73 5d 2c 20 6e 53 70 61 63 65  st[iPos], nSpace
236b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
236c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
236d0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3e 30       assert( n>0
236e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
236f0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
23700 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75  feAppendBlob(pBu
23710 66 2c 20 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f  f, &pPoslist[iPo
23720 73 5d 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20  s], n);.        
23730 20 20 20 20 20 20 20 20 69 50 6f 73 20 2b 3d 20          iPos += 
23740 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
23750 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20     if( (pBuf->n 
23760 2b 20 70 50 67 69 64 78 2d 3e 6e 29 3e 3d 70 67  + pPgidx->n)>=pg
23770 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  sz ){.          
23780 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74          fts5Writ
23790 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77  eFlushLeaf(p, &w
237a0 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  riter);.        
237b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
237c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
237d0 6f 73 3e 3d 6e 43 6f 70 79 20 29 20 62 72 65 61  os>=nCopy ) brea
237e0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
237f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
23800 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66  .            iOf
23810 66 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  f += nCopy;.    
23820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23830 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
23840 20 2f 2a 20 54 4f 44 4f 32 3a 20 44 6f 63 6c 69   /* TODO2: Docli
23850 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 77 72  st terminator wr
23860 69 74 74 65 6e 20 68 65 72 65 2e 20 2a 2f 0a 20  itten here. */. 
23870 20 20 20 20 20 2f 2a 20 70 42 75 66 2d 3e 70 5b       /* pBuf->p[
23880 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 27 5c 30  pBuf->n++] = '\0
23890 27 3b 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  '; */.      asse
238a0 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75  rt( pBuf->n<=pBu
238b0 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 20 20 20  f->nSpace );.   
238c0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
238d0 4c 49 54 45 5f 4f 4b 20 29 20 73 71 6c 69 74 65  LITE_OK ) sqlite
238e0 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78  3Fts5HashScanNex
238f0 74 28 70 48 61 73 68 29 3b 0a 20 20 20 20 7d 0a  t(pHash);.    }.
23900 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
23910 61 73 68 43 6c 65 61 72 28 70 48 61 73 68 29 3b  ashClear(pHash);
23920 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46 69  .    fts5WriteFi
23930 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c  nish(p, &writer,
23940 20 26 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20   &pgnoLast);..  
23950 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
23960 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 20 49  Fts5Structure. I
23970 74 20 69 73 20 77 72 69 74 74 65 6e 20 62 61 63  t is written bac
23980 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  k to the databas
23990 65 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20  e by the.    ** 
239a0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
239b0 65 61 73 65 28 29 20 63 61 6c 6c 20 62 65 6c 6f  ease() call belo
239c0 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  w.  */.    if( p
239d0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d  Struct->nLevel==
239e0 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  0 ){.      fts5S
239f0 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c  tructureAddLevel
23a00 28 26 70 2d 3e 72 63 2c 20 26 70 53 74 72 75 63  (&p->rc, &pStruc
23a10 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  t);.    }.    ft
23a20 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e  s5StructureExten
23a30 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70  dLevel(&p->rc, p
23a40 53 74 72 75 63 74 2c 20 30 2c 20 31 2c 20 30 29  Struct, 0, 1, 0)
23a50 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ;.    if( p->rc=
23a60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23a70 20 20 20 20 70 53 65 67 20 3d 20 26 70 53 74 72      pSeg = &pStr
23a80 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 61  uct->aLevel[0].a
23a90 53 65 67 5b 20 70 53 74 72 75 63 74 2d 3e 61 4c  Seg[ pStruct->aL
23aa0 65 76 65 6c 5b 30 5d 2e 6e 53 65 67 2b 2b 20 5d  evel[0].nSeg++ ]
23ab0 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 69 53  ;.      pSeg->iS
23ac0 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 20  egid = iSegid;. 
23ad0 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46       pSeg->pgnoF
23ae0 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  irst = 1;.      
23af0 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d  pSeg->pgnoLast =
23b00 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 20   pgnoLast;.     
23b10 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
23b20 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt++;.    }.    
23b30 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
23b40 6d 6f 74 65 28 70 2c 20 30 2c 20 70 53 74 72 75  mote(p, 0, pStru
23b50 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  ct);.  }..  fts5
23b60 49 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28 70  IndexAutomerge(p
23b70 2c 20 26 70 53 74 72 75 63 74 2c 20 70 67 6e 6f  , &pStruct, pgno
23b80 4c 61 73 74 29 3b 0a 20 20 66 74 73 35 49 6e 64  Last);.  fts5Ind
23b90 65 78 43 72 69 73 69 73 6d 65 72 67 65 28 70 2c  exCrisismerge(p,
23ba0 20 26 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74   &pStruct);.  ft
23bb0 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65  s5StructureWrite
23bc0 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  (p, pStruct);.  
23bd0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
23be0 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 7d  ease(pStruct);.}
23bf0 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e  ../*.** Flush an
23c00 79 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  y data stored in
23c10 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68   the in-memory h
23c20 61 73 68 20 74 61 62 6c 65 73 20 74 6f 20 74 68  ash tables to th
23c30 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
23c40 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
23c50 6e 64 65 78 46 6c 75 73 68 28 46 74 73 35 49 6e  ndexFlush(Fts5In
23c60 64 65 78 20 2a 70 29 7b 0a 20 20 2f 2a 20 55 6e  dex *p){.  /* Un
23c70 6c 65 73 73 20 69 74 20 69 73 20 65 6d 70 74 79  less it is empty
23c80 2c 20 66 6c 75 73 68 20 74 68 65 20 68 61 73 68  , flush the hash
23c90 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b 20 2a   table to disk *
23ca0 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64  /.  if( p->nPend
23cb0 69 6e 67 44 61 74 61 20 29 7b 0a 20 20 20 20 61  ingData ){.    a
23cc0 73 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20  ssert( p->pHash 
23cd0 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69  );.    p->nPendi
23ce0 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  ngData = 0;.    
23cf0 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61 73 68  fts5FlushOneHash
23d00 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  (p);.  }.}..stat
23d10 69 63 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ic Fts5Structure
23d20 20 2a 66 74 73 35 49 6e 64 65 78 4f 70 74 69 6d   *fts5IndexOptim
23d30 69 7a 65 53 74 72 75 63 74 28 0a 20 20 46 74 73  izeStruct(.  Fts
23d40 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
23d50 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
23d60 72 75 63 74 0a 29 7b 0a 20 20 46 74 73 35 53 74  ruct.){.  Fts5St
23d70 72 75 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20  ructure *pNew = 
23d80 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  0;.  sqlite3_int
23d90 36 34 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  64 nByte = sizeo
23da0 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29  f(Fts5Structure)
23db0 3b 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 70  ;.  int nSeg = p
23dc0 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
23dd0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  ;.  int i;..  /*
23de0 20 46 69 67 75 72 65 20 6f 75 74 20 69 66 20 74   Figure out if t
23df0 68 69 73 20 73 74 72 75 63 74 75 72 65 20 72 65  his structure re
23e00 71 75 69 72 65 73 20 6f 70 74 69 6d 69 7a 61 74  quires optimizat
23e10 69 6f 6e 2e 20 41 20 73 74 72 75 63 74 75 72 65  ion. A structure
23e20 20 64 6f 65 73 0a 20 20 2a 2a 20 6e 6f 74 20 72   does.  ** not r
23e30 65 71 75 69 72 65 20 6f 70 74 69 6d 69 7a 61 74  equire optimizat
23e40 69 6f 6e 20 69 66 20 65 69 74 68 65 72 3a 0a 20  ion if either:. 
23e50 20 2a 2a 0a 20 20 2a 2a 20 20 2b 20 69 74 20 63   **.  **  + it c
23e60 6f 6e 73 69 73 74 73 20 6f 66 20 66 65 77 65 72  onsists of fewer
23e70 20 74 68 61 6e 20 74 77 6f 20 73 65 67 6d 65 6e   than two segmen
23e80 74 73 2c 20 6f 72 20 0a 20 20 2a 2a 20 20 2b 20  ts, or .  **  + 
23e90 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 61 72 65  all segments are
23ea0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 6c 65 76   on the same lev
23eb0 65 6c 2c 20 6f 72 0a 20 20 2a 2a 20 20 2b 20 61  el, or.  **  + a
23ec0 6c 6c 20 73 65 67 6d 65 6e 74 73 20 65 78 63 65  ll segments exce
23ed0 70 74 20 6f 6e 65 20 61 72 65 20 63 75 72 72 65  pt one are curre
23ee0 6e 74 6c 79 20 69 6e 70 75 74 73 20 74 6f 20 61  ntly inputs to a
23ef0 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e   merge operation
23f00 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74  ..  **.  ** In t
23f10 68 65 20 66 69 72 73 74 20 63 61 73 65 2c 20 72  he first case, r
23f20 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 20 74  eturn NULL. In t
23f30 68 65 20 73 65 63 6f 6e 64 2c 20 69 6e 63 72 65  he second, incre
23f40 6d 65 6e 74 20 74 68 65 20 72 65 66 2d 63 6f 75  ment the ref-cou
23f50 6e 74 0a 20 20 2a 2a 20 6f 6e 20 2a 70 53 74 72  nt.  ** on *pStr
23f60 75 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61  uct and return a
23f70 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 69   copy of the poi
23f80 6e 74 65 72 20 74 6f 20 69 74 2e 0a 20 20 2a 2f  nter to it..  */
23f90 0a 20 20 69 66 28 20 6e 53 65 67 3c 32 20 29 20  .  if( nSeg<2 ) 
23fa0 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28  return 0;.  for(
23fb0 69 3d 30 3b 20 69 3c 70 53 74 72 75 63 74 2d 3e  i=0; i<pStruct->
23fc0 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20  nLevel; i++){.  
23fd0 20 20 69 6e 74 20 6e 54 68 69 73 20 3d 20 70 53    int nThis = pS
23fe0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d  truct->aLevel[i]
23ff0 2e 6e 53 65 67 3b 0a 20 20 20 20 69 66 28 20 6e  .nSeg;.    if( n
24000 54 68 69 73 3d 3d 6e 53 65 67 20 7c 7c 20 28 6e  This==nSeg || (n
24010 54 68 69 73 3d 3d 6e 53 65 67 2d 31 20 26 26 20  This==nSeg-1 && 
24020 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
24030 69 5d 2e 6e 4d 65 72 67 65 3d 3d 6e 54 68 69 73  i].nMerge==nThis
24040 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  ) ){.      fts5S
24050 74 72 75 63 74 75 72 65 52 65 66 28 70 53 74 72  tructureRef(pStr
24060 75 63 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  uct);.      retu
24070 72 6e 20 70 53 74 72 75 63 74 3b 0a 20 20 20 20  rn pStruct;.    
24080 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  }.    assert( pS
24090 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d  truct->aLevel[i]
240a0 2e 6e 4d 65 72 67 65 3c 3d 6e 54 68 69 73 20 29  .nMerge<=nThis )
240b0 3b 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65 20 2b  ;.  }..  nByte +
240c0 3d 20 28 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  = (pStruct->nLev
240d0 65 6c 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 46  el+1) * sizeof(F
240e0 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
240f0 6c 29 3b 0a 20 20 70 4e 65 77 20 3d 20 28 46 74  l);.  pNew = (Ft
24100 73 35 53 74 72 75 63 74 75 72 65 2a 29 73 71 6c  s5Structure*)sql
24110 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
24120 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65  ro(&p->rc, nByte
24130 29 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29  );..  if( pNew )
24140 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
24150 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a  ureLevel *pLvl;.
24160 20 20 20 20 6e 42 79 74 65 20 3d 20 6e 53 65 67      nByte = nSeg
24170 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74   * sizeof(Fts5St
24180 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b  ructureSegment);
24190 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 65 76 65  .    pNew->nLeve
241a0 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  l = pStruct->nLe
241b0 76 65 6c 2b 31 3b 0a 20 20 20 20 70 4e 65 77 2d  vel+1;.    pNew-
241c0 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  >nRef = 1;.    p
241d0 4e 65 77 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74  New->nWriteCount
241e0 65 72 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57  er = pStruct->nW
241f0 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20 20  riteCounter;.   
24200 20 70 4c 76 6c 20 3d 20 26 70 4e 65 77 2d 3e 61   pLvl = &pNew->a
24210 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e  Level[pStruct->n
24220 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c  Level];.    pLvl
24230 2d 3e 61 53 65 67 20 3d 20 28 46 74 73 35 53 74  ->aSeg = (Fts5St
24240 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 2a 29  ructureSegment*)
24250 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
24260 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42  cZero(&p->rc, nB
24270 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  yte);.    if( pL
24280 76 6c 2d 3e 61 53 65 67 20 29 7b 0a 20 20 20 20  vl->aSeg ){.    
24290 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67    int iLvl, iSeg
242a0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67  ;.      int iSeg
242b0 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 2f  Out = 0;.      /
242c0 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67  * Iterate throug
242d0 68 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 2c 20  h all segments, 
242e0 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e  from oldest to n
242f0 65 77 65 73 74 2e 20 41 64 64 20 74 68 65 6d 20  ewest. Add them 
24300 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
24310 6e 65 77 20 46 74 73 35 4c 65 76 65 6c 20 6f 62  new Fts5Level ob
24320 6a 65 63 74 20 73 6f 20 74 68 61 74 20 70 4c 76  ject so that pLv
24330 6c 2d 3e 61 53 65 67 5b 30 5d 20 69 73 20 74 68  l->aSeg[0] is th
24340 65 20 6f 6c 64 65 73 74 0a 20 20 20 20 20 20 2a  e oldest.      *
24350 2a 20 73 65 67 6d 65 6e 74 20 69 6e 20 74 68 65  * segment in the
24360 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e   data structure.
24370 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69    */.      for(i
24380 4c 76 6c 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl=pStruct->nLe
24390 76 65 6c 2d 31 3b 20 69 4c 76 6c 3e 3d 30 3b 20  vel-1; iLvl>=0; 
243a0 69 4c 76 6c 2d 2d 29 7b 0a 20 20 20 20 20 20 20  iLvl--){.       
243b0 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
243c0 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  g<pStruct->aLeve
243d0 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53  l[iLvl].nSeg; iS
243e0 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  eg++){.         
243f0 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67   pLvl->aSeg[iSeg
24400 4f 75 74 5d 20 3d 20 70 53 74 72 75 63 74 2d 3e  Out] = pStruct->
24410 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65  aLevel[iLvl].aSe
24420 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20  g[iSeg];.       
24430 20 20 20 69 53 65 67 4f 75 74 2b 2b 3b 0a 20 20     iSegOut++;.  
24440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
24450 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67        pNew->nSeg
24460 6d 65 6e 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65  ment = pLvl->nSe
24470 67 20 3d 20 6e 53 65 67 3b 0a 20 20 20 20 7d 65  g = nSeg;.    }e
24480 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
24490 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
244a0 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20       pNew = 0;. 
244b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
244c0 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 69 6e 74 20  rn pNew;.}..int 
244d0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
244e0 4f 70 74 69 6d 69 7a 65 28 46 74 73 35 49 6e 64  Optimize(Fts5Ind
244f0 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74  ex *p){.  Fts5St
24500 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
24510 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
24520 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 0a 20 20  e *pNew = 0;..  
24530 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
24540 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74  QLITE_OK );.  ft
24550 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b  s5IndexFlush(p);
24560 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73  .  pStruct = fts
24570 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
24580 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  );.  fts5Structu
24590 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b  reInvalidate(p);
245a0 0a 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20  ..  if( pStruct 
245b0 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 66 74  ){.    pNew = ft
245c0 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65 53  s5IndexOptimizeS
245d0 74 72 75 63 74 28 70 2c 20 70 53 74 72 75 63 74  truct(p, pStruct
245e0 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 53 74 72  );.  }.  fts5Str
245f0 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
24600 74 72 75 63 74 29 3b 0a 0a 20 20 61 73 73 65 72  truct);..  asser
24610 74 28 20 70 4e 65 77 3d 3d 30 20 7c 7c 20 70 4e  t( pNew==0 || pN
24620 65 77 2d 3e 6e 53 65 67 6d 65 6e 74 3e 30 20 29  ew->nSegment>0 )
24630 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
24640 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20      int iLvl;.  
24650 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 70 4e    for(iLvl=0; pN
24660 65 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ew->aLevel[iLvl]
24670 2e 6e 53 65 67 3d 3d 30 3b 20 69 4c 76 6c 2b 2b  .nSeg==0; iLvl++
24680 29 7b 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70  ){}.    while( p
24690 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
246a0 26 26 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b  && pNew->aLevel[
246b0 69 4c 76 6c 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a  iLvl].nSeg>0 ){.
246c0 20 20 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d        int nRem =
246d0 20 46 54 53 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55   FTS5_OPT_WORK_U
246e0 4e 49 54 3b 0a 20 20 20 20 20 20 66 74 73 35 49  NIT;.      fts5I
246f0 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70  ndexMergeLevel(p
24700 2c 20 26 70 4e 65 77 2c 20 69 4c 76 6c 2c 20 26  , &pNew, iLvl, &
24710 6e 52 65 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  nRem);.    }..  
24720 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57    fts5StructureW
24730 72 69 74 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20  rite(p, pNew);. 
24740 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
24750 52 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20  Release(pNew);. 
24760 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 66 74 73   }..  return fts
24770 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
24780 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
24790 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6d 70  is called to imp
247a0 6c 65 6d 65 6e 74 20 74 68 65 20 73 70 65 63 69  lement the speci
247b0 61 6c 20 22 56 41 4c 55 45 53 28 27 6d 65 72 67  al "VALUES('merg
247c0 65 27 2c 20 24 6e 4d 65 72 67 65 29 22 0a 2a 2a  e', $nMerge)".**
247d0 20 49 4e 53 45 52 54 20 63 6f 6d 6d 61 6e 64 2e   INSERT command.
247e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
247f0 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 46 74  ts5IndexMerge(Ft
24800 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
24810 6e 4d 65 72 67 65 29 7b 0a 20 20 46 74 73 35 53  nMerge){.  Fts5S
24820 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
24830 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
24840 65 52 65 61 64 28 70 29 3b 0a 20 20 69 66 28 20  eRead(p);.  if( 
24850 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69  pStruct ){.    i
24860 6e 74 20 6e 4d 69 6e 20 3d 20 70 2d 3e 70 43 6f  nt nMin = p->pCo
24870 6e 66 69 67 2d 3e 6e 55 73 65 72 6d 65 72 67 65  nfig->nUsermerge
24880 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  ;.    fts5Struct
24890 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29  ureInvalidate(p)
248a0 3b 0a 20 20 20 20 69 66 28 20 6e 4d 65 72 67 65  ;.    if( nMerge
248b0 3c 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  <0 ){.      Fts5
248c0 53 74 72 75 63 74 75 72 65 20 2a 70 4e 65 77 20  Structure *pNew 
248d0 3d 20 66 74 73 35 49 6e 64 65 78 4f 70 74 69 6d  = fts5IndexOptim
248e0 69 7a 65 53 74 72 75 63 74 28 70 2c 20 70 53 74  izeStruct(p, pSt
248f0 72 75 63 74 29 3b 0a 20 20 20 20 20 20 66 74 73  ruct);.      fts
24900 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
24910 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20  e(pStruct);.    
24920 20 20 70 53 74 72 75 63 74 20 3d 20 70 4e 65 77    pStruct = pNew
24930 3b 0a 20 20 20 20 20 20 6e 4d 69 6e 20 3d 20 32  ;.      nMin = 2
24940 3b 0a 20 20 20 20 20 20 6e 4d 65 72 67 65 20 3d  ;.      nMerge =
24950 20 6e 4d 65 72 67 65 2a 2d 31 3b 0a 20 20 20 20   nMerge*-1;.    
24960 7d 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63  }.    if( pStruc
24970 74 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c  t && pStruct->nL
24980 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  evel ){.      if
24990 28 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65  ( fts5IndexMerge
249a0 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20 6e 4d  (p, &pStruct, nM
249b0 65 72 67 65 2c 20 6e 4d 69 6e 29 20 29 7b 0a 20  erge, nMin) ){. 
249c0 20 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63         fts5Struc
249d0 74 75 72 65 57 72 69 74 65 28 70 2c 20 70 53 74  tureWrite(p, pSt
249e0 72 75 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ruct);.      }. 
249f0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72     }.    fts5Str
24a00 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
24a10 74 72 75 63 74 29 3b 0a 20 20 7d 0a 20 20 72 65  truct);.  }.  re
24a20 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
24a30 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 73 74 61 74  turn(p);.}..stat
24a40 69 63 20 76 6f 69 64 20 66 74 73 35 41 70 70 65  ic void fts5Appe
24a50 6e 64 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49  ndRowid(.  Fts5I
24a60 6e 64 65 78 20 2a 70 2c 0a 20 20 69 36 34 20 69  ndex *p,.  i64 i
24a70 44 65 6c 74 61 2c 0a 20 20 46 74 73 35 49 74 65  Delta,.  Fts5Ite
24a80 72 20 2a 70 55 6e 75 73 65 64 2c 0a 20 20 46 74  r *pUnused,.  Ft
24a90 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a 29  s5Buffer *pBuf.)
24aa0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
24ab0 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 66 74 73  (pUnused);.  fts
24ac0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
24ad0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 70 42 75 66  int(&p->rc, pBuf
24ae0 2c 20 69 44 65 6c 74 61 29 3b 0a 7d 0a 0a 73 74  , iDelta);.}..st
24af0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 70  atic void fts5Ap
24b00 70 65 6e 64 50 6f 73 6c 69 73 74 28 0a 20 20 46  pendPoslist(.  F
24b10 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69  ts5Index *p,.  i
24b20 36 34 20 69 44 65 6c 74 61 2c 0a 20 20 46 74 73  64 iDelta,.  Fts
24b30 35 49 74 65 72 20 2a 70 4d 75 6c 74 69 2c 0a 20  5Iter *pMulti,. 
24b40 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
24b50 66 0a 29 7b 0a 20 20 69 6e 74 20 6e 44 61 74 61  f.){.  int nData
24b60 20 3d 20 70 4d 75 6c 74 69 2d 3e 62 61 73 65 2e   = pMulti->base.
24b70 6e 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28  nData;.  assert(
24b80 20 6e 44 61 74 61 3e 30 20 29 3b 0a 20 20 69 66   nData>0 );.  if
24b90 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
24ba0 4f 4b 20 26 26 20 30 3d 3d 66 74 73 35 42 75 66  OK && 0==fts5Buf
24bb0 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20  ferGrow(&p->rc, 
24bc0 70 42 75 66 2c 20 6e 44 61 74 61 2b 39 2b 39 29  pBuf, nData+9+9)
24bd0 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66   ){.    fts5Buff
24be0 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
24bf0 6e 74 28 70 42 75 66 2c 20 69 44 65 6c 74 61 29  nt(pBuf, iDelta)
24c00 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
24c10 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
24c20 28 70 42 75 66 2c 20 6e 44 61 74 61 2a 32 29 3b  (pBuf, nData*2);
24c30 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53  .    fts5BufferS
24c40 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42  afeAppendBlob(pB
24c50 75 66 2c 20 70 4d 75 6c 74 69 2d 3e 62 61 73 65  uf, pMulti->base
24c60 2e 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a  .pData, nData);.
24c70 20 20 7d 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76    }.}...static v
24c80 6f 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49  oid fts5DoclistI
24c90 74 65 72 4e 65 78 74 28 46 74 73 35 44 6f 63 6c  terNext(Fts5Docl
24ca0 69 73 74 49 74 65 72 20 2a 70 49 74 65 72 29 7b  istIter *pIter){
24cb0 0a 20 20 75 38 20 2a 70 20 3d 20 70 49 74 65 72  .  u8 *p = pIter
24cc0 2d 3e 61 50 6f 73 6c 69 73 74 20 2b 20 70 49 74  ->aPoslist + pIt
24cd0 65 72 2d 3e 6e 53 69 7a 65 20 2b 20 70 49 74 65  er->nSize + pIte
24ce0 72 2d 3e 6e 50 6f 73 6c 69 73 74 3b 0a 0a 20 20  r->nPoslist;..  
24cf0 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 61  assert( pIter->a
24d00 50 6f 73 6c 69 73 74 20 29 3b 0a 20 20 69 66 28  Poslist );.  if(
24d10 20 70 3e 3d 70 49 74 65 72 2d 3e 61 45 6f 66 20   p>=pIter->aEof 
24d20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50  ){.    pIter->aP
24d30 6f 73 6c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 65  oslist = 0;.  }e
24d40 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 69 44 65  lse{.    i64 iDe
24d50 6c 74 61 3b 0a 0a 20 20 20 20 70 20 2b 3d 20 66  lta;..    p += f
24d60 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 2c 20  ts5GetVarint(p, 
24d70 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a  (u64*)&iDelta);.
24d80 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
24d90 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20  d += iDelta;..  
24da0 20 20 2f 2a 20 52 65 61 64 20 70 6f 73 69 74 69    /* Read positi
24db0 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20 2a 2f 0a  on list size */.
24dc0 20 20 20 20 69 66 28 20 70 5b 30 5d 20 26 20 30      if( p[0] & 0
24dd0 78 38 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  x80 ){.      int
24de0 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 70 49 74   nPos;.      pIt
24df0 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 66 74 73 35  er->nSize = fts5
24e00 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20 6e  GetVarint32(p, n
24e10 50 6f 73 29 3b 0a 20 20 20 20 20 20 70 49 74 65  Pos);.      pIte
24e20 72 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d 20 28 6e  r->nPoslist = (n
24e30 50 6f 73 3e 3e 31 29 3b 0a 20 20 20 20 7d 65 6c  Pos>>1);.    }el
24e40 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  se{.      pIter-
24e50 3e 6e 50 6f 73 6c 69 73 74 20 3d 20 28 28 69 6e  >nPoslist = ((in
24e60 74 29 28 70 5b 30 5d 29 29 20 3e 3e 20 31 3b 0a  t)(p[0])) >> 1;.
24e70 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 53 69        pIter->nSi
24e80 7a 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  ze = 1;.    }.. 
24e90 20 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69     pIter->aPosli
24ea0 73 74 20 3d 20 70 3b 0a 20 20 7d 0a 7d 0a 0a 73  st = p;.  }.}..s
24eb0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
24ec0 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 0a  oclistIterInit(.
24ed0 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
24ee0 75 66 2c 20 0a 20 20 46 74 73 35 44 6f 63 6c 69  uf, .  Fts5Docli
24ef0 73 74 49 74 65 72 20 2a 70 49 74 65 72 0a 29 7b  stIter *pIter.){
24f00 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c  .  memset(pIter,
24f10 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
24f20 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61 50  r));.  pIter->aP
24f30 6f 73 6c 69 73 74 20 3d 20 70 42 75 66 2d 3e 70  oslist = pBuf->p
24f40 3b 0a 20 20 70 49 74 65 72 2d 3e 61 45 6f 66 20  ;.  pIter->aEof 
24f50 3d 20 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d  = &pBuf->p[pBuf-
24f60 3e 6e 5d 3b 0a 20 20 66 74 73 35 44 6f 63 6c 69  >n];.  fts5Docli
24f70 73 74 49 74 65 72 4e 65 78 74 28 70 49 74 65 72  stIterNext(pIter
24f80 29 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a  );.}..#if 0./*.*
24f90 2a 20 41 70 70 65 6e 64 20 61 20 64 6f 63 6c 69  * Append a docli
24fa0 73 74 20 74 6f 20 62 75 66 66 65 72 20 70 42 75  st to buffer pBu
24fb0 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f..**.** This fu
24fc0 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
24fd0 68 61 74 20 73 70 61 63 65 20 77 69 74 68 69 6e  hat space within
24fe0 20 74 68 65 20 62 75 66 66 65 72 20 68 61 73 20   the buffer has 
24ff0 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20  already been.** 
25000 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f 0a 73 74  allocated..*/.st
25010 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65  atic void fts5Me
25020 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 0a  rgeAppendDocid(.
25030 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
25040 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
25050 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 77    /* Buffer to w
25060 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34  rite to */.  i64
25070 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 2c 20 20   *piLastRowid,  
25080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25090 49 4e 2f 4f 55 54 3a 20 50 72 65 76 69 6f 75 73  IN/OUT: Previous
250a0 20 72 6f 77 69 64 20 77 72 69 74 74 65 6e 20 28   rowid written (
250b0 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 69 36 34  if any) */.  i64
250c0 20 69 52 6f 77 69 64 20 20 20 20 20 20 20 20 20   iRowid         
250d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
250e0 52 6f 77 69 64 20 74 6f 20 61 70 70 65 6e 64 20  Rowid to append 
250f0 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
25100 70 42 75 66 2d 3e 6e 21 3d 30 20 7c 7c 20 28 2a  pBuf->n!=0 || (*
25110 70 69 4c 61 73 74 52 6f 77 69 64 29 3d 3d 30 20  piLastRowid)==0 
25120 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 53  );.  fts5BufferS
25130 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28  afeAppendVarint(
25140 70 42 75 66 2c 20 69 52 6f 77 69 64 20 2d 20 2a  pBuf, iRowid - *
25150 70 69 4c 61 73 74 52 6f 77 69 64 29 3b 0a 20 20  piLastRowid);.  
25160 2a 70 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 69  *piLastRowid = i
25170 52 6f 77 69 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a  Rowid;.}.#endif.
25180 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4d 65 72  .#define fts5Mer
25190 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 70 42  geAppendDocid(pB
251a0 75 66 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20  uf, iLastRowid, 
251b0 69 52 6f 77 69 64 29 20 7b 20 20 20 20 20 20 20  iRowid) {       
251c0 5c 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 75  \.  assert( (pBu
251d0 66 29 2d 3e 6e 21 3d 30 20 7c 7c 20 28 69 4c 61  f)->n!=0 || (iLa
251e0 73 74 52 6f 77 69 64 29 3d 3d 30 20 29 3b 20 20  stRowid)==0 );  
251f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25200 20 5c 0a 20 20 66 74 73 35 42 75 66 66 65 72 53   \.  fts5BufferS
25210 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28  afeAppendVarint(
25220 28 70 42 75 66 29 2c 20 28 69 52 6f 77 69 64 29  (pBuf), (iRowid)
25230 20 2d 20 28 69 4c 61 73 74 52 6f 77 69 64 29 29   - (iLastRowid))
25240 3b 20 5c 0a 20 20 28 69 4c 61 73 74 52 6f 77 69  ; \.  (iLastRowi
25250 64 29 20 3d 20 28 69 52 6f 77 69 64 29 3b 20 20  d) = (iRowid);  
25260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25280 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77     \.}../*.** Sw
25290 61 70 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ap the contents 
252a0 6f 66 20 62 75 66 66 65 72 20 2a 70 31 20 77 69  of buffer *p1 wi
252b0 74 68 20 74 68 61 74 20 6f 66 20 2a 70 32 2e 0a  th that of *p2..
252c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
252d0 74 73 35 42 75 66 66 65 72 53 77 61 70 28 46 74  ts5BufferSwap(Ft
252e0 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20 46 74  s5Buffer *p1, Ft
252f0 73 35 42 75 66 66 65 72 20 2a 70 32 29 7b 0a 20  s5Buffer *p2){. 
25300 20 46 74 73 35 42 75 66 66 65 72 20 74 6d 70 20   Fts5Buffer tmp 
25310 3d 20 2a 70 31 3b 0a 20 20 2a 70 31 20 3d 20 2a  = *p1;.  *p1 = *
25320 70 32 3b 0a 20 20 2a 70 32 20 3d 20 74 6d 70 3b  p2;.  *p2 = tmp;
25330 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
25340 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28 46 74  fts5NextRowid(Ft
25350 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
25360 69 6e 74 20 2a 70 69 4f 66 66 2c 20 69 36 34 20  int *piOff, i64 
25370 2a 70 69 52 6f 77 69 64 29 7b 0a 20 20 69 6e 74  *piRowid){.  int
25380 20 69 20 3d 20 2a 70 69 4f 66 66 3b 0a 20 20 69   i = *piOff;.  i
25390 66 28 20 69 3e 3d 70 42 75 66 2d 3e 6e 20 29 7b  f( i>=pBuf->n ){
253a0 0a 20 20 20 20 2a 70 69 4f 66 66 20 3d 20 2d 31  .    *piOff = -1
253b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
253c0 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 2a 70 69  64 iVal;.    *pi
253d0 4f 66 66 20 3d 20 69 20 2b 20 73 71 6c 69 74 65  Off = i + sqlite
253e0 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26  3Fts5GetVarint(&
253f0 70 42 75 66 2d 3e 70 5b 69 5d 2c 20 26 69 56 61  pBuf->p[i], &iVa
25400 6c 29 3b 0a 20 20 20 20 2a 70 69 52 6f 77 69 64  l);.    *piRowid
25410 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 7d 0a 7d 0a   += iVal;.  }.}.
25420 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
25430 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66  he equivalent of
25440 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78   fts5MergePrefix
25450 4c 69 73 74 73 28 29 20 66 6f 72 20 64 65 74 61  Lists() for deta
25460 69 6c 3d 6e 6f 6e 65 20 6d 6f 64 65 2e 0a 2a 2a  il=none mode..**
25470 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
25480 65 20 62 75 66 66 65 72 73 20 63 6f 6e 73 69 73  e buffers consis
25490 74 20 6f 66 20 61 20 64 65 6c 74 61 2d 65 6e 63  t of a delta-enc
254a0 6f 64 65 64 20 6c 69 73 74 20 6f 66 20 72 6f 77  oded list of row
254b0 69 64 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61  ids only..*/.sta
254c0 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72  tic void fts5Mer
254d0 67 65 52 6f 77 69 64 4c 69 73 74 73 28 0a 20 20  geRowidLists(.  
254e0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
254f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25500 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
25510 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
25520 42 75 66 66 65 72 20 2a 70 31 2c 20 20 20 20 20  Buffer *p1,     
25530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
25540 69 72 73 74 20 6c 69 73 74 20 74 6f 20 6d 65 72  irst list to mer
25550 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  ge */.  Fts5Buff
25560 65 72 20 2a 70 32 20 20 20 20 20 20 20 20 20 20  er *p2          
25570 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e          /* Secon
25580 64 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20  d list to merge 
25590 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d  */.){.  int i1 =
255a0 20 30 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 30   0;.  int i2 = 0
255b0 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 31 20  ;.  i64 iRowid1 
255c0 3d 20 30 3b 0a 20 20 69 36 34 20 69 52 6f 77 69  = 0;.  i64 iRowi
255d0 64 32 20 3d 20 30 3b 0a 20 20 69 36 34 20 69 4f  d2 = 0;.  i64 iO
255e0 75 74 20 3d 20 30 3b 0a 0a 20 20 46 74 73 35 42  ut = 0;..  Fts5B
255f0 75 66 66 65 72 20 6f 75 74 3b 0a 20 20 6d 65 6d  uffer out;.  mem
25600 73 65 74 28 26 6f 75 74 2c 20 30 2c 20 73 69 7a  set(&out, 0, siz
25610 65 6f 66 28 6f 75 74 29 29 3b 0a 20 20 73 71 6c  eof(out));.  sql
25620 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69  ite3Fts5BufferSi
25630 7a 65 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c  ze(&p->rc, &out,
25640 20 70 31 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 29 3b   p1->n + p2->n);
25650 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72  .  if( p->rc ) r
25660 65 74 75 72 6e 3b 0a 0a 20 20 66 74 73 35 4e 65  eturn;..  fts5Ne
25670 78 74 52 6f 77 69 64 28 70 31 2c 20 26 69 31 2c  xtRowid(p1, &i1,
25680 20 26 69 52 6f 77 69 64 31 29 3b 0a 20 20 66 74   &iRowid1);.  ft
25690 73 35 4e 65 78 74 52 6f 77 69 64 28 70 32 2c 20  s5NextRowid(p2, 
256a0 26 69 32 2c 20 26 69 52 6f 77 69 64 32 29 3b 0a  &i2, &iRowid2);.
256b0 20 20 77 68 69 6c 65 28 20 69 31 3e 3d 30 20 7c    while( i1>=0 |
256c0 7c 20 69 32 3e 3d 30 20 29 7b 0a 20 20 20 20 69  | i2>=0 ){.    i
256d0 66 28 20 69 31 3e 3d 30 20 26 26 20 28 69 32 3c  f( i1>=0 && (i2<
256e0 30 20 7c 7c 20 69 52 6f 77 69 64 31 3c 69 52 6f  0 || iRowid1<iRo
256f0 77 69 64 32 29 20 29 7b 0a 20 20 20 20 20 20 61  wid2) ){.      a
25700 73 73 65 72 74 28 20 69 4f 75 74 3d 3d 30 20 7c  ssert( iOut==0 |
25710 7c 20 69 52 6f 77 69 64 31 3e 69 4f 75 74 20 29  | iRowid1>iOut )
25720 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
25730 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
25740 6e 74 28 26 6f 75 74 2c 20 69 52 6f 77 69 64 31  nt(&out, iRowid1
25750 20 2d 20 69 4f 75 74 29 3b 0a 20 20 20 20 20 20   - iOut);.      
25760 69 4f 75 74 20 3d 20 69 52 6f 77 69 64 31 3b 0a  iOut = iRowid1;.
25770 20 20 20 20 20 20 66 74 73 35 4e 65 78 74 52 6f        fts5NextRo
25780 77 69 64 28 70 31 2c 20 26 69 31 2c 20 26 69 52  wid(p1, &i1, &iR
25790 6f 77 69 64 31 29 3b 0a 20 20 20 20 7d 65 6c 73  owid1);.    }els
257a0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
257b0 20 69 4f 75 74 3d 3d 30 20 7c 7c 20 69 52 6f 77   iOut==0 || iRow
257c0 69 64 32 3e 69 4f 75 74 20 29 3b 0a 20 20 20 20  id2>iOut );.    
257d0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
257e0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 6f 75  AppendVarint(&ou
257f0 74 2c 20 69 52 6f 77 69 64 32 20 2d 20 69 4f 75  t, iRowid2 - iOu
25800 74 29 3b 0a 20 20 20 20 20 20 69 4f 75 74 20 3d  t);.      iOut =
25810 20 69 52 6f 77 69 64 32 3b 0a 20 20 20 20 20 20   iRowid2;.      
25820 69 66 28 20 69 31 3e 3d 30 20 26 26 20 69 52 6f  if( i1>=0 && iRo
25830 77 69 64 31 3d 3d 69 52 6f 77 69 64 32 20 29 7b  wid1==iRowid2 ){
25840 0a 20 20 20 20 20 20 20 20 66 74 73 35 4e 65 78  .        fts5Nex
25850 74 52 6f 77 69 64 28 70 31 2c 20 26 69 31 2c 20  tRowid(p1, &i1, 
25860 26 69 52 6f 77 69 64 31 29 3b 0a 20 20 20 20 20  &iRowid1);.     
25870 20 7d 0a 20 20 20 20 20 20 66 74 73 35 4e 65 78   }.      fts5Nex
25880 74 52 6f 77 69 64 28 70 32 2c 20 26 69 32 2c 20  tRowid(p2, &i2, 
25890 26 69 52 6f 77 69 64 32 29 3b 0a 20 20 20 20 7d  &iRowid2);.    }
258a0 0a 20 20 7d 0a 0a 20 20 66 74 73 35 42 75 66 66  .  }..  fts5Buff
258b0 65 72 53 77 61 70 28 26 6f 75 74 2c 20 70 31 29  erSwap(&out, p1)
258c0 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ;.  fts5BufferFr
258d0 65 65 28 26 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a  ee(&out);.}../*.
258e0 2a 2a 20 42 75 66 66 65 72 73 20 70 31 20 61 6e  ** Buffers p1 an
258f0 64 20 70 32 20 63 6f 6e 74 61 69 6e 20 64 6f 63  d p2 contain doc
25900 6c 69 73 74 73 2e 20 54 68 69 73 20 66 75 6e 63  lists. This func
25910 74 69 6f 6e 20 6d 65 72 67 65 73 20 74 68 65 20  tion merges the 
25920 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68  content.** of th
25930 65 20 74 77 6f 20 64 6f 63 6c 69 73 74 73 20 74  e two doclists t
25940 6f 67 65 74 68 65 72 20 61 6e 64 20 73 65 74 73  ogether and sets
25950 20 62 75 66 66 65 72 20 70 31 20 74 6f 20 74 68   buffer p1 to th
25960 65 20 72 65 73 75 6c 74 20 62 65 66 6f 72 65 0a  e result before.
25970 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  ** returning..**
25980 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
25990 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
259a0 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e   code is left in
259b0 20 70 2d 3e 72 63 2e 20 49 66 20 61 6e 20 65 72   p->rc. If an er
259c0 72 6f 72 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61  ror has.** alrea
259d0 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
259e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
259f0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
25a00 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 50   void fts5MergeP
25a10 72 65 66 69 78 4c 69 73 74 73 28 0a 20 20 46 74  refixLists(.  Ft
25a20 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
25a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25a40 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
25a50 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 42 75  ject */.  Fts5Bu
25a60 66 66 65 72 20 2a 70 31 2c 20 20 20 20 20 20 20  ffer *p1,       
25a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
25a80 73 74 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65  st list to merge
25a90 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
25aa0 20 2a 70 32 20 20 20 20 20 20 20 20 20 20 20 20   *p2            
25ab0 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20        /* Second 
25ac0 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f  list to merge */
25ad0 0a 29 7b 0a 20 20 69 66 28 20 70 32 2d 3e 6e 20  .){.  if( p2->n 
25ae0 29 7b 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74  ){.    i64 iLast
25af0 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46  Rowid = 0;.    F
25b00 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69  ts5DoclistIter i
25b10 31 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69  1;.    Fts5Docli
25b20 73 74 49 74 65 72 20 69 32 3b 0a 20 20 20 20 46  stIter i2;.    F
25b30 74 73 35 42 75 66 66 65 72 20 6f 75 74 20 3d 20  ts5Buffer out = 
25b40 7b 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 20 20 46  {0, 0, 0};.    F
25b50 74 73 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20  ts5Buffer tmp = 
25b60 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 20 20  {0, 0, 0};..    
25b70 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73  /* The maximum s
25b80 69 7a 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ize of the outpu
25b90 74 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68  t is equal to th
25ba0 65 20 73 75 6d 20 6f 66 20 74 68 65 20 74 77 6f  e sum of the two
25bb0 20 0a 20 20 20 20 2a 2a 20 69 6e 70 75 74 20 73   .    ** input s
25bc0 69 7a 65 73 20 2b 20 31 20 76 61 72 69 6e 74 20  izes + 1 varint 
25bd0 28 39 20 62 79 74 65 73 29 2e 20 54 68 65 20 65  (9 bytes). The e
25be0 78 74 72 61 20 76 61 72 69 6e 74 20 69 73 20 62  xtra varint is b
25bf0 65 63 61 75 73 65 20 69 66 20 74 68 65 0a 20 20  ecause if the.  
25c00 20 20 2a 2a 20 66 69 72 73 74 20 72 6f 77 69 64    ** first rowid
25c10 20 69 6e 20 6f 6e 65 20 69 6e 70 75 74 20 69 73   in one input is
25c20 20 61 20 6c 61 72 67 65 20 6e 65 67 61 74 69 76   a large negativ
25c30 65 20 6e 75 6d 62 65 72 2c 20 61 6e 64 20 74 68  e number, and th
25c40 65 20 66 69 72 73 74 20 69 6e 0a 20 20 20 20 2a  e first in.    *
25c50 2a 20 74 68 65 20 6f 74 68 65 72 20 61 20 6e 6f  * the other a no
25c60 6e 2d 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  n-negative numbe
25c70 72 2c 20 74 68 65 20 64 65 6c 74 61 20 66 6f 72  r, the delta for
25c80 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76   the non-negativ
25c90 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
25ca0 77 69 6c 6c 20 62 65 20 6c 61 72 67 65 72 20 6f  will be larger o
25cb0 6e 20 64 69 73 6b 20 74 68 61 6e 20 74 68 65 20  n disk than the 
25cc0 6c 69 74 65 72 61 6c 20 69 6e 74 65 67 65 72 20  literal integer 
25cd0 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 77 61 73  value.    ** was
25ce0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  .  */.    if( sq
25cf0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
25d00 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74  ize(&p->rc, &out
25d10 2c 20 70 31 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 20  , p1->n + p2->n 
25d20 2b 20 39 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  + 9) ) return;. 
25d30 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
25d40 65 72 49 6e 69 74 28 70 31 2c 20 26 69 31 29 3b  erInit(p1, &i1);
25d50 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74  .    fts5Doclist
25d60 49 74 65 72 49 6e 69 74 28 70 32 2c 20 26 69 32  IterInit(p2, &i2
25d70 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 31  );..    while( 1
25d80 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 31   ){.      if( i1
25d90 2e 69 52 6f 77 69 64 3c 69 32 2e 69 52 6f 77 69  .iRowid<i2.iRowi
25da0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d ){.        /* 
25db0 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20  Copy entry from 
25dc0 69 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74  i1 */.        ft
25dd0 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
25de0 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f  id(&out, iLastRo
25df0 77 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b  wid, i1.iRowid);
25e00 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
25e10 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
25e20 62 28 26 6f 75 74 2c 20 69 31 2e 61 50 6f 73 6c  b(&out, i1.aPosl
25e30 69 73 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74  ist, i1.nPoslist
25e40 2b 69 31 2e 6e 53 69 7a 65 29 3b 0a 20 20 20 20  +i1.nSize);.    
25e50 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
25e60 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20  terNext(&i1);.  
25e70 20 20 20 20 20 20 69 66 28 20 69 31 2e 61 50 6f        if( i1.aPo
25e80 73 6c 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b  slist==0 ) break
25e90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25ea0 65 6c 73 65 20 69 66 28 20 69 32 2e 69 52 6f 77  else if( i2.iRow
25eb0 69 64 21 3d 69 31 2e 69 52 6f 77 69 64 20 29 7b  id!=i1.iRowid ){
25ec0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79  .        /* Copy
25ed0 20 65 6e 74 72 79 20 66 72 6f 6d 20 69 32 20 2a   entry from i2 *
25ee0 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65  /.        fts5Me
25ef0 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26  rgeAppendDocid(&
25f00 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c  out, iLastRowid,
25f10 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20   i2.iRowid);.   
25f20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
25f30 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f  afeAppendBlob(&o
25f40 75 74 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c  ut, i2.aPoslist,
25f50 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2b 69 32 2e   i2.nPoslist+i2.
25f60 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  nSize);.        
25f70 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
25f80 65 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20  ext(&i2);.      
25f90 20 20 69 66 28 20 69 32 2e 61 50 6f 73 6c 69 73    if( i2.aPoslis
25fa0 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  t==0 ) break;.  
25fb0 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65      }.      else
25fc0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 72  {.        /* Mer
25fd0 67 65 20 74 68 65 20 74 77 6f 20 70 6f 73 69 74  ge the two posit
25fe0 69 6f 6e 20 6c 69 73 74 73 2e 20 2a 2f 20 0a 20  ion lists. */ . 
25ff0 20 20 20 20 20 20 20 69 36 34 20 69 50 6f 73 31         i64 iPos1
26000 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36   = 0;.        i6
26010 34 20 69 50 6f 73 32 20 3d 20 30 3b 0a 20 20 20  4 iPos2 = 0;.   
26020 20 20 20 20 20 69 6e 74 20 69 4f 66 66 31 20 3d       int iOff1 =
26030 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
26040 69 4f 66 66 32 20 3d 20 30 3b 0a 20 20 20 20 20  iOff2 = 0;.     
26050 20 20 20 75 38 20 2a 61 31 20 3d 20 26 69 31 2e     u8 *a1 = &i1.
26060 61 50 6f 73 6c 69 73 74 5b 69 31 2e 6e 53 69 7a  aPoslist[i1.nSiz
26070 65 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a  e];.        u8 *
26080 61 32 20 3d 20 26 69 32 2e 61 50 6f 73 6c 69 73  a2 = &i2.aPoslis
26090 74 5b 69 32 2e 6e 53 69 7a 65 5d 3b 0a 0a 20 20  t[i2.nSize];..  
260a0 20 20 20 20 20 20 69 36 34 20 69 50 72 65 76 20        i64 iPrev 
260b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 46 74 73  = 0;.        Fts
260c0 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77  5PoslistWriter w
260d0 72 69 74 65 72 3b 0a 20 20 20 20 20 20 20 20 6d  riter;.        m
260e0 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30  emset(&writer, 0
260f0 2c 20 73 69 7a 65 6f 66 28 77 72 69 74 65 72 29  , sizeof(writer)
26100 29 3b 0a 0a 20 20 20 20 20 20 20 20 66 74 73 35  );..        fts5
26110 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64  MergeAppendDocid
26120 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69  (&out, iLastRowi
26130 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20  d, i2.iRowid);. 
26140 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
26150 72 5a 65 72 6f 28 26 74 6d 70 29 3b 0a 20 20 20  rZero(&tmp);.   
26160 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
26170 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72  BufferSize(&p->r
26180 63 2c 20 26 74 6d 70 2c 20 69 31 2e 6e 50 6f 73  c, &tmp, i1.nPos
26190 6c 69 73 74 20 2b 20 69 32 2e 6e 50 6f 73 6c 69  list + i2.nPosli
261a0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  st);.        if(
261b0 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a   p->rc ) break;.
261c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
261d0 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
261e0 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73  4(a1, i1.nPoslis
261f0 74 2c 20 26 69 4f 66 66 31 2c 20 26 69 50 6f 73  t, &iOff1, &iPos
26200 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
26210 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65  te3Fts5PoslistNe
26220 78 74 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73  xt64(a2, i2.nPos
26230 6c 69 73 74 2c 20 26 69 4f 66 66 32 2c 20 26 69  list, &iOff2, &i
26240 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 61  Pos2);.        a
26250 73 73 65 72 74 28 20 69 50 6f 73 31 3e 3d 30 20  ssert( iPos1>=0 
26260 26 26 20 69 50 6f 73 32 3e 3d 30 20 29 3b 0a 0a  && iPos2>=0 );..
26270 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73          if( iPos
26280 31 3c 69 50 6f 73 32 20 29 7b 0a 20 20 20 20 20  1<iPos2 ){.     
26290 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
262a0 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e  PoslistSafeAppen
262b0 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20  d(&tmp, &iPrev, 
262c0 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20  iPos1);.        
262d0 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
262e0 6c 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69  listNext64(a1, i
262f0 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66  1.nPoslist, &iOf
26300 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20  f1, &iPos1);.   
26310 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26320 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
26330 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65  5PoslistSafeAppe
26340 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c  nd(&tmp, &iPrev,
26350 20 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20   iPos2);.       
26360 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
26370 73 6c 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20  slistNext64(a2, 
26380 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f  i2.nPoslist, &iO
26390 66 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20  ff2, &iPos2);.  
263a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
263b0 20 69 66 28 20 69 50 6f 73 31 3e 3d 30 20 26 26   if( iPos1>=0 &&
263c0 20 69 50 6f 73 32 3e 3d 30 20 29 7b 0a 20 20 20   iPos2>=0 ){.   
263d0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 31 20         while( 1 
263e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
263f0 66 28 20 69 50 6f 73 31 3c 69 50 6f 73 32 20 29  f( iPos1<iPos2 )
26400 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26410 69 66 28 20 69 50 6f 73 31 21 3d 69 50 72 65 76  if( iPos1!=iPrev
26420 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26430 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
26440 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64  oslistSafeAppend
26450 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69  (&tmp, &iPrev, i
26460 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20  Pos1);.         
26470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26480 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
26490 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61 31  PoslistNext64(a1
264a0 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26  , i1.nPoslist, &
264b0 69 4f 66 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a  iOff1, &iPos1);.
264c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
264d0 28 20 69 50 6f 73 31 3c 30 20 29 20 62 72 65 61  ( iPos1<0 ) brea
264e0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
264f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26500 20 20 20 20 61 73 73 65 72 74 28 20 69 50 6f 73      assert( iPos
26510 32 21 3d 69 50 72 65 76 20 29 3b 0a 20 20 20 20  2!=iPrev );.    
26520 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26530 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65  3Fts5PoslistSafe
26540 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50  Append(&tmp, &iP
26550 72 65 76 2c 20 69 50 6f 73 32 29 3b 0a 20 20 20  rev, iPos2);.   
26560 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
26570 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78  e3Fts5PoslistNex
26580 74 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c  t64(a2, i2.nPosl
26590 69 73 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50  ist, &iOff2, &iP
265a0 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  os2);.          
265b0 20 20 20 20 69 66 28 20 69 50 6f 73 32 3c 30 20      if( iPos2<0 
265c0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
265d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
265e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
265f0 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 3e        if( iPos1>
26600 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
26610 69 66 28 20 69 50 6f 73 31 21 3d 69 50 72 65 76  if( iPos1!=iPrev
26620 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26630 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
26640 73 74 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d  stSafeAppend(&tm
26650 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73 31  p, &iPrev, iPos1
26660 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
26670 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
26680 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
26690 62 28 26 74 6d 70 2c 20 26 61 31 5b 69 4f 66 66  b(&tmp, &a1[iOff
266a0 31 5d 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2d  1], i1.nPoslist-
266b0 69 4f 66 66 31 29 3b 0a 20 20 20 20 20 20 20 20  iOff1);.        
266c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
266d0 20 61 73 73 65 72 74 28 20 69 50 6f 73 32 3e 3d   assert( iPos2>=
266e0 30 20 26 26 20 69 50 6f 73 32 21 3d 69 50 72 65  0 && iPos2!=iPre
266f0 76 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  v );.          s
26700 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
26710 74 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70  tSafeAppend(&tmp
26720 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73 32 29  , &iPrev, iPos2)
26730 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
26740 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
26750 42 6c 6f 62 28 26 74 6d 70 2c 20 26 61 32 5b 69  Blob(&tmp, &a2[i
26760 4f 66 66 32 5d 2c 20 69 32 2e 6e 50 6f 73 6c 69  Off2], i2.nPosli
26770 73 74 2d 69 4f 66 66 32 29 3b 0a 20 20 20 20 20  st-iOff2);.     
26780 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
26790 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a   WRITEPOSLISTSIZ
267a0 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73  E */.        fts
267b0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
267c0 64 56 61 72 69 6e 74 28 26 6f 75 74 2c 20 74 6d  dVarint(&out, tm
267d0 70 2e 6e 20 2a 20 32 29 3b 0a 20 20 20 20 20 20  p.n * 2);.      
267e0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
267f0 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c  AppendBlob(&out,
26800 20 74 6d 70 2e 70 2c 20 74 6d 70 2e 6e 29 3b 0a   tmp.p, tmp.n);.
26810 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c          fts5Docl
26820 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 31 29  istIterNext(&i1)
26830 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f  ;.        fts5Do
26840 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69  clistIterNext(&i
26850 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  2);.        if( 
26860 69 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c  i1.aPoslist==0 |
26870 7c 20 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30  | i2.aPoslist==0
26880 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
26890 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
268a0 20 69 31 2e 61 50 6f 73 6c 69 73 74 20 29 7b 0a   i1.aPoslist ){.
268b0 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41        fts5MergeA
268c0 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c  ppendDocid(&out,
268d0 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 31 2e   iLastRowid, i1.
268e0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 66  iRowid);.      f
268f0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
26900 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 31  endBlob(&out, i1
26910 2e 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e 61 45  .aPoslist, i1.aE
26920 6f 66 20 2d 20 69 31 2e 61 50 6f 73 6c 69 73 74  of - i1.aPoslist
26930 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  );.    }.    els
26940 65 20 69 66 28 20 69 32 2e 61 50 6f 73 6c 69 73  e if( i2.aPoslis
26950 74 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d  t ){.      fts5M
26960 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28  ergeAppendDocid(
26970 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64  &out, iLastRowid
26980 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20  , i2.iRowid);.  
26990 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
269a0 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75  feAppendBlob(&ou
269b0 74 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20  t, i2.aPoslist, 
269c0 69 32 2e 61 45 6f 66 20 2d 20 69 32 2e 61 50 6f  i2.aEof - i2.aPo
269d0 73 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  slist);.    }.  
269e0 20 20 61 73 73 65 72 74 28 20 6f 75 74 2e 6e 3c    assert( out.n<
269f0 3d 28 70 31 2d 3e 6e 2b 70 32 2d 3e 6e 2b 39 29  =(p1->n+p2->n+9)
26a00 20 29 3b 0a 0a 20 20 20 20 66 74 73 35 42 75 66   );..    fts5Buf
26a10 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 70  ferSet(&p->rc, p
26a20 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70 29  1, out.n, out.p)
26a30 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
26a40 46 72 65 65 28 26 74 6d 70 29 3b 0a 20 20 20 20  Free(&tmp);.    
26a50 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
26a60 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  out);.  }.}..sta
26a70 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 74  tic void fts5Set
26a80 75 70 50 72 65 66 69 78 49 74 65 72 28 0a 20 20  upPrefixIter(.  
26a90 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
26aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ab0 2f 2a 20 49 6e 64 65 78 20 74 6f 20 72 65 61 64  /* Index to read
26ac0 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 62   from */.  int b
26ad0 44 65 73 63 2c 20 20 20 20 20 20 20 20 20 20 20  Desc,           
26ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
26af0 75 65 20 66 6f 72 20 22 4f 52 44 45 52 20 42 59  ue for "ORDER BY
26b00 20 72 6f 77 69 64 20 44 45 53 43 22 20 2a 2f 0a   rowid DESC" */.
26b10 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 6f 6b    const u8 *pTok
26b20 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
26b30 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
26b40 61 69 6e 69 6e 67 20 70 72 65 66 69 78 20 74 6f  aining prefix to
26b50 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20   match */.  int 
26b60 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20  nToken,         
26b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
26b80 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 54  ize of buffer pT
26b90 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f  oken in bytes */
26ba0 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
26bb0 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20  Colset,         
26bc0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d     /* Restrict m
26bd0 61 74 63 68 65 73 20 74 6f 20 74 68 65 73 65 20  atches to these 
26be0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 46 74 73  columns */.  Fts
26bf0 35 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20  5Iter **ppIter  
26c00 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
26c10 4e 65 77 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a  New iterator */.
26c20 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ){.  Fts5Structu
26c30 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46  re *pStruct;.  F
26c40 74 73 35 42 75 66 66 65 72 20 2a 61 42 75 66 3b  ts5Buffer *aBuf;
26c50 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75  .  const int nBu
26c60 66 20 3d 20 33 32 3b 0a 0a 20 20 76 6f 69 64 20  f = 32;..  void 
26c70 28 2a 78 4d 65 72 67 65 29 28 46 74 73 35 49 6e  (*xMerge)(Fts5In
26c80 64 65 78 2a 2c 20 46 74 73 35 42 75 66 66 65 72  dex*, Fts5Buffer
26c90 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 29 3b  *, Fts5Buffer*);
26ca0 0a 20 20 76 6f 69 64 20 28 2a 78 41 70 70 65 6e  .  void (*xAppen
26cb0 64 29 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 69  d)(Fts5Index*, i
26cc0 36 34 2c 20 46 74 73 35 49 74 65 72 2a 2c 20 46  64, Fts5Iter*, F
26cd0 74 73 35 42 75 66 66 65 72 2a 29 3b 0a 20 20 69  ts5Buffer*);.  i
26ce0 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65  f( p->pConfig->e
26cf0 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
26d00 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AIL_NONE ){.    
26d10 78 4d 65 72 67 65 20 3d 20 66 74 73 35 4d 65 72  xMerge = fts5Mer
26d20 67 65 52 6f 77 69 64 4c 69 73 74 73 3b 0a 20 20  geRowidLists;.  
26d30 20 20 78 41 70 70 65 6e 64 20 3d 20 66 74 73 35    xAppend = fts5
26d40 41 70 70 65 6e 64 52 6f 77 69 64 3b 0a 20 20 7d  AppendRowid;.  }
26d50 65 6c 73 65 7b 0a 20 20 20 20 78 4d 65 72 67 65  else{.    xMerge
26d60 20 3d 20 66 74 73 35 4d 65 72 67 65 50 72 65 66   = fts5MergePref
26d70 69 78 4c 69 73 74 73 3b 0a 20 20 20 20 78 41 70  ixLists;.    xAp
26d80 70 65 6e 64 20 3d 20 66 74 73 35 41 70 70 65 6e  pend = fts5Appen
26d90 64 50 6f 73 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20  dPoslist;.  }.. 
26da0 20 61 42 75 66 20 3d 20 28 46 74 73 35 42 75 66   aBuf = (Fts5Buf
26db0 66 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c  fer*)fts5IdxMall
26dc0 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73  oc(p, sizeof(Fts
26dd0 35 42 75 66 66 65 72 29 2a 6e 42 75 66 29 3b 0a  5Buffer)*nBuf);.
26de0 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35    pStruct = fts5
26df0 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29  StructureRead(p)
26e00 3b 0a 0a 20 20 69 66 28 20 61 42 75 66 20 26 26  ;..  if( aBuf &&
26e10 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
26e20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
26e30 3d 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  = FTS5INDEX_QUER
26e40 59 5f 53 43 41 4e 20 0a 20 20 20 20 20 20 20 20  Y_SCAN .        
26e50 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 54              | FT
26e60 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b  S5INDEX_QUERY_SK
26e70 49 50 45 4d 50 54 59 20 0a 20 20 20 20 20 20 20  IPEMPTY .       
26e80 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46               | F
26e90 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e  TS5INDEX_QUERY_N
26ea0 4f 4f 55 54 50 55 54 3b 0a 20 20 20 20 69 6e 74  OOUTPUT;.    int
26eb0 20 69 3b 0a 20 20 20 20 69 36 34 20 69 4c 61 73   i;.    i64 iLas
26ec0 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20  tRowid = 0;.    
26ed0 46 74 73 35 49 74 65 72 20 2a 70 31 20 3d 20 30  Fts5Iter *p1 = 0
26ee0 3b 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f  ;     /* Iterato
26ef0 72 20 75 73 65 64 20 74 6f 20 67 61 74 68 65 72  r used to gather
26f00 20 64 61 74 61 20 66 72 6f 6d 20 69 6e 64 65 78   data from index
26f10 20 2a 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61   */.    Fts5Data
26f20 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 46 74 73   *pData;.    Fts
26f30 35 42 75 66 66 65 72 20 64 6f 63 6c 69 73 74 3b  5Buffer doclist;
26f40 0a 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72  .    int bNewTer
26f50 6d 20 3d 20 31 3b 0a 0a 20 20 20 20 6d 65 6d 73  m = 1;..    mems
26f60 65 74 28 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20  et(&doclist, 0, 
26f70 73 69 7a 65 6f 66 28 64 6f 63 6c 69 73 74 29 29  sizeof(doclist))
26f80 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  ;.    fts5MultiI
26f90 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63  terNew(p, pStruc
26fa0 74 2c 20 66 6c 61 67 73 2c 20 70 43 6f 6c 73 65  t, flags, pColse
26fb0 74 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  t, pToken, nToke
26fc0 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a  n, -1, 0, &p1);.
26fd0 20 20 20 20 66 74 73 35 49 74 65 72 53 65 74 4f      fts5IterSetO
26fe0 75 74 70 75 74 43 62 28 26 70 2d 3e 72 63 2c 20  utputCb(&p->rc, 
26ff0 70 31 29 3b 0a 20 20 20 20 66 6f 72 28 20 2f 2a  p1);.    for( /*
27000 20 6e 6f 2d 6f 70 20 2a 2f 20 3b 0a 20 20 20 20   no-op */ ;.    
27010 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
27020 72 45 6f 66 28 70 2c 20 70 31 29 3d 3d 30 3b 0a  rEof(p, p1)==0;.
27030 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
27040 69 49 74 65 72 4e 65 78 74 32 28 70 2c 20 70 31  iIterNext2(p, p1
27050 2c 20 26 62 4e 65 77 54 65 72 6d 29 0a 20 20 20  , &bNewTerm).   
27060 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65   ){.      Fts5Se
27070 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
27080 31 2d 3e 61 53 65 67 5b 20 70 31 2d 3e 61 46 69  1->aSeg[ p1->aFi
27090 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
270a0 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  .      int nTerm
270b0 20 3d 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 3b   = pSeg->term.n;
270c0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
270d0 2a 70 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e 74  *pTerm = pSeg->t
270e0 65 72 6d 2e 70 3b 0a 20 20 20 20 20 20 70 31 2d  erm.p;.      p1-
270f0 3e 78 53 65 74 4f 75 74 70 75 74 73 28 70 31 2c  >xSetOutputs(p1,
27100 20 70 53 65 67 29 3b 0a 0a 20 20 20 20 20 20 61   pSeg);..      a
27110 73 73 65 72 74 5f 6e 63 28 20 6d 65 6d 63 6d 70  ssert_nc( memcmp
27120 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20  (pToken, pTerm, 
27130 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72  MIN(nToken, nTer
27140 6d 29 29 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20  m))<=0 );.      
27150 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a  if( bNewTerm ){.
27160 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 65 72          if( nTer
27170 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63  m<nToken || memc
27180 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d  mp(pToken, pTerm
27190 2c 20 6e 54 6f 6b 65 6e 29 20 29 20 62 72 65 61  , nToken) ) brea
271a0 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
271b0 20 20 69 66 28 20 70 31 2d 3e 62 61 73 65 2e 6e    if( p1->base.n
271c0 44 61 74 61 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Data==0 ) contin
271d0 75 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70  ue;..      if( p
271e0 31 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 3c 3d  1->base.iRowid<=
271f0 69 4c 61 73 74 52 6f 77 69 64 20 26 26 20 64 6f  iLastRowid && do
27200 63 6c 69 73 74 2e 6e 3e 30 20 29 7b 0a 20 20 20  clist.n>0 ){.   
27210 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d       for(i=0; p-
27220 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
27230 26 20 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b  & doclist.n; i++
27240 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
27250 65 72 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a 20  ert( i<nBuf );. 
27260 20 20 20 20 20 20 20 20 20 69 66 28 20 61 42 75           if( aBu
27270 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  f[i].n==0 ){.   
27280 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
27290 66 65 72 53 77 61 70 28 26 64 6f 63 6c 69 73 74  ferSwap(&doclist
272a0 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  , &aBuf[i]);.   
272b0 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
272c0 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73 74  ferZero(&doclist
272d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
272e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
272f0 78 4d 65 72 67 65 28 70 2c 20 26 64 6f 63 6c 69  xMerge(p, &docli
27300 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20  st, &aBuf[i]);. 
27310 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
27320 75 66 66 65 72 5a 65 72 6f 28 26 61 42 75 66 5b  ufferZero(&aBuf[
27330 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  i]);.          }
27340 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27350 20 20 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20     iLastRowid = 
27360 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  0;.      }..    
27370 20 20 78 41 70 70 65 6e 64 28 70 2c 20 70 31 2d    xAppend(p, p1-
27380 3e 62 61 73 65 2e 69 52 6f 77 69 64 2d 69 4c 61  >base.iRowid-iLa
27390 73 74 52 6f 77 69 64 2c 20 70 31 2c 20 26 64 6f  stRowid, p1, &do
273a0 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 4c  clist);.      iL
273b0 61 73 74 52 6f 77 69 64 20 3d 20 70 31 2d 3e 62  astRowid = p1->b
273c0 61 73 65 2e 69 52 6f 77 69 64 3b 0a 20 20 20 20  ase.iRowid;.    
273d0 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  }..    for(i=0; 
273e0 69 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20  i<nBuf; i++){.  
273f0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
27400 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27410 20 20 20 20 78 4d 65 72 67 65 28 70 2c 20 26 64      xMerge(p, &d
27420 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d  oclist, &aBuf[i]
27430 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
27440 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
27450 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 7d  &aBuf[i]);.    }
27460 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74  .    fts5MultiIt
27470 65 72 46 72 65 65 28 70 31 29 3b 0a 0a 20 20 20  erFree(p1);..   
27480 20 70 44 61 74 61 20 3d 20 66 74 73 35 49 64 78   pData = fts5Idx
27490 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66  Malloc(p, sizeof
274a0 28 46 74 73 35 44 61 74 61 29 20 2b 20 64 6f 63  (Fts5Data) + doc
274b0 6c 69 73 74 2e 6e 29 3b 0a 20 20 20 20 69 66 28  list.n);.    if(
274c0 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20   pData ){.      
274d0 70 44 61 74 61 2d 3e 70 20 3d 20 28 75 38 2a 29  pData->p = (u8*)
274e0 26 70 44 61 74 61 5b 31 5d 3b 0a 20 20 20 20 20  &pData[1];.     
274f0 20 70 44 61 74 61 2d 3e 6e 6e 20 3d 20 70 44 61   pData->nn = pDa
27500 74 61 2d 3e 73 7a 4c 65 61 66 20 3d 20 64 6f 63  ta->szLeaf = doc
27510 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 20 20 69 66  list.n;.      if
27520 28 20 64 6f 63 6c 69 73 74 2e 6e 20 29 20 6d 65  ( doclist.n ) me
27530 6d 63 70 79 28 70 44 61 74 61 2d 3e 70 2c 20 64  mcpy(pData->p, d
27540 6f 63 6c 69 73 74 2e 70 2c 20 64 6f 63 6c 69 73  oclist.p, doclis
27550 74 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35  t.n);.      fts5
27560 4d 75 6c 74 69 49 74 65 72 4e 65 77 32 28 70 2c  MultiIterNew2(p,
27570 20 70 44 61 74 61 2c 20 62 44 65 73 63 2c 20 70   pData, bDesc, p
27580 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pIter);.    }.  
27590 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
275a0 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 0a  (&doclist);.  }.
275b0 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
275c0 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
275d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
275e0 28 61 42 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  (aBuf);.}.../*.*
275f0 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
27600 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 63  all subsequent c
27610 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46  alls to sqlite3F
27620 74 73 35 49 6e 64 65 78 57 72 69 74 65 28 29 20  ts5IndexWrite() 
27630 70 65 72 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68  pertain.** to th
27640 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20  e document with 
27650 72 6f 77 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f  rowid iRowid..*/
27660 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
27670 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65 28  IndexBeginWrite(
27680 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
27690 74 20 62 44 65 6c 65 74 65 2c 20 69 36 34 20 69  t bDelete, i64 i
276a0 52 6f 77 69 64 29 7b 0a 20 20 61 73 73 65 72 74  Rowid){.  assert
276b0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
276c0 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  OK );..  /* Allo
276d0 63 61 74 65 20 74 68 65 20 68 61 73 68 20 74 61  cate the hash ta
276e0 62 6c 65 20 69 66 20 69 74 20 68 61 73 20 6e 6f  ble if it has no
276f0 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  t already been a
27700 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 66  llocated */.  if
27710 28 20 70 2d 3e 70 48 61 73 68 3d 3d 30 20 29 7b  ( p->pHash==0 ){
27720 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
27730 69 74 65 33 46 74 73 35 48 61 73 68 4e 65 77 28  ite3Fts5HashNew(
27740 70 2d 3e 70 43 6f 6e 66 69 67 2c 20 26 70 2d 3e  p->pConfig, &p->
27750 70 48 61 73 68 2c 20 26 70 2d 3e 6e 50 65 6e 64  pHash, &p->nPend
27760 69 6e 67 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20  ingData);.  }.. 
27770 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 68 61   /* Flush the ha
27780 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b  sh table to disk
27790 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
277a0 20 20 69 66 28 20 69 52 6f 77 69 64 3c 70 2d 3e    if( iRowid<p->
277b0 69 57 72 69 74 65 52 6f 77 69 64 20 0a 20 20 20  iWriteRowid .   
277c0 7c 7c 20 28 69 52 6f 77 69 64 3d 3d 70 2d 3e 69  || (iRowid==p->i
277d0 57 72 69 74 65 52 6f 77 69 64 20 26 26 20 70 2d  WriteRowid && p-
277e0 3e 62 44 65 6c 65 74 65 3d 3d 30 29 0a 20 20 20  >bDelete==0).   
277f0 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64 69 6e 67 44  || (p->nPendingD
27800 61 74 61 20 3e 20 70 2d 3e 70 43 6f 6e 66 69 67  ata > p->pConfig
27810 2d 3e 6e 48 61 73 68 53 69 7a 65 29 20 0a 20 20  ->nHashSize) .  
27820 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  ){.    fts5Index
27830 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a 0a 20  Flush(p);.  }.. 
27840 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20   p->iWriteRowid 
27850 3d 20 69 52 6f 77 69 64 3b 0a 20 20 70 2d 3e 62  = iRowid;.  p->b
27860 44 65 6c 65 74 65 20 3d 20 62 44 65 6c 65 74 65  Delete = bDelete
27870 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
27880 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
27890 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64  ../*.** Commit d
278a0 61 74 61 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a  ata to disk..*/.
278b0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
278c0 6e 64 65 78 53 79 6e 63 28 46 74 73 35 49 6e 64  ndexSync(Fts5Ind
278d0 65 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ex *p){.  assert
278e0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
278f0 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65  OK );.  fts5Inde
27900 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 66 74 73  xFlush(p);.  fts
27910 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b  5CloseReader(p);
27920 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
27930 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
27940 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61  ./*.** Discard a
27950 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  ny data stored i
27960 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
27970 68 61 73 68 20 74 61 62 6c 65 73 2e 20 44 6f 20  hash tables. Do 
27980 6e 6f 74 20 77 72 69 74 65 20 69 74 0a 2a 2a 20  not write it.** 
27990 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
279a0 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61   Additionally, a
279b0 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 63  ssume that the c
279c0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 25  ontents of the %
279d0 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d  _data.** table m
279e0 61 79 20 68 61 76 65 20 63 68 61 6e 67 65 64 20  ay have changed 
279f0 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20  on disk. So any 
27a00 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 73  in-memory caches
27a10 20 6f 66 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72   of %_data .** r
27a20 65 63 6f 72 64 73 20 6d 75 73 74 20 62 65 20 69  ecords must be i
27a30 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69  nvalidated..*/.i
27a40 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
27a50 64 65 78 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35  dexRollback(Fts5
27a60 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 66 74 73  Index *p){.  fts
27a70 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b  5CloseReader(p);
27a80 0a 20 20 66 74 73 35 49 6e 64 65 78 44 69 73 63  .  fts5IndexDisc
27a90 61 72 64 44 61 74 61 28 70 29 3b 0a 20 20 66 74  ardData(p);.  ft
27aa0 73 35 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c  s5StructureInval
27ab0 69 64 61 74 65 28 70 29 3b 0a 20 20 2f 2a 20 61  idate(p);.  /* a
27ac0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
27ad0 4c 49 54 45 5f 4f 4b 20 29 3b 20 2a 2f 0a 20 20  LITE_OK ); */.  
27ae0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27af0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25  ;.}../*.** The %
27b00 5f 64 61 74 61 20 74 61 62 6c 65 20 69 73 20 63  _data table is c
27b10 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20  ompletely empty 
27b20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
27b30 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68  on is called. Th
27b40 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70  is.** function p
27b50 6f 70 75 6c 61 74 65 73 20 69 74 20 77 69 74 68  opulates it with
27b60 20 74 68 65 20 69 6e 69 74 69 61 6c 20 73 74 72   the initial str
27b70 75 63 74 75 72 65 20 6f 62 6a 65 63 74 73 20 66  ucture objects f
27b80 6f 72 20 65 61 63 68 20 69 6e 64 65 78 2c 0a 2a  or each index,.*
27b90 2a 20 61 6e 64 20 74 68 65 20 69 6e 69 74 69 61  * and the initia
27ba0 6c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  l version of the
27bb0 20 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f   "averages" reco
27bc0 72 64 20 28 61 20 7a 65 72 6f 2d 62 79 74 65 20  rd (a zero-byte 
27bd0 62 6c 6f 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  blob)..*/.int sq
27be0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65  lite3Fts5IndexRe
27bf0 69 6e 69 74 28 46 74 73 35 49 6e 64 65 78 20 2a  init(Fts5Index *
27c00 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  p){.  Fts5Struct
27c10 75 72 65 20 73 3b 0a 20 20 66 74 73 35 53 74 72  ure s;.  fts5Str
27c20 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65  uctureInvalidate
27c30 28 70 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  (p);.  memset(&s
27c40 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
27c50 53 74 72 75 63 74 75 72 65 29 29 3b 0a 20 20 66  Structure));.  f
27c60 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
27c70 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f  FTS5_AVERAGES_RO
27c80 57 49 44 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29  WID, (const u8*)
27c90 22 22 2c 20 30 29 3b 0a 20 20 66 74 73 35 53 74  "", 0);.  fts5St
27ca0 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20  ructureWrite(p, 
27cb0 26 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  &s);.  return ft
27cc0 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
27cd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
27ce0 61 20 6e 65 77 20 46 74 73 35 49 6e 64 65 78 20  a new Fts5Index 
27cf0 68 61 6e 64 6c 65 2e 20 49 66 20 74 68 65 20 62  handle. If the b
27d00 43 72 65 61 74 65 20 61 72 67 75 6d 65 6e 74 20  Create argument 
27d10 69 73 20 74 72 75 65 2c 20 63 72 65 61 74 65 0a  is true, create.
27d20 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
27d30 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
27d40 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a   %_data table..*
27d50 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
27d60 75 6c 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70  ul, set *pp to p
27d70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
27d80 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72  object and retur
27d90 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
27da0 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 2a  Otherwise, set *
27db0 70 70 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72  pp to NULL and r
27dc0 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
27dd0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69  error code..*/.i
27de0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
27df0 64 65 78 4f 70 65 6e 28 0a 20 20 46 74 73 35 43  dexOpen(.  Fts5C
27e00 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20  onfig *pConfig, 
27e10 0a 20 20 69 6e 74 20 62 43 72 65 61 74 65 2c 20  .  int bCreate, 
27e20 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 2a 70  .  Fts5Index **p
27e30 70 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  p,.  char **pzEr
27e40 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  r.){.  int rc = 
27e50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73  SQLITE_OK;.  Fts
27e60 35 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20  5Index *p;      
27e70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27e80 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20  New object */.. 
27e90 20 2a 70 70 20 3d 20 70 20 3d 20 28 46 74 73 35   *pp = p = (Fts5
27ea0 49 6e 64 65 78 2a 29 73 71 6c 69 74 65 33 46 74  Index*)sqlite3Ft
27eb0 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
27ec0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64  , sizeof(Fts5Ind
27ed0 65 78 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ex));.  if( rc==
27ee0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27ef0 20 70 2d 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43   p->pConfig = pC
27f00 6f 6e 66 69 67 3b 0a 20 20 20 20 70 2d 3e 6e 57  onfig;.    p->nW
27f10 6f 72 6b 55 6e 69 74 20 3d 20 46 54 53 35 5f 57  orkUnit = FTS5_W
27f20 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 70 2d  ORK_UNIT;.    p-
27f30 3e 7a 44 61 74 61 54 62 6c 20 3d 20 73 71 6c 69  >zDataTbl = sqli
27f40 74 65 33 46 74 73 35 4d 70 72 69 6e 74 66 28 26  te3Fts5Mprintf(&
27f50 72 63 2c 20 22 25 73 5f 64 61 74 61 22 2c 20 70  rc, "%s_data", p
27f60 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a  Config->zName);.
27f70 20 20 20 20 69 66 28 20 70 2d 3e 7a 44 61 74 61      if( p->zData
27f80 54 62 6c 20 26 26 20 62 43 72 65 61 74 65 20 29  Tbl && bCreate )
27f90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
27fa0 69 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61  ite3Fts5CreateTa
27fb0 62 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20 70  ble(.          p
27fc0 43 6f 6e 66 69 67 2c 20 22 64 61 74 61 22 2c 20  Config, "data", 
27fd0 22 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  "id INTEGER PRIM
27fe0 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42  ARY KEY, block B
27ff0 4c 4f 42 22 2c 20 30 2c 20 70 7a 45 72 72 0a 20  LOB", 0, pzErr. 
28000 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
28010 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28020 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
28030 73 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74  sqlite3Fts5Creat
28040 65 54 61 62 6c 65 28 70 43 6f 6e 66 69 67 2c 20  eTable(pConfig, 
28050 22 69 64 78 22 2c 20 0a 20 20 20 20 20 20 20 20  "idx", .        
28060 20 20 20 20 22 73 65 67 69 64 2c 20 74 65 72 6d      "segid, term
28070 2c 20 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20  , pgno, PRIMARY 
28080 4b 45 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29  KEY(segid, term)
28090 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
280a0 31 2c 20 70 7a 45 72 72 0a 20 20 20 20 20 20 20  1, pzErr.       
280b0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
280c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
280d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
280e0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  c = sqlite3Fts5I
280f0 6e 64 65 78 52 65 69 6e 69 74 28 70 29 3b 0a 20  ndexReinit(p);. 
28100 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
28110 0a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ..  assert( rc!=
28120 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
28130 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
28140 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
28150 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
28160 78 43 6c 6f 73 65 28 70 29 3b 0a 20 20 20 20 2a  xClose(p);.    *
28170 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  pp = 0;.  }.  re
28180 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28190 2a 20 43 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65  * Close a handle
281a0 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61   opened by an ea
281b0 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71  rlier call to sq
281c0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70  lite3Fts5IndexOp
281d0 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  en()..*/.int sql
281e0 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f  ite3Fts5IndexClo
281f0 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  se(Fts5Index *p)
28200 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
28210 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
28220 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
28230 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a  ->pReader==0 );.
28240 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
28250 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a  eInvalidate(p);.
28260 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
28270 6c 69 7a 65 28 70 2d 3e 70 57 72 69 74 65 72 29  lize(p->pWriter)
28280 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
28290 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 65 6c 65 74  nalize(p->pDelet
282a0 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
282b0 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64  _finalize(p->pId
282c0 78 57 72 69 74 65 72 29 3b 0a 20 20 20 20 73 71  xWriter);.    sq
282d0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
282e0 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 29 3b 0a  ->pIdxDeleter);.
282f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
28300 6c 69 7a 65 28 70 2d 3e 70 49 64 78 53 65 6c 65  lize(p->pIdxSele
28310 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ct);.    sqlite3
28320 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 61  _finalize(p->pDa
28330 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20 20 20  taVersion);.    
28340 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 46  sqlite3Fts5HashF
28350 72 65 65 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20  ree(p->pHash);. 
28360 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28370 70 2d 3e 7a 44 61 74 61 54 62 6c 29 3b 0a 20 20  p->zDataTbl);.  
28380 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
28390 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
283a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  rc;.}../*.** Arg
283b0 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73 20 74  ument p points t
283c0 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
283d0 69 6e 69 6e 67 20 75 74 66 2d 38 20 74 65 78 74  ining utf-8 text
283e0 20 74 68 61 74 20 69 73 20 6e 20 62 79 74 65 73   that is n bytes
283f0 20 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e 20 52 65   in .** size. Re
28400 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
28410 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
28420 6e 43 68 61 72 20 63 68 61 72 61 63 74 65 72 20  nChar character 
28430 70 72 65 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a  prefix of the.**
28440 20 62 75 66 66 65 72 2c 20 6f 72 20 30 20 69 66   buffer, or 0 if
28450 20 74 68 65 72 65 20 61 72 65 20 6c 65 73 73 20   there are less 
28460 74 68 61 6e 20 6e 43 68 61 72 20 63 68 61 72 61  than nChar chara
28470 63 74 65 72 73 20 69 6e 20 74 6f 74 61 6c 2e 0a  cters in total..
28480 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
28490 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f  s5IndexCharlenTo
284a0 42 79 74 65 6c 65 6e 28 0a 20 20 63 6f 6e 73 74  Bytelen(.  const
284b0 20 63 68 61 72 20 2a 70 2c 20 0a 20 20 69 6e 74   char *p, .  int
284c0 20 6e 42 79 74 65 2c 20 0a 20 20 69 6e 74 20 6e   nByte, .  int n
284d0 43 68 61 72 0a 29 7b 0a 20 20 69 6e 74 20 6e 20  Char.){.  int n 
284e0 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
284f0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72  for(i=0; i<nChar
28500 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
28510 6e 3e 3d 6e 42 79 74 65 20 29 20 72 65 74 75 72  n>=nByte ) retur
28520 6e 20 30 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70  n 0;      /* Inp
28530 75 74 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65  ut contains fewe
28540 72 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68 61  r than nChar cha
28550 72 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 75  rs */.    if( (u
28560 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70 5b 6e  nsigned char)p[n
28570 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20  ++]>=0xc0 ){.   
28580 20 20 20 77 68 69 6c 65 28 20 28 70 5b 6e 5d 20     while( (p[n] 
28590 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 7b  & 0xc0)==0x80 ){
285a0 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  .        n++;.  
285b0 20 20 20 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79        if( n>=nBy
285c0 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  te ) break;.    
285d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
285e0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
285f0 2a 2a 20 70 49 6e 20 69 73 20 61 20 55 54 46 2d  ** pIn is a UTF-
28600 38 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67  8 encoded string
28610 2c 20 6e 49 6e 20 62 79 74 65 73 20 69 6e 20 73  , nIn bytes in s
28620 69 7a 65 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ize. Return the 
28630 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 75 6e 69  number of.** uni
28640 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 73 20  code characters 
28650 69 6e 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a  in the string..*
28660 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
28670 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28 63 6f  5IndexCharlen(co
28680 6e 73 74 20 63 68 61 72 20 2a 70 49 6e 2c 20 69  nst char *pIn, i
28690 6e 74 20 6e 49 6e 29 7b 0a 20 20 69 6e 74 20 6e  nt nIn){.  int n
286a0 43 68 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Char = 0;       
286b0 20 20 20 20 20 0a 20 20 69 6e 74 20 69 20 3d 20       .  int i = 
286c0 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 49  0;.  while( i<nI
286d0 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 28 75 6e  n ){.    if( (un
286e0 73 69 67 6e 65 64 20 63 68 61 72 29 70 49 6e 5b  signed char)pIn[
286f0 69 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20  i++]>=0xc0 ){.  
28700 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e      while( i<nIn
28710 20 26 26 20 28 70 49 6e 5b 69 5d 20 26 20 30 78   && (pIn[i] & 0x
28720 63 30 29 3d 3d 30 78 38 30 20 29 20 69 2b 2b 3b  c0)==0x80 ) i++;
28730 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 68 61 72  .    }.    nChar
28740 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
28750 20 6e 43 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nChar;.}../*.**
28760 20 49 6e 73 65 72 74 20 6f 72 20 72 65 6d 6f 76   Insert or remov
28770 65 20 64 61 74 61 20 74 6f 20 6f 72 20 66 72 6f  e data to or fro
28780 6d 20 74 68 65 20 69 6e 64 65 78 2e 20 45 61 63  m the index. Eac
28790 68 20 74 69 6d 65 20 61 20 64 6f 63 75 6d 65 6e  h time a documen
287a0 74 20 69 73 20 0a 2a 2a 20 61 64 64 65 64 20 74  t is .** added t
287b0 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f  o or removed fro
287c0 6d 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68 69  m the index, thi
287d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
287e0 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  lled one or more
287f0 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a  .** times..**.**
28800 20 46 6f 72 20 61 6e 20 69 6e 73 65 72 74 2c 20   For an insert, 
28810 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  it must be calle
28820 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
28830 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 6e 65 77  token in the new
28840 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66   document..** If
28850 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   the operation i
28860 73 20 61 20 64 65 6c 65 74 65 2c 20 69 74 20 6d  s a delete, it m
28870 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 28 61  ust be called (a
28880 74 20 6c 65 61 73 74 29 20 6f 6e 63 65 20 66 6f  t least) once fo
28890 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69 71 75 65  r each.** unique
288a0 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 64 6f   token in the do
288b0 63 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 69  cument with an i
288c0 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73 73 20 74  Col value less t
288d0 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65 20 69 50  han zero. The iP
288e0 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69  os.** argument i
288f0 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 61 20  s ignored for a 
28900 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73  delete..*/.int s
28910 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 57  qlite3Fts5IndexW
28920 72 69 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65  rite(.  Fts5Inde
28930 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
28940 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
28950 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
28960 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20    int iCol,     
28970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28980 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65    /* Column toke
28990 6e 20 61 70 70 65 61 72 73 20 69 6e 20 28 2d 76  n appears in (-v
289a0 65 20 2d 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a  e -> delete) */.
289b0 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20 20 20    int iPos,     
289c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289d0 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66    /* Position of
289e0 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f   token within co
289f0 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lumn */.  const 
28a00 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e  char *pToken, in
28a10 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b  t nToken  /* Tok
28a20 65 6e 20 74 6f 20 61 64 64 20 6f 72 20 72 65 6d  en to add or rem
28a30 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f 6d 20 69  ove to or from i
28a40 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ndex */.){.  int
28a50 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
28a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28a70 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
28a80 74 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20  through indexes 
28a90 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
28aa0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
28ab0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
28ac0 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e  ode */.  Fts5Con
28ad0 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
28ae0 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20 20 61 73  ->pConfig;..  as
28af0 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
28b00 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65  ITE_OK );.  asse
28b10 72 74 28 20 28 69 43 6f 6c 3c 30 29 3d 3d 70 2d  rt( (iCol<0)==p-
28b20 3e 62 44 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f  >bDelete );..  /
28b30 2a 20 41 64 64 20 74 68 65 20 65 6e 74 72 79 20  * Add the entry 
28b40 74 6f 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d  to the main term
28b50 73 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 72 63  s index. */.  rc
28b60 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61   = sqlite3Fts5Ha
28b70 73 68 57 72 69 74 65 28 0a 20 20 20 20 20 20 70  shWrite(.      p
28b80 2d 3e 70 48 61 73 68 2c 20 70 2d 3e 69 57 72 69  ->pHash, p->iWri
28b90 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69  teRowid, iCol, i
28ba0 50 6f 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50  Pos, FTS5_MAIN_P
28bb0 52 45 46 49 58 2c 20 70 54 6f 6b 65 6e 2c 20 6e  REFIX, pToken, n
28bc0 54 6f 6b 65 6e 0a 20 20 29 3b 0a 0a 20 20 66 6f  Token.  );..  fo
28bd0 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67  r(i=0; i<pConfig
28be0 2d 3e 6e 50 72 65 66 69 78 20 26 26 20 72 63 3d  ->nPrefix && rc=
28bf0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
28c00 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
28c10 6e 43 68 61 72 20 3d 20 70 43 6f 6e 66 69 67 2d  nChar = pConfig-
28c20 3e 61 50 72 65 66 69 78 5b 69 5d 3b 0a 20 20 20  >aPrefix[i];.   
28c30 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71 6c   int nByte = sql
28c40 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 68 61  ite3Fts5IndexCha
28c50 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54  rlenToBytelen(pT
28c60 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 6e 43  oken, nToken, nC
28c70 68 61 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  har);.    if( nB
28c80 79 74 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  yte ){.      rc 
28c90 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  = sqlite3Fts5Has
28ca0 68 57 72 69 74 65 28 70 2d 3e 70 48 61 73 68 2c  hWrite(p->pHash,
28cb0 20 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69   .          p->i
28cc0 57 72 69 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c  WriteRowid, iCol
28cd0 2c 20 69 50 6f 73 2c 20 28 63 68 61 72 29 28 46  , iPos, (char)(F
28ce0 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2b  TS5_MAIN_PREFIX+
28cf0 69 2b 31 29 2c 20 70 54 6f 6b 65 6e 2c 0a 20 20  i+1), pToken,.  
28d00 20 20 20 20 20 20 20 20 6e 42 79 74 65 0a 20 20          nByte.  
28d10 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
28d20 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
28d30 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
28d40 65 77 20 69 74 65 72 61 74 6f 72 20 74 6f 20 69  ew iterator to i
28d50 74 65 72 61 74 65 20 74 68 6f 75 67 68 20 61 6c  terate though al
28d60 6c 20 72 6f 77 69 64 20 74 68 61 74 20 6d 61 74  l rowid that mat
28d70 63 68 20 74 68 65 20 0a 2a 2a 20 73 70 65 63 69  ch the .** speci
28d80 66 69 65 64 20 74 6f 6b 65 6e 20 6f 72 20 74 6f  fied token or to
28d90 6b 65 6e 20 70 72 65 66 69 78 2e 0a 2a 2f 0a 69  ken prefix..*/.i
28da0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
28db0 64 65 78 51 75 65 72 79 28 0a 20 20 46 74 73 35  dexQuery(.  Fts5
28dc0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
28dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
28de0 54 53 20 69 6e 64 65 78 20 74 6f 20 71 75 65 72  TS index to quer
28df0 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  y */.  const cha
28e00 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e  r *pToken, int n
28e10 54 6f 6b 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20  Token, /* Token 
28e20 28 6f 72 20 70 72 65 66 69 78 29 20 74 6f 20 71  (or prefix) to q
28e30 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  uery for */.  in
28e40 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
28e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28e60 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44   Mask of FTS5IND
28e70 45 58 5f 51 55 45 52 59 5f 58 20 66 6c 61 67 73  EX_QUERY_X flags
28e80 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74   */.  Fts5Colset
28e90 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20   *pColset,      
28ea0 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74        /* Match t
28eb0 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6f 6e 6c  hese columns onl
28ec0 79 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78  y */.  Fts5Index
28ed0 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20  Iter **ppIter   
28ee0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
28ef0 65 77 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  ew iterator obje
28f00 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43  ct */.){.  Fts5C
28f10 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
28f20 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46   p->pConfig;.  F
28f30 74 73 35 49 74 65 72 20 2a 70 52 65 74 20 3d 20  ts5Iter *pRet = 
28f40 30 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  0;.  Fts5Buffer 
28f50 62 75 66 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b  buf = {0, 0, 0};
28f60 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 51 55  ..  /* If the QU
28f70 45 52 59 5f 53 43 41 4e 20 66 6c 61 67 20 69 73  ERY_SCAN flag is
28f80 20 73 65 74 2c 20 61 6c 6c 20 6f 74 68 65 72 20   set, all other 
28f90 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 63 6c  flags must be cl
28fa0 65 61 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ear. */.  assert
28fb0 28 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  ( (flags & FTS5I
28fc0 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29  NDEX_QUERY_SCAN)
28fd0 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 46 54  ==0 || flags==FT
28fe0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
28ff0 41 4e 20 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c  AN );..  if( sql
29000 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69  ite3Fts5BufferSi
29010 7a 65 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ze(&p->rc, &buf,
29020 20 6e 54 6f 6b 65 6e 2b 31 29 3d 3d 30 20 29 7b   nToken+1)==0 ){
29030 0a 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20  .    int iIdx = 
29040 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
29050 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 73     /* Index to s
29060 65 61 72 63 68 20 2a 2f 0a 20 20 20 20 69 66 28  earch */.    if(
29070 20 6e 54 6f 6b 65 6e 20 29 20 6d 65 6d 63 70 79   nToken ) memcpy
29080 28 26 62 75 66 2e 70 5b 31 5d 2c 20 70 54 6f 6b  (&buf.p[1], pTok
29090 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 0a 20 20  en, nToken);..  
290a0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
290b0 77 68 69 63 68 20 69 6e 64 65 78 20 74 6f 20 73  which index to s
290c0 65 61 72 63 68 20 61 6e 64 20 73 65 74 20 69 49  earch and set iI
290d0 64 78 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  dx accordingly. 
290e0 49 66 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  If this.    ** i
290f0 73 20 61 20 70 72 65 66 69 78 20 71 75 65 72 79  s a prefix query
29100 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65   for which there
29110 20 69 73 20 6e 6f 20 70 72 65 66 69 78 20 69 6e   is no prefix in
29120 64 65 78 2c 20 73 65 74 20 69 49 64 78 20 74 6f  dex, set iIdx to
29130 0a 20 20 20 20 2a 2a 20 67 72 65 61 74 65 72 20  .    ** greater 
29140 74 68 61 6e 20 70 43 6f 6e 66 69 67 2d 3e 6e 50  than pConfig->nP
29150 72 65 66 69 78 20 74 6f 20 69 6e 64 69 63 61 74  refix to indicat
29160 65 20 74 68 61 74 20 74 68 65 20 71 75 65 72 79  e that the query
29170 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20   will be.    ** 
29180 73 61 74 69 73 66 69 65 64 20 62 79 20 73 63 61  satisfied by sca
29190 6e 6e 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 74  nning multiple t
291a0 65 72 6d 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  erms in the main
291b0 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   index..    **. 
291c0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 51 55 45     ** If the QUE
291d0 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20 66 6c  RY_TEST_NOIDX fl
291e0 61 67 20 77 61 73 20 73 70 65 63 69 66 69 65 64  ag was specified
291f0 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 75 73 74  , then this must
29200 20 62 65 20 61 0a 20 20 20 20 2a 2a 20 70 72 65   be a.    ** pre
29210 66 69 78 2d 71 75 65 72 79 2e 20 49 6e 73 74 65  fix-query. Inste
29220 61 64 20 6f 66 20 75 73 69 6e 67 20 61 20 70 72  ad of using a pr
29230 65 66 69 78 2d 69 6e 64 65 78 20 28 69 66 20 6f  efix-index (if o
29240 6e 65 20 65 78 69 73 74 73 29 2c 20 0a 20 20 20  ne exists), .   
29250 20 2a 2a 20 65 76 61 6c 75 61 74 65 20 74 68 65   ** evaluate the
29260 20 70 72 65 66 69 78 20 71 75 65 72 79 20 75 73   prefix query us
29270 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 46 54 53  ing the main FTS
29280 20 69 6e 64 65 78 2e 20 54 68 69 73 20 69 73 20   index. This is 
29290 75 73 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20  used.    ** for 
292a0 69 6e 74 65 72 6e 61 6c 20 73 61 6e 69 74 79 20  internal sanity 
292b0 63 68 65 63 6b 69 6e 67 20 62 79 20 74 68 65 20  checking by the 
292c0 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20  integrity-check 
292d0 69 6e 20 64 65 62 75 67 20 0a 20 20 20 20 2a 2a  in debug .    **
292e0 20 6d 6f 64 65 20 6f 6e 6c 79 2e 20 20 2a 2f 0a   mode only.  */.
292f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
29300 42 55 47 0a 20 20 20 20 69 66 28 20 70 43 6f 6e  BUG.    if( pCon
29310 66 69 67 2d 3e 62 50 72 65 66 69 78 49 6e 64 65  fig->bPrefixInde
29320 78 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26  x==0 || (flags &
29330 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
29340 5f 54 45 53 54 5f 4e 4f 49 44 58 29 20 29 7b 0a  _TEST_NOIDX) ){.
29350 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
29360 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
29370 51 55 45 52 59 5f 50 52 45 46 49 58 20 29 3b 0a  QUERY_PREFIX );.
29380 20 20 20 20 20 20 69 49 64 78 20 3d 20 31 2b 70        iIdx = 1+p
29390 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b  Config->nPrefix;
293a0 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
293b0 66 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20  f.    if( flags 
293c0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
293d0 59 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20 20  Y_PREFIX ){.    
293e0 20 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 66 74    int nChar = ft
293f0 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28 70  s5IndexCharlen(p
29400 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
29410 20 20 20 20 20 20 66 6f 72 28 69 49 64 78 3d 31        for(iIdx=1
29420 3b 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d  ; iIdx<=pConfig-
29430 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b  >nPrefix; iIdx++
29440 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
29450 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b  Config->aPrefix[
29460 69 49 64 78 2d 31 5d 3d 3d 6e 43 68 61 72 20 29  iIdx-1]==nChar )
29470 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
29480 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
29490 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  Idx<=pConfig->nP
294a0 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20 2f  refix ){.      /
294b0 2a 20 53 74 72 61 69 67 68 74 20 69 6e 64 65 78  * Straight index
294c0 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 20   lookup */.     
294d0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
294e0 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
294f0 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
29500 20 20 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d        buf.p[0] =
29510 20 28 75 38 29 28 46 54 53 35 5f 4d 41 49 4e 5f   (u8)(FTS5_MAIN_
29520 50 52 45 46 49 58 20 2b 20 69 49 64 78 29 3b 0a  PREFIX + iIdx);.
29530 20 20 20 20 20 20 69 66 28 20 70 53 74 72 75 63        if( pStruc
29540 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  t ){.        fts
29550 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c  5MultiIterNew(p,
29560 20 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73 20   pStruct, flags 
29570 7c 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  | FTS5INDEX_QUER
29580 59 5f 53 4b 49 50 45 4d 50 54 59 2c 20 0a 20 20  Y_SKIPEMPTY, .  
29590 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 73 65            pColse
295a0 74 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e  t, buf.p, nToken
295b0 2b 31 2c 20 2d 31 2c 20 30 2c 20 26 70 52 65 74  +1, -1, 0, &pRet
295c0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
295d0 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
295e0 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
295f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
29600 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53  else{.      /* S
29610 63 61 6e 20 6d 75 6c 74 69 70 6c 65 20 74 65 72  can multiple ter
29620 6d 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 69  ms in the main i
29630 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ndex */.      in
29640 74 20 62 44 65 73 63 20 3d 20 28 66 6c 61 67 73  t bDesc = (flags
29650 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
29660 52 59 5f 44 45 53 43 29 21 3d 30 3b 0a 20 20 20  RY_DESC)!=0;.   
29670 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54     buf.p[0] = FT
29680 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 3b 0a  S5_MAIN_PREFIX;.
29690 20 20 20 20 20 20 66 74 73 35 53 65 74 75 70 50        fts5SetupP
296a0 72 65 66 69 78 49 74 65 72 28 70 2c 20 62 44 65  refixIter(p, bDe
296b0 73 63 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65  sc, buf.p, nToke
296c0 6e 2b 31 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70  n+1, pColset, &p
296d0 52 65 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Ret);.      asse
296e0 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  rt( p->rc!=SQLIT
296f0 45 5f 4f 4b 20 7c 7c 20 70 52 65 74 2d 3e 70 43  E_OK || pRet->pC
29700 6f 6c 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20  olset==0 );.    
29710 20 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74    fts5IterSetOut
29720 70 75 74 43 62 28 26 70 2d 3e 72 63 2c 20 70 52  putCb(&p->rc, pR
29730 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  et);.      if( p
29740 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
29750 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 53  ){.        Fts5S
29760 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
29770 70 52 65 74 2d 3e 61 53 65 67 5b 70 52 65 74 2d  pRet->aSeg[pRet-
29780 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
29790 74 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t];.        if( 
297a0 70 53 65 67 2d 3e 70 4c 65 61 66 20 29 20 70 52  pSeg->pLeaf ) pR
297b0 65 74 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 28  et->xSetOutputs(
297c0 70 52 65 74 2c 20 70 53 65 67 29 3b 0a 20 20 20  pRet, pSeg);.   
297d0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
297e0 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20  if( p->rc ){.   
297f0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 74     sqlite3Fts5It
29800 65 72 43 6c 6f 73 65 28 28 46 74 73 35 49 6e 64  erClose((Fts5Ind
29810 65 78 49 74 65 72 2a 29 70 52 65 74 29 3b 0a 20  exIter*)pRet);. 
29820 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20       pRet = 0;. 
29830 20 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65       fts5CloseRe
29840 61 64 65 72 28 70 29 3b 0a 20 20 20 20 7d 0a 0a  ader(p);.    }..
29850 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 28 46      *ppIter = (F
29860 74 73 35 49 6e 64 65 78 49 74 65 72 2a 29 70 52  ts5IndexIter*)pR
29870 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  et;.    sqlite3F
29880 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62  ts5BufferFree(&b
29890 75 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  uf);.  }.  retur
298a0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
298b0 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n(p);.}../*.** R
298c0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
298d0 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
298e0 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
298f0 67 75 6d 65 6e 74 20 69 73 20 61 74 20 45 4f 46  gument is at EOF
29900 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ..*/./*.** Move 
29910 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63  to the next matc
29920 68 69 6e 67 20 72 6f 77 69 64 2e 20 0a 2a 2f 0a  hing rowid. .*/.
29930 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
29940 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65  terNext(Fts5Inde
29950 78 49 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65  xIter *pIndexIte
29960 72 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a  r){.  Fts5Iter *
29970 70 49 74 65 72 20 3d 20 28 46 74 73 35 49 74 65  pIter = (Fts5Ite
29980 72 2a 29 70 49 6e 64 65 78 49 74 65 72 3b 0a 20  r*)pIndexIter;. 
29990 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
299a0 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49  pIndex->rc==SQLI
299b0 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 4d  TE_OK );.  fts5M
299c0 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 49 74  ultiIterNext(pIt
299d0 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65  er->pIndex, pIte
299e0 72 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75  r, 0, 0);.  retu
299f0 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
29a00 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  rn(pIter->pIndex
29a10 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  );.}../*.** Move
29a20 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74   to the next mat
29a30 63 68 69 6e 67 20 74 65 72 6d 2f 72 6f 77 69 64  ching term/rowid
29a40 2e 20 55 73 65 64 20 62 79 20 74 68 65 20 66 74  . Used by the ft
29a50 73 35 76 6f 63 61 62 20 6d 6f 64 75 6c 65 2e 0a  s5vocab module..
29a60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
29a70 73 35 49 74 65 72 4e 65 78 74 53 63 61 6e 28 46  s5IterNextScan(F
29a80 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
29a90 6e 64 65 78 49 74 65 72 29 7b 0a 20 20 46 74 73  ndexIter){.  Fts
29aa0 35 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 28  5Iter *pIter = (
29ab0 46 74 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78  Fts5Iter*)pIndex
29ac0 49 74 65 72 3b 0a 20 20 46 74 73 35 49 6e 64 65  Iter;.  Fts5Inde
29ad0 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 49  x *p = pIter->pI
29ae0 6e 64 65 78 3b 0a 0a 20 20 61 73 73 65 72 74 28  ndex;..  assert(
29af0 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e   pIter->pIndex->
29b00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
29b10 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65  ..  fts5MultiIte
29b20 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20  rNext(p, pIter, 
29b30 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e  0, 0);.  if( p->
29b40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29b50 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72  .    Fts5SegIter
29b60 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
29b70 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
29b80 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
29b90 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e  ;.    if( pSeg->
29ba0 70 4c 65 61 66 20 26 26 20 70 53 65 67 2d 3e 74  pLeaf && pSeg->t
29bb0 65 72 6d 2e 70 5b 30 5d 21 3d 46 54 53 35 5f 4d  erm.p[0]!=FTS5_M
29bc0 41 49 4e 5f 50 52 45 46 49 58 20 29 7b 0a 20 20  AIN_PREFIX ){.  
29bd0 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
29be0 61 73 65 28 70 53 65 67 2d 3e 70 4c 65 61 66 29  ase(pSeg->pLeaf)
29bf0 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 4c  ;.      pSeg->pL
29c00 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  eaf = 0;.      p
29c10 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20  Iter->base.bEof 
29c20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
29c30 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
29c40 65 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e  exReturn(pIter->
29c50 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
29c60 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65  * Move to the ne
29c70 78 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69  xt matching rowi
29c80 64 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74  d that occurs at
29c90 20 6f 72 20 61 66 74 65 72 20 69 4d 61 74 63 68   or after iMatch
29ca0 2e 20 54 68 65 0a 2a 2a 20 64 65 66 69 6e 69 74  . The.** definit
29cb0 69 6f 6e 20 6f 66 20 22 61 74 20 6f 72 20 61 66  ion of "at or af
29cc0 74 65 72 22 20 64 65 70 65 6e 64 73 20 6f 6e 20  ter" depends on 
29cd0 77 68 65 74 68 65 72 20 74 68 69 73 20 69 74 65  whether this ite
29ce0 72 61 74 6f 72 20 69 74 65 72 61 74 65 73 0a 2a  rator iterates.*
29cf0 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
29d00 72 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77  r descending row
29d10 69 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74  id order..*/.int
29d20 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
29d30 4e 65 78 74 46 72 6f 6d 28 46 74 73 35 49 6e 64  NextFrom(Fts5Ind
29d40 65 78 49 74 65 72 20 2a 70 49 6e 64 65 78 49 74  exIter *pIndexIt
29d50 65 72 2c 20 69 36 34 20 69 4d 61 74 63 68 29 7b  er, i64 iMatch){
29d60 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  .  Fts5Iter *pIt
29d70 65 72 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29  er = (Fts5Iter*)
29d80 70 49 6e 64 65 78 49 74 65 72 3b 0a 20 20 66 74  pIndexIter;.  ft
29d90 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 46  s5MultiIterNextF
29da0 72 6f 6d 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  rom(pIter->pInde
29db0 78 2c 20 70 49 74 65 72 2c 20 69 4d 61 74 63 68  x, pIter, iMatch
29dc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
29dd0 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65  IndexReturn(pIte
29de0 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f  r->pIndex);.}../
29df0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
29e00 63 75 72 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f  current term..*/
29e10 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
29e20 69 74 65 33 46 74 73 35 49 74 65 72 54 65 72 6d  ite3Fts5IterTerm
29e30 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
29e40 70 49 6e 64 65 78 49 74 65 72 2c 20 69 6e 74 20  pIndexIter, int 
29e50 2a 70 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  *pn){.  int n;. 
29e60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
29e70 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 66 74   (const char*)ft
29e80 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28  s5MultiIterTerm(
29e90 28 46 74 73 35 49 74 65 72 2a 29 70 49 6e 64 65  (Fts5Iter*)pInde
29ea0 78 49 74 65 72 2c 20 26 6e 29 3b 0a 20 20 2a 70  xIter, &n);.  *p
29eb0 6e 20 3d 20 6e 2d 31 3b 0a 20 20 72 65 74 75 72  n = n-1;.  retur
29ec0 6e 20 26 7a 5b 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  n &z[1];.}../*.*
29ed0 2a 20 43 6c 6f 73 65 20 61 6e 20 69 74 65 72 61  * Close an itera
29ee0 74 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 61 6e  tor opened by an
29ef0 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
29f00 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
29f10 78 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69  xQuery()..*/.voi
29f20 64 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  d sqlite3Fts5Ite
29f30 72 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78  rClose(Fts5Index
29f40 49 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72  Iter *pIndexIter
29f50 29 7b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 49  ){.  if( pIndexI
29f60 74 65 72 20 29 7b 0a 20 20 20 20 46 74 73 35 49  ter ){.    Fts5I
29f70 74 65 72 20 2a 70 49 74 65 72 20 3d 20 28 46 74  ter *pIter = (Ft
29f80 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74  s5Iter*)pIndexIt
29f90 65 72 3b 0a 20 20 20 20 46 74 73 35 49 6e 64 65  er;.    Fts5Inde
29fa0 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 49 74 65  x *pIndex = pIte
29fb0 72 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 66  r->pIndex;.    f
29fc0 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
29fd0 28 70 49 74 65 72 29 3b 0a 20 20 20 20 66 74 73  (pIter);.    fts
29fe0 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 49 6e  5CloseReader(pIn
29ff0 64 65 78 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  dex);.  }.}../*.
2a000 2a 2a 20 52 65 61 64 20 61 6e 64 20 64 65 63 6f  ** Read and deco
2a010 64 65 20 74 68 65 20 22 61 76 65 72 61 67 65 73  de the "averages
2a020 22 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  " record from th
2a030 65 20 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a 0a  e database. .**.
2a040 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 6e 53  ** Parameter anS
2a050 69 7a 65 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ize must point t
2a060 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 73 69  o an array of si
2a070 7a 65 20 6e 43 6f 6c 2c 20 77 68 65 72 65 20 6e  ze nCol, where n
2a080 43 6f 6c 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75  Col is.** the nu
2a090 6d 62 65 72 20 6f 66 20 75 73 65 72 20 64 65 66  mber of user def
2a0a0 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  ined columns in 
2a0b0 74 68 65 20 46 54 53 20 74 61 62 6c 65 2e 0a 2a  the FTS table..*
2a0c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
2a0d0 35 49 6e 64 65 78 47 65 74 41 76 65 72 61 67 65  5IndexGetAverage
2a0e0 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  s(Fts5Index *p, 
2a0f0 69 36 34 20 2a 70 6e 52 6f 77 2c 20 69 36 34 20  i64 *pnRow, i64 
2a100 2a 61 6e 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20  *anSize){.  int 
2a110 6e 43 6f 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nCol = p->pConfi
2a120 67 2d 3e 6e 43 6f 6c 3b 0a 20 20 46 74 73 35 44  g->nCol;.  Fts5D
2a130 61 74 61 20 2a 70 44 61 74 61 3b 0a 0a 20 20 2a  ata *pData;..  *
2a140 70 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 6d 65 6d  pnRow = 0;.  mem
2a150 73 65 74 28 61 6e 53 69 7a 65 2c 20 30 2c 20 73  set(anSize, 0, s
2a160 69 7a 65 6f 66 28 69 36 34 29 20 2a 20 6e 43 6f  izeof(i64) * nCo
2a170 6c 29 3b 0a 20 20 70 44 61 74 61 20 3d 20 66 74  l);.  pData = ft
2a180 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
2a190 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49  S5_AVERAGES_ROWI
2a1a0 44 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  D);.  if( p->rc=
2a1b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44  =SQLITE_OK && pD
2a1c0 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 69  ata->nn ){.    i
2a1d0 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e  nt i = 0;.    in
2a1e0 74 20 69 43 6f 6c 3b 0a 20 20 20 20 69 20 2b 3d  t iCol;.    i +=
2a1f0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
2a200 70 44 61 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36  pData->p[i], (u6
2a210 34 2a 29 70 6e 52 6f 77 29 3b 0a 20 20 20 20 66  4*)pnRow);.    f
2a220 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 3c 70 44 61  or(iCol=0; i<pDa
2a230 74 61 2d 3e 6e 6e 20 26 26 20 69 43 6f 6c 3c 6e  ta->nn && iCol<n
2a240 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
2a250 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
2a260 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70  Varint(&pData->p
2a270 5b 69 5d 2c 20 28 75 36 34 2a 29 26 61 6e 53 69  [i], (u64*)&anSi
2a280 7a 65 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 7d  ze[iCol]);.    }
2a290 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61  .  }..  fts5Data
2a2a0 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a  Release(pData);.
2a2b0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
2a2c0 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
2a2d0 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68  /*.** Replace th
2a2e0 65 20 63 75 72 72 65 6e 74 20 22 61 76 65 72 61  e current "avera
2a2f0 67 65 73 22 20 72 65 63 6f 72 64 20 77 69 74 68  ges" record with
2a300 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2a310 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20   the buffer .** 
2a320 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 20  supplied as the 
2a330 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
2a340 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
2a350 74 73 35 49 6e 64 65 78 53 65 74 41 76 65 72 61  ts5IndexSetAvera
2a360 67 65 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ges(Fts5Index *p
2a370 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74  , const u8 *pDat
2a380 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20  a, int nData){. 
2a390 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
2a3a0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66  SQLITE_OK );.  f
2a3b0 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
2a3c0 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f  FTS5_AVERAGES_RO
2a3d0 57 49 44 2c 20 70 44 61 74 61 2c 20 6e 44 61 74  WID, pData, nDat
2a3e0 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  a);.  return fts
2a3f0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
2a400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2a410 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
2a420 72 20 6f 66 20 62 6c 6f 63 6b 73 20 74 68 69 73  r of blocks this
2a430 20 6d 6f 64 75 6c 65 20 68 61 73 20 72 65 61 64   module has read
2a440 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61   from the %_data
2a450 0a 2a 2a 20 74 61 62 6c 65 20 73 69 6e 63 65 20  .** table since 
2a460 69 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a  it was created..
2a470 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
2a480 73 35 49 6e 64 65 78 52 65 61 64 73 28 46 74 73  s5IndexReads(Fts
2a490 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 72 65  5Index *p){.  re
2a4a0 74 75 72 6e 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d  turn p->nRead;.}
2a4b0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
2a4c0 33 32 2d 62 69 74 20 63 6f 6f 6b 69 65 20 76 61  32-bit cookie va
2a4d0 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 74 68  lue stored at th
2a4e0 65 20 73 74 61 72 74 20 6f 66 20 61 6c 6c 20 73  e start of all s
2a4f0 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 72 65 63  tructure .** rec
2a500 6f 72 64 73 20 74 6f 20 74 68 65 20 76 61 6c 75  ords to the valu
2a510 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
2a520 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
2a530 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
2a540 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
2a550 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
2a560 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
2a570 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63  f an error.** oc
2a580 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  curs..*/.int sql
2a590 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74  ite3Fts5IndexSet
2a5a0 43 6f 6f 6b 69 65 28 46 74 73 35 49 6e 64 65 78  Cookie(Fts5Index
2a5b0 20 2a 70 2c 20 69 6e 74 20 69 4e 65 77 29 7b 0a   *p, int iNew){.
2a5c0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2a5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5e0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2a5f0 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 43   code */.  Fts5C
2a600 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
2a610 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 20 20 20 20   p->pConfig;    
2a620 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  /* Configuration
2a630 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 38 20   object */.  u8 
2a640 61 43 6f 6f 6b 69 65 5b 34 5d 3b 20 20 20 20 20  aCookie[4];     
2a650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a660 20 20 2f 2a 20 42 69 6e 61 72 79 20 72 65 70 72    /* Binary repr
2a670 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 69 4e  esentation of iN
2a680 65 77 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ew */.  sqlite3_
2a690 62 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 30 3b  blob *pBlob = 0;
2a6a0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
2a6b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
2a6c0 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74    sqlite3Fts5Put
2a6d0 33 32 28 61 43 6f 6f 6b 69 65 2c 20 69 4e 65 77  32(aCookie, iNew
2a6e0 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
2a6f0 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f  e3_blob_open(pCo
2a700 6e 66 69 67 2d 3e 64 62 2c 20 70 43 6f 6e 66 69  nfig->db, pConfi
2a710 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61  g->zDb, p->zData
2a720 54 62 6c 2c 20 0a 20 20 20 20 20 20 22 62 6c 6f  Tbl, .      "blo
2a730 63 6b 22 2c 20 46 54 53 35 5f 53 54 52 55 43 54  ck", FTS5_STRUCT
2a740 55 52 45 5f 52 4f 57 49 44 2c 20 31 2c 20 26 70  URE_ROWID, 1, &p
2a750 42 6c 6f 62 0a 20 20 29 3b 0a 20 20 69 66 28 20  Blob.  );.  if( 
2a760 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2a770 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  .    sqlite3_blo
2a780 62 5f 77 72 69 74 65 28 70 42 6c 6f 62 2c 20 61  b_write(pBlob, a
2a790 43 6f 6f 6b 69 65 2c 20 34 2c 20 30 29 3b 0a 20  Cookie, 4, 0);. 
2a7a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2a7b0 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62  blob_close(pBlob
2a7c0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
2a7d0 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69   rc;.}..int sqli
2a7e0 74 65 33 46 74 73 35 49 6e 64 65 78 4c 6f 61 64  te3Fts5IndexLoad
2a7f0 43 6f 6e 66 69 67 28 46 74 73 35 49 6e 64 65 78  Config(Fts5Index
2a800 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75   *p){.  Fts5Stru
2a810 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
2a820 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35    pStruct = fts5
2a830 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29  StructureRead(p)
2a840 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
2a850 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
2a860 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
2a870 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
2a880 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.../***********
2a890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a8a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a8b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a8c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
2a8d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a8e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a8f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a910 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c  *********.** Bel
2a920 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73  ow this point is
2a930 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
2a940 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 74 65 67  ion of the integ
2a950 72 69 74 79 2d 63 68 65 63 6b 20 0a 2a 2a 20 66  rity-check .** f
2a960 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2e 0a 2a 2f  unctionality..*/
2a970 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
2a980 20 73 69 6d 70 6c 65 20 63 68 65 63 6b 73 75 6d   simple checksum
2a990 20 76 61 6c 75 65 20 62 61 73 65 64 20 6f 6e 20   value based on 
2a9a0 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  the arguments..*
2a9b0 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 46 74 73  /.u64 sqlite3Fts
2a9c0 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d  5IndexEntryCksum
2a9d0 28 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20  (.  i64 iRowid, 
2a9e0 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20  .  int iCol, .  
2a9f0 69 6e 74 20 69 50 6f 73 2c 20 0a 20 20 69 6e 74  int iPos, .  int
2aa00 20 69 49 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63   iIdx,.  const c
2aa10 68 61 72 20 2a 70 54 65 72 6d 2c 0a 20 20 69 6e  har *pTerm,.  in
2aa20 74 20 6e 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74  t nTerm.){.  int
2aa30 20 69 3b 0a 20 20 75 36 34 20 72 65 74 20 3d 20   i;.  u64 ret = 
2aa40 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d  iRowid;.  ret +=
2aa50 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c   (ret<<3) + iCol
2aa60 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c  ;.  ret += (ret<
2aa70 3c 33 29 20 2b 20 69 50 6f 73 3b 0a 20 20 69 66  <3) + iPos;.  if
2aa80 28 20 69 49 64 78 3e 3d 30 20 29 20 72 65 74 20  ( iIdx>=0 ) ret 
2aa90 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 28 46  += (ret<<3) + (F
2aaa0 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20  TS5_MAIN_PREFIX 
2aab0 2b 20 69 49 64 78 29 3b 0a 20 20 66 6f 72 28 69  + iIdx);.  for(i
2aac0 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b  =0; i<nTerm; i++
2aad0 29 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33  ) ret += (ret<<3
2aae0 29 20 2b 20 70 54 65 72 6d 5b 69 5d 3b 0a 20 20  ) + pTerm[i];.  
2aaf0 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23  return ret;.}..#
2ab00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2ab10 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  UG./*.** This fu
2ab20 6e 63 74 69 6f 6e 20 69 73 20 70 75 72 65 6c 79  nction is purely
2ab30 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73   an internal tes
2ab40 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63  t. It does not c
2ab50 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a  ontribute to .**
2ab60 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69   FTS functionali
2ab70 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20  ty, or even the 
2ab80 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c  integrity-check,
2ab90 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a   in any way..**.
2aba0 2a 2a 20 49 6e 73 74 65 61 64 2c 20 69 74 20 74  ** Instead, it t
2abb0 65 73 74 73 20 74 68 61 74 20 74 68 65 20 73 61  ests that the sa
2abc0 6d 65 20 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72  me set of pgno/r
2abd0 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  owid combination
2abe0 73 20 61 72 65 20 0a 2a 2a 20 76 69 73 69 74 65  s are .** visite
2abf0 64 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  d regardless of 
2ac00 77 68 65 74 68 65 72 20 74 68 65 20 64 6f 63 6c  whether the docl
2ac10 69 73 74 2d 69 6e 64 65 78 20 69 64 65 6e 74 69  ist-index identi
2ac20 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
2ac30 72 73 0a 2a 2a 20 69 53 65 67 69 64 2f 69 4c 65  rs.** iSegid/iLe
2ac40 61 66 20 69 73 20 69 74 65 72 61 74 65 64 20 69  af is iterated i
2ac50 6e 20 66 6f 72 77 61 72 64 73 20 6f 72 20 72 65  n forwards or re
2ac60 76 65 72 73 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a  verse order..*/.
2ac70 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2ac80 54 65 73 74 44 6c 69 64 78 52 65 76 65 72 73 65  TestDlidxReverse
2ac90 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
2aca0 2c 20 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c  , .  int iSegid,
2acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acc0 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
2acd0 69 64 20 74 6f 20 6c 6f 61 64 20 66 72 6f 6d 20  id to load from 
2ace0 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 20 20  */.  int iLeaf  
2acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad00 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 64 6f 63       /* Load doc
2ad10 6c 69 73 74 2d 69 6e 64 65 78 20 66 6f 72 20 74  list-index for t
2ad20 68 69 73 20 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20  his leaf */.){. 
2ad30 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
2ad40 70 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 75 36  pDlidx = 0;.  u6
2ad50 34 20 63 6b 73 75 6d 31 20 3d 20 31 33 3b 0a 20  4 cksum1 = 13;. 
2ad60 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 31 33   u64 cksum2 = 13
2ad70 3b 0a 0a 20 20 66 6f 72 28 70 44 6c 69 64 78 3d  ;..  for(pDlidx=
2ad80 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
2ad90 74 28 70 2c 20 30 2c 20 69 53 65 67 69 64 2c 20  t(p, 0, iSegid, 
2ada0 69 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 66 74  iLeaf);.      ft
2adb0 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70  s5DlidxIterEof(p
2adc0 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20  , pDlidx)==0;.  
2add0 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
2ade0 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29  rNext(p, pDlidx)
2adf0 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52  .  ){.    i64 iR
2ae00 6f 77 69 64 20 3d 20 66 74 73 35 44 6c 69 64 78  owid = fts5Dlidx
2ae10 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78  IterRowid(pDlidx
2ae20 29 3b 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f 20  );.    int pgno 
2ae30 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  = fts5DlidxIterP
2ae40 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  gno(pDlidx);.   
2ae50 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3e 69 4c   assert( pgno>iL
2ae60 65 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d  eaf );.    cksum
2ae70 31 20 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28  1 += iRowid + ((
2ae80 69 36 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20  i64)pgno<<32);. 
2ae90 20 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74   }.  fts5DlidxIt
2aea0 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a  erFree(pDlidx);.
2aeb0 20 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20    pDlidx = 0;.. 
2aec0 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35   for(pDlidx=fts5
2aed0 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c  DlidxIterInit(p,
2aee0 20 31 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61   1, iSegid, iLea
2aef0 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  f);.      fts5Dl
2af00 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
2af10 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20  lidx)==0;.      
2af20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65  fts5DlidxIterPre
2af30 76 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 29  v(p, pDlidx).  )
2af40 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  {.    i64 iRowid
2af50 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
2af60 52 6f 77 69 64 28 70 44 6c 69 64 78 29 3b 0a 20  Rowid(pDlidx);. 
2af70 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74     int pgno = ft
2af80 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
2af90 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 61 73 73  pDlidx);.    ass
2afa0 65 72 74 28 20 66 74 73 35 44 6c 69 64 78 49 74  ert( fts5DlidxIt
2afb0 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3e 69  erPgno(pDlidx)>i
2afc0 4c 65 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75  Leaf );.    cksu
2afd0 6d 32 20 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28  m2 += iRowid + (
2afe0 28 69 36 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a  (i64)pgno<<32);.
2aff0 20 20 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49    }.  fts5DlidxI
2b000 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b  terFree(pDlidx);
2b010 0a 20 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a  .  pDlidx = 0;..
2b020 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
2b030 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 31  ITE_OK && cksum1
2b040 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63  !=cksum2 ) p->rc
2b050 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2b060 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
2b070 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 0a 20  ts5QueryCksum(. 
2b080 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
2b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0a0 20 2f 2a 20 46 74 73 35 20 69 6e 64 65 78 20 6f   /* Fts5 index o
2b0b0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
2b0c0 49 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Idx,.  const cha
2b0d0 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20  r *z,           
2b0e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2b0f0 6b 65 79 20 74 6f 20 71 75 65 72 79 20 66 6f 72  key to query for
2b100 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
2b110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b120 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2b130 20 69 6e 64 65 78 20 6b 65 79 20 69 6e 20 62 79   index key in by
2b140 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  tes */.  int fla
2b150 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
2b160 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
2b170 73 20 66 6f 72 20 46 74 73 35 49 6e 64 65 78 51  s for Fts5IndexQ
2b180 75 65 72 79 20 2a 2f 0a 20 20 75 36 34 20 2a 70  uery */.  u64 *p
2b190 43 6b 73 75 6d 20 20 20 20 20 20 20 20 20 20 20  Cksum           
2b1a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
2b1b0 4f 55 54 3a 20 43 68 65 63 6b 73 75 6d 20 76 61  OUT: Checksum va
2b1c0 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lue */.){.  int 
2b1d0 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f  eDetail = p->pCo
2b1e0 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20  nfig->eDetail;. 
2b1f0 20 75 36 34 20 63 6b 73 75 6d 20 3d 20 2a 70 43   u64 cksum = *pC
2b200 6b 73 75 6d 3b 0a 20 20 46 74 73 35 49 6e 64 65  ksum;.  Fts5Inde
2b210 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30  xIter *pIter = 0
2b220 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
2b230 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65  ite3Fts5IndexQue
2b240 72 79 28 70 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67  ry(p, z, n, flag
2b250 73 2c 20 30 2c 20 26 70 49 74 65 72 29 3b 0a 0a  s, 0, &pIter);..
2b260 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
2b270 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c  ITE_OK && 0==sql
2b280 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28  ite3Fts5IterEof(
2b290 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69 36  pIter) ){.    i6
2b2a0 34 20 72 6f 77 69 64 20 3d 20 70 49 74 65 72 2d  4 rowid = pIter-
2b2b0 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 20 20 69 66  >iRowid;..    if
2b2c0 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ( eDetail==FTS5_
2b2d0 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
2b2e0 20 20 20 20 20 63 6b 73 75 6d 20 5e 3d 20 73 71       cksum ^= sq
2b2f0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e  lite3Fts5IndexEn
2b300 74 72 79 43 6b 73 75 6d 28 72 6f 77 69 64 2c 20  tryCksum(rowid, 
2b310 30 2c 20 30 2c 20 69 49 64 78 2c 20 7a 2c 20 6e  0, 0, iIdx, z, n
2b320 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2b330 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52      Fts5PoslistR
2b340 65 61 64 65 72 20 73 52 65 61 64 65 72 3b 0a 20  eader sReader;. 
2b350 20 20 20 20 20 66 6f 72 28 73 71 6c 69 74 65 33       for(sqlite3
2b360 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
2b370 72 49 6e 69 74 28 70 49 74 65 72 2d 3e 70 44 61  rInit(pIter->pDa
2b380 74 61 2c 20 70 49 74 65 72 2d 3e 6e 44 61 74 61  ta, pIter->nData
2b390 2c 20 26 73 52 65 61 64 65 72 29 3b 0a 20 20 20  , &sReader);.   
2b3a0 20 20 20 20 20 20 20 73 52 65 61 64 65 72 2e 62         sReader.b
2b3b0 45 6f 66 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  Eof==0;.        
2b3c0 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
2b3d0 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 26  listReaderNext(&
2b3e0 73 52 65 61 64 65 72 29 0a 20 20 20 20 20 20 29  sReader).      )
2b3f0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  {.        int iC
2b400 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f  ol = FTS5_POS2CO
2b410 4c 55 4d 4e 28 73 52 65 61 64 65 72 2e 69 50 6f  LUMN(sReader.iPo
2b420 73 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  s);.        int 
2b430 69 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f 53 32  iOff = FTS5_POS2
2b440 4f 46 46 53 45 54 28 73 52 65 61 64 65 72 2e 69  OFFSET(sReader.i
2b450 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 63 6b  Pos);.        ck
2b460 73 75 6d 20 5e 3d 20 73 71 6c 69 74 65 33 46 74  sum ^= sqlite3Ft
2b470 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75  s5IndexEntryCksu
2b480 6d 28 72 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69  m(rowid, iCol, i
2b490 4f 66 66 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29  Off, iIdx, z, n)
2b4a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2b4b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b4c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2b4d0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  c = sqlite3Fts5I
2b4e0 74 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a  terNext(pIter);.
2b4f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
2b500 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65  te3Fts5IterClose
2b510 28 70 49 74 65 72 29 3b 0a 0a 20 20 2a 70 43 6b  (pIter);..  *pCk
2b520 73 75 6d 20 3d 20 63 6b 73 75 6d 3b 0a 20 20 72  sum = cksum;.  r
2b530 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2b540 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2b550 6e 20 69 73 20 61 6c 73 6f 20 70 75 72 65 6c 79  n is also purely
2b560 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73   an internal tes
2b570 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63  t. It does not c
2b580 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a  ontribute to .**
2b590 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69   FTS functionali
2b5a0 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20  ty, or even the 
2b5b0 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c  integrity-check,
2b5c0 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a   in any way..*/.
2b5d0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2b5e0 54 65 73 74 54 65 72 6d 28 0a 20 20 46 74 73 35  TestTerm(.  Fts5
2b5f0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
2b600 35 42 75 66 66 65 72 20 2a 70 50 72 65 76 2c 20  5Buffer *pPrev, 
2b610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b620 50 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f  Previous term */
2b630 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2b640 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20  , int n,        
2b650 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6e     /* Possibly n
2b660 65 77 20 74 65 72 6d 20 74 6f 20 74 65 73 74 20  ew term to test 
2b670 2a 2f 0a 20 20 75 36 34 20 65 78 70 65 63 74 65  */.  u64 expecte
2b680 64 2c 0a 20 20 75 36 34 20 2a 70 43 6b 73 75 6d  d,.  u64 *pCksum
2b690 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  .){.  int rc = p
2b6a0 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 50 72 65  ->rc;.  if( pPre
2b6b0 76 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66  v->n==0 ){.    f
2b6c0 74 73 35 42 75 66 66 65 72 53 65 74 28 26 72 63  ts5BufferSet(&rc
2b6d0 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e  , pPrev, n, (con
2b6e0 73 74 20 75 38 2a 29 7a 29 3b 0a 20 20 7d 65 6c  st u8*)z);.  }el
2b6f0 73 65 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  se.  if( rc==SQL
2b700 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 72 65 76  ITE_OK && (pPrev
2b710 2d 3e 6e 21 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70  ->n!=n || memcmp
2b720 28 70 50 72 65 76 2d 3e 70 2c 20 7a 2c 20 6e 29  (pPrev->p, z, n)
2b730 29 20 29 7b 0a 20 20 20 20 75 36 34 20 63 6b 73  ) ){.    u64 cks
2b740 75 6d 33 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20  um3 = *pCksum;. 
2b750 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2b760 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68  Term = (const ch
2b770 61 72 2a 29 26 70 50 72 65 76 2d 3e 70 5b 31 5d  ar*)&pPrev->p[1]
2b780 3b 20 20 2f 2a 20 74 65 72 6d 20 73 61 6e 73 20  ;  /* term sans 
2b790 70 72 65 66 69 78 2d 62 79 74 65 20 2a 2f 0a 20  prefix-byte */. 
2b7a0 20 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70     int nTerm = p
2b7b0 50 72 65 76 2d 3e 6e 2d 31 3b 20 20 20 20 20 20  Prev->n-1;      
2b7c0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2b7d0 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20   zTerm in bytes 
2b7e0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 20  */.    int iIdx 
2b7f0 3d 20 28 70 50 72 65 76 2d 3e 70 5b 30 5d 20 2d  = (pPrev->p[0] -
2b800 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49   FTS5_MAIN_PREFI
2b810 58 29 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67  X);.    int flag
2b820 73 20 3d 20 28 69 49 64 78 3d 3d 30 20 3f 20 30  s = (iIdx==0 ? 0
2b830 20 3a 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   : FTS5INDEX_QUE
2b840 52 59 5f 50 52 45 46 49 58 29 3b 0a 20 20 20 20  RY_PREFIX);.    
2b850 75 36 34 20 63 6b 31 20 3d 20 30 3b 0a 20 20 20  u64 ck1 = 0;.   
2b860 20 75 36 34 20 63 6b 32 20 3d 20 30 3b 0a 0a 20   u64 ck2 = 0;.. 
2b870 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
2b880 20 74 68 65 20 72 65 73 75 6c 74 73 20 72 65 74   the results ret
2b890 75 72 6e 65 64 20 66 6f 72 20 41 53 43 20 61 6e  urned for ASC an
2b8a0 64 20 44 45 53 43 20 71 75 65 72 69 65 73 20 61  d DESC queries a
2b8b0 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61  re.    ** the sa
2b8c0 6d 65 2e 20 49 66 20 6e 6f 74 2c 20 63 61 6c 6c  me. If not, call
2b8d0 20 74 68 69 73 20 63 6f 72 72 75 70 74 69 6f 6e   this corruption
2b8e0 2e 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  .  */.    rc = f
2b8f0 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c  ts5QueryCksum(p,
2b900 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54   iIdx, zTerm, nT
2b910 65 72 6d 2c 20 66 6c 61 67 73 2c 20 26 63 6b 31  erm, flags, &ck1
2b920 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2b930 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b940 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c    int f = flags|
2b950 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
2b960 44 45 53 43 3b 0a 20 20 20 20 20 20 72 63 20 3d  DESC;.      rc =
2b970 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28   fts5QueryCksum(
2b980 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20  p, iIdx, zTerm, 
2b990 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b  nTerm, f, &ck2);
2b9a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2b9b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2b9c0 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20  ck1!=ck2 ) rc = 
2b9d0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20  FTS5_CORRUPT;.. 
2b9e0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
2b9f0 20 61 20 70 72 65 66 69 78 20 71 75 65 72 79 2c   a prefix query,
2ba00 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
2ba10 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64  results returned
2ba20 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   if the.    ** t
2ba30 68 65 20 69 6e 64 65 78 20 69 73 20 64 69 73 61  he index is disa
2ba40 62 6c 65 64 20 61 72 65 20 74 68 65 20 73 61 6d  bled are the sam
2ba50 65 2e 20 49 6e 20 62 6f 74 68 20 41 53 43 20 61  e. In both ASC a
2ba60 6e 64 20 44 45 53 43 20 6f 72 64 65 72 2e 20 0a  nd DESC order. .
2ba70 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2ba80 69 73 20 63 68 65 63 6b 20 6d 61 79 20 6f 6e 6c  is check may onl
2ba90 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69  y be performed i
2baa0 66 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  f the hash table
2bab0 20 69 73 20 65 6d 70 74 79 2e 20 54 68 69 73 0a   is empty. This.
2bac0 20 20 20 20 2a 2a 20 69 73 20 62 65 63 61 75 73      ** is becaus
2bad0 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
2bae0 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 61   only supports a
2baf0 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 71 75 65   single scan que
2bb00 72 79 20 61 74 0a 20 20 20 20 2a 2a 20 61 20 74  ry at.    ** a t
2bb10 69 6d 65 2c 20 61 6e 64 20 74 68 65 20 6d 75 6c  ime, and the mul
2bb20 74 69 2d 69 74 65 72 20 6c 6f 6f 70 20 66 72 6f  ti-iter loop fro
2bb30 6d 20 77 68 69 63 68 20 74 68 69 73 20 66 75 6e  m which this fun
2bb40 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 0a  ction is called.
2bb50 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64      ** is alread
2bb60 79 20 70 65 72 66 6f 72 6d 69 6e 67 20 73 75 63  y performing suc
2bb70 68 20 61 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20  h a scan. */.   
2bb80 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67   if( p->nPending
2bb90 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Data==0 ){.     
2bba0 20 69 66 28 20 69 49 64 78 3e 30 20 26 26 20 72   if( iIdx>0 && r
2bbb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bbc0 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
2bbd0 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f  flags|FTS5INDEX_
2bbe0 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58  QUERY_TEST_NOIDX
2bbf0 3b 0a 20 20 20 20 20 20 20 20 63 6b 32 20 3d 20  ;.        ck2 = 
2bc00 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
2bc10 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70  fts5QueryCksum(p
2bc20 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e  , iIdx, zTerm, n
2bc30 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a  Term, f, &ck2);.
2bc40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2bc50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31  SQLITE_OK && ck1
2bc60 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53  !=ck2 ) rc = FTS
2bc70 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
2bc80 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 49 64   }.      if( iId
2bc90 78 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  x>0 && rc==SQLIT
2bca0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2bcb0 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54  int f = flags|FT
2bcc0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45  S5INDEX_QUERY_TE
2bcd0 53 54 5f 4e 4f 49 44 58 7c 46 54 53 35 49 4e 44  ST_NOIDX|FTS5IND
2bce0 45 58 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a 20  EX_QUERY_DESC;. 
2bcf0 20 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a         ck2 = 0;.
2bd00 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
2bd10 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69  5QueryCksum(p, i
2bd20 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  Idx, zTerm, nTer
2bd30 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20  m, f, &ck2);.   
2bd40 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2bd50 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63  ITE_OK && ck1!=c
2bd60 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43  k2 ) rc = FTS5_C
2bd70 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a  ORRUPT;.      }.
2bd80 20 20 20 20 7d 0a 0a 20 20 20 20 63 6b 73 75 6d      }..    cksum
2bd90 33 20 5e 3d 20 63 6b 31 3b 0a 20 20 20 20 66 74  3 ^= ck1;.    ft
2bda0 73 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c  s5BufferSet(&rc,
2bdb0 20 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73   pPrev, n, (cons
2bdc0 74 20 75 38 2a 29 7a 29 3b 0a 0a 20 20 20 20 69  t u8*)z);..    i
2bdd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2bde0 20 26 26 20 63 6b 73 75 6d 33 21 3d 65 78 70 65   && cksum3!=expe
2bdf0 63 74 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  cted ){.      rc
2be00 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2be10 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 43 6b 73  .    }.    *pCks
2be20 75 6d 20 3d 20 63 6b 73 75 6d 33 3b 0a 20 20 7d  um = cksum3;.  }
2be30 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d  .  p->rc = rc;.}
2be40 0a 20 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  . .#else.# defin
2be50 65 20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52  e fts5TestDlidxR
2be60 65 76 65 72 73 65 28 78 2c 79 2c 7a 29 0a 23 20  everse(x,y,z).# 
2be70 64 65 66 69 6e 65 20 66 74 73 35 54 65 73 74 54  define fts5TestT
2be80 65 72 6d 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29  erm(u,v,w,x,y,z)
2be90 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
2bea0 68 65 63 6b 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  heck that:.**.**
2beb0 20 20 20 31 29 20 41 6c 6c 20 6c 65 61 76 65 73     1) All leaves
2bec0 20 6f 66 20 70 53 65 67 20 62 65 74 77 65 65 6e   of pSeg between
2bed0 20 69 46 69 72 73 74 20 61 6e 64 20 69 4c 61 73   iFirst and iLas
2bee0 74 20 28 69 6e 63 6c 75 73 69 76 65 29 20 65 78  t (inclusive) ex
2bef0 69 73 74 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ist and.**      
2bf00 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 74 65 72  contain zero ter
2bf10 6d 73 2e 0a 2a 2a 20 20 20 32 29 20 41 6c 6c 20  ms..**   2) All 
2bf20 6c 65 61 76 65 73 20 6f 66 20 70 53 65 67 20 62  leaves of pSeg b
2bf30 65 74 77 65 65 6e 20 69 4e 6f 52 6f 77 69 64 20  etween iNoRowid 
2bf40 61 6e 64 20 69 4c 61 73 74 20 28 69 6e 63 6c 75  and iLast (inclu
2bf50 73 69 76 65 29 20 65 78 69 73 74 20 61 6e 64 0a  sive) exist and.
2bf60 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20  **      contain 
2bf70 7a 65 72 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a  zero rowids..*/.
2bf80 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2bf90 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
2bfa0 65 63 6b 45 6d 70 74 79 28 0a 20 20 46 74 73 35  eckEmpty(.  Fts5
2bfb0 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35  Index *p,.  Fts5
2bfc0 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
2bfd0 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 53   *pSeg,     /* S
2bfe0 65 67 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b 20  egment to check 
2bff0 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74  internal consist
2c000 65 6e 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46  ency */.  int iF
2c010 69 72 73 74 2c 0a 20 20 69 6e 74 20 69 4e 6f 52  irst,.  int iNoR
2c020 6f 77 69 64 2c 0a 20 20 69 6e 74 20 69 4c 61 73  owid,.  int iLas
2c030 74 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  t.){.  int i;.. 
2c040 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74 68   /* Now check th
2c050 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d 70  at the iter.nEmp
2c060 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77  ty leaves follow
2c070 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
2c080 6c 65 61 66 0a 20 20 2a 2a 20 28 61 29 20 65 78  leaf.  ** (a) ex
2c090 69 73 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74  ist and (b) cont
2c0a0 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f  ain no terms. */
2c0b0 0a 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b  .  for(i=iFirst;
2c0c0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
2c0d0 4b 20 26 26 20 69 3c 3d 69 4c 61 73 74 3b 20 69  K && i<=iLast; i
2c0e0 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74  ++){.    Fts5Dat
2c0f0 61 20 2a 70 4c 65 61 66 20 3d 20 66 74 73 35 44  a *pLeaf = fts5D
2c100 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f  ataRead(p, FTS5_
2c110 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53  SEGMENT_ROWID(pS
2c120 65 67 2d 3e 69 53 65 67 69 64 2c 20 69 29 29 3b  eg->iSegid, i));
2c130 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29  .    if( pLeaf )
2c140 7b 0a 20 20 20 20 20 20 69 66 28 20 21 66 74 73  {.      if( !fts
2c150 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28  5LeafIsTermless(
2c160 70 4c 65 61 66 29 20 29 20 70 2d 3e 72 63 20 3d  pLeaf) ) p->rc =
2c170 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2c180 20 20 20 20 20 69 66 28 20 69 3e 3d 69 4e 6f 52       if( i>=iNoR
2c190 6f 77 69 64 20 26 26 20 30 21 3d 66 74 73 35 4c  owid && 0!=fts5L
2c1a0 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
2c1b0 28 70 4c 65 61 66 29 20 29 20 70 2d 3e 72 63 20  (pLeaf) ) p->rc 
2c1c0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2c1d0 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61      }.    fts5Da
2c1e0 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29  taRelease(pLeaf)
2c1f0 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
2c200 76 6f 69 64 20 66 74 73 35 49 6e 74 65 67 72 69  void fts5Integri
2c210 74 79 43 68 65 63 6b 50 67 69 64 78 28 46 74 73  tyCheckPgidx(Fts
2c220 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44  5Index *p, Fts5D
2c230 61 74 61 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69  ata *pLeaf){.  i
2c240 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b  nt iTermOff = 0;
2c250 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 46 74  .  int ii;..  Ft
2c260 73 35 42 75 66 66 65 72 20 62 75 66 31 20 3d 20  s5Buffer buf1 = 
2c270 7b 30 2c 30 2c 30 7d 3b 0a 20 20 46 74 73 35 42  {0,0,0};.  Fts5B
2c280 75 66 66 65 72 20 62 75 66 32 20 3d 20 7b 30 2c  uffer buf2 = {0,
2c290 30 2c 30 7d 3b 0a 0a 20 20 69 69 20 3d 20 70 4c  0,0};..  ii = pL
2c2a0 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 77  eaf->szLeaf;.  w
2c2b0 68 69 6c 65 28 20 69 69 3c 70 4c 65 61 66 2d 3e  hile( ii<pLeaf->
2c2c0 6e 6e 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c  nn && p->rc==SQL
2c2d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
2c2e0 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 69  t res;.    int i
2c2f0 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 49 6e  Off;.    int nIn
2c300 63 72 3b 0a 0a 20 20 20 20 69 69 20 2b 3d 20 66  cr;..    ii += f
2c310 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
2c320 70 4c 65 61 66 2d 3e 70 5b 69 69 5d 2c 20 6e 49  pLeaf->p[ii], nI
2c330 6e 63 72 29 3b 0a 20 20 20 20 69 54 65 72 6d 4f  ncr);.    iTermO
2c340 66 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20 20  ff += nIncr;.   
2c350 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66   iOff = iTermOff
2c360 3b 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e  ;..    if( iOff>
2c370 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  =pLeaf->szLeaf )
2c380 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
2c390 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2c3a0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 54 65 72    }else if( iTer
2c3b0 6d 4f 66 66 3d 3d 6e 49 6e 63 72 20 29 7b 0a 20  mOff==nIncr ){. 
2c3c0 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a       int nByte;.
2c3d0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
2c3e0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
2c3f0 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e  Leaf->p[iOff], n
2c400 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
2c410 20 28 69 4f 66 66 2b 6e 42 79 74 65 29 3e 70 4c   (iOff+nByte)>pL
2c420 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
2c430 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46         p->rc = F
2c440 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2c450 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c460 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
2c470 26 70 2d 3e 72 63 2c 20 26 62 75 66 31 2c 20 6e  &p->rc, &buf1, n
2c480 42 79 74 65 2c 20 26 70 4c 65 61 66 2d 3e 70 5b  Byte, &pLeaf->p[
2c490 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  iOff]);.      }.
2c4a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c4b0 20 69 6e 74 20 6e 4b 65 65 70 2c 20 6e 42 79 74   int nKeep, nByt
2c4c0 65 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  e;.      iOff +=
2c4d0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
2c4e0 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  (&pLeaf->p[iOff]
2c4f0 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20  , nKeep);.      
2c500 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
2c510 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e  arint32(&pLeaf->
2c520 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b  p[iOff], nByte);
2c530 0a 20 20 20 20 20 20 69 66 28 20 6e 4b 65 65 70  .      if( nKeep
2c540 3e 62 75 66 31 2e 6e 20 7c 7c 20 28 69 4f 66 66  >buf1.n || (iOff
2c550 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66 2d 3e 73  +nByte)>pLeaf->s
2c560 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  zLeaf ){.       
2c570 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2c580 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  RRUPT;.      }el
2c590 73 65 7b 0a 20 20 20 20 20 20 20 20 62 75 66 31  se{.        buf1
2c5a0 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20  .n = nKeep;.    
2c5b0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
2c5c0 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
2c5d0 20 26 62 75 66 31 2c 20 6e 42 79 74 65 2c 20 26   &buf1, nByte, &
2c5e0 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b  pLeaf->p[iOff]);
2c5f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2c600 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
2c610 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2c620 72 65 73 20 3d 20 66 74 73 35 42 75 66 66 65 72  res = fts5Buffer
2c630 43 6f 6d 70 61 72 65 28 26 62 75 66 31 2c 20 26  Compare(&buf1, &
2c640 62 75 66 32 29 3b 0a 20 20 20 20 20 20 20 20 69  buf2);.        i
2c650 66 28 20 72 65 73 3c 3d 30 20 29 20 70 2d 3e 72  f( res<=0 ) p->r
2c660 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2c670 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c680 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
2c690 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 32 2c  t(&p->rc, &buf2,
2c6a0 20 62 75 66 31 2e 6e 2c 20 62 75 66 31 2e 70 29   buf1.n, buf1.p)
2c6b0 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 42 75 66  ;.  }..  fts5Buf
2c6c0 66 65 72 46 72 65 65 28 26 62 75 66 31 29 3b 0a  ferFree(&buf1);.
2c6d0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
2c6e0 28 26 62 75 66 32 29 3b 0a 7d 0a 0a 73 74 61 74  (&buf2);.}..stat
2c6f0 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
2c700 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53  xIntegrityCheckS
2c710 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 35 49 6e  egment(.  Fts5In
2c720 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
2c730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
2c740 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
2c750 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
2c760 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
2c770 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74        /* Segment
2c780 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65 72 6e   to check intern
2c790 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a  al consistency *
2c7a0 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69  /.){.  Fts5Confi
2c7b0 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
2c7c0 70 43 6f 6e 66 69 67 3b 0a 20 20 73 71 6c 69 74  pConfig;.  sqlit
2c7d0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
2c7e0 20 30 3b 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20   0;.  int rc2;. 
2c7f0 20 69 6e 74 20 69 49 64 78 50 72 65 76 4c 65 61   int iIdxPrevLea
2c800 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69  f = pSeg->pgnoFi
2c810 72 73 74 2d 31 3b 0a 20 20 69 6e 74 20 69 44 6c  rst-1;.  int iDl
2c820 69 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53  idxPrevLeaf = pS
2c830 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 0a 20  eg->pgnoLast;.. 
2c840 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46   if( pSeg->pgnoF
2c850 69 72 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  irst==0 ) return
2c860 3b 0a 0a 20 20 66 74 73 35 49 6e 64 65 78 50 72  ;..  fts5IndexPr
2c870 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 53  epareStmt(p, &pS
2c880 74 6d 74 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72  tmt, sqlite3_mpr
2c890 69 6e 74 66 28 0a 20 20 20 20 20 20 22 53 45 4c  intf(.      "SEL
2c8a0 45 43 54 20 73 65 67 69 64 2c 20 74 65 72 6d 2c  ECT segid, term,
2c8b0 20 28 70 67 6e 6f 3e 3e 31 29 2c 20 28 70 67 6e   (pgno>>1), (pgn
2c8c0 6f 26 31 29 20 46 52 4f 4d 20 25 51 2e 27 25 71  o&1) FROM %Q.'%q
2c8d0 5f 69 64 78 27 20 57 48 45 52 45 20 73 65 67 69  _idx' WHERE segi
2c8e0 64 3d 25 64 22 2c 0a 20 20 20 20 20 20 70 43 6f  d=%d",.      pCo
2c8f0 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66  nfig->zDb, pConf
2c900 69 67 2d 3e 7a 4e 61 6d 65 2c 20 70 53 65 67 2d  ig->zName, pSeg-
2c910 3e 69 53 65 67 69 64 0a 20 20 29 29 3b 0a 0a 20  >iSegid.  ));.. 
2c920 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f   /* Iterate thro
2c930 75 67 68 20 74 68 65 20 62 2d 74 72 65 65 20 68  ugh the b-tree h
2c940 69 65 72 61 72 63 68 79 2e 20 20 2a 2f 0a 20 20  ierarchy.  */.  
2c950 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
2c960 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
2c970 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
2c980 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
2c990 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20 20 20    i64 iRow;     
2c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9b0 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68 69  /* Rowid for thi
2c9c0 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 46 74  s leaf */.    Ft
2c9d0 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 20 20  s5Data *pLeaf;  
2c9e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2c9f0 61 74 61 20 66 6f 72 20 74 68 69 73 20 6c 65 61  ata for this lea
2ca00 66 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 6e 49  f */..    int nI
2ca10 64 78 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33  dxTerm = sqlite3
2ca20 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
2ca30 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 63 6f 6e  tmt, 1);.    con
2ca40 73 74 20 63 68 61 72 20 2a 7a 49 64 78 54 65 72  st char *zIdxTer
2ca50 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  m = (const char*
2ca60 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2ca70 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a  text(pStmt, 1);.
2ca80 20 20 20 20 69 6e 74 20 69 49 64 78 4c 65 61 66      int iIdxLeaf
2ca90 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
2caa0 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32 29 3b  n_int(pStmt, 2);
2cab0 0a 20 20 20 20 69 6e 74 20 62 49 64 78 44 6c 69  .    int bIdxDli
2cac0 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  dx = sqlite3_col
2cad0 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33  umn_int(pStmt, 3
2cae0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2caf0 65 20 6c 65 61 66 20 69 6e 20 71 75 65 73 74 69  e leaf in questi
2cb00 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
2cb10 65 65 6e 20 74 72 69 6d 6d 65 64 20 66 72 6f 6d  een trimmed from
2cb20 20 74 68 65 20 73 65 67 6d 65 6e 74 2c 20 0a 20   the segment, . 
2cb30 20 20 20 2a 2a 20 69 67 6e 6f 72 65 20 74 68 69     ** ignore thi
2cb40 73 20 62 2d 74 72 65 65 20 65 6e 74 72 79 2e 20  s b-tree entry. 
2cb50 4f 74 68 65 72 77 69 73 65 2c 20 6c 6f 61 64 20  Otherwise, load 
2cb60 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  it into memory. 
2cb70 2a 2f 0a 20 20 20 20 69 66 28 20 69 49 64 78 4c  */.    if( iIdxL
2cb80 65 61 66 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69  eaf<pSeg->pgnoFi
2cb90 72 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  rst ) continue;.
2cba0 20 20 20 20 69 52 6f 77 20 3d 20 46 54 53 35 5f      iRow = FTS5_
2cbb0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53  SEGMENT_ROWID(pS
2cbc0 65 67 2d 3e 69 53 65 67 69 64 2c 20 69 49 64 78  eg->iSegid, iIdx
2cbd0 4c 65 61 66 29 3b 0a 20 20 20 20 70 4c 65 61 66  Leaf);.    pLeaf
2cbe0 20 3d 20 66 74 73 35 4c 65 61 66 52 65 61 64 28   = fts5LeafRead(
2cbf0 70 2c 20 69 52 6f 77 29 3b 0a 20 20 20 20 69 66  p, iRow);.    if
2cc00 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65  ( pLeaf==0 ) bre
2cc10 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  ak;..    /* Chec
2cc20 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61 66 20  k that the leaf 
2cc30 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73  contains at leas
2cc40 74 20 6f 6e 65 20 74 65 72 6d 2c 20 61 6e 64 20  t one term, and 
2cc50 74 68 61 74 20 69 74 20 69 73 20 65 71 75 61 6c  that it is equal
2cc60 0a 20 20 20 20 2a 2a 20 74 6f 20 6f 72 20 6c 61  .    ** to or la
2cc70 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 70  rger than the sp
2cc80 6c 69 74 2d 6b 65 79 20 69 6e 20 7a 49 64 78 54  lit-key in zIdxT
2cc90 65 72 6d 2e 20 20 41 6c 73 6f 20 63 68 65 63 6b  erm.  Also check
2cca0 20 74 68 61 74 20 69 66 20 74 68 65 72 65 0a 20   that if there. 
2ccb0 20 20 20 2a 2a 20 69 73 20 61 6c 73 6f 20 61 20     ** is also a 
2ccc0 72 6f 77 69 64 20 70 6f 69 6e 74 65 72 20 77 69  rowid pointer wi
2ccd0 74 68 69 6e 20 74 68 65 20 6c 65 61 66 20 70 61  thin the leaf pa
2cce0 67 65 20 68 65 61 64 65 72 2c 20 69 74 20 70 6f  ge header, it po
2ccf0 69 6e 74 73 20 74 6f 20 61 0a 20 20 20 20 2a 2a  ints to a.    **
2cd00 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65   location before
2cd10 20 74 68 65 20 74 65 72 6d 2e 20 20 2a 2f 0a 20   the term.  */. 
2cd20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e     if( pLeaf->nn
2cd30 3c 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  <=pLeaf->szLeaf 
2cd40 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
2cd50 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2cd60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2cd70 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20  int iOff;       
2cd80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2cd90 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74  ffset of first t
2cda0 65 72 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20  erm on leaf */. 
2cdb0 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f       int iRowidO
2cdc0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
2cdd0 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
2cde0 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61  rst rowid on lea
2cdf0 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  f */.      int n
2ce00 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
2ce10 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2ce20 66 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 69  f term on leaf i
2ce30 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  n bytes */.     
2ce40 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20   int res;       
2ce50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ce60 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 65  Comparison of te
2ce70 72 6d 20 61 6e 64 20 73 70 6c 69 74 2d 6b 65 79  rm and split-key
2ce80 20 2a 2f 0a 0a 20 20 20 20 20 20 69 4f 66 66 20   */..      iOff 
2ce90 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 54  = fts5LeafFirstT
2cea0 65 72 6d 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20  ermOff(pLeaf);. 
2ceb0 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d       iRowidOff =
2cec0 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f   fts5LeafFirstRo
2ced0 77 69 64 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20  widOff(pLeaf);. 
2cee0 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f       if( iRowidO
2cef0 66 66 3e 3d 69 4f 66 66 20 7c 7c 20 69 4f 66 66  ff>=iOff || iOff
2cf00 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  >=pLeaf->szLeaf 
2cf10 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
2cf20 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2cf30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2cf40 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
2cf50 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
2cf60 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e  Leaf->p[iOff], n
2cf70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 72  Term);.        r
2cf80 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 70 4c 65  es = memcmp(&pLe
2cf90 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 7a 49 64  af->p[iOff], zId
2cfa0 78 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 65 72 6d  xTerm, MIN(nTerm
2cfb0 2c 20 6e 49 64 78 54 65 72 6d 29 29 3b 0a 20 20  , nIdxTerm));.  
2cfc0 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30        if( res==0
2cfd0 20 29 20 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d   ) res = nTerm -
2cfe0 20 6e 49 64 78 54 65 72 6d 3b 0a 20 20 20 20 20   nIdxTerm;.     
2cff0 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 20 70     if( res<0 ) p
2d000 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2d010 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  UPT;.      }..  
2d020 20 20 20 20 66 74 73 35 49 6e 74 65 67 72 69 74      fts5Integrit
2d030 79 43 68 65 63 6b 50 67 69 64 78 28 70 2c 20 70  yCheckPgidx(p, p
2d040 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Leaf);.    }.   
2d050 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
2d060 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28  (pLeaf);.    if(
2d070 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a   p->rc ) break;.
2d080 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63  .    /* Now chec
2d090 6b 20 74 68 61 74 20 74 68 65 20 69 74 65 72 2e  k that the iter.
2d0a0 6e 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f  nEmpty leaves fo
2d0b0 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72  llowing the curr
2d0c0 65 6e 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20  ent leaf.    ** 
2d0d0 28 61 29 20 65 78 69 73 74 20 61 6e 64 20 28 62  (a) exist and (b
2d0e0 29 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72  ) contain no ter
2d0f0 6d 73 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 49  ms. */.    fts5I
2d100 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
2d110 63 6b 45 6d 70 74 79 28 0a 20 20 20 20 20 20 20  ckEmpty(.       
2d120 20 70 2c 20 70 53 65 67 2c 20 69 49 64 78 50 72   p, pSeg, iIdxPr
2d130 65 76 4c 65 61 66 2b 31 2c 20 69 44 6c 69 64 78  evLeaf+1, iDlidx
2d140 50 72 65 76 4c 65 61 66 2b 31 2c 20 69 49 64 78  PrevLeaf+1, iIdx
2d150 4c 65 61 66 2d 31 0a 20 20 20 20 29 3b 0a 20 20  Leaf-1.    );.  
2d160 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72    if( p->rc ) br
2d170 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  eak;..    /* If 
2d180 74 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69  there is a docli
2d190 73 74 2d 69 6e 64 65 78 2c 20 63 68 65 63 6b 20  st-index, check 
2d1a0 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 72 69  that it looks ri
2d1b0 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ght. */.    if( 
2d1c0 62 49 64 78 44 6c 69 64 78 20 29 7b 0a 20 20 20  bIdxDlidx ){.   
2d1d0 20 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72     Fts5DlidxIter
2d1e0 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b 20 20 2f   *pDlidx = 0;  /
2d1f0 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20  * For iterating 
2d200 74 68 72 6f 75 67 68 20 64 6f 63 6c 69 73 74 20  through doclist 
2d210 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
2d220 6e 74 20 69 50 72 65 76 4c 65 61 66 20 3d 20 69  nt iPrevLeaf = i
2d230 49 64 78 4c 65 61 66 3b 0a 20 20 20 20 20 20 69  IdxLeaf;.      i
2d240 6e 74 20 69 53 65 67 69 64 20 3d 20 70 53 65 67  nt iSegid = pSeg
2d250 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20  ->iSegid;.      
2d260 69 6e 74 20 69 50 67 20 3d 20 30 3b 0a 20 20 20  int iPg = 0;.   
2d270 20 20 20 69 36 34 20 69 4b 65 79 3b 0a 0a 20 20     i64 iKey;..  
2d280 20 20 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66      for(pDlidx=f
2d290 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
2d2a0 28 70 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69  (p, 0, iSegid, i
2d2b0 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  IdxLeaf);.      
2d2c0 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
2d2d0 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d  rEof(p, pDlidx)=
2d2e0 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  =0;.          ft
2d2f0 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28  s5DlidxIterNext(
2d300 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 20 20 20  p, pDlidx).     
2d310 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   ){..        /* 
2d320 43 68 65 63 6b 20 61 6e 79 20 72 6f 77 69 64 2d  Check any rowid-
2d330 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 74 20  less pages that 
2d340 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74 68 65  occur before the
2d350 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a   current leaf. *
2d360 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 50  /.        for(iP
2d370 67 3d 69 50 72 65 76 4c 65 61 66 2b 31 3b 20 69  g=iPrevLeaf+1; i
2d380 50 67 3c 66 74 73 35 44 6c 69 64 78 49 74 65 72  Pg<fts5DlidxIter
2d390 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 20 69 50  Pgno(pDlidx); iP
2d3a0 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g++){.          
2d3b0 69 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d  iKey = FTS5_SEGM
2d3c0 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64  ENT_ROWID(iSegid
2d3d0 2c 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20 20  , iPg);.        
2d3e0 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61    pLeaf = fts5Da
2d3f0 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b  taRead(p, iKey);
2d400 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2d410 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
2d420 20 20 20 20 69 66 28 20 66 74 73 35 4c 65 61 66      if( fts5Leaf
2d430 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c  FirstRowidOff(pL
2d440 65 61 66 29 21 3d 30 20 29 20 70 2d 3e 72 63 20  eaf)!=0 ) p->rc 
2d450 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2d460 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
2d470 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61  DataRelease(pLea
2d480 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  f);.          }.
2d490 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d4a0 20 20 69 50 72 65 76 4c 65 61 66 20 3d 20 66 74    iPrevLeaf = ft
2d4b0 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
2d4c0 70 44 6c 69 64 78 29 3b 0a 0a 20 20 20 20 20 20  pDlidx);..      
2d4d0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
2d4e0 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69 6e  the leaf page in
2d4f0 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69  dicated by the i
2d500 74 65 72 61 74 6f 72 20 72 65 61 6c 6c 79 20 64  terator really d
2d510 6f 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  oes.        ** c
2d520 6f 6e 74 61 69 6e 20 74 68 65 20 72 6f 77 69 64  ontain the rowid
2d530 20 73 75 67 67 65 73 74 65 64 20 62 79 20 74 68   suggested by th
2d540 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20  e same. */.     
2d550 20 20 20 69 4b 65 79 20 3d 20 46 54 53 35 5f 53     iKey = FTS5_S
2d560 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65  EGMENT_ROWID(iSe
2d570 67 69 64 2c 20 69 50 72 65 76 4c 65 61 66 29 3b  gid, iPrevLeaf);
2d580 0a 20 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d  .        pLeaf =
2d590 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
2d5a0 20 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20   iKey);.        
2d5b0 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20  if( pLeaf ){.   
2d5c0 20 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69         i64 iRowi
2d5d0 64 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  d;.          int
2d5e0 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73   iRowidOff = fts
2d5f0 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
2d600 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  ff(pLeaf);.     
2d610 20 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45       ASSERT_SZLE
2d620 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20  AF_OK(pLeaf);.  
2d630 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77          if( iRow
2d640 69 64 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a  idOff>=pLeaf->sz
2d650 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
2d660 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
2d670 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2d680 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d690 20 20 20 20 20 20 20 66 74 73 35 47 65 74 56 61         fts5GetVa
2d6a0 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69  rint(&pLeaf->p[i
2d6b0 52 6f 77 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a  RowidOff], (u64*
2d6c0 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  )&iRowid);.     
2d6d0 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69         if( iRowi
2d6e0 64 21 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72  d!=fts5DlidxIter
2d6f0 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29 20  Rowid(pDlidx) ) 
2d700 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2d710 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
2d720 7d 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  }.          fts5
2d730 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61  DataRelease(pLea
2d740 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  f);.        }.  
2d750 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 44 6c      }..      iDl
2d760 69 64 78 50 72 65 76 4c 65 61 66 20 3d 20 69 50  idxPrevLeaf = iP
2d770 67 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  g;.      fts5Dli
2d780 64 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64  dxIterFree(pDlid
2d790 78 29 3b 0a 20 20 20 20 20 20 66 74 73 35 54 65  x);.      fts5Te
2d7a0 73 74 44 6c 69 64 78 52 65 76 65 72 73 65 28 70  stDlidxReverse(p
2d7b0 2c 20 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65  , iSegid, iIdxLe
2d7c0 61 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  af);.    }else{.
2d7d0 20 20 20 20 20 20 69 44 6c 69 64 78 50 72 65 76        iDlidxPrev
2d7e0 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e  Leaf = pSeg->pgn
2d7f0 6f 4c 61 73 74 3b 0a 20 20 20 20 20 20 2f 2a 20  oLast;.      /* 
2d800 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 72  TODO: Check ther
2d810 65 20 69 73 20 6e 6f 20 64 6f 63 6c 69 73 74 20  e is no doclist 
2d820 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7d 0a 0a  index */.    }..
2d830 20 20 20 20 69 49 64 78 50 72 65 76 4c 65 61 66      iIdxPrevLeaf
2d840 20 3d 20 69 49 64 78 4c 65 61 66 3b 0a 20 20 7d   = iIdxLeaf;.  }
2d850 0a 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65  ..  rc2 = sqlite
2d860 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
2d870 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
2d880 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72  SQLITE_OK ) p->r
2d890 63 20 3d 20 72 63 32 3b 0a 0a 20 20 2f 2a 20 50  c = rc2;..  /* P
2d8a0 61 67 65 20 69 74 65 72 2e 69 4c 65 61 66 20 6d  age iter.iLeaf m
2d8b0 75 73 74 20 6e 6f 77 20 62 65 20 74 68 65 20 72  ust now be the r
2d8c0 69 67 68 74 6d 6f 73 74 20 6c 65 61 66 2d 70 61  ightmost leaf-pa
2d8d0 67 65 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  ge in the segmen
2d8e0 74 20 2a 2f 0a 23 69 66 20 30 0a 20 20 69 66 28  t */.#if 0.  if(
2d8f0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
2d900 4b 20 26 26 20 69 74 65 72 2e 69 4c 65 61 66 21  K && iter.iLeaf!
2d910 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20  =pSeg->pgnoLast 
2d920 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46  ){.    p->rc = F
2d930 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  TS5_CORRUPT;.  }
2d940 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
2d950 2a 20 52 75 6e 20 69 6e 74 65 72 6e 61 6c 20 63  * Run internal c
2d960 68 65 63 6b 73 20 74 6f 20 65 6e 73 75 72 65 20  hecks to ensure 
2d970 74 68 61 74 20 74 68 65 20 46 54 53 20 69 6e 64  that the FTS ind
2d980 65 78 20 28 61 29 20 69 73 20 69 6e 74 65 72 6e  ex (a) is intern
2d990 61 6c 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69 73 74  ally .** consist
2d9a0 65 6e 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74  ent and (b) cont
2d9b0 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72  ains entries for
2d9c0 20 77 68 69 63 68 20 74 68 65 20 58 4f 52 20 6f   which the XOR o
2d9d0 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 0a  f the checksums.
2d9e0 2a 2a 20 61 73 20 63 61 6c 63 75 6c 61 74 65 64  ** as calculated
2d9f0 20 62 79 20 73 71 6c 69 74 65 33 46 74 73 35 49   by sqlite3Fts5I
2da00 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 29  ndexEntryCksum()
2da10 20 69 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a   is cksum..**.**
2da20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   Return SQLITE_C
2da30 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 6f 66  ORRUPT if any of
2da40 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 68   the internal ch
2da50 65 63 6b 73 20 66 61 69 6c 2c 20 6f 72 20 69 66  ecks fail, or if
2da60 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d   the.** checksum
2da70 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e   does not match.
2da80 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2da90 4b 20 69 66 20 61 6c 6c 20 63 68 65 63 6b 73 20  K if all checks 
2daa0 70 61 73 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20  pass without.** 
2dab0 65 72 72 6f 72 2c 20 6f 72 20 73 6f 6d 65 20 6f  error, or some o
2dac0 74 68 65 72 20 53 51 4c 69 74 65 20 65 72 72 6f  ther SQLite erro
2dad0 72 20 63 6f 64 65 20 69 66 20 61 6e 6f 74 68 65  r code if anothe
2dae0 72 20 65 72 72 6f 72 20 28 65 2e 67 2e 20 4f 4f  r error (e.g. OO
2daf0 4d 29 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f  M).** occurs..*/
2db00 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
2db10 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
2db20 65 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70  eck(Fts5Index *p
2db30 2c 20 75 36 34 20 63 6b 73 75 6d 29 7b 0a 20 20  , u64 cksum){.  
2db40 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d  int eDetail = p-
2db50 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
2db60 6c 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20  l;.  u64 cksum2 
2db70 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2db80 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
2db90 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e   based on conten
2dba0 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f  ts of indexes */
2dbb0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 70 6f  .  Fts5Buffer po
2dbc0 73 6c 69 73 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b  slist = {0,0,0};
2dbd0 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65     /* Buffer use
2dbe0 64 20 74 6f 20 68 6f 6c 64 20 61 20 70 6f 73 6c  d to hold a posl
2dbf0 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 49 74 65  ist */.  Fts5Ite
2dc00 72 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20  r *pIter;       
2dc10 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
2dc20 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
2dc30 75 67 68 20 65 6e 74 69 72 65 20 69 6e 64 65 78  ugh entire index
2dc40 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
2dc50 75 72 65 20 2a 70 53 74 72 75 63 74 3b 20 20 20  ure *pStruct;   
2dc60 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
2dc70 74 72 75 63 74 75 72 65 20 2a 2f 0a 0a 23 69 66  tructure */..#if
2dc80 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2dc90 0a 20 20 2f 2a 20 55 73 65 64 20 62 79 20 65 78  .  /* Used by ex
2dca0 74 72 61 20 69 6e 74 65 72 6e 61 6c 20 74 65 73  tra internal tes
2dcb0 74 73 20 6f 6e 6c 79 20 72 75 6e 20 69 66 20 4e  ts only run if N
2dcc0 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
2dcd0 69 6e 65 64 20 2a 2f 0a 20 20 75 36 34 20 63 6b  ined */.  u64 ck
2dce0 73 75 6d 33 20 3d 20 30 3b 20 20 20 20 20 20 20  sum3 = 0;       
2dcf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
2dd00 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63  cksum based on c
2dd10 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78  ontents of index
2dd20 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  es */.  Fts5Buff
2dd30 65 72 20 74 65 72 6d 20 3d 20 7b 30 2c 30 2c 30  er term = {0,0,0
2dd40 7d 3b 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65  };      /* Buffe
2dd50 72 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 6d  r used to hold m
2dd60 6f 73 74 20 72 65 63 65 6e 74 20 74 65 72 6d 20  ost recent term 
2dd70 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 6f 6e 73  */.#endif.  cons
2dd80 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54  t int flags = FT
2dd90 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f  S5INDEX_QUERY_NO
2dda0 4f 55 54 50 55 54 3b 0a 20 20 0a 20 20 2f 2a 20  OUTPUT;.  .  /* 
2ddb0 4c 6f 61 64 20 74 68 65 20 46 54 53 20 69 6e 64  Load the FTS ind
2ddc0 65 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ex structure */.
2ddd0 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35    pStruct = fts5
2dde0 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29  StructureRead(p)
2ddf0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
2de00 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  at the internal 
2de10 6e 6f 64 65 73 20 6f 66 20 65 61 63 68 20 73 65  nodes of each se
2de20 67 6d 65 6e 74 20 6d 61 74 63 68 20 74 68 65 20  gment match the 
2de30 6c 65 61 76 65 73 20 2a 2f 0a 20 20 69 66 28 20  leaves */.  if( 
2de40 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69  pStruct ){.    i
2de50 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20  nt iLvl, iSeg;. 
2de60 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69     for(iLvl=0; i
2de70 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
2de80 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
2de90 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
2dea0 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c  iSeg<pStruct->aL
2deb0 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
2dec0 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
2ded0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
2dee0 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26  egment *pSeg = &
2def0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
2df00 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d  iLvl].aSeg[iSeg]
2df10 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 49 6e  ;.        fts5In
2df20 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63  dexIntegrityChec
2df30 6b 53 65 67 6d 65 6e 74 28 70 2c 20 70 53 65 67  kSegment(p, pSeg
2df40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2df50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
2df60 6b 73 75 6d 20 61 72 67 75 6d 65 6e 74 20 70 61  ksum argument pa
2df70 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
2df80 63 74 69 6f 6e 20 69 73 20 61 20 63 68 65 63 6b  ction is a check
2df90 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 0a 20  sum calculated. 
2dfa0 20 2a 2a 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c   ** based on all
2dfb0 20 65 78 70 65 63 74 65 64 20 65 6e 74 72 69 65   expected entrie
2dfc0 73 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e 64  s in the FTS ind
2dfd0 65 78 20 28 69 6e 63 6c 75 64 69 6e 67 20 70 72  ex (including pr
2dfe0 65 66 69 78 20 69 6e 64 65 78 0a 20 20 2a 2a 20  efix index.  ** 
2dff0 65 6e 74 72 69 65 73 29 2e 20 54 68 69 73 20 62  entries). This b
2e000 6c 6f 63 6b 20 63 68 65 63 6b 73 20 74 68 61 74  lock checks that
2e010 20 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63   a checksum calc
2e020 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20  ulated based on 
2e030 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20  the.  ** actual 
2e040 63 6f 6e 74 65 6e 74 73 20 6f 66 20 46 54 53 20  contents of FTS 
2e050 69 6e 64 65 78 20 69 73 20 69 64 65 6e 74 69 63  index is identic
2e060 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 77  al..  **.  ** Tw
2e070 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
2e080 65 20 73 61 6d 65 20 63 68 65 63 6b 73 75 6d 20  e same checksum 
2e090 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 2e 20  are calculated. 
2e0a0 54 68 65 20 66 69 72 73 74 20 28 73 74 61 63 6b  The first (stack
2e0b0 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 63  .  ** variable c
2e0c0 6b 73 75 6d 32 29 20 62 61 73 65 64 20 6f 6e 20  ksum2) based on 
2e0d0 65 6e 74 72 69 65 73 20 65 78 74 72 61 63 74 65  entries extracte
2e0e0 64 20 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d  d from the full-
2e0f0 74 65 78 74 20 69 6e 64 65 78 0a 20 20 2a 2a 20  text index.  ** 
2e100 77 68 69 6c 65 20 64 6f 69 6e 67 20 61 20 6c 69  while doing a li
2e110 6e 65 61 72 20 73 63 61 6e 20 6f 66 20 65 61 63  near scan of eac
2e120 68 20 69 6e 64 69 76 69 64 75 61 6c 20 69 6e 64  h individual ind
2e130 65 78 20 69 6e 20 74 75 72 6e 2e 20 0a 20 20 2a  ex in turn. .  *
2e140 2a 0a 20 20 2a 2a 20 41 73 20 65 61 63 68 20 74  *.  ** As each t
2e150 65 72 6d 20 76 69 73 69 74 65 64 20 62 79 20 74  erm visited by t
2e160 68 65 20 6c 69 6e 65 61 72 20 73 63 61 6e 73 2c  he linear scans,
2e170 20 61 20 73 65 70 61 72 61 74 65 20 71 75 65 72   a separate quer
2e180 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73  y for the.  ** s
2e190 61 6d 65 20 74 65 72 6d 20 69 73 20 70 65 72 66  ame term is perf
2e1a0 6f 72 6d 65 64 2e 20 63 6b 73 75 6d 33 20 69 73  ormed. cksum3 is
2e1b0 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65   calculated base
2e1c0 64 20 6f 6e 20 74 68 65 20 65 6e 74 72 69 65 73  d on the entries
2e1d0 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20  .  ** extracted 
2e1e0 62 79 20 74 68 65 73 65 20 71 75 65 72 69 65 73  by these queries
2e1f0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74 73  ..  */.  for(fts
2e200 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c  5MultiIterNew(p,
2e210 20 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73 2c   pStruct, flags,
2e220 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c   0, 0, 0, -1, 0,
2e230 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20   &pIter);.      
2e240 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
2e250 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20  (p, pIter)==0;. 
2e260 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
2e270 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c  erNext(p, pIter,
2e280 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20   0, 0).  ){.    
2e290 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
2e2a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2e2b0 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62  ize of term in b
2e2c0 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 36 34 20  ytes */.    i64 
2e2d0 69 50 6f 73 20 3d 20 30 3b 20 20 20 20 20 20 20  iPos = 0;       
2e2e0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74          /* Posit
2e2f0 69 6f 6e 20 72 65 61 64 20 66 72 6f 6d 20 70 6f  ion read from po
2e300 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74  slist */.    int
2e310 20 69 4f 66 66 20 3d 20 30 3b 20 20 20 20 20 20   iOff = 0;      
2e320 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2e330 65 74 20 77 69 74 68 69 6e 20 70 6f 73 6c 69 73  et within poslis
2e340 74 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 52 6f  t */.    i64 iRo
2e350 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  wid = fts5MultiI
2e360 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b  terRowid(pIter);
2e370 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28  .    char *z = (
2e380 63 68 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49  char*)fts5MultiI
2e390 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26  terTerm(pIter, &
2e3a0 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  n);..    /* If t
2e3b0 68 69 73 20 69 73 20 61 20 6e 65 77 20 74 65 72  his is a new ter
2e3c0 6d 2c 20 71 75 65 72 79 20 66 6f 72 20 69 74 2e  m, query for it.
2e3d0 20 55 70 64 61 74 65 20 63 6b 73 75 6d 33 20 77   Update cksum3 w
2e3e0 69 74 68 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ith the results.
2e3f0 20 2a 2f 0a 20 20 20 20 66 74 73 35 54 65 73 74   */.    fts5Test
2e400 54 65 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20 7a  Term(p, &term, z
2e410 2c 20 6e 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b  , n, cksum2, &ck
2e420 73 75 6d 33 29 3b 0a 0a 20 20 20 20 69 66 28 20  sum3);..    if( 
2e430 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
2e440 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  TAIL_NONE ){.   
2e450 20 20 20 69 66 28 20 30 3d 3d 66 74 73 35 4d 75     if( 0==fts5Mu
2e460 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70  ltiIterIsEmpty(p
2e470 2c 20 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20  , pIter) ){.    
2e480 20 20 20 20 63 6b 73 75 6d 32 20 5e 3d 20 73 71      cksum2 ^= sq
2e490 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e  lite3Fts5IndexEn
2e4a0 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c  tryCksum(iRowid,
2e4b0 20 30 2c 20 30 2c 20 2d 31 2c 20 7a 2c 20 6e 29   0, 0, -1, z, n)
2e4c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2e4d0 6c 73 65 7b 0a 20 20 20 20 20 20 70 6f 73 6c 69  lse{.      posli
2e4e0 73 74 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  st.n = 0;.      
2e4f0 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69  fts5SegiterPosli
2e500 73 74 28 70 2c 20 26 70 49 74 65 72 2d 3e 61 53  st(p, &pIter->aS
2e510 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74  eg[pIter->aFirst
2e520 5b 31 5d 2e 69 46 69 72 73 74 5d 2c 20 30 2c 20  [1].iFirst], 0, 
2e530 26 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20  &poslist);.     
2e540 20 77 68 69 6c 65 28 20 30 3d 3d 73 71 6c 69 74   while( 0==sqlit
2e550 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78  e3Fts5PoslistNex
2e560 74 36 34 28 70 6f 73 6c 69 73 74 2e 70 2c 20 70  t64(poslist.p, p
2e570 6f 73 6c 69 73 74 2e 6e 2c 20 26 69 4f 66 66 2c  oslist.n, &iOff,
2e580 20 26 69 50 6f 73 29 20 29 7b 0a 20 20 20 20 20   &iPos) ){.     
2e590 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54     int iCol = FT
2e5a0 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 69 50  S5_POS2COLUMN(iP
2e5b0 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  os);.        int
2e5c0 20 69 54 6f 6b 4f 66 66 20 3d 20 46 54 53 35 5f   iTokOff = FTS5_
2e5d0 50 4f 53 32 4f 46 46 53 45 54 28 69 50 6f 73 29  POS2OFFSET(iPos)
2e5e0 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32  ;.        cksum2
2e5f0 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49   ^= sqlite3Fts5I
2e600 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69  ndexEntryCksum(i
2e610 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 54 6f  Rowid, iCol, iTo
2e620 6b 4f 66 66 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b  kOff, -1, z, n);
2e630 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2e640 20 7d 0a 20 20 66 74 73 35 54 65 73 74 54 65 72   }.  fts5TestTer
2e650 6d 28 70 2c 20 26 74 65 72 6d 2c 20 30 2c 20 30  m(p, &term, 0, 0
2e660 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d  , cksum2, &cksum
2e670 33 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69  3);..  fts5Multi
2e680 49 74 65 72 46 72 65 65 28 70 49 74 65 72 29 3b  IterFree(pIter);
2e690 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
2e6a0 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d  LITE_OK && cksum
2e6b0 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63  !=cksum2 ) p->rc
2e6c0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2e6d0 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ..  fts5Structur
2e6e0 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
2e6f0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
2e700 5f 44 45 42 55 47 0a 20 20 66 74 73 35 42 75 66  _DEBUG.  fts5Buf
2e710 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a  ferFree(&term);.
2e720 23 65 6e 64 69 66 0a 20 20 66 74 73 35 42 75 66  #endif.  fts5Buf
2e730 66 65 72 46 72 65 65 28 26 70 6f 73 6c 69 73 74  ferFree(&poslist
2e740 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
2e750 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
2e760 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
2e770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e7a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2e7b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e7c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e7d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e7e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e7f0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f  ********.** Belo
2e800 77 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20  w this point is 
2e810 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
2e820 6f 6e 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64  on of the fts5_d
2e830 65 63 6f 64 65 28 29 20 73 63 61 6c 61 72 0a 2a  ecode() scalar.*
2e840 2a 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e  * function only.
2e850 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  .*/../*.** Decod
2e860 65 20 61 20 73 65 67 6d 65 6e 74 2d 64 61 74 61  e a segment-data
2e870 20 72 6f 77 69 64 20 66 72 6f 6d 20 74 68 65 20   rowid from the 
2e880 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54 68  %_data table. Th
2e890 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
2e8a0 2a 20 74 68 65 20 6f 70 70 6f 73 69 74 65 20 6f  * the opposite o
2e8b0 66 20 6d 61 63 72 6f 20 46 54 53 35 5f 53 45 47  f macro FTS5_SEG
2e8c0 4d 45 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f  MENT_ROWID()..*/
2e8d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
2e8e0 35 44 65 63 6f 64 65 52 6f 77 69 64 28 0a 20 20  5DecodeRowid(.  
2e8f0 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20  i64 iRowid,     
2e900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e910 2f 2a 20 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f  /* Rowid from %_
2e920 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20  data table */.  
2e930 69 6e 74 20 2a 70 69 53 65 67 69 64 2c 20 20 20  int *piSegid,   
2e940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e950 2f 2a 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74 20  /* OUT: Segment 
2e960 69 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44  id */.  int *pbD
2e970 6c 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  lidx,           
2e980 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2e990 44 6c 69 64 78 20 66 6c 61 67 20 2a 2f 0a 20 20  Dlidx flag */.  
2e9a0 69 6e 74 20 2a 70 69 48 65 69 67 68 74 2c 20 20  int *piHeight,  
2e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9c0 2f 2a 20 4f 55 54 3a 20 48 65 69 67 68 74 20 2a  /* OUT: Height *
2e9d0 2f 0a 20 20 69 6e 74 20 2a 70 69 50 67 6e 6f 20  /.  int *piPgno 
2e9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9f0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65      /* OUT: Page
2ea00 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
2ea10 2a 70 69 50 67 6e 6f 20 3d 20 28 69 6e 74 29 28  *piPgno = (int)(
2ea20 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29  iRowid & (((i64)
2ea30 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 50  1 << FTS5_DATA_P
2ea40 41 47 45 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20  AGE_B) - 1));.  
2ea50 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f  iRowid >>= FTS5_
2ea60 44 41 54 41 5f 50 41 47 45 5f 42 3b 0a 0a 20 20  DATA_PAGE_B;..  
2ea70 2a 70 69 48 65 69 67 68 74 20 3d 20 28 69 6e 74  *piHeight = (int
2ea80 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36  )(iRowid & (((i6
2ea90 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41  4)1 << FTS5_DATA
2eaa0 5f 48 45 49 47 48 54 5f 42 29 20 2d 20 31 29 29  _HEIGHT_B) - 1))
2eab0 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46  ;.  iRowid >>= F
2eac0 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f  TS5_DATA_HEIGHT_
2ead0 42 3b 0a 0a 20 20 2a 70 62 44 6c 69 64 78 20 3d  B;..  *pbDlidx =
2eae0 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20   (int)(iRowid & 
2eaf0 30 78 30 30 30 31 29 3b 0a 20 20 69 52 6f 77 69  0x0001);.  iRowi
2eb00 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f  d >>= FTS5_DATA_
2eb10 44 4c 49 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67  DLI_B;..  *piSeg
2eb20 69 64 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69  id = (int)(iRowi
2eb30 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20  d & (((i64)1 << 
2eb40 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 20  FTS5_DATA_ID_B) 
2eb50 2d 20 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  - 1));.}..static
2eb60 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67 52   void fts5DebugR
2eb70 6f 77 69 64 28 69 6e 74 20 2a 70 52 63 2c 20 46  owid(int *pRc, F
2eb80 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
2eb90 20 69 36 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e   i64 iKey){.  in
2eba0 74 20 69 53 65 67 69 64 2c 20 69 48 65 69 67 68  t iSegid, iHeigh
2ebb0 74 2c 20 69 50 67 6e 6f 2c 20 62 44 6c 69 64 78  t, iPgno, bDlidx
2ebc0 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64  ;       /* Rowid
2ebd0 20 63 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a 20   compenents */. 
2ebe0 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64   fts5DecodeRowid
2ebf0 28 69 4b 65 79 2c 20 26 69 53 65 67 69 64 2c 20  (iKey, &iSegid, 
2ec00 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69 67 68  &bDlidx, &iHeigh
2ec10 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69  t, &iPgno);..  i
2ec20 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a  f( iSegid==0 ){.
2ec30 20 20 20 20 69 66 28 20 69 4b 65 79 3d 3d 46 54      if( iKey==FT
2ec40 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49  S5_AVERAGES_ROWI
2ec50 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D ){.      sqlit
2ec60 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2ec70 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2ec80 75 66 2c 20 22 7b 61 76 65 72 61 67 65 73 7d 20  uf, "{averages} 
2ec90 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
2eca0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
2ecb0 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2ecc0 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b  tf(pRc, pBuf, "{
2ecd0 73 74 72 75 63 74 75 72 65 7d 22 29 3b 0a 20 20  structure}");.  
2ece0 20 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 7b 0a    }.  }.  else{.
2ecf0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2ed00 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2ed10 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 25  f(pRc, pBuf, "{%
2ed20 73 73 65 67 69 64 3d 25 64 20 68 3d 25 64 20 70  ssegid=%d h=%d p
2ed30 67 6e 6f 3d 25 64 7d 22 2c 0a 20 20 20 20 20 20  gno=%d}",.      
2ed40 20 20 62 44 6c 69 64 78 20 3f 20 22 64 6c 69 64    bDlidx ? "dlid
2ed50 78 20 22 20 3a 20 22 22 2c 20 69 53 65 67 69 64  x " : "", iSegid
2ed60 2c 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e 6f  , iHeight, iPgno
2ed70 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  .    );.  }.}..s
2ed80 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
2ed90 65 62 75 67 53 74 72 75 63 74 75 72 65 28 0a 20  ebugStructure(. 
2eda0 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
2edb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2edc0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f   /* IN/OUT: erro
2edd0 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  r code */.  Fts5
2ede0 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20  Buffer *pBuf,.  
2edf0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
2ee00 0a 29 7b 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20  .){.  int iLvl, 
2ee10 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  iSeg;           
2ee20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65        /* Iterate
2ee30 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 2c   through levels,
2ee40 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20   segments */..  
2ee50 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
2ee60 3c 70 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  <p->nLevel; iLvl
2ee70 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  ++){.    Fts5Str
2ee80 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
2ee90 6c 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 69  l = &p->aLevel[i
2eea0 4c 76 6c 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  Lvl];.    sqlite
2eeb0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2eec0 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2eed0 66 2c 20 0a 20 20 20 20 20 20 20 20 22 20 7b 6c  f, .        " {l
2eee0 76 6c 3d 25 64 20 6e 4d 65 72 67 65 3d 25 64 20  vl=%d nMerge=%d 
2eef0 6e 53 65 67 3d 25 64 22 2c 20 69 4c 76 6c 2c 20  nSeg=%d", iLvl, 
2ef00 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 2c 20 70 4c  pLvl->nMerge, pL
2ef10 76 6c 2d 3e 6e 53 65 67 0a 20 20 20 20 29 3b 0a  vl->nSeg.    );.
2ef20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
2ef30 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b  iSeg<pLvl->nSeg;
2ef40 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
2ef50 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
2ef60 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c  ment *pSeg = &pL
2ef70 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a  vl->aSeg[iSeg];.
2ef80 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
2ef90 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2efa0 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
2efb0 20 7b 69 64 3d 25 64 20 6c 65 61 76 65 73 3d 25   {id=%d leaves=%
2efc0 64 2e 2e 25 64 7d 22 2c 20 0a 20 20 20 20 20 20  d..%d}", .      
2efd0 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64      pSeg->iSegid
2efe0 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  , pSeg->pgnoFirs
2eff0 74 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  t, pSeg->pgnoLas
2f000 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  t.      );.    }
2f010 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
2f020 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2f030 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7d  tf(pRc, pBuf, "}
2f040 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
2f050 20 54 68 69 73 20 69 73 20 70 61 72 74 20 6f 66   This is part of
2f060 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65   the fts5_decode
2f070 28 29 20 64 65 62 75 67 67 69 6e 67 20 61 69 64  () debugging aid
2f080 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
2f090 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f  s pBlob/nBlob co
2f0a0 6e 74 61 69 6e 20 61 20 73 65 72 69 61 6c 69 7a  ntain a serializ
2f0b0 65 64 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ed Fts5Structure
2f0c0 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a   object. This.**
2f0d0 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
2f0e0 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  s a human-readab
2f0f0 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
2f100 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6f 62  n of the same ob
2f110 6a 65 63 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62  ject.** to the b
2f120 75 66 66 65 72 20 70 61 73 73 65 64 20 61 73 20  uffer passed as 
2f130 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
2f140 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ent. .*/.static 
2f150 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 53  void fts5DecodeS
2f160 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20  tructure(.  int 
2f170 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20  *pRc,           
2f180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2f190 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64  N/OUT: error cod
2f1a0 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  e */.  Fts5Buffe
2f1b0 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74  r *pBuf,.  const
2f1c0 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20   u8 *pBlob, int 
2f1d0 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72  nBlob.){.  int r
2f1e0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2f1f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2f200 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46  turn code */.  F
2f210 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 20  ts5Structure *p 
2f220 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
2f230 2a 20 44 65 63 6f 64 65 64 20 73 74 72 75 63 74  * Decoded struct
2f240 75 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20  ure object */.. 
2f250 20 72 63 20 3d 20 66 74 73 35 53 74 72 75 63 74   rc = fts5Struct
2f260 75 72 65 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c  ureDecode(pBlob,
2f270 20 6e 42 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a   nBlob, 0, &p);.
2f280 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f290 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20  _OK ){.    *pRc 
2f2a0 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
2f2b0 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 65 62  ;.  }..  fts5Deb
2f2c0 75 67 53 74 72 75 63 74 75 72 65 28 70 52 63 2c  ugStructure(pRc,
2f2d0 20 70 42 75 66 2c 20 70 29 3b 0a 20 20 66 74 73   pBuf, p);.  fts
2f2e0 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
2f2f0 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  e(p);.}../*.** T
2f300 68 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 74  his is part of t
2f310 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29  he fts5_decode()
2f320 20 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a   debugging aid..
2f330 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20  **.** Arguments 
2f340 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74  pBlob/nBlob cont
2f350 61 69 6e 20 61 6e 20 22 61 76 65 72 61 67 65 73  ain an "averages
2f360 22 20 72 65 63 6f 72 64 2e 20 54 68 69 73 20 66  " record. This f
2f370 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 70 70 65  unction .** appe
2f380 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64  nds a human-read
2f390 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74  able representat
2f3a0 69 6f 6e 20 6f 66 20 72 65 63 6f 72 64 20 74 6f  ion of record to
2f3b0 20 74 68 65 20 62 75 66 66 65 72 20 70 61 73 73   the buffer pass
2f3c0 65 64 20 0a 2a 2a 20 61 73 20 74 68 65 20 73 65  ed .** as the se
2f3d0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a  cond argument. .
2f3e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2f3f0 74 73 35 44 65 63 6f 64 65 41 76 65 72 61 67 65  ts5DecodeAverage
2f400 73 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20  s(.  int *pRc,  
2f410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f420 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
2f430 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
2f440 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
2f450 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42  ,.  const u8 *pB
2f460 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29  lob, int nBlob.)
2f470 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  {.  int i = 0;. 
2f480 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70   const char *zSp
2f490 61 63 65 20 3d 20 22 22 3b 0a 0a 20 20 77 68 69  ace = "";..  whi
2f4a0 6c 65 28 20 69 3c 6e 42 6c 6f 62 20 29 7b 0a 20  le( i<nBlob ){. 
2f4b0 20 20 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20     u64 iVal;.   
2f4c0 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73   i += sqlite3Fts
2f4d0 35 47 65 74 56 61 72 69 6e 74 28 26 70 42 6c 6f  5GetVarint(&pBlo
2f4e0 62 5b 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20  b[i], &iVal);.  
2f4f0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2f500 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2f510 70 52 63 2c 20 70 42 75 66 2c 20 22 25 73 25 64  pRc, pBuf, "%s%d
2f520 22 2c 20 7a 53 70 61 63 65 2c 20 28 69 6e 74 29  ", zSpace, (int)
2f530 69 56 61 6c 29 3b 0a 20 20 20 20 7a 53 70 61 63  iVal);.    zSpac
2f540 65 20 3d 20 22 20 22 3b 0a 20 20 7d 0a 7d 0a 0a  e = " ";.  }.}..
2f550 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28 61 2f  /*.** Buffer (a/
2f560 6e 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  n) is assumed to
2f570 20 63 6f 6e 74 61 69 6e 20 61 20 6c 69 73 74 20   contain a list 
2f580 6f 66 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61  of serialized va
2f590 72 69 6e 74 73 2e 20 52 65 61 64 0a 2a 2a 20 65  rints. Read.** e
2f5a0 61 63 68 20 76 61 72 69 6e 74 20 61 6e 64 20 61  ach varint and a
2f5b0 70 70 65 6e 64 20 69 74 73 20 73 74 72 69 6e 67  ppend its string
2f5c0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2f5d0 74 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 20  to buffer pBuf. 
2f5e0 52 65 74 75 72 6e 0a 2a 2a 20 61 66 74 65 72 20  Return.** after 
2f5f0 65 69 74 68 65 72 20 74 68 65 20 69 6e 70 75 74  either the input
2f600 20 62 75 66 66 65 72 20 69 73 20 65 78 68 61 75   buffer is exhau
2f610 73 74 65 64 20 6f 72 20 61 20 30 20 76 61 6c 75  sted or a 0 valu
2f620 65 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  e is read..**.**
2f630 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
2f640 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
2f650 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72  of bytes read fr
2f660 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66  om the input buf
2f670 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  fer..*/.static i
2f680 6e 74 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73  nt fts5DecodePos
2f690 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46  list(int *pRc, F
2f6a0 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
2f6b0 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e   const u8 *a, in
2f6c0 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66  t n){.  int iOff
2f6d0 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69   = 0;.  while( i
2f6e0 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74  Off<n ){.    int
2f6f0 20 69 56 61 6c 3b 0a 20 20 20 20 69 4f 66 66 20   iVal;.    iOff 
2f700 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
2f710 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 69 56 61  32(&a[iOff], iVa
2f720 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  l);.    sqlite3F
2f730 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2f740 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2f750 20 22 20 25 64 22 2c 20 69 56 61 6c 29 3b 0a 20   " %d", iVal);. 
2f760 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66   }.  return iOff
2f770 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
2f780 74 61 72 74 20 6f 66 20 62 75 66 66 65 72 20 28  tart of buffer (
2f790 61 2f 6e 29 20 63 6f 6e 74 61 69 6e 73 20 74 68  a/n) contains th
2f7a0 65 20 73 74 61 72 74 20 6f 66 20 61 20 64 6f 63  e start of a doc
2f7b0 6c 69 73 74 2e 20 54 68 65 20 64 6f 63 6c 69 73  list. The doclis
2f7c0 74 0a 2a 2a 20 6d 61 79 20 6f 72 20 6d 61 79 20  t.** may or may 
2f7d0 6e 6f 74 20 66 69 6e 69 73 68 20 77 69 74 68 69  not finish withi
2f7e0 6e 20 74 68 65 20 62 75 66 66 65 72 2e 20 54 68  n the buffer. Th
2f7f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65  is function appe
2f800 6e 64 73 20 61 20 74 65 78 74 0a 2a 2a 20 72 65  nds a text.** re
2f810 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
2f820 74 68 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  the part of the 
2f830 64 6f 63 6c 69 73 74 20 74 68 61 74 20 69 73 20  doclist that is 
2f840 70 72 65 73 65 6e 74 20 74 6f 20 62 75 66 66 65  present to buffe
2f850 72 0a 2a 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a  r.** pBuf. .**.*
2f860 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
2f870 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ue is the number
2f880 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 66   of bytes read f
2f890 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75  rom the input bu
2f8a0 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ffer..*/.static 
2f8b0 69 6e 74 20 66 74 73 35 44 65 63 6f 64 65 44 6f  int fts5DecodeDo
2f8c0 63 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20  clist(int *pRc, 
2f8d0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
2f8e0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69  , const u8 *a, i
2f8f0 6e 74 20 6e 29 7b 0a 20 20 69 36 34 20 69 44 6f  nt n){.  i64 iDo
2f900 63 69 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  cid = 0;.  int i
2f910 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Off = 0;..  if( 
2f920 6e 3e 30 20 29 7b 0a 20 20 20 20 69 4f 66 66 20  n>0 ){.    iOff 
2f930 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  = sqlite3Fts5Get
2f940 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29  Varint(a, (u64*)
2f950 26 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 73 71  &iDocid);.    sq
2f960 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2f970 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
2f980 20 70 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64   pBuf, " id=%lld
2f990 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a  ", iDocid);.  }.
2f9a0 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20    while( iOff<n 
2f9b0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b  ){.    int nPos;
2f9c0 0a 20 20 20 20 69 6e 74 20 62 44 65 6c 3b 0a 20  .    int bDel;. 
2f9d0 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
2f9e0 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61  etPoslistSize(&a
2f9f0 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26  [iOff], &nPos, &
2fa00 62 44 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  bDel);.    sqlit
2fa10 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2fa20 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2fa30 75 66 2c 20 22 20 6e 50 6f 73 3d 25 64 25 73 22  uf, " nPos=%d%s"
2fa40 2c 20 6e 50 6f 73 2c 20 62 44 65 6c 3f 22 2a 22  , nPos, bDel?"*"
2fa50 3a 22 22 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b  :"");.    iOff +
2fa60 3d 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c  = fts5DecodePosl
2fa70 69 73 74 28 70 52 63 2c 20 70 42 75 66 2c 20 26  ist(pRc, pBuf, &
2fa80 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69  a[iOff], MIN(n-i
2fa90 4f 66 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20  Off, nPos));.   
2faa0 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20   if( iOff<n ){. 
2fab0 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b       i64 iDelta;
2fac0 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73  .      iOff += s
2fad0 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
2fae0 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75  int(&a[iOff], (u
2faf0 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
2fb00 20 20 20 20 69 44 6f 63 69 64 20 2b 3d 20 69 44      iDocid += iD
2fb10 65 6c 74 61 3b 0a 20 20 20 20 20 20 73 71 6c 69  elta;.      sqli
2fb20 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2fb30 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2fb40 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c  Buf, " id=%lld",
2fb50 20 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d 0a   iDocid);.    }.
2fb60 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 4f    }..  return iO
2fb70 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ff;.}../*.** Thi
2fb80 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 61  s function is pa
2fb90 72 74 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64  rt of the fts5_d
2fba0 65 63 6f 64 65 28 29 20 64 65 62 75 67 67 69 6e  ecode() debuggin
2fbb0 67 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69  g function. It i
2fbc0 73 20 0a 2a 2a 20 6f 6e 6c 79 20 65 76 65 72 20  s .** only ever 
2fbd0 75 73 65 64 20 77 69 74 68 20 64 65 74 61 69 6c  used with detail
2fbe0 3d 6e 6f 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2a  =none tables..**
2fbf0 0a 2a 2a 20 42 75 66 66 65 72 20 28 70 44 61 74  .** Buffer (pDat
2fc00 61 2f 6e 44 61 74 61 29 20 63 6f 6e 74 61 69 6e  a/nData) contain
2fc10 73 20 61 20 64 6f 63 6c 69 73 74 20 69 6e 20 74  s a doclist in t
2fc20 68 65 20 66 6f 72 6d 61 74 20 75 73 65 64 20 62  he format used b
2fc30 79 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 0a 2a 2a  y detail=none.**
2fc40 20 74 61 62 6c 65 73 2e 20 54 68 69 73 20 66 75   tables. This fu
2fc50 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61  nction appends a
2fc60 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
2fc70 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 61 74 20  version of that 
2fc80 6c 69 73 74 20 74 6f 0a 2a 2a 20 62 75 66 66 65  list to.** buffe
2fc90 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 49 66  r pBuf..**.** If
2fca0 20 2a 70 52 63 20 69 73 20 6f 74 68 65 72 20 74   *pRc is other t
2fcb0 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68  han SQLITE_OK wh
2fcc0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2fcd0 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
2fce0 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 49 66  s a.** no-op. If
2fcf0 20 61 6e 20 4f 4f 4d 20 6f 72 20 6f 74 68 65 72   an OOM or other
2fd00 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
2fd10 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
2fd20 6f 6e 2c 20 2a 70 52 63 20 69 73 0a 2a 2a 20 73  on, *pRc is.** s
2fd30 65 74 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20  et to an SQLite 
2fd40 65 72 72 6f 72 20 63 6f 64 65 20 62 65 66 6f 72  error code befor
2fd50 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 54 68 65  e returning. The
2fd60 20 66 69 6e 61 6c 20 73 74 61 74 65 20 6f 66 20   final state of 
2fd70 62 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 20 69  buffer.** pBuf i
2fd80 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  s undefined in t
2fd90 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61  his case..*/.sta
2fda0 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63  tic void fts5Dec
2fdb0 6f 64 65 52 6f 77 69 64 4c 69 73 74 28 0a 20 20  odeRowidList(.  
2fdc0 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20  int *pRc,       
2fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fde0 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72  /* IN/OUT: Error
2fdf0 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42   code */.  Fts5B
2fe00 75 66 66 65 72 20 2a 70 42 75 66 2c 20 20 20 20  uffer *pBuf,    
2fe10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
2fe20 66 66 65 72 20 74 6f 20 61 70 70 65 6e 64 20 74  ffer to append t
2fe30 65 78 74 20 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73  ext to */.  cons
2fe40 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74  t u8 *pData, int
2fe50 20 6e 44 61 74 61 20 20 20 20 20 20 2f 2a 20 44   nData      /* D
2fe60 61 74 61 20 74 6f 20 64 65 63 6f 64 65 20 6c 69  ata to decode li
2fe70 73 74 2d 6f 66 2d 72 6f 77 69 64 73 20 66 72 6f  st-of-rowids fro
2fe80 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 20  m */.){.  int i 
2fe90 3d 20 30 3b 0a 20 20 69 36 34 20 69 52 6f 77 69  = 0;.  i64 iRowi
2fea0 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28  d = 0;..  while(
2feb0 20 69 3c 6e 44 61 74 61 20 29 7b 0a 20 20 20 20   i<nData ){.    
2fec0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 70 70  const char *zApp
2fed0 20 3d 20 22 22 3b 0a 20 20 20 20 75 36 34 20 69   = "";.    u64 i
2fee0 56 61 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71  Val;.    i += sq
2fef0 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
2ff00 6e 74 28 26 70 44 61 74 61 5b 69 5d 2c 20 26 69  nt(&pData[i], &i
2ff10 56 61 6c 29 3b 0a 20 20 20 20 69 52 6f 77 69 64  Val);.    iRowid
2ff20 20 2b 3d 20 69 56 61 6c 3b 0a 0a 20 20 20 20 69   += iVal;..    i
2ff30 66 28 20 69 3c 6e 44 61 74 61 20 26 26 20 70 44  f( i<nData && pD
2ff40 61 74 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b 0a  ata[i]==0x00 ){.
2ff50 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
2ff60 20 69 66 28 20 69 3c 6e 44 61 74 61 20 26 26 20   if( i<nData && 
2ff70 70 44 61 74 61 5b 69 5d 3d 3d 30 78 30 30 20 29  pData[i]==0x00 )
2ff80 7b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20  {.        i++;. 
2ff90 20 20 20 20 20 20 20 7a 41 70 70 20 3d 20 22 2b         zApp = "+
2ffa0 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
2ffb0 20 20 20 20 20 20 20 20 7a 41 70 70 20 3d 20 22          zApp = "
2ffc0 2a 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  *";.      }.    
2ffd0 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  }..    sqlite3Ft
2ffe0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2fff0 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
30000 22 20 25 6c 6c 64 25 73 22 2c 20 69 52 6f 77 69  " %lld%s", iRowi
30010 64 2c 20 7a 41 70 70 29 3b 0a 20 20 7d 0a 7d 0a  d, zApp);.  }.}.
30020 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  ./*.** The imple
30030 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65  mentation of use
30040 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72  r-defined scalar
30050 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 64   function fts5_d
30060 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  ecode()..*/.stat
30070 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f  ic void fts5Deco
30080 64 65 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  deFunction(.  sq
30090 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
300a0 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Ctx,          /*
300b0 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63   Function call c
300c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
300d0 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  nArg,           
300e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
300f0 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 28 61  umber of args (a
30100 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20 73 71  lways 2) */.  sq
30110 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
30120 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Val           /*
30130 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   Function argume
30140 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  nts */.){.  i64 
30150 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  iRowid;         
30160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
30170 6f 77 69 64 20 66 6f 72 20 72 65 63 6f 72 64 20  owid for record 
30180 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f  being decoded */
30190 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 69 48  .  int iSegid,iH
301a0 65 69 67 68 74 2c 69 50 67 6e 6f 2c 62 44 6c 69  eight,iPgno,bDli
301b0 64 78 3b 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70  dx;/* Rowid comp
301c0 6f 6e 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  onents */.  cons
301d0 74 20 75 38 20 2a 61 42 6c 6f 62 3b 20 69 6e 74  t u8 *aBlob; int
301e0 20 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   n;         /* R
301f0 65 63 6f 72 64 20 74 6f 20 64 65 63 6f 64 65 20  ecord to decode 
30200 2a 2f 0a 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a  */.  u8 *a = 0;.
30210 20 20 46 74 73 35 42 75 66 66 65 72 20 73 3b 20    Fts5Buffer s; 
30220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30230 20 20 2f 2a 20 42 75 69 6c 64 20 75 70 20 74 65    /* Build up te
30240 78 74 20 74 6f 20 72 65 74 75 72 6e 20 68 65 72  xt to return her
30250 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
30260 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
30270 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
30280 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
30290 65 33 5f 69 6e 74 36 34 20 6e 53 70 61 63 65 20  e3_int64 nSpace 
302a0 3d 20 30 3b 0a 20 20 69 6e 74 20 65 44 65 74 61  = 0;.  int eDeta
302b0 69 6c 4e 6f 6e 65 20 3d 20 28 73 71 6c 69 74 65  ilNone = (sqlite
302c0 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78  3_user_data(pCtx
302d0 29 21 3d 30 29 3b 0a 0a 20 20 61 73 73 65 72 74  )!=0);..  assert
302e0 28 20 6e 41 72 67 3d 3d 32 20 29 3b 0a 20 20 55  ( nArg==2 );.  U
302f0 4e 55 53 45 44 5f 50 41 52 41 4d 28 6e 41 72 67  NUSED_PARAM(nArg
30300 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20  );.  memset(&s, 
30310 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  0, sizeof(Fts5Bu
30320 66 66 65 72 29 29 3b 0a 20 20 69 52 6f 77 69 64  ffer));.  iRowid
30330 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
30340 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b 30 5d 29  _int64(apVal[0])
30350 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63  ;..  /* Make a c
30360 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  opy of the secon
30370 64 20 61 72 67 75 6d 65 6e 74 20 28 61 20 62 6c  d argument (a bl
30380 6f 62 29 20 69 6e 20 61 42 6c 6f 62 5b 5d 2e 20  ob) in aBlob[]. 
30390 54 68 65 20 61 42 6c 6f 62 5b 5d 0a 20 20 2a 2a  The aBlob[].  **
303a0 20 63 6f 70 79 20 69 73 20 66 6f 6c 6c 6f 77 65   copy is followe
303b0 64 20 62 79 20 46 54 53 35 5f 44 41 54 41 5f 5a  d by FTS5_DATA_Z
303c0 45 52 4f 5f 50 41 44 44 49 4e 47 20 30 78 30 30  ERO_PADDING 0x00
303d0 20 62 79 74 65 73 2c 20 77 68 69 63 68 20 70 72   bytes, which pr
303e0 65 76 65 6e 74 73 0a 20 20 2a 2a 20 62 75 66 66  events.  ** buff
303f0 65 72 20 6f 76 65 72 72 65 61 64 73 20 65 76 65  er overreads eve
30400 6e 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 20  n if the record 
30410 69 73 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a  is corrupt.  */.
30420 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    n = sqlite3_va
30430 6c 75 65 5f 62 79 74 65 73 28 61 70 56 61 6c 5b  lue_bytes(apVal[
30440 31 5d 29 3b 0a 20 20 61 42 6c 6f 62 20 3d 20 73  1]);.  aBlob = s
30450 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
30460 62 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 6e  b(apVal[1]);.  n
30470 53 70 61 63 65 20 3d 20 6e 20 2b 20 46 54 53 35  Space = n + FTS5
30480 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49  _DATA_ZERO_PADDI
30490 4e 47 3b 0a 20 20 61 20 3d 20 28 75 38 2a 29 73  NG;.  a = (u8*)s
304a0 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
304b0 5a 65 72 6f 28 26 72 63 2c 20 6e 53 70 61 63 65  Zero(&rc, nSpace
304c0 29 3b 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 20  );.  if( a==0 ) 
304d0 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b  goto decode_out;
304e0 0a 20 20 69 66 28 20 6e 3e 30 20 29 20 6d 65 6d  .  if( n>0 ) mem
304f0 63 70 79 28 61 2c 20 61 42 6c 6f 62 2c 20 6e 29  cpy(a, aBlob, n)
30500 3b 0a 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52  ;..  fts5DecodeR
30510 6f 77 69 64 28 69 52 6f 77 69 64 2c 20 26 69 53  owid(iRowid, &iS
30520 65 67 69 64 2c 20 26 62 44 6c 69 64 78 2c 20 26  egid, &bDlidx, &
30530 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29  iHeight, &iPgno)
30540 3b 0a 0a 20 20 66 74 73 35 44 65 62 75 67 52 6f  ;..  fts5DebugRo
30550 77 69 64 28 26 72 63 2c 20 26 73 2c 20 69 52 6f  wid(&rc, &s, iRo
30560 77 69 64 29 3b 0a 20 20 69 66 28 20 62 44 6c 69  wid);.  if( bDli
30570 64 78 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61  dx ){.    Fts5Da
30580 74 61 20 64 6c 69 64 78 3b 0a 20 20 20 20 46 74  ta dlidx;.    Ft
30590 73 35 44 6c 69 64 78 4c 76 6c 20 6c 76 6c 3b 0a  s5DlidxLvl lvl;.
305a0 0a 20 20 20 20 64 6c 69 64 78 2e 70 20 3d 20 61  .    dlidx.p = a
305b0 3b 0a 20 20 20 20 64 6c 69 64 78 2e 6e 6e 20 3d  ;.    dlidx.nn =
305c0 20 6e 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28   n;..    memset(
305d0 26 6c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &lvl, 0, sizeof(
305e0 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a  Fts5DlidxLvl));.
305f0 20 20 20 20 6c 76 6c 2e 70 44 61 74 61 20 3d 20      lvl.pData = 
30600 26 64 6c 69 64 78 3b 0a 20 20 20 20 6c 76 6c 2e  &dlidx;.    lvl.
30610 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 6e  iLeafPgno = iPgn
30620 6f 3b 0a 0a 20 20 20 20 66 6f 72 28 66 74 73 35  o;..    for(fts5
30630 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c 76  DlidxLvlNext(&lv
30640 6c 29 3b 20 6c 76 6c 2e 62 45 6f 66 3d 3d 30 3b  l); lvl.bEof==0;
30650 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78   fts5DlidxLvlNex
30660 74 28 26 6c 76 6c 29 29 7b 0a 20 20 20 20 20 20  t(&lvl)){.      
30670 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
30680 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72  rAppendPrintf(&r
30690 63 2c 20 26 73 2c 20 0a 20 20 20 20 20 20 20 20  c, &s, .        
306a0 20 20 22 20 25 64 28 25 6c 6c 64 29 22 2c 20 6c    " %d(%lld)", l
306b0 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 2c 20 6c 76  vl.iLeafPgno, lv
306c0 6c 2e 69 52 6f 77 69 64 0a 20 20 20 20 20 20 29  l.iRowid.      )
306d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
306e0 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b  if( iSegid==0 ){
306f0 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 3d  .    if( iRowid=
30700 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52  =FTS5_AVERAGES_R
30710 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 66 74  OWID ){.      ft
30720 73 35 44 65 63 6f 64 65 41 76 65 72 61 67 65 73  s5DecodeAverages
30730 28 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b  (&rc, &s, a, n);
30740 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30750 20 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75    fts5DecodeStru
30760 63 74 75 72 65 28 26 72 63 2c 20 26 73 2c 20 61  cture(&rc, &s, a
30770 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , n);.    }.  }e
30780 6c 73 65 20 69 66 28 20 65 44 65 74 61 69 6c 4e  lse if( eDetailN
30790 6f 6e 65 20 29 7b 0a 20 20 20 20 46 74 73 35 42  one ){.    Fts5B
307a0 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20  uffer term;     
307b0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
307c0 65 6e 74 20 74 65 72 6d 20 72 65 61 64 20 66 72  ent term read fr
307d0 6f 6d 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69  om page */.    i
307e0 6e 74 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 69  nt szLeaf;.    i
307f0 6e 74 20 69 50 67 69 64 78 4f 66 66 20 3d 20 73  nt iPgidxOff = s
30800 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74 55  zLeaf = fts5GetU
30810 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20 69  16(&a[2]);.    i
30820 6e 74 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20  nt iTermOff;.   
30830 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a   int nKeep = 0;.
30840 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20      int iOff;.. 
30850 20 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c     memset(&term,
30860 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42   0, sizeof(Fts5B
30870 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 2f 2a  uffer));..    /*
30880 20 44 65 63 6f 64 65 20 61 6e 79 20 65 6e 74 72   Decode any entr
30890 69 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 62  ies that occur b
308a0 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
308b0 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 69 66 28  term. */.    if(
308c0 20 73 7a 4c 65 61 66 3c 6e 20 29 7b 0a 20 20 20   szLeaf<n ){.   
308d0 20 20 20 69 50 67 69 64 78 4f 66 66 20 2b 3d 20     iPgidxOff += 
308e0 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
308f0 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 69  &a[iPgidxOff], i
30900 54 65 72 6d 4f 66 66 29 3b 0a 20 20 20 20 7d 65  TermOff);.    }e
30910 6c 73 65 7b 0a 20 20 20 20 20 20 69 54 65 72 6d  lse{.      iTerm
30920 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20  Off = szLeaf;.  
30930 20 20 7d 0a 20 20 20 20 66 74 73 35 44 65 63 6f    }.    fts5Deco
30940 64 65 52 6f 77 69 64 4c 69 73 74 28 26 72 63 2c  deRowidList(&rc,
30950 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69 54 65 72   &s, &a[4], iTer
30960 6d 4f 66 66 2d 34 29 3b 0a 0a 20 20 20 20 69 4f  mOff-4);..    iO
30970 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20  ff = iTermOff;. 
30980 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 73     while( iOff<s
30990 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69  zLeaf ){.      i
309a0 6e 74 20 6e 41 70 70 65 6e 64 3b 0a 0a 20 20 20  nt nAppend;..   
309b0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 74     /* Read the t
309c0 65 72 6d 20 64 61 74 61 20 66 6f 72 20 74 68 65  erm data for the
309d0 20 6e 65 78 74 20 74 65 72 6d 2a 2f 0a 20 20 20   next term*/.   
309e0 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
309f0 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
30a00 66 66 5d 2c 20 6e 41 70 70 65 6e 64 29 3b 0a 20  ff], nAppend);. 
30a10 20 20 20 20 20 74 65 72 6d 2e 6e 20 3d 20 6e 4b       term.n = nK
30a20 65 65 70 3b 0a 20 20 20 20 20 20 66 74 73 35 42  eep;.      fts5B
30a30 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
30a40 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 41 70 70  &rc, &term, nApp
30a50 65 6e 64 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a  end, &a[iOff]);.
30a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
30a70 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
30a80 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 26  ntf(.          &
30a90 72 63 2c 20 26 73 2c 20 22 20 74 65 72 6d 3d 25  rc, &s, " term=%
30aa0 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c 20 28 63  .*s", term.n, (c
30ab0 6f 6e 73 74 20 63 68 61 72 2a 29 74 65 72 6d 2e  onst char*)term.
30ac0 70 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  p.      );.     
30ad0 20 69 4f 66 66 20 2b 3d 20 6e 41 70 70 65 6e 64   iOff += nAppend
30ae0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75  ;..      /* Figu
30af0 72 65 20 6f 75 74 20 77 68 65 72 65 20 74 68 65  re out where the
30b00 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 69   doclist for thi
30b10 73 20 74 65 72 6d 20 65 6e 64 73 20 2a 2f 0a 20  s term ends */. 
30b20 20 20 20 20 20 69 66 28 20 69 50 67 69 64 78 4f       if( iPgidxO
30b30 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  ff<n ){.        
30b40 69 6e 74 20 6e 49 6e 63 72 3b 0a 20 20 20 20 20  int nIncr;.     
30b50 20 20 20 69 50 67 69 64 78 4f 66 66 20 2b 3d 20     iPgidxOff += 
30b60 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
30b70 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e  &a[iPgidxOff], n
30b80 49 6e 63 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Incr);.        i
30b90 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 49 6e 63 72  TermOff += nIncr
30ba0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
30bb0 20 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20         iTermOff 
30bc0 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20  = szLeaf;.      
30bd0 7d 0a 0a 20 20 20 20 20 20 66 74 73 35 44 65 63  }..      fts5Dec
30be0 6f 64 65 52 6f 77 69 64 4c 69 73 74 28 26 72 63  odeRowidList(&rc
30bf0 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20  , &s, &a[iOff], 
30c00 69 54 65 72 6d 4f 66 66 2d 69 4f 66 66 29 3b 0a  iTermOff-iOff);.
30c10 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65        iOff = iTe
30c20 72 6d 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28  rmOff;.      if(
30c30 20 69 4f 66 66 3c 73 7a 4c 65 61 66 20 29 7b 0a   iOff<szLeaf ){.
30c40 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
30c50 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
30c60 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29  &a[iOff], nKeep)
30c70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
30c80 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
30c90 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 7d 65  ree(&term);.  }e
30ca0 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 42 75 66  lse{.    Fts5Buf
30cb0 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20  fer term;       
30cc0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
30cd0 74 20 74 65 72 6d 20 72 65 61 64 20 66 72 6f 6d  t term read from
30ce0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74   page */.    int
30cf0 20 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20 20   szLeaf;        
30d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
30d10 66 73 65 74 20 6f 66 20 70 67 69 64 78 20 69 6e  fset of pgidx in
30d20 20 61 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20   a[] */.    int 
30d30 69 50 67 69 64 78 4f 66 66 3b 0a 20 20 20 20 69  iPgidxOff;.    i
30d40 6e 74 20 69 50 67 69 64 78 50 72 65 76 20 3d 20  nt iPgidxPrev = 
30d50 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
30d60 50 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20 72  Previous value r
30d70 65 61 64 20 66 72 6f 6d 20 70 67 69 64 78 20 2a  ead from pgidx *
30d80 2f 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d 4f  /.    int iTermO
30d90 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ff = 0;.    int 
30da0 69 52 6f 77 69 64 4f 66 66 20 3d 20 30 3b 0a 20  iRowidOff = 0;. 
30db0 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20     int iOff;.   
30dc0 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a   int nDoclist;..
30dd0 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d      memset(&term
30de0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
30df0 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 69  Buffer));..    i
30e00 66 28 20 6e 3c 34 20 29 7b 0a 20 20 20 20 20 20  f( n<4 ){.      
30e10 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
30e20 72 53 65 74 28 26 72 63 2c 20 26 73 2c 20 37 2c  rSet(&rc, &s, 7,
30e30 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 63 6f 72   (const u8*)"cor
30e40 72 75 70 74 22 29 3b 0a 20 20 20 20 20 20 67 6f  rupt");.      go
30e50 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20  to decode_out;. 
30e60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30e70 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35  iRowidOff = fts5
30e80 47 65 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20  GetU16(&a[0]);. 
30e90 20 20 20 20 20 69 50 67 69 64 78 4f 66 66 20 3d       iPgidxOff =
30ea0 20 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65   szLeaf = fts5Ge
30eb0 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20  tU16(&a[2]);.   
30ec0 20 20 20 69 66 28 20 69 50 67 69 64 78 4f 66 66     if( iPgidxOff
30ed0 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  <n ){.        ft
30ee0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
30ef0 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 69 54 65  [iPgidxOff], iTe
30f00 72 6d 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a  rmOff);.      }.
30f10 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
30f20 63 6f 64 65 20 74 68 65 20 70 6f 73 69 74 69 6f  code the positio
30f30 6e 20 6c 69 73 74 20 74 61 69 6c 20 61 74 20 74  n list tail at t
30f40 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
30f50 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  page */.    if( 
30f60 69 52 6f 77 69 64 4f 66 66 21 3d 30 20 29 7b 0a  iRowidOff!=0 ){.
30f70 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 52 6f        iOff = iRo
30f80 77 69 64 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73  widOff;.    }els
30f90 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66 21 3d  e if( iTermOff!=
30fa0 30 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20  0 ){.      iOff 
30fb0 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20  = iTermOff;.    
30fc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4f 66  }else{.      iOf
30fd0 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20  f = szLeaf;.    
30fe0 7d 0a 20 20 20 20 66 74 73 35 44 65 63 6f 64 65  }.    fts5Decode
30ff0 50 6f 73 6c 69 73 74 28 26 72 63 2c 20 26 73 2c  Poslist(&rc, &s,
31000 20 26 61 5b 34 5d 2c 20 69 4f 66 66 2d 34 29 3b   &a[4], iOff-4);
31010 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
31020 61 6e 79 20 6d 6f 72 65 20 64 6f 63 6c 69 73 74  any more doclist
31030 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
31040 72 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 62  rs on the page b
31050 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
31060 20 66 69 72 73 74 20 74 65 72 6d 2e 20 2a 2f 0a   first term. */.
31070 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 3d 20 28      nDoclist = (
31080 69 54 65 72 6d 4f 66 66 20 3f 20 69 54 65 72 6d  iTermOff ? iTerm
31090 4f 66 66 20 3a 20 73 7a 4c 65 61 66 29 20 2d 20  Off : szLeaf) - 
310a0 69 4f 66 66 3b 0a 20 20 20 20 66 74 73 35 44 65  iOff;.    fts5De
310b0 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72 63 2c  codeDoclist(&rc,
310c0 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e   &s, &a[iOff], n
310d0 44 6f 63 6c 69 73 74 29 3b 0a 0a 20 20 20 20 77  Doclist);..    w
310e0 68 69 6c 65 28 20 69 50 67 69 64 78 4f 66 66 3c  hile( iPgidxOff<
310f0 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  n ){.      int b
31100 46 69 72 73 74 20 3d 20 28 69 50 67 69 64 78 4f  First = (iPgidxO
31110 66 66 3d 3d 73 7a 4c 65 61 66 29 3b 20 20 20 20  ff==szLeaf);    
31120 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 66 69 72   /* True for fir
31130 73 74 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20  st term on page 
31140 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79  */.      int nBy
31150 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
31160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31170 2a 20 42 79 74 65 73 20 6f 66 20 64 61 74 61 20  * Bytes of data 
31180 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 45 6e  */.      int iEn
31190 64 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  d;.      .      
311a0 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73  iPgidxOff += fts
311b0 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
311c0 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74  iPgidxOff], nByt
311d0 65 29 3b 0a 20 20 20 20 20 20 69 50 67 69 64 78  e);.      iPgidx
311e0 50 72 65 76 20 2b 3d 20 6e 42 79 74 65 3b 0a 20  Prev += nByte;. 
311f0 20 20 20 20 20 69 4f 66 66 20 3d 20 69 50 67 69       iOff = iPgi
31200 64 78 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 69  dxPrev;..      i
31210 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29  f( iPgidxOff<n )
31220 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 47 65  {.        fts5Ge
31230 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67  tVarint32(&a[iPg
31240 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b  idxOff], nByte);
31250 0a 20 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20  .        iEnd = 
31260 69 50 67 69 64 78 50 72 65 76 20 2b 20 6e 42 79  iPgidxPrev + nBy
31270 74 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  te;.      }else{
31280 0a 20 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20  .        iEnd = 
31290 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20 7d 0a  szLeaf;.      }.
312a0 0a 20 20 20 20 20 20 69 66 28 20 62 46 69 72 73  .      if( bFirs
312b0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
312c0 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
312d0 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
312e0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
312f0 20 20 74 65 72 6d 2e 6e 20 3d 20 6e 42 79 74 65    term.n = nByte
31300 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31310 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
31320 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
31330 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
31340 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
31350 42 6c 6f 62 28 26 72 63 2c 20 26 74 65 72 6d 2c  Blob(&rc, &term,
31360 20 6e 42 79 74 65 2c 20 26 61 5b 69 4f 66 66 5d   nByte, &a[iOff]
31370 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  );.      iOff +=
31380 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 20 20 73   nByte;..      s
31390 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
313a0 41 70 70 65 6e 64 50 72 69 6e 74 66 28 0a 20 20  AppendPrintf(.  
313b0 20 20 20 20 20 20 20 20 26 72 63 2c 20 26 73 2c          &rc, &s,
313c0 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20 74   " term=%.*s", t
313d0 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63 68  erm.n, (const ch
313e0 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20 20  ar*)term.p.     
313f0 20 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b   );.      iOff +
31400 3d 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c  = fts5DecodeDocl
31410 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b  ist(&rc, &s, &a[
31420 69 4f 66 66 5d 2c 20 69 45 6e 64 2d 69 4f 66 66  iOff], iEnd-iOff
31430 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74  );.    }..    ft
31440 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65  s5BufferFree(&te
31450 72 6d 29 3b 0a 20 20 7d 0a 20 20 0a 20 64 65 63  rm);.  }.  . dec
31460 6f 64 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ode_out:.  sqlit
31470 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 69 66  e3_free(a);.  if
31480 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31490 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
314a0 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c  esult_text(pCtx,
314b0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 2e   (const char*)s.
314c0 70 2c 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f 54  p, s.n, SQLITE_T
314d0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c  RANSIENT);.  }el
314e0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
314f0 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64  result_error_cod
31500 65 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d  e(pCtx, rc);.  }
31510 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
31520 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e(&s);.}../*.** 
31530 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
31540 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e  on of user-defin
31550 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  ed scalar functi
31560 6f 6e 20 66 74 73 35 5f 72 6f 77 69 64 28 29 2e  on fts5_rowid().
31570 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
31580 66 74 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f  fts5RowidFunctio
31590 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  n(.  sqlite3_con
315a0 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20  text *pCtx,     
315b0 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
315c0 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f   call context */
315d0 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
315e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
31600 61 72 67 73 20 28 61 6c 77 61 79 73 20 32 29 20  args (always 2) 
31610 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
31620 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20  ue **apVal      
31630 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
31640 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
31650 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
31660 41 72 67 3b 0a 20 20 69 66 28 20 6e 41 72 67 3d  Arg;.  if( nArg=
31670 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
31680 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70  3_result_error(p
31690 43 74 78 2c 20 22 73 68 6f 75 6c 64 20 62 65 3a  Ctx, "should be:
316a0 20 66 74 73 35 5f 72 6f 77 69 64 28 73 75 62 6a   fts5_rowid(subj
316b0 65 63 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d 31 29  ect, ....)", -1)
316c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
316d0 41 72 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Arg = (const cha
316e0 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
316f0 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b  _text(apVal[0]);
31700 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  .    if( 0==sqli
31710 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67  te3_stricmp(zArg
31720 2c 20 22 73 65 67 6d 65 6e 74 22 29 20 29 7b 0a  , "segment") ){.
31730 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
31740 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 65 67 69  ;.      int segi
31750 64 2c 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 69  d, pgno;.      i
31760 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20  f( nArg!=3 ){.  
31770 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
31780 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c  sult_error(pCtx,
31790 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73   .            "s
317a0 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35 5f 72  hould be: fts5_r
317b0 6f 77 69 64 28 27 73 65 67 6d 65 6e 74 27 2c 20  owid('segment', 
317c0 73 65 67 69 64 2c 20 70 67 6e 6f 29 29 22 2c 20  segid, pgno))", 
317d0 2d 31 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  -1.        );.  
317e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
317f0 20 20 20 73 65 67 69 64 20 3d 20 73 71 6c 69 74     segid = sqlit
31800 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56  e3_value_int(apV
31810 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  al[1]);.        
31820 70 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 76  pgno = sqlite3_v
31830 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 32  alue_int(apVal[2
31840 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 52 6f 77  ]);.        iRow
31850 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
31860 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c 20 70  T_ROWID(segid, p
31870 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71  gno);.        sq
31880 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
31890 36 34 28 70 43 74 78 2c 20 69 52 6f 77 69 64 29  64(pCtx, iRowid)
318a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
318b0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
318c0 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
318d0 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20 20 22  pCtx, .        "
318e0 66 69 72 73 74 20 61 72 67 20 74 6f 20 66 74 73  first arg to fts
318f0 35 5f 72 6f 77 69 64 28 29 20 6d 75 73 74 20 62  5_rowid() must b
31900 65 20 27 73 65 67 6d 65 6e 74 27 22 20 2c 20 2d  e 'segment'" , -
31910 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  1.      );.    }
31920 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
31930 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20  is is called as 
31940 70 61 72 74 20 6f 66 20 72 65 67 69 73 74 65 72  part of register
31950 69 6e 67 20 74 68 65 20 46 54 53 35 20 6d 6f 64  ing the FTS5 mod
31960 75 6c 65 20 77 69 74 68 20 64 61 74 61 62 61 73  ule with databas
31970 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e.** connection 
31980 64 62 2e 20 49 74 20 72 65 67 69 73 74 65 72 73  db. It registers
31990 20 73 65 76 65 72 61 6c 20 75 73 65 72 2d 64 65   several user-de
319a0 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e  fined scalar fun
319b0 63 74 69 6f 6e 73 20 75 73 65 66 75 6c 0a 2a 2a  ctions useful.**
319c0 20 77 69 74 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a   with FTS5..**.*
319d0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
319e0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
319f0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72  turned. If an er
31a00 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 6f 6d 65  ror occurs, some
31a10 20 6f 74 68 65 72 0a 2a 2a 20 53 51 4c 69 74 65   other.** SQLite
31a20 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
31a30 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e  eturned instead.
31a40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
31a50 74 73 35 49 6e 64 65 78 49 6e 69 74 28 73 71 6c  ts5IndexInit(sql
31a60 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
31a70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
31a80 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  eate_function(. 
31a90 20 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f 64       db, "fts5_d
31aa0 65 63 6f 64 65 22 2c 20 32 2c 20 53 51 4c 49 54  ecode", 2, SQLIT
31ab0 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73 35 44  E_UTF8, 0, fts5D
31ac0 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30  ecodeFunction, 0
31ad0 2c 20 30 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  , 0.  );..  if( 
31ae0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31af0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
31b00 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
31b10 6e 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22  n(.        db, "
31b20 66 74 73 35 5f 64 65 63 6f 64 65 5f 6e 6f 6e 65  fts5_decode_none
31b30 22 2c 20 32 2c 20 0a 20 20 20 20 20 20 20 20 53  ", 2, .        S
31b40 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69  QLITE_UTF8, (voi
31b50 64 2a 29 64 62 2c 20 66 74 73 35 44 65 63 6f 64  d*)db, fts5Decod
31b60 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a  eFunction, 0, 0.
31b70 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66      );.  }..  if
31b80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31b90 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
31ba0 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
31bb0 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 64 62 2c  ion(.        db,
31bc0 20 22 66 74 73 35 5f 72 6f 77 69 64 22 2c 20 2d   "fts5_rowid", -
31bd0 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
31be0 30 2c 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63  0, fts5RowidFunc
31bf0 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20 29  tion, 0, 0.    )
31c00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
31c10 63 3b 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74  c;.}...int sqlit
31c20 65 33 46 74 73 35 49 6e 64 65 78 52 65 73 65 74  e3Fts5IndexReset
31c30 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
31c40 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 74    assert( p->pSt
31c50 72 75 63 74 3d 3d 30 20 7c 7c 20 70 2d 3e 69 53  ruct==0 || p->iS
31c60 74 72 75 63 74 56 65 72 73 69 6f 6e 21 3d 30 20  tructVersion!=0 
31c70 29 3b 0a 20 20 69 66 28 20 66 74 73 35 49 6e 64  );.  if( fts5Ind
31c80 65 78 44 61 74 61 56 65 72 73 69 6f 6e 28 70 29  exDataVersion(p)
31c90 21 3d 70 2d 3e 69 53 74 72 75 63 74 56 65 72 73  !=p->iStructVers
31ca0 69 6f 6e 20 29 7b 0a 20 20 20 20 66 74 73 35 53  ion ){.    fts5S
31cb0 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61  tructureInvalida
31cc0 74 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  te(p);.  }.  ret
31cd0 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
31ce0 75 72 6e 28 70 29 3b 0a 7d 0a                    urn(p);.}.