/ Hex Artifact Content
Login

Artifact c6cd5190c7e5dd94151cb17acd939c82e5c7be2d:


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 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74  */.};..struct Ft
2c30: 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a  s5DoclistIter {.
2c40: 20 20 75 38 20 2a 61 45 6f 66 3b 20 20 20 20 20    u8 *aEof;     
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c60: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2c70: 31 20 62 79 74 65 20 70 61 73 74 20 65 6e 64 20  1 byte past end 
2c80: 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20  of doclist */.. 
2c90: 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61   /* Output varia
2ca0: 62 6c 65 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d  bles. aPoslist==
2cb0: 30 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36  0 at EOF */.  i6
2cc0: 34 20 69 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a  4 iRowid;.  u8 *
2cd0: 61 50 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20  aPoslist;.  int 
2ce0: 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20  nPoslist;.  int 
2cf0: 6e 53 69 7a 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  nSize;.};../*.**
2d00: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
2d10: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 22   the "structure"
2d20: 20 72 65 63 6f 72 64 20 66 6f 72 20 65 61 63 68   record for each
2d30: 20 69 6e 64 65 78 20 61 72 65 20 72 65 70 72 65   index are repre
2d40: 73 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20  sented.** using 
2d50: 61 6e 20 46 74 73 35 53 74 72 75 63 74 75 72 65  an Fts5Structure
2d60: 20 72 65 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72   record in memor
2d70: 79 2e 20 57 68 69 63 68 20 75 73 65 73 20 69 6e  y. Which uses in
2d80: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 0a  stances of the .
2d90: 2a 2a 20 6f 74 68 65 72 20 46 74 73 35 53 74 72  ** other Fts5Str
2da0: 75 63 74 75 72 65 58 58 58 20 74 79 70 65 73 20  uctureXXX types 
2db0: 61 73 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a  as components..*
2dc0: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 53 74 72  /.struct Fts5Str
2dd0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a  uctureSegment {.
2de0: 20 20 69 6e 74 20 69 53 65 67 69 64 3b 20 20 20    int iSegid;   
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e00: 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20    /* Segment id 
2e10: 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 46 69 72  */.  int pgnoFir
2e20: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
2e30: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 65       /* First le
2e40: 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  af page number i
2e50: 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69  n segment */.  i
2e60: 6e 74 20 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20  nt pgnoLast;    
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e80: 2a 20 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65  * Last leaf page
2e90: 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65   number in segme
2ea0: 6e 74 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20  nt */.};.struct 
2eb0: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
2ec0: 65 6c 20 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67  el {.  int nMerg
2ed0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2ee0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2ef0: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20   of segments in 
2f00: 69 6e 63 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20  incr-merge */.  
2f10: 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20  int nSeg;       
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f30: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
2f40: 6f 66 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c  of segments on l
2f50: 65 76 65 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74  evel */.  Fts5St
2f60: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
2f70: 61 53 65 67 3b 20 20 20 20 20 2f 2a 20 41 72 72  aSeg;     /* Arr
2f80: 61 79 20 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20  ay of segments. 
2f90: 61 53 65 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73  aSeg[0] is oldes
2fa0: 74 2e 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20  t. */.};.struct 
2fb0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 7b 0a  Fts5Structure {.
2fc0: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 72 65 66 65    /* Object refe
2ff0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 2a 2f 0a 20  rence count */. 
3000: 20 75 36 34 20 6e 57 72 69 74 65 43 6f 75 6e 74   u64 nWriteCount
3010: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
3020: 20 2f 2a 20 54 6f 74 61 6c 20 6c 65 61 76 65 73   /* Total leaves
3030: 20 77 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65   written to leve
3040: 6c 20 30 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65  l 0 */.  int nSe
3050: 67 6d 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20  gment;          
3060: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
3070: 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68  l segments in th
3080: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
3090: 20 20 69 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20    int nLevel;   
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
30c0: 65 76 65 6c 73 20 69 6e 20 74 68 69 73 20 69 6e  evels in this in
30d0: 64 65 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  dex */.  Fts5Str
30e0: 75 63 74 75 72 65 4c 65 76 65 6c 20 61 4c 65 76  uctureLevel aLev
30f0: 65 6c 5b 31 5d 3b 20 20 20 2f 2a 20 41 72 72 61  el[1];   /* Arra
3100: 79 20 6f 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65  y of nLevel leve
3110: 6c 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a  l objects */.};.
3120: 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74  ./*.** An object
3130: 20 6f 66 20 74 79 70 65 20 46 74 73 35 53 65 67   of type Fts5Seg
3140: 57 72 69 74 65 72 20 69 73 20 75 73 65 64 20 74  Writer is used t
3150: 6f 20 77 72 69 74 65 20 74 6f 20 73 65 67 6d 65  o write to segme
3160: 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  nts..*/.struct F
3170: 74 73 35 50 61 67 65 57 72 69 74 65 72 20 7b 0a  ts5PageWriter {.
3180: 20 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20    int pgno;     
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a0: 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
31b0: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
31c0: 2f 0a 20 20 69 6e 74 20 69 50 72 65 76 50 67 69  /.  int iPrevPgi
31d0: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
31e0: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
31f0: 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20 69 6e  value written in
3200: 74 6f 20 70 67 69 64 78 20 2a 2f 0a 20 20 46 74  to pgidx */.  Ft
3210: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3230: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
3240: 6e 67 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  ng leaf data */.
3250: 20 20 46 74 73 35 42 75 66 66 65 72 20 70 67 69    Fts5Buffer pgi
3260: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
3270: 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
3280: 61 69 6e 69 6e 67 20 70 61 67 65 2d 69 6e 64 65  aining page-inde
3290: 78 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  x */.  Fts5Buffe
32a0: 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  r term;         
32b0: 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
32c0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 76   containing prev
32d0: 69 6f 75 73 20 74 65 72 6d 20 6f 6e 20 70 61 67  ious term on pag
32e0: 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46  e */.};.struct F
32f0: 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 7b  ts5DlidxWriter {
3300: 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20  .  int pgno;    
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3320: 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
3330: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  r for this page 
3340: 2a 2f 0a 20 20 69 6e 74 20 62 50 72 65 76 56 61  */.  int bPrevVa
3350: 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lid;            
3360: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3370: 69 50 72 65 76 20 69 73 20 76 61 6c 69 64 20 2a  iPrev is valid *
3380: 2f 0a 20 20 69 36 34 20 69 50 72 65 76 3b 20 20  /.  i64 iPrev;  
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a0: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
33b0: 72 6f 77 69 64 20 76 61 6c 75 65 20 77 72 69 74  rowid value writ
33c0: 74 65 6e 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  ten to page */. 
33d0: 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b   Fts5Buffer buf;
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f0: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
3400: 69 6e 69 6e 67 20 70 61 67 65 20 64 61 74 61 20  ining page data 
3410: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
3420: 35 53 65 67 57 72 69 74 65 72 20 7b 0a 20 20 69  5SegWriter {.  i
3430: 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20  nt iSegid;      
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3450: 2a 20 53 65 67 69 64 20 74 6f 20 77 72 69 74 65  * Segid to write
3460: 20 74 6f 20 2a 2f 0a 20 20 46 74 73 35 50 61 67   to */.  Fts5Pag
3470: 65 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20  eWriter writer; 
3480: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
3490: 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f  Writer object */
34a0: 0a 20 20 69 36 34 20 69 50 72 65 76 52 6f 77 69  .  i64 iPrevRowi
34b0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
34c0: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
34d0: 6f 77 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20  owid written to 
34e0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a  current leaf */.
34f0: 20 20 75 38 20 62 46 69 72 73 74 52 6f 77 69 64    u8 bFirstRowid
3500: 49 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20  InDoclist;      
3510: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78    /* True if nex
3520: 74 20 72 6f 77 69 64 20 69 73 20 66 69 72 73 74  t rowid is first
3530: 20 69 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20   in doclist */. 
3540: 20 75 38 20 62 46 69 72 73 74 52 6f 77 69 64 49   u8 bFirstRowidI
3550: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
3560: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74   /* True if next
3570: 20 72 6f 77 69 64 20 69 73 20 66 69 72 73 74 20   rowid is first 
3580: 69 6e 20 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20  in page */.  /* 
3590: 54 4f 44 4f 31 3a 20 43 61 6e 20 75 73 65 20 28  TODO1: Can use (
35a0: 77 72 69 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d  writer.pgidx.n==
35b0: 30 29 20 69 6e 73 74 65 61 64 20 6f 66 20 62 46  0) instead of bF
35c0: 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 2a  irstTermInPage *
35d0: 2f 0a 20 20 75 38 20 62 46 69 72 73 74 54 65 72  /.  u8 bFirstTer
35e0: 6d 49 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  mInPage;        
35f0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e      /* True if n
3600: 65 78 74 20 74 65 72 6d 20 77 69 6c 6c 20 62 65  ext term will be
3610: 20 66 69 72 73 74 20 69 6e 20 6c 65 61 66 20 2a   first in leaf *
3620: 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 57 72 69  /.  int nLeafWri
3630: 74 74 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tten;           
3640: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3650: 20 6c 65 61 66 20 70 61 67 65 73 20 77 72 69 74   leaf pages writ
3660: 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d  ten */.  int nEm
3670: 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  pty;            
3680: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3690: 65 72 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73  er of contiguous
36a0: 20 74 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73   term-less nodes
36b0: 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64   */..  int nDlid
36c0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
36d0: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
36e0: 74 65 64 20 73 69 7a 65 20 6f 66 20 61 44 6c 69  ted size of aDli
36f0: 64 78 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  dx[] array */.  
3700: 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20  Fts5DlidxWriter 
3710: 2a 61 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20  *aDlidx;        
3720: 2f 2a 20 41 72 72 61 79 20 6f 66 20 46 74 73 35  /* Array of Fts5
3730: 44 6c 69 64 78 57 72 69 74 65 72 20 6f 62 6a 65  DlidxWriter obje
3740: 63 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c  cts */..  /* Val
3750: 75 65 73 20 74 6f 20 69 6e 73 65 72 74 20 69 6e  ues to insert in
3760: 74 6f 20 74 68 65 20 25 5f 69 64 78 20 74 61 62  to the %_idx tab
3770: 6c 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  le */.  Fts5Buff
3780: 65 72 20 62 74 74 65 72 6d 3b 20 20 20 20 20 20  er btterm;      
3790: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
37a0: 74 65 72 6d 20 74 6f 20 69 6e 73 65 72 74 20 69  term to insert i
37b0: 6e 74 6f 20 25 5f 69 64 78 20 74 61 62 6c 65 20  nto %_idx table 
37c0: 2a 2f 0a 20 20 69 6e 74 20 69 42 74 50 61 67 65  */.  int iBtPage
37d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37e0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
37f0: 62 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ber correspondin
3800: 67 20 74 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d  g to btterm */.}
3810: 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  ;..typedef struc
3820: 74 20 46 74 73 35 43 52 65 73 75 6c 74 20 46 74  t Fts5CResult Ft
3830: 73 35 43 52 65 73 75 6c 74 3b 0a 73 74 72 75 63  s5CResult;.struc
3840: 74 20 46 74 73 35 43 52 65 73 75 6c 74 20 7b 0a  t Fts5CResult {.
3850: 20 20 75 31 36 20 69 46 69 72 73 74 3b 20 20 20    u16 iFirst;   
3860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3870: 20 20 2f 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65    /* aSeg[] inde
3880: 78 20 6f 66 20 66 69 72 73 74 65 73 74 20 69 74  x of firstest it
3890: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62  erator */.  u8 b
38a0: 54 65 72 6d 45 71 3b 20 20 20 20 20 20 20 20 20  TermEq;         
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
38c0: 72 75 65 20 69 66 20 74 68 65 20 74 65 72 6d 73  rue if the terms
38d0: 20 61 72 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b   are equal */.};
38e0: 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66  ../*.** Object f
38f0: 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
3900: 6f 75 67 68 20 61 20 73 69 6e 67 6c 65 20 73 65  ough a single se
3910: 67 6d 65 6e 74 2c 20 76 69 73 69 74 69 6e 67 20  gment, visiting 
3920: 65 61 63 68 20 74 65 72 6d 2f 72 6f 77 69 64 0a  each term/rowid.
3930: 2a 2a 20 70 61 69 72 20 69 6e 20 74 68 65 20 73  ** pair in the s
3940: 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53  egment..**.** pS
3950: 65 67 3a 0a 2a 2a 20 20 20 54 68 65 20 73 65 67  eg:.**   The seg
3960: 6d 65 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20  ment to iterate 
3970: 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69  through..**.** i
3980: 4c 65 61 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43  LeafPgno:.**   C
3990: 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65  urrent leaf page
39a0: 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 73   number within s
39b0: 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c  egment..**.** iL
39c0: 65 61 66 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20  eafOffset:.**   
39d0: 42 79 74 65 20 6f 66 66 73 65 74 20 77 69 74 68  Byte offset with
39e0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  in the current l
39f0: 65 61 66 20 74 68 61 74 20 69 73 20 74 68 65 20  eaf that is the 
3a00: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
3a10: 65 20 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e  e .**   position
3a20: 20 6c 69 73 74 20 64 61 74 61 20 28 6f 6e 65 20   list data (one 
3a30: 62 79 74 65 20 70 61 73 73 65 64 20 74 68 65 20  byte passed the 
3a40: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
3a50: 7a 65 20 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20  ze field)..**   
3a60: 72 6f 77 69 64 20 66 69 65 6c 64 20 6f 66 20 74  rowid field of t
3a70: 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
3a80: 2e 20 55 73 75 61 6c 6c 79 20 74 68 69 73 20 69  . Usually this i
3a90: 73 20 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64  s the size field
3aa0: 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73   of the.**   pos
3ab0: 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e  ition list data.
3ac0: 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69   The exception i
3ad0: 73 20 69 66 20 74 68 65 20 72 6f 77 69 64 20 66  s if the rowid f
3ae0: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  or the current e
3af0: 6e 74 72 79 20 0a 2a 2a 20 20 20 69 73 20 74 68  ntry .**   is th
3b00: 65 20 6c 61 73 74 20 74 68 69 6e 67 20 6f 6e 20  e last thing on 
3b10: 74 68 65 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a  the leaf page..*
3b20: 2a 0a 2a 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20  *.** pLeaf:.**  
3b30: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
3b40: 6e 67 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  ng current leaf 
3b50: 70 61 67 65 20 64 61 74 61 2e 20 53 65 74 20 74  page data. Set t
3b60: 6f 20 4e 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a  o NULL at EOF..*
3b70: 2a 0a 2a 2a 20 69 54 65 72 6d 4c 65 61 66 50 67  *.** iTermLeafPg
3b80: 6e 6f 2c 20 69 54 65 72 6d 4c 65 61 66 4f 66 66  no, iTermLeafOff
3b90: 73 65 74 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70  set:.**   Leaf p
3ba0: 61 67 65 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61  age number conta
3bb0: 69 6e 69 6e 67 20 74 68 65 20 6c 61 73 74 20 74  ining the last t
3bc0: 65 72 6d 20 72 65 61 64 20 66 72 6f 6d 20 74 68  erm read from th
3bd0: 65 20 73 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a  e segment. And.*
3be0: 2a 20 20 20 74 68 65 20 6f 66 66 73 65 74 20 69  *   the offset i
3bf0: 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
3c00: 77 69 6e 67 20 74 68 65 20 74 65 72 6d 20 64 61  wing the term da
3c10: 74 61 2e 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a  ta..**.** flags:
3c20: 0a 2a 2a 20 20 20 4d 61 73 6b 20 6f 66 20 46 54  .**   Mask of FT
3c30: 53 35 5f 53 45 47 49 54 45 52 5f 58 58 58 20 76  S5_SEGITER_XXX v
3c40: 61 6c 75 65 73 2e 20 49 6e 74 65 72 70 72 65 74  alues. Interpret
3c50: 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
3c60: 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47 49  *.**   FTS5_SEGI
3c70: 54 45 52 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20  TER_ONETERM:.** 
3c80: 20 20 20 20 49 66 20 73 65 74 2c 20 73 65 74 20      If set, set 
3c90: 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20  the iterator to 
3ca0: 70 6f 69 6e 74 20 74 6f 20 45 4f 46 20 61 66 74  point to EOF aft
3cb0: 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  er the current d
3cc0: 6f 63 6c 69 73 74 20 0a 2a 2a 20 20 20 20 20 68  oclist .**     h
3cd0: 61 73 20 62 65 65 6e 20 65 78 68 61 75 73 74 65  as been exhauste
3ce0: 64 2e 20 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65  d. Do not procee
3cf0: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 74 65  d to the next te
3d00: 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  rm in the segmen
3d10: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f  t..**.**   FTS5_
3d20: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 3a  SEGITER_REVERSE:
3d30: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61  .**     This fla
3d40: 67 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 73  g is only ever s
3d50: 65 74 20 69 66 20 46 54 53 35 5f 53 45 47 49 54  et if FTS5_SEGIT
3d60: 45 52 5f 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c  ER_ONETERM is al
3d70: 73 6f 20 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20  so set. If.**   
3d80: 20 20 69 74 20 69 73 20 73 65 74 2c 20 69 74 65    it is set, ite
3d90: 72 61 74 65 20 74 68 72 6f 75 67 68 20 72 6f 77  rate through row
3da0: 69 64 20 69 6e 20 64 65 73 63 65 6e 64 69 6e 67  id in descending
3db0: 20 6f 72 64 65 72 20 69 6e 73 74 65 61 64 20 6f   order instead o
3dc0: 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 64 65 66  f the.**     def
3dd0: 61 75 6c 74 20 61 73 63 65 6e 64 69 6e 67 20 6f  ault ascending o
3de0: 72 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77  rder..**.** iRow
3df0: 69 64 4f 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f  idOffset/nRowidO
3e00: 66 66 73 65 74 2f 61 52 6f 77 69 64 4f 66 66 73  ffset/aRowidOffs
3e10: 65 74 3a 0a 2a 2a 20 20 20 20 20 54 68 65 73 65  et:.**     These
3e20: 20 61 72 65 20 75 73 65 64 20 69 66 20 74 68 65   are used if the
3e30: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
3e40: 56 45 52 53 45 20 66 6c 61 67 20 69 73 20 73 65  VERSE flag is se
3e50: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72  t..**.**     For
3e60: 20 65 61 63 68 20 72 6f 77 69 64 20 6f 6e 20 74   each rowid on t
3e70: 68 65 20 70 61 67 65 20 63 6f 72 72 65 73 70 6f  he page correspo
3e80: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72  nding to the cur
3e90: 72 65 6e 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a  rent term, the.*
3ea0: 2a 20 20 20 20 20 63 6f 72 72 65 73 70 6f 6e 64  *     correspond
3eb0: 69 6e 67 20 61 52 6f 77 69 64 4f 66 66 73 65 74  ing aRowidOffset
3ec0: 5b 5d 20 65 6e 74 72 79 20 69 73 20 73 65 74 20  [] entry is set 
3ed0: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
3ee0: 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20  et of the.**    
3ef0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 22 70   start of the "p
3f00: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a  osition-list-siz
3f10: 65 22 20 66 69 65 6c 64 20 77 69 74 68 69 6e 20  e" field within 
3f20: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
3f30: 69 54 65 72 6d 49 64 78 3a 0a 2a 2a 20 20 20 20  iTermIdx:.**    
3f40: 20 49 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e   Index of curren
3f50: 74 20 74 65 72 6d 20 6f 6e 20 69 54 65 72 6d 4c  t term on iTermL
3f60: 65 61 66 50 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75  eafPgno..*/.stru
3f70: 63 74 20 46 74 73 35 53 65 67 49 74 65 72 20 7b  ct Fts5SegIter {
3f80: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
3f90: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20  Segment *pSeg;  
3fa0: 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f     /* Segment to
3fb0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
3fc0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b   */.  int flags;
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fe0: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
3ff0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
4000: 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  lags */.  int iL
4010: 65 61 66 50 67 6e 6f 3b 20 20 20 20 20 20 20 20  eafPgno;        
4020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4030: 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e  rent leaf page n
4040: 75 6d 62 65 72 20 2a 2f 0a 20 20 46 74 73 35 44  umber */.  Fts5D
4050: 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20  ata *pLeaf;     
4060: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4070: 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20  rrent leaf data 
4080: 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  */.  Fts5Data *p
4090: 4e 65 78 74 4c 65 61 66 3b 20 20 20 20 20 20 20  NextLeaf;       
40a0: 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67       /* Leaf pag
40b0: 65 20 28 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20  e (iLeafPgno+1) 
40c0: 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 4f 66  */.  int iLeafOf
40d0: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
40e0: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
40f0: 73 65 74 20 77 69 74 68 69 6e 20 63 75 72 72 65  set within curre
4100: 6e 74 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a  nt leaf */..  /*
4110: 20 4e 65 78 74 20 6d 65 74 68 6f 64 20 2a 2f 0a   Next method */.
4120: 20 20 76 6f 69 64 20 28 2a 78 4e 65 78 74 29 28    void (*xNext)(
4130: 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35  Fts5Index*, Fts5
4140: 53 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b  SegIter*, int*);
4150: 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ..  /* The page 
4160: 61 6e 64 20 6f 66 66 73 65 74 20 66 72 6f 6d 20  and offset from 
4170: 77 68 69 63 68 20 74 68 65 20 63 75 72 72 65 6e  which the curren
4180: 74 20 74 65 72 6d 20 77 61 73 20 72 65 61 64 2e  t term was read.
4190: 20 54 68 65 20 6f 66 66 73 65 74 20 0a 20 20 2a   The offset .  *
41a0: 2a 20 69 73 20 74 68 65 20 6f 66 66 73 65 74 20  * is the offset 
41b0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
41c0: 69 64 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  id in the curren
41d0: 74 20 64 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20  t doclist.  */. 
41e0: 20 69 6e 74 20 69 54 65 72 6d 4c 65 61 66 50 67   int iTermLeafPg
41f0: 6e 6f 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c  no;.  int iTermL
4200: 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20 20 69 6e  eafOffset;..  in
4210: 74 20 69 50 67 69 64 78 4f 66 66 3b 20 20 20 20  t iPgidxOff;    
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4230: 20 4e 65 78 74 20 6f 66 66 73 65 74 20 69 6e 20   Next offset in 
4240: 70 67 69 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69  pgidx */.  int i
4250: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 0a 20  EndofDoclist;.. 
4260: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
4270: 67 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20  g are only used 
4280: 69 66 20 74 68 65 20 46 54 53 35 5f 53 45 47 49  if the FTS5_SEGI
4290: 54 45 52 5f 52 45 56 45 52 53 45 20 66 6c 61 67  TER_REVERSE flag
42a0: 20 69 73 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e   is set. */.  in
42b0: 74 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3b 20  t iRowidOffset; 
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
42d0: 20 43 75 72 72 65 6e 74 20 65 6e 74 72 79 20 69   Current entry i
42e0: 6e 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d  n aRowidOffset[]
42f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 77 69 64   */.  int nRowid
4300: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
4310: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
4320: 65 64 20 73 69 7a 65 20 6f 66 20 61 52 6f 77 69  ed size of aRowi
4330: 64 4f 66 66 73 65 74 5b 5d 20 61 72 72 61 79 20  dOffset[] array 
4340: 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 77 69 64  */.  int *aRowid
4350: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
4360: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
4370: 20 6f 66 66 73 65 74 20 74 6f 20 72 6f 77 69 64   offset to rowid
4380: 20 66 69 65 6c 64 73 20 2a 2f 0a 0a 20 20 46 74   fields */..  Ft
4390: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c  s5DlidxIter *pDl
43a0: 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  idx;          /*
43b0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 64   If there is a d
43c0: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a  oclist-index */.
43d0: 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20  .  /* Variables 
43e0: 70 6f 70 75 6c 61 74 65 64 20 62 61 73 65 64 20  populated based 
43f0: 6f 6e 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  on current entry
4400: 2e 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  . */.  Fts5Buffe
4410: 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  r term;         
4420: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
4430: 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 36 34 20  t term */.  i64 
4440: 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  iRowid;         
4450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4460: 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a  urrent rowid */.
4470: 20 20 69 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20    int nPos;     
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4490: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
44a0: 79 74 65 73 20 69 6e 20 63 75 72 72 65 6e 74 20  ytes in current 
44b0: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  position list */
44c0: 0a 20 20 75 38 20 62 44 65 6c 3b 20 20 20 20 20  .  u8 bDel;     
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
44f0: 65 20 64 65 6c 65 74 65 20 66 6c 61 67 20 69 73  e delete flag is
4500: 20 73 65 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a   set */.};../*.*
4510: 2a 20 41 72 67 75 6d 65 6e 74 20 69 73 20 61 20  * Argument is a 
4520: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 46 74  pointer to an Ft
4530: 73 35 44 61 74 61 20 73 74 72 75 63 74 75 72 65  s5Data structure
4540: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
4550: 20 0a 2a 2a 20 6c 65 61 66 20 70 61 67 65 2e 0a   .** leaf page..
4560: 2a 2f 0a 23 64 65 66 69 6e 65 20 41 53 53 45 52  */.#define ASSER
4570: 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 78 29 20 61  T_SZLEAF_OK(x) a
4580: 73 73 65 72 74 28 20 5c 0a 20 20 20 20 28 78 29  ssert( \.    (x)
4590: 2d 3e 73 7a 4c 65 61 66 3d 3d 28 78 29 2d 3e 6e  ->szLeaf==(x)->n
45a0: 6e 20 7c 7c 20 28 78 29 2d 3e 73 7a 4c 65 61 66  n || (x)->szLeaf
45b0: 3d 3d 66 74 73 35 47 65 74 55 31 36 28 26 28 78  ==fts5GetU16(&(x
45c0: 29 2d 3e 70 5b 32 5d 29 20 5c 0a 29 0a 0a 23 64  )->p[2]) \.)..#d
45d0: 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54  efine FTS5_SEGIT
45e0: 45 52 5f 4f 4e 45 54 45 52 4d 20 30 78 30 31 0a  ER_ONETERM 0x01.
45f0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47  #define FTS5_SEG
4600: 49 54 45 52 5f 52 45 56 45 52 53 45 20 30 78 30  ITER_REVERSE 0x0
4610: 32 0a 0a 2f 2a 20 0a 2a 2a 20 41 72 67 75 6d 65  2../* .** Argume
4620: 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
4630: 74 6f 20 61 6e 20 46 74 73 35 44 61 74 61 20 73  to an Fts5Data s
4640: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
4650: 6e 74 61 69 6e 73 20 61 20 6c 65 61 66 0a 2a 2a  ntains a leaf.**
4660: 20 70 61 67 65 2e 20 54 68 69 73 20 6d 61 63 72   page. This macr
4670: 6f 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74  o evaluates to t
4680: 72 75 65 20 69 66 20 74 68 65 20 6c 65 61 66 20  rue if the leaf 
4690: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 74 65 72 6d  contains no term
46a0: 73 2c 20 6f 72 0a 2a 2a 20 66 61 6c 73 65 20 69  s, or.** false i
46b0: 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 74  f it contains at
46c0: 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e   least one term.
46d0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 74 73 35  .*/.#define fts5
46e0: 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 78  LeafIsTermless(x
46f0: 29 20 28 28 78 29 2d 3e 73 7a 4c 65 61 66 20 3e  ) ((x)->szLeaf >
4700: 3d 20 28 78 29 2d 3e 6e 6e 29 0a 0a 23 64 65 66  = (x)->nn)..#def
4710: 69 6e 65 20 66 74 73 35 4c 65 61 66 54 65 72 6d  ine fts5LeafTerm
4720: 4f 66 66 28 78 2c 20 69 29 20 28 66 74 73 35 47  Off(x, i) (fts5G
4730: 65 74 55 31 36 28 26 28 78 29 2d 3e 70 5b 28 78  etU16(&(x)->p[(x
4740: 29 2d 3e 73 7a 4c 65 61 66 20 2b 20 28 69 29 2a  )->szLeaf + (i)*
4750: 32 5d 29 29 0a 0a 23 64 65 66 69 6e 65 20 66 74  2]))..#define ft
4760: 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
4770: 4f 66 66 28 78 29 20 28 66 74 73 35 47 65 74 55  Off(x) (fts5GetU
4780: 31 36 28 28 78 29 2d 3e 70 29 29 0a 0a 2f 2a 0a  16((x)->p))../*.
4790: 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74  ** Object for it
47a0: 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
47b0: 74 68 65 20 6d 65 72 67 65 64 20 72 65 73 75 6c  the merged resul
47c0: 74 73 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ts of one or mor
47d0: 65 20 73 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20 76  e segments,.** v
47e0: 69 73 69 74 69 6e 67 20 65 61 63 68 20 74 65 72  isiting each ter
47f0: 6d 2f 72 6f 77 69 64 20 70 61 69 72 20 69 6e 20  m/rowid pair in 
4800: 74 68 65 20 6d 65 72 67 65 64 20 64 61 74 61 2e  the merged data.
4810: 0a 2a 2a 0a 2a 2a 20 6e 53 65 67 20 69 73 20 61  .**.** nSeg is a
4820: 6c 77 61 79 73 20 61 20 70 6f 77 65 72 20 6f 66  lways a power of
4830: 20 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61   two greater tha
4840: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
4850: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73  e number of.** s
4860: 65 67 6d 65 6e 74 73 20 74 68 61 74 20 74 68 69  egments that thi
4870: 73 20 6f 62 6a 65 63 74 20 69 73 20 6d 65 72 67  s object is merg
4880: 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 2e 20 42  ing data from. B
4890: 6f 74 68 20 74 68 65 20 61 53 65 67 5b 5d 20 61  oth the aSeg[] a
48a0: 6e 64 0a 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61  nd.** aFirst[] a
48b0: 72 72 61 79 73 20 61 72 65 20 73 69 7a 65 64 20  rrays are sized 
48c0: 61 74 20 6e 53 65 67 20 65 6e 74 72 69 65 73 2e  at nSeg entries.
48d0: 20 54 68 65 20 61 53 65 67 5b 5d 20 61 72 72 61   The aSeg[] arra
48e0: 79 20 69 73 20 70 61 64 64 65 64 0a 2a 2a 20 77  y is padded.** w
48f0: 69 74 68 20 7a 65 72 6f 65 64 20 6f 62 6a 65 63  ith zeroed objec
4900: 74 73 20 2d 20 74 68 65 73 65 20 61 72 65 20 68  ts - these are h
4910: 61 6e 64 6c 65 64 20 61 73 20 69 66 20 74 68 65  andled as if the
4920: 79 20 77 65 72 65 20 69 74 65 72 61 74 6f 72 73  y were iterators
4930: 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 65 6d   opened.** on em
4940: 70 74 79 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a  pty segments..**
4950: 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
4960: 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 67  of comparing seg
4970: 6d 65 6e 74 73 20 61 53 65 67 5b 4e 5d 20 61 6e  ments aSeg[N] an
4980: 64 20 61 53 65 67 5b 4e 2b 31 5d 2c 20 77 68 65  d aSeg[N+1], whe
4990: 72 65 20 4e 20 69 73 20 61 6e 0a 2a 2a 20 65 76  re N is an.** ev
49a0: 65 6e 20 6e 75 6d 62 65 72 2c 20 69 73 20 73 74  en number, is st
49b0: 6f 72 65 64 20 69 6e 20 61 46 69 72 73 74 5b 28  ored in aFirst[(
49c0: 6e 53 65 67 2b 4e 29 2f 32 5d 2e 20 54 68 65 20  nSeg+N)/2]. The 
49d0: 22 72 65 73 75 6c 74 22 20 6f 66 20 74 68 65 20  "result" of the 
49e0: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  .** comparison i
49f0: 6e 20 74 68 69 73 20 63 6f 6e 74 65 78 74 20 69  n this context i
4a00: 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  s the index of t
4a10: 68 65 20 69 74 65 72 61 74 6f 72 20 74 68 61 74  he iterator that
4a20: 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f   currently.** po
4a30: 69 6e 74 73 20 74 6f 20 74 68 65 20 73 6d 61 6c  ints to the smal
4a40: 6c 65 72 20 74 65 72 6d 2f 72 6f 77 69 64 20 63  ler term/rowid c
4a50: 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 49 74 65 72  ombination. Iter
4a60: 61 74 6f 72 73 20 61 74 20 45 4f 46 20 61 72 65  ators at EOF are
4a70: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 74  .** considered t
4a80: 6f 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  o be greater tha
4a90: 6e 20 61 6c 6c 20 6f 74 68 65 72 20 69 74 65 72  n all other iter
4aa0: 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 61 46 69  ators..**.** aFi
4ab0: 72 73 74 5b 31 5d 20 63 6f 6e 74 61 69 6e 73 20  rst[1] contains 
4ac0: 74 68 65 20 69 6e 64 65 78 20 69 6e 20 61 53 65  the index in aSe
4ad0: 67 5b 5d 20 6f 66 20 74 68 65 20 69 74 65 72 61  g[] of the itera
4ae0: 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20  tor that points 
4af0: 74 6f 0a 2a 2a 20 74 68 65 20 73 6d 61 6c 6c 65  to.** the smalle
4b00: 73 74 20 6b 65 79 20 6f 76 65 72 61 6c 6c 2e 20  st key overall. 
4b10: 61 46 69 72 73 74 5b 30 5d 20 69 73 20 75 6e 75  aFirst[0] is unu
4b20: 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 70 6f 73 6c  sed. .**.** posl
4b30: 69 73 74 3a 0a 2a 2a 20 20 20 55 73 65 64 20 62  ist:.**   Used b
4b40: 79 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  y sqlite3Fts5Ite
4b50: 72 50 6f 73 6c 69 73 74 28 29 20 77 68 65 6e 20  rPoslist() when 
4b60: 74 68 65 20 70 6f 73 6c 69 73 74 20 6e 65 65 64  the poslist need
4b70: 73 20 74 6f 20 62 65 20 62 75 66 66 65 72 65 64  s to be buffered
4b80: 2e 0a 2a 2a 20 20 20 54 68 65 72 65 20 69 73 20  ..**   There is 
4b90: 6e 6f 20 77 61 79 20 74 6f 20 74 65 6c 6c 20 69  no way to tell i
4ba0: 66 20 74 68 69 73 20 69 73 20 70 6f 70 75 6c 61  f this is popula
4bb0: 74 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 73  ted or not..*/.s
4bc0: 74 72 75 63 74 20 46 74 73 35 49 74 65 72 20 7b  truct Fts5Iter {
4bd0: 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
4be0: 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 20   base;          
4bf0: 20 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73     /* Base class
4c00: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6f 75 74 70   containing outp
4c10: 75 74 20 76 61 72 73 20 2a 2f 0a 0a 20 20 46 74  ut vars */..  Ft
4c20: 73 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b  s5Index *pIndex;
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4c40: 20 49 6e 64 65 78 20 74 68 61 74 20 6f 77 6e 73   Index that owns
4c50: 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20 2a   this iterator *
4c60: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
4c70: 65 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20 20  e *pStruct;     
4c80: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
4c90: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68  structure for th
4ca0: 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  is iterator */. 
4cb0: 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c   Fts5Buffer posl
4cc0: 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
4cd0: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
4ce0: 69 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 70 6f  ining current po
4cf0: 73 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 43  slist */.  Fts5C
4d00: 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20  olset *pColset; 
4d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
4d20: 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74  strict matches t
4d30: 6f 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20  o these columns 
4d40: 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 64  */..  /* Invoked
4d50: 20 74 6f 20 73 65 74 20 6f 75 74 70 75 74 20 76   to set output v
4d60: 61 72 69 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 76  ariables. */.  v
4d70: 6f 69 64 20 28 2a 78 53 65 74 4f 75 74 70 75 74  oid (*xSetOutput
4d80: 73 29 28 46 74 73 35 49 74 65 72 2a 2c 20 46 74  s)(Fts5Iter*, Ft
4d90: 73 35 53 65 67 49 74 65 72 2a 29 3b 0a 0a 20 20  s5SegIter*);..  
4da0: 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20  int nSeg;       
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dc0: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 53 65 67 5b  /* Size of aSeg[
4dd0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  ] array */.  int
4de0: 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e00: 54 72 75 65 20 74 6f 20 69 74 65 72 61 74 65 20  True to iterate 
4e10: 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
4e20: 20 2a 2f 0a 20 20 75 38 20 62 53 6b 69 70 45 6d   */.  u8 bSkipEm
4e30: 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  pty;            
4e40: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
4e50: 20 73 6b 69 70 20 64 65 6c 65 74 65 64 20 65 6e   skip deleted en
4e60: 74 72 69 65 73 20 2a 2f 0a 0a 20 20 69 36 34 20  tries */..  i64 
4e70: 69 53 77 69 74 63 68 52 6f 77 69 64 3b 20 20 20  iSwitchRowid;   
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4e90: 69 72 73 74 65 73 74 20 72 6f 77 69 64 20 6f 66  irstest rowid of
4ea0: 20 6f 74 68 65 72 20 74 68 61 6e 20 61 46 69 72   other than aFir
4eb0: 73 74 5b 31 5d 20 2a 2f 0a 20 20 46 74 73 35 43  st[1] */.  Fts5C
4ec0: 52 65 73 75 6c 74 20 2a 61 46 69 72 73 74 3b 20  Result *aFirst; 
4ed0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4ee0: 72 72 65 6e 74 20 6d 65 72 67 65 20 73 74 61 74  rrent merge stat
4ef0: 65 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f  e (see above) */
4f00: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 61  .  Fts5SegIter a
4f10: 53 65 67 5b 31 5d 3b 20 20 20 20 20 20 20 20 20  Seg[1];         
4f20: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
4f30: 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73  egment iterators
4f40: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41   */.};.../*.** A
4f50: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
4f60: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65  e following type
4f70: 20 69 73 20 75 73 65 64 20 74 6f 20 69 74 65 72   is used to iter
4f80: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
4f90: 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61  contents.** of a
4fa0: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72   doclist-index r
4fb0: 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61  ecord..**.** pDa
4fc0: 74 61 3a 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20  ta:.**   Record 
4fd0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 64  containing the d
4fe0: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 64 61 74  oclist-index dat
4ff0: 61 2e 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a  a..**.** bEof:.*
5000: 2a 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20  *   Set to true 
5010: 6f 6e 63 65 20 69 74 65 72 61 74 6f 72 20 68 61  once iterator ha
5020: 73 20 72 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a  s reached EOF..*
5030: 2a 0a 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20  *.** iOff:.**   
5040: 53 65 74 20 74 6f 20 74 68 65 20 63 75 72 72 65  Set to the curre
5050: 6e 74 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  nt offset within
5060: 20 72 65 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a   record pData..*
5070: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c 69  /.struct Fts5Dli
5080: 64 78 4c 76 6c 20 7b 0a 20 20 46 74 73 35 44 61  dxLvl {.  Fts5Da
5090: 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  ta *pData;      
50a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
50b0: 66 6f 72 20 63 75 72 72 65 6e 74 20 70 61 67 65  for current page
50c0: 20 6f 66 20 74 68 69 73 20 6c 65 76 65 6c 20 2a   of this level *
50d0: 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20  /.  int iOff;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50f0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66    /* Current off
5100: 73 65 74 20 69 6e 74 6f 20 70 44 61 74 61 20 2a  set into pData *
5110: 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20  /.  int bEof;   
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5130: 20 20 2f 2a 20 41 74 20 45 4f 46 20 61 6c 72 65    /* At EOF alre
5140: 61 64 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  ady */.  int iFi
5150: 72 73 74 4f 66 66 3b 20 20 20 20 20 20 20 20 20  rstOff;         
5160: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62         /* Used b
5170: 79 20 72 65 76 65 72 73 65 20 69 74 65 72 61 74  y reverse iterat
5180: 6f 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74  ors */..  /* Out
5190: 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f  put variables */
51a0: 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
51b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
51c0: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
51d0: 6f 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  of current leaf 
51e0: 70 61 67 65 20 2a 2f 0a 20 20 69 36 34 20 69 52  page */.  i64 iR
51f0: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
5200: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
5210: 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 69   rowid on leaf i
5220: 4c 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73  LeafPgno */.};.s
5230: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
5240: 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c  ter {.  int nLvl
5250: 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a  ;.  int iSegid;.
5260: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 61    Fts5DlidxLvl a
5270: 4c 76 6c 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74 61 74  Lvl[1];.};..stat
5280: 69 63 20 76 6f 69 64 20 66 74 73 35 50 75 74 55  ic void fts5PutU
5290: 31 36 28 75 38 20 2a 61 4f 75 74 2c 20 75 31 36  16(u8 *aOut, u16
52a0: 20 69 56 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30   iVal){.  aOut[0
52b0: 5d 20 3d 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20  ] = (iVal>>8);. 
52c0: 20 61 4f 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c   aOut[1] = (iVal
52d0: 26 30 78 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69  &0xFF);.}..stati
52e0: 63 20 75 31 36 20 66 74 73 35 47 65 74 55 31 36  c u16 fts5GetU16
52f0: 28 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b  (const u8 *aIn){
5300: 0a 20 20 72 65 74 75 72 6e 20 28 28 75 31 36 29  .  return ((u16)
5310: 61 49 6e 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61  aIn[0] << 8) + a
5320: 49 6e 5b 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a 2a 2a  In[1];.} ../*.**
5330: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   Allocate and re
5340: 74 75 72 6e 20 61 20 62 75 66 66 65 72 20 61 74  turn a buffer at
5350: 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79 74   least nByte byt
5360: 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
5370: 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
5380: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
5390: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
53a0: 64 20 73 65 74 20 74 68 65 20 65 72 72 6f 72 20  d set the error 
53b0: 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46  code in.** the F
53c0: 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 20  ts5Index handle 
53d0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
53e0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  rst argument..*/
53f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74  .static void *ft
5400: 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35  s5IdxMalloc(Fts5
5410: 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 42  Index *p, int nB
5420: 79 74 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  yte){.  return s
5430: 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
5440: 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79  Zero(&p->rc, nBy
5450: 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  te);.}../*.** Co
5460: 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  mpare the conten
5470: 74 73 20 6f 66 20 74 68 65 20 70 4c 65 66 74 20  ts of the pLeft 
5480: 62 75 66 66 65 72 20 77 69 74 68 20 74 68 65 20  buffer with the 
5490: 70 52 69 67 68 74 2f 6e 52 69 67 68 74 20 62 6c  pRight/nRight bl
54a0: 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ob..**.** Return
54b0: 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69 73   -ve if pLeft is
54c0: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 52   smaller than pR
54d0: 69 67 68 74 2c 20 30 20 69 66 20 74 68 65 79 20  ight, 0 if they 
54e0: 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20  are equal or.** 
54f0: 2b 76 65 20 69 66 20 70 52 69 67 68 74 20 69 73  +ve if pRight is
5500: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c   smaller than pL
5510: 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  eft. In other wo
5520: 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  rds:.**.**     r
5530: 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70  es = *pLeft - *p
5540: 52 69 67 68 74 0a 2a 2f 0a 23 69 66 64 65 66 20  Right.*/.#ifdef 
5550: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
5560: 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66 66  tic int fts5Buff
5570: 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20  erCompareBlob(. 
5580: 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65   Fts5Buffer *pLe
5590: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
55a0: 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73 69   /* Left hand si
55b0: 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  de of comparison
55c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
55d0: 70 52 69 67 68 74 2c 20 69 6e 74 20 6e 52 69 67  pRight, int nRig
55e0: 68 74 20 20 20 20 2f 2a 20 52 69 67 68 74 20 68  ht    /* Right h
55f0: 61 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d 70  and side of comp
5600: 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69  arison */.){.  i
5610: 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c  nt nCmp = MIN(pL
5620: 65 66 74 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b  eft->n, nRight);
5630: 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d  .  int res = mem
5640: 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52  cmp(pLeft->p, pR
5650: 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72  ight, nCmp);.  r
5660: 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20  eturn (res==0 ? 
5670: 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67  (pLeft->n - nRig
5680: 68 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 23 65  ht) : res);.}.#e
5690: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ndif../*.** Comp
56a0: 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  are the contents
56b0: 20 6f 66 20 74 68 65 20 74 77 6f 20 62 75 66 66   of the two buff
56c0: 65 72 73 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70  ers using memcmp
56d0: 28 29 2e 20 49 66 20 6f 6e 65 20 62 75 66 66 65  (). If one buffe
56e0: 72 0a 2a 2a 20 69 73 20 61 20 70 72 65 66 69 78  r.** is a prefix
56f0: 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20 69   of the other, i
5700: 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  t is considered 
5710: 74 68 65 20 6c 65 73 73 65 72 2e 0a 2a 2a 0a 2a  the lesser..**.*
5720: 2a 20 52 65 74 75 72 6e 20 2d 76 65 20 69 66 20  * Return -ve if 
5730: 70 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c 65 72  pLeft is smaller
5740: 20 74 68 61 6e 20 70 52 69 67 68 74 2c 20 30 20   than pRight, 0 
5750: 69 66 20 74 68 65 79 20 61 72 65 20 65 71 75 61  if they are equa
5760: 6c 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70  l or.** +ve if p
5770: 52 69 67 68 74 20 69 73 20 73 6d 61 6c 6c 65 72  Right is smaller
5780: 20 74 68 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20   than pLeft. In 
5790: 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a  other words:.**.
57a0: 2a 2a 20 20 20 20 20 72 65 73 20 3d 20 2a 70 4c  **     res = *pL
57b0: 65 66 74 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f  eft - *pRight.*/
57c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
57d0: 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28 46 74  BufferCompare(Ft
57e0: 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66 74 2c  s5Buffer *pLeft,
57f0: 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 52 69   Fts5Buffer *pRi
5800: 67 68 74 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70  ght){.  int nCmp
5810: 20 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c   = MIN(pLeft->n,
5820: 20 70 52 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 69   pRight->n);.  i
5830: 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28  nt res = memcmp(
5840: 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67 68 74  pLeft->p, pRight
5850: 2d 3e 70 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65  ->p, nCmp);.  re
5860: 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28  turn (res==0 ? (
5870: 70 4c 65 66 74 2d 3e 6e 20 2d 20 70 52 69 67 68  pLeft->n - pRigh
5880: 74 2d 3e 6e 29 20 3a 20 72 65 73 29 3b 0a 7d 0a  t->n) : res);.}.
5890: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
58a0: 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
58b0: 28 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66  (Fts5Data *pLeaf
58c0: 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20  ){.  int ret;.  
58d0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
58e0: 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d  &pLeaf->p[pLeaf-
58f0: 3e 73 7a 4c 65 61 66 5d 2c 20 72 65 74 29 3b 0a  >szLeaf], ret);.
5900: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
5910: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
5920: 20 72 65 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20   read-only blob 
5930: 68 61 6e 64 6c 65 2c 20 69 66 20 69 74 20 69 73  handle, if it is
5940: 20 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63   open..*/.static
5950: 20 76 6f 69 64 20 66 74 73 35 43 6c 6f 73 65 52   void fts5CloseR
5960: 65 61 64 65 72 28 46 74 73 35 49 6e 64 65 78 20  eader(Fts5Index 
5970: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52  *p){.  if( p->pR
5980: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  eader ){.    sql
5990: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64  ite3_blob *pRead
59a0: 65 72 20 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b  er = p->pReader;
59b0: 0a 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20  .    p->pReader 
59c0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
59d0: 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61  _blob_close(pRea
59e0: 64 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  der);.  }.}.../*
59f0: 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 72  .** Retrieve a r
5a00: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 25  ecord from the %
5a10: 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a  _data table..**.
5a20: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
5a30: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
5a40: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
5a50: 72 72 6f 72 20 6c 65 66 74 20 69 6e 20 74 68 65  rror left in the
5a60: 20 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 6f   .** Fts5Index o
5a70: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
5a80: 20 46 74 73 35 44 61 74 61 20 2a 66 74 73 35 44   Fts5Data *fts5D
5a90: 61 74 61 52 65 61 64 28 46 74 73 35 49 6e 64 65  ataRead(Fts5Inde
5aa0: 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64  x *p, i64 iRowid
5ab0: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
5ac0: 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Ret = 0;.  if( p
5ad0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
5ae0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
5af0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20  SQLITE_OK;..    
5b00: 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 20 29  if( p->pReader )
5b10: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
5b20: 63 61 6c 6c 20 6d 61 79 20 72 65 74 75 72 6e 20  call may return 
5b30: 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 69 66 20  SQLITE_ABORT if 
5b40: 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 61  there has been a
5b50: 20 73 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 20   savepoint.     
5b60: 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 73 69 6e   ** rollback sin
5b70: 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 75  ce it was last u
5b80: 73 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  sed. In this cas
5b90: 65 20 61 20 6e 65 77 20 62 6c 6f 62 20 68 61 6e  e a new blob han
5ba0: 64 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  dle.      ** is 
5bb0: 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20  required.  */.  
5bc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
5bd0: 20 2a 70 42 6c 6f 62 20 3d 20 70 2d 3e 70 52 65   *pBlob = p->pRe
5be0: 61 64 65 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  ader;.      p->p
5bf0: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  Reader = 0;.    
5c00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
5c10: 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 42 6c 6f 62  lob_reopen(pBlob
5c20: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , iRowid);.     
5c30: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65 61   assert( p->pRea
5c40: 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  der==0 );.      
5c50: 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 70 42 6c  p->pReader = pBl
5c60: 6f 62 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ob;.      if( rc
5c70: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
5c80: 20 20 20 20 20 20 20 66 74 73 35 43 6c 6f 73 65         fts5Close
5c90: 52 65 61 64 65 72 28 70 29 3b 0a 20 20 20 20 20  Reader(p);.     
5ca0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
5cb0: 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 29 20  =SQLITE_ABORT ) 
5cc0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5cd0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
5ce0: 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65   the blob handle
5cf0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 61 74 20   is not open at 
5d00: 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 70 65 6e  this point, open
5d10: 20 69 74 20 61 6e 64 20 73 65 65 6b 20 0a 20 20   it and seek .  
5d20: 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 65 71 75    ** to the requ
5d30: 65 73 74 65 64 20 65 6e 74 72 79 2e 20 20 2a 2f  ested entry.  */
5d40: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65 61  .    if( p->pRea
5d50: 64 65 72 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51  der==0 && rc==SQ
5d60: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
5d70: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
5d80: 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
5d90: 67 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  g;.      rc = sq
5da0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28  lite3_blob_open(
5db0: 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 0a 20 20  pConfig->db, .  
5dc0: 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d          pConfig-
5dd0: 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62  >zDb, p->zDataTb
5de0: 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20 69 52 6f 77  l, "block", iRow
5df0: 69 64 2c 20 30 2c 20 26 70 2d 3e 70 52 65 61 64  id, 0, &p->pRead
5e00: 65 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  er.      );.    
5e10: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 69 74  }..    /* If eit
5e20: 68 65 72 20 6f 66 20 74 68 65 20 73 71 6c 69 74  her of the sqlit
5e30: 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 29 20 6f  e3_blob_open() o
5e40: 72 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  r sqlite3_blob_r
5e50: 65 6f 70 65 6e 28 29 20 63 61 6c 6c 73 0a 20 20  eopen() calls.  
5e60: 20 20 2a 2a 20 61 62 6f 76 65 20 72 65 74 75 72    ** above retur
5e70: 6e 65 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  ned SQLITE_ERROR
5e80: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
5e90: 43 4f 52 52 55 50 54 5f 56 54 41 42 20 69 6e 73  CORRUPT_VTAB ins
5ea0: 74 65 61 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 6c  tead..    ** All
5eb0: 20 74 68 65 20 72 65 61 73 6f 6e 73 20 74 68 6f   the reasons tho
5ec0: 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 6d 69 67  se functions mig
5ed0: 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ht return SQLITE
5ee0: 5f 45 52 52 4f 52 20 2d 20 6d 69 73 73 69 6e 67  _ERROR - missing
5ef0: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2c 20 6d  .    ** table, m
5f00: 69 73 73 69 6e 67 20 72 6f 77 2c 20 6e 6f 6e 2d  issing row, non-
5f10: 62 6c 6f 62 2f 74 65 78 74 20 69 6e 20 62 6c 6f  blob/text in blo
5f20: 63 6b 20 63 6f 6c 75 6d 6e 20 2d 20 69 6e 64 69  ck column - indi
5f30: 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 62 61 63  cate .    ** bac
5f40: 6b 69 6e 67 20 73 74 6f 72 65 20 63 6f 72 72 75  king store corru
5f50: 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 69  ption.  */.    i
5f60: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52  f( rc==SQLITE_ER
5f70: 52 4f 52 20 29 20 72 63 20 3d 20 46 54 53 35 5f  ROR ) rc = FTS5_
5f80: 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20 69 66  CORRUPT;..    if
5f90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5fa0: 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 4f 75  ){.      u8 *aOu
5fb0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
5fc0: 20 20 20 20 20 2f 2a 20 52 65 61 64 20 62 6c 6f       /* Read blo
5fd0: 62 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73  b data into this
5fe0: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 20   buffer */.     
5ff0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71 6c   int nByte = sql
6000: 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28  ite3_blob_bytes(
6010: 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20 20 20  p->pReader);.   
6020: 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20     int nAlloc = 
6030: 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29  sizeof(Fts5Data)
6040: 20 2b 20 6e 42 79 74 65 20 2b 20 46 54 53 35 5f   + nByte + FTS5_
6050: 44 41 54 41 5f 50 41 44 44 49 4e 47 3b 0a 20 20  DATA_PADDING;.  
6060: 20 20 20 20 70 52 65 74 20 3d 20 28 46 74 73 35      pRet = (Fts5
6070: 44 61 74 61 2a 29 73 71 6c 69 74 65 33 5f 6d 61  Data*)sqlite3_ma
6080: 6c 6c 6f 63 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20  lloc(nAlloc);.  
6090: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
60a0: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 6e          pRet->nn
60b0: 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   = nByte;.      
60c0: 20 20 61 4f 75 74 20 3d 20 70 52 65 74 2d 3e 70    aOut = pRet->p
60d0: 20 3d 20 28 75 38 2a 29 26 70 52 65 74 5b 31 5d   = (u8*)&pRet[1]
60e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
60f0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
6100: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
6110: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  }..      if( rc=
6120: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6130: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6140: 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e  e3_blob_read(p->
6150: 70 52 65 61 64 65 72 2c 20 61 4f 75 74 2c 20 6e  pReader, aOut, n
6160: 42 79 74 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Byte, 0);.      
6170: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
6180: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6190: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
61a0: 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20  e(pRet);.       
61b0: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20   pRet = 0;.     
61c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
61d0: 2f 2a 20 54 4f 44 4f 31 3a 20 46 69 78 20 74 68  /* TODO1: Fix th
61e0: 69 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 52  is */.        pR
61f0: 65 74 2d 3e 73 7a 4c 65 61 66 20 3d 20 66 74 73  et->szLeaf = fts
6200: 35 47 65 74 55 31 36 28 26 70 52 65 74 2d 3e 70  5GetU16(&pRet->p
6210: 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [2]);.      }.  
6220: 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20    }.    p->rc = 
6230: 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 61 64  rc;.    p->nRead
6240: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ++;.  }..  asser
6250: 74 28 20 28 70 52 65 74 3d 3d 30 29 3d 3d 28 70  t( (pRet==0)==(p
6260: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  ->rc!=SQLITE_OK)
6270: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65   );.  return pRe
6280: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  t;.}../*.** Rele
6290: 61 73 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ase a reference 
62a0: 74 6f 20 64 61 74 61 20 72 65 63 6f 72 64 20 72  to data record r
62b0: 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61  eturned by an ea
62c0: 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a  rlier call to.**
62d0: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 29 2e   fts5DataRead().
62e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
62f0: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
6300: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 29  Fts5Data *pData)
6310: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  {.  sqlite3_free
6320: 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 73 74 61 74  (pData);.}..stat
6330: 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78  ic int fts5Index
6340: 50 72 65 70 61 72 65 53 74 6d 74 28 0a 20 20 46  PrepareStmt(.  F
6350: 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 73  ts5Index *p,.  s
6360: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
6370: 53 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a 7a 53  Stmt,.  char *zS
6380: 71 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  ql.){.  if( p->r
6390: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
63a0: 20 20 20 20 69 66 28 20 7a 53 71 6c 20 29 7b 0a      if( zSql ){.
63b0: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
63c0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
63d0: 28 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 64 62 2c  (p->pConfig->db,
63e0: 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d   zSql, -1, ppStm
63f0: 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, 0);.    }else
6400: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
6410: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6420: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
6430: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
6440: 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
6450: 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53 45 52 54 20 4f  ../*.** INSERT O
6460: 52 20 52 45 50 4c 41 43 45 20 61 20 72 65 63 6f  R REPLACE a reco
6470: 72 64 20 69 6e 74 6f 20 74 68 65 20 25 5f 64 61  rd into the %_da
6480: 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ta table..*/.sta
6490: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74  tic void fts5Dat
64a0: 61 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78  aWrite(Fts5Index
64b0: 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 2c   *p, i64 iRowid,
64c0: 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61   const u8 *pData
64d0: 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20  , int nData){.  
64e0: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
64f0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a  E_OK ) return;..
6500: 20 20 69 66 28 20 70 2d 3e 70 57 72 69 74 65 72    if( p->pWriter
6510: 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43  ==0 ){.    Fts5C
6520: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
6530: 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
6540: 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
6550: 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 57 72  eStmt(p, &p->pWr
6560: 69 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70  iter, sqlite3_mp
6570: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
6580: 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27   "REPLACE INTO '
6590: 25 71 27 2e 27 25 71 5f 64 61 74 61 27 28 69 64  %q'.'%q_data'(id
65a0: 2c 20 62 6c 6f 63 6b 29 20 56 41 4c 55 45 53 28  , block) VALUES(
65b0: 3f 2c 3f 29 22 2c 20 0a 20 20 20 20 20 20 20 20  ?,?)", .        
65c0: 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
65d0: 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
65e0: 20 20 20 29 29 3b 0a 20 20 20 20 69 66 28 20 70     ));.    if( p
65f0: 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->rc ) return;. 
6600: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 69   }..  sqlite3_bi
6610: 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 57 72 69  nd_int64(p->pWri
6620: 74 65 72 2c 20 31 2c 20 69 52 6f 77 69 64 29 3b  ter, 1, iRowid);
6630: 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
6640: 62 6c 6f 62 28 70 2d 3e 70 57 72 69 74 65 72 2c  blob(p->pWriter,
6650: 20 32 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61   2, pData, nData
6660: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
6670: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
6680: 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20  (p->pWriter);.  
6690: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
66a0: 72 65 73 65 74 28 70 2d 3e 70 57 72 69 74 65 72  reset(p->pWriter
66b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
66c0: 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ute the followin
66d0: 67 20 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  g SQL:.**.**    
66e0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64   DELETE FROM %_d
66f0: 61 74 61 20 57 48 45 52 45 20 69 64 20 42 45 54  ata WHERE id BET
6700: 57 45 45 4e 20 24 69 46 69 72 73 74 20 41 4e 44  WEEN $iFirst AND
6710: 20 24 69 4c 61 73 74 0a 2a 2f 0a 73 74 61 74 69   $iLast.*/.stati
6720: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 44  c void fts5DataD
6730: 65 6c 65 74 65 28 46 74 73 35 49 6e 64 65 78 20  elete(Fts5Index 
6740: 2a 70 2c 20 69 36 34 20 69 46 69 72 73 74 2c 20  *p, i64 iFirst, 
6750: 69 36 34 20 69 4c 61 73 74 29 7b 0a 20 20 69 66  i64 iLast){.  if
6760: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
6770: 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  OK ) return;..  
6780: 69 66 28 20 70 2d 3e 70 44 65 6c 65 74 65 72 3d  if( p->pDeleter=
6790: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  =0 ){.    int rc
67a0: 3b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  ;.    Fts5Config
67b0: 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
67c0: 43 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68 61 72  Config;.    char
67d0: 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33   *zSql = sqlite3
67e0: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
67f0: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27    "DELETE FROM '
6800: 25 71 27 2e 27 25 71 5f 64 61 74 61 27 20 57 48  %q'.'%q_data' WH
6810: 45 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64  ERE id>=? AND id
6820: 3c 3d 3f 22 2c 20 0a 20 20 20 20 20 20 20 20 20  <=?", .         
6830: 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
6840: 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20  Config->zName.  
6850: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71    );.    if( zSq
6860: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l==0 ){.      rc
6870: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
6880: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6890: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
68a0: 72 65 70 61 72 65 5f 76 32 28 70 43 6f 6e 66 69  repare_v2(pConfi
68b0: 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  g->db, zSql, -1,
68c0: 20 26 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 30   &p->pDeleter, 0
68d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
68e0: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
68f0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
6900: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6910: 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
6920: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
6930: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
6940: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70  _bind_int64(p->p
6950: 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 46 69 72  Deleter, 1, iFir
6960: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  st);.  sqlite3_b
6970: 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65  ind_int64(p->pDe
6980: 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61 73 74 29  leter, 2, iLast)
6990: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
69a0: 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20  (p->pDeleter);. 
69b0: 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
69c0: 5f 72 65 73 65 74 28 70 2d 3e 70 44 65 6c 65 74  _reset(p->pDelet
69d0: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
69e0: 6d 6f 76 65 20 61 6c 6c 20 72 65 63 6f 72 64 73  move all records
69f0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6a00: 20 73 65 67 6d 65 6e 74 20 69 53 65 67 69 64 2e   segment iSegid.
6a10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6a20: 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65  fts5DataRemoveSe
6a30: 67 6d 65 6e 74 28 46 74 73 35 49 6e 64 65 78 20  gment(Fts5Index 
6a40: 2a 70 2c 20 69 6e 74 20 69 53 65 67 69 64 29 7b  *p, int iSegid){
6a50: 0a 20 20 69 36 34 20 69 46 69 72 73 74 20 3d 20  .  i64 iFirst = 
6a60: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
6a70: 49 44 28 69 53 65 67 69 64 2c 20 30 29 3b 0a 20  ID(iSegid, 0);. 
6a80: 20 69 36 34 20 69 4c 61 73 74 20 3d 20 46 54 53   i64 iLast = FTS
6a90: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
6aa0: 69 53 65 67 69 64 2b 31 2c 20 30 29 2d 31 3b 0a  iSegid+1, 0)-1;.
6ab0: 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65    fts5DataDelete
6ac0: 28 70 2c 20 69 46 69 72 73 74 2c 20 69 4c 61 73  (p, iFirst, iLas
6ad0: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 49 64  t);.  if( p->pId
6ae0: 78 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20  xDeleter==0 ){. 
6af0: 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
6b00: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
6b10: 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64  fig;.    fts5Ind
6b20: 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c  exPrepareStmt(p,
6b30: 20 26 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72   &p->pIdxDeleter
6b40: 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  , sqlite3_mprint
6b50: 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 44 45  f(.          "DE
6b60: 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 27  LETE FROM '%q'.'
6b70: 25 71 5f 69 64 78 27 20 57 48 45 52 45 20 73 65  %q_idx' WHERE se
6b80: 67 69 64 3d 3f 22 2c 0a 20 20 20 20 20 20 20 20  gid=?",.        
6b90: 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
6ba0: 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
6bb0: 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28     ));.  }.  if(
6bc0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
6bd0: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
6be0: 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64  _bind_int(p->pId
6bf0: 78 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 53 65  xDeleter, 1, iSe
6c00: 67 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  gid);.    sqlite
6c10: 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78 44 65  3_step(p->pIdxDe
6c20: 6c 65 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72  leter);.    p->r
6c30: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
6c40: 74 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72  t(p->pIdxDeleter
6c50: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6c60: 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65  Release a refere
6c70: 6e 63 65 20 74 6f 20 61 6e 20 46 74 73 35 53 74  nce to an Fts5St
6c80: 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 72  ructure object r
6c90: 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61  eturned by an ea
6ca0: 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20 74  rlier .** call t
6cb0: 6f 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  o fts5StructureR
6cc0: 65 61 64 28 29 20 6f 72 20 66 74 73 35 53 74 72  ead() or fts5Str
6cd0: 75 63 74 75 72 65 44 65 63 6f 64 65 28 29 2e 0a  uctureDecode()..
6ce0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
6cf0: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
6d00: 61 73 65 28 46 74 73 35 53 74 72 75 63 74 75 72  ase(Fts5Structur
6d10: 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
6d20: 66 28 20 70 53 74 72 75 63 74 20 26 26 20 30 3e  f( pStruct && 0>
6d30: 3d 28 2d 2d 70 53 74 72 75 63 74 2d 3e 6e 52 65  =(--pStruct->nRe
6d40: 66 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  f) ){.    int i;
6d50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
6d60: 72 75 63 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  ruct->nRef==0 );
6d70: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6d80: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
6d90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
6da0: 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75 63  ite3_free(pStruc
6db0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65  t->aLevel[i].aSe
6dc0: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  g);.    }.    sq
6dd0: 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75  lite3_free(pStru
6de0: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ct);.  }.}..stat
6df0: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
6e00: 63 74 75 72 65 52 65 66 28 46 74 73 35 53 74 72  ctureRef(Fts5Str
6e10: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
6e20: 7b 0a 20 20 70 53 74 72 75 63 74 2d 3e 6e 52 65  {.  pStruct->nRe
6e30: 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  f++;.}../*.** De
6e40: 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65  serialize and re
6e50: 74 75 72 6e 20 74 68 65 20 73 74 72 75 63 74 75  turn the structu
6e60: 72 65 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e  re record curren
6e70: 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 73 65  tly stored in se
6e80: 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72 6d  rialized.** form
6e90: 20 77 69 74 68 69 6e 20 62 75 66 66 65 72 20 70   within buffer p
6ea0: 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a 2a  Data/nData..**.*
6eb0: 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63 74  * The Fts5Struct
6ec0: 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64  ure.aLevel[] and
6ed0: 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63 74   each Fts5Struct
6ee0: 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20  ureLevel.aSeg[] 
6ef0: 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65  array.** are ove
6f00: 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 6f  r-allocated by o
6f10: 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73 20 61 6c  ne slot. This al
6f20: 6c 6f 77 73 20 74 68 65 20 73 74 72 75 63 74 75  lows the structu
6f30: 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 74  re contents.** t
6f40: 6f 20 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79  o be more easily
6f50: 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   edited..**.** I
6f60: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
6f70: 73 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74  s, *ppOut is set
6f80: 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20   to NULL and an 
6f90: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
6fa0: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f  e.** returned. O
6fb0: 74 68 65 72 77 69 73 65 2c 20 2a 70 70 4f 75 74  therwise, *ppOut
6fc0: 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
6fd0: 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65   to the new obje
6fe0: 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ct and.** SQLITE
6ff0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
7000: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
7010: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
7020: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61  .  const u8 *pDa
7030: 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
7040: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
7050: 74 61 69 6e 69 6e 67 20 73 65 72 69 61 6c 69 7a  taining serializ
7060: 65 64 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ed structure */.
7070: 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20    int nData,    
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
70a0: 66 65 72 20 70 44 61 74 61 20 69 6e 20 62 79 74  fer pData in byt
70b0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43  es */.  int *piC
70c0: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20 20 20 20  ookie,          
70d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
70e0: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
70f0: 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74 73 35 53  value */.  Fts5S
7100: 74 72 75 63 74 75 72 65 20 2a 2a 70 70 4f 75 74  tructure **ppOut
7110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
7120: 54 3a 20 44 65 73 65 72 69 61 6c 69 7a 65 64 20  T: Deserialized 
7130: 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69  object */.){.  i
7140: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
7150: 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  K;.  int i = 0;.
7160: 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 69 6e    int iLvl;.  in
7170: 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20  t nLevel = 0;.  
7180: 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30  int nSegment = 0
7190: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  ;.  int nByte;  
71a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71b0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
71c0: 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
71d0: 65 20 61 74 20 70 52 65 74 20 2a 2f 0a 20 20 46  e at pRet */.  F
71e0: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 52  ts5Structure *pR
71f0: 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  et = 0;        /
7200: 2a 20 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65  * Structure obje
7210: 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ct to return */.
7220: 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 63  .  /* Grab the c
7230: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20  ookie value */. 
7240: 20 69 66 28 20 70 69 43 6f 6f 6b 69 65 20 29 20   if( piCookie ) 
7250: 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c 69  *piCookie = sqli
7260: 74 65 33 46 74 73 35 47 65 74 33 32 28 70 44 61  te3Fts5Get32(pDa
7270: 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b 0a 0a 20  ta);.  i = 4;.. 
7280: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 74 6f 74   /* Read the tot
7290: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76  al number of lev
72a0: 65 6c 73 20 61 6e 64 20 73 65 67 6d 65 6e 74 73  els and segments
72b0: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
72c0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 74 72 75  of the.  ** stru
72d0: 63 74 75 72 65 20 72 65 63 6f 72 64 2e 20 20 2a  cture record.  *
72e0: 2f 0a 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74  /.  i += fts5Get
72f0: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
7300: 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20 20 69  i], nLevel);.  i
7310: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
7320: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e  t32(&pData[i], n
7330: 53 65 67 6d 65 6e 74 29 3b 0a 20 20 6e 42 79 74  Segment);.  nByt
7340: 65 20 3d 20 28 0a 20 20 20 20 20 20 73 69 7a 65  e = (.      size
7350: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
7360: 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) +             
7370: 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73         /* Main s
7380: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
7390: 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72    sizeof(Fts5Str
73a0: 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28  uctureLevel) * (
73b0: 6e 4c 65 76 65 6c 2d 31 29 20 20 20 20 2f 2a 20  nLevel-1)    /* 
73c0: 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a  aLevel[] array *
73d0: 2f 0a 20 20 29 3b 0a 20 20 70 52 65 74 20 3d 20  /.  );.  pRet = 
73e0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29  (Fts5Structure*)
73f0: 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
7400: 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65  cZero(&rc, nByte
7410: 29 3b 0a 0a 20 20 69 66 28 20 70 52 65 74 20 29  );..  if( pRet )
7420: 7b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 52 65 66  {.    pRet->nRef
7430: 20 3d 20 31 3b 0a 20 20 20 20 70 52 65 74 2d 3e   = 1;.    pRet->
7440: 6e 4c 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b  nLevel = nLevel;
7450: 0a 20 20 20 20 70 52 65 74 2d 3e 6e 53 65 67 6d  .    pRet->nSegm
7460: 65 6e 74 20 3d 20 6e 53 65 67 6d 65 6e 74 3b 0a  ent = nSegment;.
7470: 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33      i += sqlite3
7480: 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  Fts5GetVarint(&p
7490: 44 61 74 61 5b 69 5d 2c 20 26 70 52 65 74 2d 3e  Data[i], &pRet->
74a0: 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a  nWriteCounter);.
74b0: 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
74c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
74d0: 26 20 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69  & iLvl<nLevel; i
74e0: 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  Lvl++){.      Ft
74f0: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7500: 20 2a 70 4c 76 6c 20 3d 20 26 70 52 65 74 2d 3e   *pLvl = &pRet->
7510: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
7520: 20 20 20 20 69 6e 74 20 6e 54 6f 74 61 6c 3b 0a      int nTotal;.
7530: 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 3b 0a        int iSeg;.
7540: 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 44  .      if( i>=nD
7550: 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ata ){.        r
7560: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
7570: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7580: 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35         i += fts5
7590: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
75a0: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e 4d 65  ta[i], pLvl->nMe
75b0: 72 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 20  rge);.        i 
75c0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
75d0: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 54  32(&pData[i], nT
75e0: 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 61  otal);.        a
75f0: 73 73 65 72 74 28 20 6e 54 6f 74 61 6c 3e 3d 70  ssert( nTotal>=p
7600: 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 3b 0a 20  Lvl->nMerge );. 
7610: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65         pLvl->aSe
7620: 67 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75  g = (Fts5Structu
7630: 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74  reSegment*)sqlit
7640: 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
7650: 28 26 72 63 2c 20 0a 20 20 20 20 20 20 20 20 20  (&rc, .         
7660: 20 20 20 6e 54 6f 74 61 6c 20 2a 20 73 69 7a 65     nTotal * size
7670: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
7680: 53 65 67 6d 65 6e 74 29 0a 20 20 20 20 20 20 20  Segment).       
7690: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
76a0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
76b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
76c0: 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 54 6f  pLvl->nSeg = nTo
76d0: 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  tal;.        for
76e0: 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 6e 54  (iSeg=0; iSeg<nT
76f0: 6f 74 61 6c 3b 20 69 53 65 67 2b 2b 29 7b 0a 20  otal; iSeg++){. 
7700: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d           if( i>=
7710: 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  nData ){.       
7720: 20 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f 43       rc = FTS5_C
7730: 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
7740: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7750: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7760: 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
7770: 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c  int32(&pData[i],
7780: 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67   pLvl->aSeg[iSeg
7790: 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20  ].iSegid);.     
77a0: 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65       i += fts5Ge
77b0: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
77c0: 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  [i], pLvl->aSeg[
77d0: 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29  iSeg].pgnoFirst)
77e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
77f0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
7800: 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c  (&pData[i], pLvl
7810: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e  ->aSeg[iSeg].pgn
7820: 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20  oLast);.        
7830: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
7840: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
7850: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66  TE_OK ){.      f
7860: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
7870: 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20  ase(pRet);.     
7880: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d   pRet = 0;.    }
7890: 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74 20 3d  .  }..  *ppOut =
78a0: 20 70 52 65 74 3b 0a 20 20 72 65 74 75 72 6e 20   pRet;.  return 
78b0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a  rc;.}../*.**.*/.
78c0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
78d0: 53 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65  StructureAddLeve
78e0: 6c 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35  l(int *pRc, Fts5
78f0: 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74  Structure **ppSt
7900: 72 75 63 74 29 7b 0a 20 20 69 66 28 20 2a 70 52  ruct){.  if( *pR
7910: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7920: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
7930: 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70  e *pStruct = *pp
7940: 53 74 72 75 63 74 3b 0a 20 20 20 20 69 6e 74 20  Struct;.    int 
7950: 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74  nLevel = pStruct
7960: 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 69 6e  ->nLevel;.    in
7970: 74 20 6e 42 79 74 65 20 3d 20 28 0a 20 20 20 20  t nByte = (.    
7980: 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53      sizeof(Fts5S
7990: 74 72 75 63 74 75 72 65 29 20 2b 20 20 20 20 20  tructure) +     
79a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
79b0: 4d 61 69 6e 20 73 74 72 75 63 74 75 72 65 20 2a  Main structure *
79c0: 2f 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66  /.        sizeof
79d0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65  (Fts5StructureLe
79e0: 76 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2b 31  vel) * (nLevel+1
79f0: 29 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61  )  /* aLevel[] a
7a00: 72 72 61 79 20 2a 2f 0a 20 20 20 20 29 3b 0a 0a  rray */.    );..
7a10: 20 20 20 20 70 53 74 72 75 63 74 20 3d 20 73 71      pStruct = sq
7a20: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 53  lite3_realloc(pS
7a30: 74 72 75 63 74 2c 20 6e 42 79 74 65 29 3b 0a 20  truct, nByte);. 
7a40: 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29     if( pStruct )
7a50: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  {.      memset(&
7a60: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
7a70: 6e 4c 65 76 65 6c 5d 2c 20 30 2c 20 73 69 7a 65  nLevel], 0, size
7a80: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
7a90: 4c 65 76 65 6c 29 29 3b 0a 20 20 20 20 20 20 70  Level));.      p
7aa0: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b  Struct->nLevel++
7ab0: 3b 0a 20 20 20 20 20 20 2a 70 70 53 74 72 75 63  ;.      *ppStruc
7ac0: 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 20  t = pStruct;.   
7ad0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
7ae0: 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
7af0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  M;.    }.  }.}..
7b00: 2f 2a 0a 2a 2a 20 45 78 74 65 6e 64 20 6c 65 76  /*.** Extend lev
7b10: 65 6c 20 69 4c 76 6c 20 73 6f 20 74 68 61 74 20  el iLvl so that 
7b20: 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 66 6f  there is room fo
7b30: 72 20 61 74 20 6c 65 61 73 74 20 6e 45 78 74 72  r at least nExtr
7b40: 61 20 6d 6f 72 65 0a 2a 2a 20 73 65 67 6d 65 6e  a more.** segmen
7b50: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
7b60: 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65  id fts5Structure
7b70: 45 78 74 65 6e 64 4c 65 76 65 6c 28 0a 20 20 69  ExtendLevel(.  i
7b80: 6e 74 20 2a 70 52 63 2c 20 0a 20 20 46 74 73 35  nt *pRc, .  Fts5
7b90: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
7ba0: 63 74 2c 20 0a 20 20 69 6e 74 20 69 4c 76 6c 2c  ct, .  int iLvl,
7bb0: 20 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20   .  int nExtra, 
7bc0: 0a 20 20 69 6e 74 20 62 49 6e 73 65 72 74 0a 29  .  int bInsert.)
7bd0: 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  {.  if( *pRc==SQ
7be0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
7bf0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
7c00: 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75  l *pLvl = &pStru
7c10: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
7c20: 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  ;.    Fts5Struct
7c30: 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 4e 65 77  ureSegment *aNew
7c40: 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b  ;.    int nByte;
7c50: 0a 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 70  ..    nByte = (p
7c60: 4c 76 6c 2d 3e 6e 53 65 67 20 2b 20 6e 45 78 74  Lvl->nSeg + nExt
7c70: 72 61 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  ra) * sizeof(Fts
7c80: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
7c90: 74 29 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73  t);.    aNew = s
7ca0: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
7cb0: 4c 76 6c 2d 3e 61 53 65 67 2c 20 6e 42 79 74 65  Lvl->aSeg, nByte
7cc0: 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 20  );.    if( aNew 
7cd0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e  ){.      if( bIn
7ce0: 73 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  sert==0 ){.     
7cf0: 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b     memset(&aNew[
7d00: 70 4c 76 6c 2d 3e 6e 53 65 67 5d 2c 20 30 2c 20  pLvl->nSeg], 0, 
7d10: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
7d20: 74 75 72 65 53 65 67 6d 65 6e 74 29 20 2a 20 6e  tureSegment) * n
7d30: 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 65  Extra);.      }e
7d40: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
7d50: 20 6e 4d 6f 76 65 20 3d 20 70 4c 76 6c 2d 3e 6e   nMove = pLvl->n
7d60: 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  Seg * sizeof(Fts
7d70: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
7d80: 74 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d  t);.        memm
7d90: 6f 76 65 28 26 61 4e 65 77 5b 6e 45 78 74 72 61  ove(&aNew[nExtra
7da0: 5d 2c 20 61 4e 65 77 2c 20 6e 4d 6f 76 65 29 3b  ], aNew, nMove);
7db0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
7dc0: 61 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  aNew, 0, sizeof(
7dd0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
7de0: 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29 3b  ment) * nExtra);
7df0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
7e00: 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 61 4e 65 77  Lvl->aSeg = aNew
7e10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7e20: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
7e30: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
7e40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 2c  }.}../*.** Read,
7e50: 20 64 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64   deserialize and
7e60: 20 72 65 74 75 72 6e 20 74 68 65 20 73 74 72 75   return the stru
7e70: 63 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a  cture record..**
7e80: 0a 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72 75  .** The Fts5Stru
7e90: 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61  cture.aLevel[] a
7ea0: 6e 64 20 65 61 63 68 20 46 74 73 35 53 74 72 75  nd each Fts5Stru
7eb0: 63 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b  ctureLevel.aSeg[
7ec0: 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f  ] array.** are o
7ed0: 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 61 73  ver-allocated as
7ee0: 20 64 65 73 63 72 69 62 65 64 20 66 6f 72 20 66   described for f
7ef0: 75 6e 63 74 69 6f 6e 20 66 74 73 35 53 74 72 75  unction fts5Stru
7f00: 63 74 75 72 65 44 65 63 6f 64 65 28 29 20 0a 2a  ctureDecode() .*
7f10: 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 49  * above..**.** I
7f20: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
7f30: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
7f40: 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ned and an error
7f50: 20 63 6f 64 65 20 6c 65 66 74 20 69 6e 20 74 68   code left in th
7f60: 65 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 68  e.** Fts5Index h
7f70: 61 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65 72 72  andle. If an err
7f80: 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
7f90: 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
7fa0: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
7fb0: 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
7fc0: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
7fd0: 63 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  c Fts5Structure 
7fe0: 2a 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65  *fts5StructureRe
7ff0: 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ad(Fts5Index *p)
8000: 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  {.  Fts5Config *
8010: 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
8020: 6e 66 69 67 3b 0a 20 20 46 74 73 35 53 74 72 75  nfig;.  Fts5Stru
8030: 63 74 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b  cture *pRet = 0;
8040: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
8050: 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  t to return */. 
8060: 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20   int iCookie;   
8070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8080: 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f   /* Configuratio
8090: 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 46 74  n cookie */.  Ft
80a0: 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 0a  s5Data *pData;..
80b0: 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61    pData = fts5Da
80c0: 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53  taRead(p, FTS5_S
80d0: 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 29 3b  TRUCTURE_ROWID);
80e0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72  .  if( p->rc ) r
80f0: 65 74 75 72 6e 20 30 3b 0a 20 20 2f 2a 20 54 4f  eturn 0;.  /* TO
8100: 44 4f 3a 20 44 6f 20 77 65 20 6e 65 65 64 20 74  DO: Do we need t
8110: 68 69 73 20 69 66 20 74 68 65 20 6c 65 61 66 2d  his if the leaf-
8120: 69 6e 64 65 78 20 69 73 20 61 70 70 65 6e 64 65  index is appende
8130: 64 3f 20 50 72 6f 62 61 62 6c 79 2e 2e 2e 20 2a  d? Probably... *
8140: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 44 61 74  /.  memset(&pDat
8150: 61 2d 3e 70 5b 70 44 61 74 61 2d 3e 6e 6e 5d 2c  a->p[pData->nn],
8160: 20 30 2c 20 46 54 53 35 5f 44 41 54 41 5f 50 41   0, FTS5_DATA_PA
8170: 44 44 49 4e 47 29 3b 0a 20 20 70 2d 3e 72 63 20  DDING);.  p->rc 
8180: 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  = fts5StructureD
8190: 65 63 6f 64 65 28 70 44 61 74 61 2d 3e 70 2c 20  ecode(pData->p, 
81a0: 70 44 61 74 61 2d 3e 6e 6e 2c 20 26 69 43 6f 6f  pData->nn, &iCoo
81b0: 6b 69 65 2c 20 26 70 52 65 74 29 3b 0a 20 20 69  kie, &pRet);.  i
81c0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
81d0: 5f 4f 4b 20 26 26 20 70 43 6f 6e 66 69 67 2d 3e  _OK && pConfig->
81e0: 69 43 6f 6f 6b 69 65 21 3d 69 43 6f 6f 6b 69 65  iCookie!=iCookie
81f0: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
8200: 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66 69  sqlite3Fts5Confi
8210: 67 4c 6f 61 64 28 70 43 6f 6e 66 69 67 2c 20 69  gLoad(pConfig, i
8220: 43 6f 6f 6b 69 65 29 3b 0a 20 20 7d 0a 0a 20 20  Cookie);.  }..  
8230: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
8240: 70 44 61 74 61 29 3b 0a 20 20 69 66 28 20 70 2d  pData);.  if( p-
8250: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
8260: 7b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  {.    fts5Struct
8270: 75 72 65 52 65 6c 65 61 73 65 28 70 52 65 74 29  ureRelease(pRet)
8280: 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  ;.    pRet = 0;.
8290: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
82a0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
82b0: 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
82c0: 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
82d0: 69 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  in index structu
82e0: 72 65 20 70 53 74 72 75 63 74 2e 20 54 68 69 73  re pStruct. This
82f0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
8300: 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20 61  only ever used a
8310: 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74  s part of assert
8320: 28 29 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 2a  () conditions..*
8330: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
8340: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
8350: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 43 6f   fts5StructureCo
8360: 75 6e 74 53 65 67 6d 65 6e 74 73 28 46 74 73 35  untSegments(Fts5
8370: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
8380: 63 74 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67 6d  ct){.  int nSegm
8390: 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ent = 0;        
83a0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
83b0: 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e  number of segmen
83c0: 74 73 20 2a 2f 0a 20 20 69 66 28 20 70 53 74 72  ts */.  if( pStr
83d0: 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  uct ){.    int i
83e0: 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Lvl;            
83f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
8400: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
8410: 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20  ugh levels */.  
8420: 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
8430: 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
8440: 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
8450: 20 20 20 6e 53 65 67 6d 65 6e 74 20 2b 3d 20 70     nSegment += p
8460: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
8470: 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 20 20 20 20 7d  Lvl].nSeg;.    }
8480: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e  .  }..  return n
8490: 53 65 67 6d 65 6e 74 3b 0a 7d 0a 23 65 6e 64 69  Segment;.}.#endi
84a0: 66 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42  f..#define fts5B
84b0: 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
84c0: 6c 6f 62 28 70 42 75 66 2c 20 70 42 6c 6f 62 2c  lob(pBuf, pBlob,
84d0: 20 6e 42 6c 6f 62 29 20 7b 20 20 20 20 20 5c 0a   nBlob) {     \.
84e0: 20 20 61 73 73 65 72 74 28 20 28 70 42 75 66 29    assert( (pBuf)
84f0: 2d 3e 6e 53 70 61 63 65 3e 3d 28 28 70 42 75 66  ->nSpace>=((pBuf
8500: 29 2d 3e 6e 2b 6e 42 6c 6f 62 29 20 29 3b 20 20  )->n+nBlob) );  
8510: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6d             \.  m
8520: 65 6d 63 70 79 28 26 28 70 42 75 66 29 2d 3e 70  emcpy(&(pBuf)->p
8530: 5b 28 70 42 75 66 29 2d 3e 6e 5d 2c 20 70 42 6c  [(pBuf)->n], pBl
8540: 6f 62 2c 20 6e 42 6c 6f 62 29 3b 20 20 20 20 20  ob, nBlob);     
8550: 20 20 20 20 20 20 20 20 5c 0a 20 20 28 70 42 75          \.  (pBu
8560: 66 29 2d 3e 6e 20 2b 3d 20 6e 42 6c 6f 62 3b 20  f)->n += nBlob; 
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8590: 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e       \.}..#defin
85a0: 65 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65  e fts5BufferSafe
85b0: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75  AppendVarint(pBu
85c0: 66 2c 20 69 56 61 6c 29 20 7b 20 20 20 20 20 20  f, iVal) {      
85d0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 28 70            \.  (p
85e0: 42 75 66 29 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  Buf)->n += sqlit
85f0: 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28  e3Fts5PutVarint(
8600: 26 28 70 42 75 66 29 2d 3e 70 5b 28 70 42 75 66  &(pBuf)->p[(pBuf
8610: 29 2d 3e 6e 5d 2c 20 28 69 56 61 6c 29 29 3b 20  )->n], (iVal)); 
8620: 20 5c 0a 20 20 61 73 73 65 72 74 28 20 28 70 42   \.  assert( (pB
8630: 75 66 29 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 42  uf)->nSpace>=(pB
8640: 75 66 29 2d 3e 6e 20 29 3b 20 20 20 20 20 20 20  uf)->n );       
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 20 20 20 5c 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53     \.}.../*.** S
8670: 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 73 74 6f  erialize and sto
8680: 72 65 20 74 68 65 20 22 73 74 72 75 63 74 75 72  re the "structur
8690: 65 22 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  e" record..**.**
86a0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
86b0: 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
86c0: 72 6f 72 20 63 6f 64 65 20 69 6e 20 74 68 65 20  ror code in the 
86d0: 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74  Fts5Index object
86e0: 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  . If an.** error
86f0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
8700: 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
8710: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
8720: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8730: 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69  fts5StructureWri
8740: 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  te(Fts5Index *p,
8750: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
8760: 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20  pStruct){.  if( 
8770: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
8780: 20 29 7b 0a 20 20 20 20 46 74 73 35 42 75 66 66   ){.    Fts5Buff
8790: 65 72 20 62 75 66 3b 20 20 20 20 20 20 20 20 20  er buf;         
87a0: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
87b0: 74 6f 20 73 65 72 69 61 6c 69 7a 65 20 72 65 63  to serialize rec
87c0: 6f 72 64 20 69 6e 74 6f 20 2a 2f 0a 20 20 20 20  ord into */.    
87d0: 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20  int iLvl;       
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
87f0: 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
8800: 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20   through levels 
8810: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b  */.    int iCook
8820: 69 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ie;             
8830: 20 20 20 20 20 2f 2a 20 43 6f 6f 6b 69 65 20 76       /* Cookie v
8840: 61 6c 75 65 20 74 6f 20 73 74 6f 72 65 20 2a 2f  alue to store */
8850: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ..    assert( pS
8860: 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d  truct->nSegment=
8870: 3d 66 74 73 35 53 74 72 75 63 74 75 72 65 43 6f  =fts5StructureCo
8880: 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72  untSegments(pStr
8890: 75 63 74 29 20 29 3b 0a 20 20 20 20 6d 65 6d 73  uct) );.    mems
88a0: 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65  et(&buf, 0, size
88b0: 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b  of(Fts5Buffer));
88c0: 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ..    /* Append 
88d0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 66  the current conf
88e0: 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65  iguration cookie
88f0: 20 2a 2f 0a 20 20 20 20 69 43 6f 6f 6b 69 65 20   */.    iCookie 
8900: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 69 43  = p->pConfig->iC
8910: 6f 6f 6b 69 65 3b 0a 20 20 20 20 69 66 28 20 69  ookie;.    if( i
8920: 43 6f 6f 6b 69 65 3c 30 20 29 20 69 43 6f 6f 6b  Cookie<0 ) iCook
8930: 69 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  ie = 0;..    if(
8940: 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 42   0==sqlite3Fts5B
8950: 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63  ufferSize(&p->rc
8960: 2c 20 26 62 75 66 2c 20 34 2b 39 2b 39 2b 39 29  , &buf, 4+9+9+9)
8970: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8980: 33 46 74 73 35 50 75 74 33 32 28 62 75 66 2e 70  3Fts5Put32(buf.p
8990: 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a 20 20 20 20  , iCookie);.    
89a0: 20 20 62 75 66 2e 6e 20 3d 20 34 3b 0a 20 20 20    buf.n = 4;.   
89b0: 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
89c0: 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62  eAppendVarint(&b
89d0: 75 66 2c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  uf, pStruct->nLe
89e0: 76 65 6c 29 3b 0a 20 20 20 20 20 20 66 74 73 35  vel);.      fts5
89f0: 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
8a00: 56 61 72 69 6e 74 28 26 62 75 66 2c 20 70 53 74  Varint(&buf, pSt
8a10: 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 29 3b  ruct->nSegment);
8a20: 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
8a30: 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
8a40: 74 28 26 62 75 66 2c 20 28 69 36 34 29 70 53 74  t(&buf, (i64)pSt
8a50: 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e  ruct->nWriteCoun
8a60: 74 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ter);.    }..   
8a70: 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
8a80: 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
8a90: 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
8aa0: 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20    int iSeg;     
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ac0: 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
8ad0: 74 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65  te through segme
8ae0: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 74 73  nts */.      Fts
8af0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
8b00: 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74  *pLvl = &pStruct
8b10: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
8b20: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
8b30: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
8b40: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
8b50: 3e 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20  >nMerge);.      
8b60: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
8b70: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
8b80: 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 29  buf, pLvl->nSeg)
8b90: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8ba0: 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c  pLvl->nMerge<=pL
8bb0: 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 20  vl->nSeg );..   
8bc0: 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
8bd0: 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20  Seg<pLvl->nSeg; 
8be0: 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
8bf0: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
8c00: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
8c10: 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67  &buf, pLvl->aSeg
8c20: 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a  [iSeg].iSegid);.
8c30: 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
8c40: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
8c50: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76  p->rc, &buf, pLv
8c60: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67  l->aSeg[iSeg].pg
8c70: 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  noFirst);.      
8c80: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
8c90: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
8ca0: 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65   &buf, pLvl->aSe
8cb0: 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74  g[iSeg].pgnoLast
8cc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8cd0: 0a 0a 20 20 20 20 66 74 73 35 44 61 74 61 57 72  ..    fts5DataWr
8ce0: 69 74 65 28 70 2c 20 46 54 53 35 5f 53 54 52 55  ite(p, FTS5_STRU
8cf0: 43 54 55 52 45 5f 52 4f 57 49 44 2c 20 62 75 66  CTURE_ROWID, buf
8d00: 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20 20  .p, buf.n);.    
8d10: 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
8d20: 62 75 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  buf);.  }.}..#if
8d30: 20 30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66   0.static void f
8d40: 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75 72  ts5DebugStructur
8d50: 65 28 69 6e 74 2a 2c 46 74 73 35 42 75 66 66 65  e(int*,Fts5Buffe
8d60: 72 2a 2c 46 74 73 35 53 74 72 75 63 74 75 72 65  r*,Fts5Structure
8d70: 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  *);.static void 
8d80: 66 74 73 35 50 72 69 6e 74 53 74 72 75 63 74 75  fts5PrintStructu
8d90: 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  re(const char *z
8da0: 43 61 70 74 69 6f 6e 2c 20 46 74 73 35 53 74 72  Caption, Fts5Str
8db0: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
8dc0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
8dd0: 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 42 75  ITE_OK;.  Fts5Bu
8de0: 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d 73  ffer buf;.  mems
8df0: 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65  et(&buf, 0, size
8e00: 6f 66 28 62 75 66 29 29 3b 0a 20 20 66 74 73 35  of(buf));.  fts5
8e10: 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28 26  DebugStructure(&
8e20: 72 63 2c 20 26 62 75 66 2c 20 70 53 74 72 75 63  rc, &buf, pStruc
8e30: 74 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74  t);.  fprintf(st
8e40: 64 6f 75 74 2c 20 22 25 73 3a 20 25 73 5c 6e 22  dout, "%s: %s\n"
8e50: 2c 20 7a 43 61 70 74 69 6f 6e 2c 20 62 75 66 2e  , zCaption, buf.
8e60: 70 29 3b 0a 20 20 66 66 6c 75 73 68 28 73 74 64  p);.  fflush(std
8e70: 6f 75 74 29 3b 0a 20 20 66 74 73 35 42 75 66 66  out);.  fts5Buff
8e80: 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a  erFree(&buf);.}.
8e90: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66  #else.# define f
8ea0: 74 73 35 50 72 69 6e 74 53 74 72 75 63 74 75 72  ts5PrintStructur
8eb0: 65 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 73  e(x,y).#endif..s
8ec0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 65  tatic int fts5Se
8ed0: 67 6d 65 6e 74 53 69 7a 65 28 46 74 73 35 53 74  gmentSize(Fts5St
8ee0: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
8ef0: 70 53 65 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  pSeg){.  return 
8f00: 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  1 + pSeg->pgnoLa
8f10: 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46  st - pSeg->pgnoF
8f20: 69 72 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  irst;.}../*.** R
8f30: 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66 20  eturn a copy of 
8f40: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  index structure 
8f50: 70 53 74 72 75 63 74 2e 20 45 78 63 65 70 74 2c  pStruct. Except,
8f60: 20 70 72 6f 6d 6f 74 65 20 61 73 20 6d 61 6e 79   promote as many
8f70: 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 61 73   .** segments as
8f80: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 65 76   possible to lev
8f90: 65 6c 20 69 50 72 6f 6d 6f 74 65 2e 20 49 66 20  el iPromote. If 
8fa0: 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 4e  an OOM occurs, N
8fb0: 55 4c 4c 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  ULL is .** retur
8fc0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ned..*/.static v
8fd0: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
8fe0: 65 50 72 6f 6d 6f 74 65 54 6f 28 0a 20 20 46 74  ePromoteTo(.  Ft
8ff0: 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 6e  s5Index *p,.  in
9000: 74 20 69 50 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e  t iPromote,.  in
9010: 74 20 73 7a 50 72 6f 6d 6f 74 65 2c 0a 20 20 46  t szPromote,.  F
9020: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
9030: 74 72 75 63 74 0a 29 7b 0a 20 20 69 6e 74 20 69  truct.){.  int i
9040: 6c 2c 20 69 73 3b 0a 20 20 46 74 73 35 53 74 72  l, is;.  Fts5Str
9050: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4f 75  uctureLevel *pOu
9060: 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  t = &pStruct->aL
9070: 65 76 65 6c 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a  evel[iPromote];.
9080: 0a 20 20 69 66 28 20 70 4f 75 74 2d 3e 6e 4d 65  .  if( pOut->nMe
9090: 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f  rge==0 ){.    fo
90a0: 72 28 69 6c 3d 69 50 72 6f 6d 6f 74 65 2b 31 3b  r(il=iPromote+1;
90b0: 20 69 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65   il<pStruct->nLe
90c0: 76 65 6c 3b 20 69 6c 2b 2b 29 7b 0a 20 20 20 20  vel; il++){.    
90d0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
90e0: 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53  evel *pLvl = &pS
90f0: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c  truct->aLevel[il
9100: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76  ];.      if( pLv
9110: 6c 2d 3e 6e 4d 65 72 67 65 20 29 20 72 65 74 75  l->nMerge ) retu
9120: 72 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 73  rn;.      for(is
9130: 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69  =pLvl->nSeg-1; i
9140: 73 3e 3d 30 3b 20 69 73 2d 2d 29 7b 0a 20 20 20  s>=0; is--){.   
9150: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 66 74       int sz = ft
9160: 73 35 53 65 67 6d 65 6e 74 53 69 7a 65 28 26 70  s5SegmentSize(&p
9170: 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 29 3b 0a  Lvl->aSeg[is]);.
9180: 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e 73          if( sz>s
9190: 7a 50 72 6f 6d 6f 74 65 20 29 20 72 65 74 75 72  zPromote ) retur
91a0: 6e 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  n;.        fts5S
91b0: 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65  tructureExtendLe
91c0: 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72  vel(&p->rc, pStr
91d0: 75 63 74 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 31  uct, iPromote, 1
91e0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
91f0: 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
9200: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
9210: 28 70 4f 75 74 2d 3e 61 53 65 67 2c 20 26 70 4c  (pOut->aSeg, &pL
9220: 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 2c 20 73 69  vl->aSeg[is], si
9230: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
9240: 72 65 53 65 67 6d 65 6e 74 29 29 3b 0a 20 20 20  reSegment));.   
9250: 20 20 20 20 20 70 4f 75 74 2d 3e 6e 53 65 67 2b       pOut->nSeg+
9260: 2b 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  +;.        pLvl-
9270: 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20 7d  >nSeg--;.      }
9280: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
9290: 0a 2a 2a 20 41 20 6e 65 77 20 73 65 67 6d 65 6e  .** A new segmen
92a0: 74 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  t has just been 
92b0: 77 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c  written to level
92c0: 20 69 4c 76 6c 20 6f 66 20 69 6e 64 65 78 20 73   iLvl of index s
92d0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 53 74 72  tructure.** pStr
92e0: 75 63 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69  uct. This functi
92f0: 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  on determines if
9300: 20 61 6e 79 20 73 65 67 6d 65 6e 74 73 20 73 68   any segments sh
9310: 6f 75 6c 64 20 62 65 20 70 72 6f 6d 6f 74 65 64  ould be promoted
9320: 0a 2a 2a 20 61 73 20 61 20 72 65 73 75 6c 74 2e  .** as a result.
9330: 20 53 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72   Segments are pr
9340: 6f 6d 6f 74 65 64 20 69 6e 20 74 77 6f 20 73 63  omoted in two sc
9350: 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20  enarios:.**.**  
9360: 20 61 29 20 49 66 20 74 68 65 20 73 65 67 6d 65   a) If the segme
9370: 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  nt just written 
9380: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
9390: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d  one or more segm
93a0: 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 77 69 74  ents.**      wit
93b0: 68 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73  hin the previous
93c0: 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c   populated level
93d0: 2c 20 69 74 20 69 73 20 70 72 6f 6d 6f 74 65 64  , it is promoted
93e0: 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
93f0: 0a 2a 2a 20 20 20 20 20 20 70 6f 70 75 6c 61 74  .**      populat
9400: 65 64 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20  ed level..**.** 
9410: 20 20 62 29 20 49 66 20 74 68 65 20 73 65 67 6d    b) If the segm
9420: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
9430: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
9440: 74 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65  the newest segme
9450: 6e 74 20 6f 6e 0a 2a 2a 20 20 20 20 20 20 74 68  nt on.**      th
9460: 65 20 6e 65 78 74 20 70 6f 70 75 6c 61 74 65 64  e next populated
9470: 20 6c 65 76 65 6c 2c 20 74 68 65 6e 20 74 68 61   level, then tha
9480: 74 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20 61  t segment, and a
9490: 6e 79 20 6f 74 68 65 72 20 61 64 6a 61 63 65 6e  ny other adjacen
94a0: 74 0a 2a 2a 20 20 20 20 20 20 73 65 67 6d 65 6e  t.**      segmen
94b0: 74 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f  ts that are also
94c0: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
94d0: 65 20 6f 6e 65 20 6a 75 73 74 20 77 72 69 74 74  e one just writt
94e0: 65 6e 2c 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  en, are .**     
94f0: 20 70 72 6f 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a   promoted. .**.*
9500: 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  * If one or more
9510: 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72   segments are pr
9520: 6f 6d 6f 74 65 64 2c 20 74 68 65 20 73 74 72 75  omoted, the stru
9530: 63 74 75 72 65 20 6f 62 6a 65 63 74 20 69 73 20  cture object is 
9540: 75 70 64 61 74 65 64 0a 2a 2a 20 74 6f 20 72 65  updated.** to re
9550: 66 6c 65 63 74 20 74 68 69 73 2e 0a 2a 2f 0a 73  flect this..*/.s
9560: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
9570: 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28  tructurePromote(
9580: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95a0: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
95b0: 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  nd object */.  i
95c0: 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20  nt iLvl,        
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
95e0: 2a 20 49 6e 64 65 78 20 6c 65 76 65 6c 20 6a 75  * Index level ju
95f0: 73 74 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20  st updated */.  
9600: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
9610: 53 74 72 75 63 74 20 20 20 20 20 20 20 20 20 20  Struct          
9620: 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  /* Index structu
9630: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  re */.){.  if( p
9640: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
9650: 29 7b 0a 20 20 20 20 69 6e 74 20 69 54 73 74 3b  ){.    int iTst;
9660: 0a 20 20 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74  .    int iPromot
9670: 65 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20  e = -1;.    int 
9680: 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 30 3b 20 20  szPromote = 0;  
9690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
96a0: 6d 6f 74 65 20 61 6e 79 74 68 69 6e 67 20 74 68  mote anything th
96b0: 69 73 20 73 69 7a 65 20 6f 72 20 73 6d 61 6c 6c  is size or small
96c0: 65 72 20 2a 2f 0a 20 20 20 20 46 74 73 35 53 74  er */.    Fts5St
96d0: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
96e0: 70 53 65 67 3b 20 20 20 2f 2a 20 53 65 67 6d 65  pSeg;   /* Segme
96f0: 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  nt just written 
9700: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 53 65 67  */.    int szSeg
9710: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9720: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
9730: 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69  segment just wri
9740: 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tten */.    int 
9750: 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e  nSeg = pStruct->
9760: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
9770: 67 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 65 67  g;..    if( nSeg
9780: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
9790: 20 20 70 53 65 67 20 3d 20 26 70 53 74 72 75 63    pSeg = &pStruc
97a0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
97b0: 61 53 65 67 5b 70 53 74 72 75 63 74 2d 3e 61 4c  aSeg[pStruct->aL
97c0: 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 2d  evel[iLvl].nSeg-
97d0: 31 5d 3b 0a 20 20 20 20 73 7a 53 65 67 20 3d 20  1];.    szSeg = 
97e0: 28 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  (1 + pSeg->pgnoL
97f0: 61 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f  ast - pSeg->pgno
9800: 46 69 72 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  First);..    /* 
9810: 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e 64 69 74  Check for condit
9820: 69 6f 6e 20 28 61 29 20 2a 2f 0a 20 20 20 20 66  ion (a) */.    f
9830: 6f 72 28 69 54 73 74 3d 69 4c 76 6c 2d 31 3b 20  or(iTst=iLvl-1; 
9840: 69 54 73 74 3e 3d 30 20 26 26 20 70 53 74 72 75  iTst>=0 && pStru
9850: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d  ct->aLevel[iTst]
9860: 2e 6e 53 65 67 3d 3d 30 3b 20 69 54 73 74 2d 2d  .nSeg==0; iTst--
9870: 29 3b 0a 20 20 20 20 69 66 28 20 69 54 73 74 3e  );.    if( iTst>
9880: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
9890: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 4d  i;.      int szM
98a0: 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 46 74  ax = 0;.      Ft
98b0: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
98c0: 20 2a 70 54 73 74 20 3d 20 26 70 53 74 72 75 63   *pTst = &pStruc
98d0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d 3b  t->aLevel[iTst];
98e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
98f0: 54 73 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29  Tst->nMerge==0 )
9900: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
9910: 20 69 3c 70 54 73 74 2d 3e 6e 53 65 67 3b 20 69   i<pTst->nSeg; i
9920: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
9930: 20 73 7a 20 3d 20 70 54 73 74 2d 3e 61 53 65 67   sz = pTst->aSeg
9940: 5b 69 5d 2e 70 67 6e 6f 4c 61 73 74 20 2d 20 70  [i].pgnoLast - p
9950: 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67 6e  Tst->aSeg[i].pgn
9960: 6f 46 69 72 73 74 20 2b 20 31 3b 0a 20 20 20 20  oFirst + 1;.    
9970: 20 20 20 20 69 66 28 20 73 7a 3e 73 7a 4d 61 78      if( sz>szMax
9980: 20 29 20 73 7a 4d 61 78 20 3d 20 73 7a 3b 0a 20   ) szMax = sz;. 
9990: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
99a0: 20 73 7a 4d 61 78 3e 3d 73 7a 53 65 67 20 29 7b   szMax>=szSeg ){
99b0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64  .        /* Cond
99c0: 69 74 69 6f 6e 20 28 61 29 20 69 73 20 74 72 75  ition (a) is tru
99d0: 65 2e 20 50 72 6f 6d 6f 74 65 20 74 68 65 20 6e  e. Promote the n
99e0: 65 77 65 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e  ewest segment on
99f0: 20 6c 65 76 65 6c 20 0a 20 20 20 20 20 20 20 20   level .        
9a00: 2a 2a 20 69 4c 76 6c 20 74 6f 20 6c 65 76 65 6c  ** iLvl to level
9a10: 20 69 54 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20   iTst.  */.     
9a20: 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69 54     iPromote = iT
9a30: 73 74 3b 0a 20 20 20 20 20 20 20 20 73 7a 50 72  st;.        szPr
9a40: 6f 6d 6f 74 65 20 3d 20 73 7a 4d 61 78 3b 0a 20  omote = szMax;. 
9a50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
9a60: 20 20 2f 2a 20 49 66 20 63 6f 6e 64 69 74 69 6f    /* If conditio
9a70: 6e 20 28 61 29 20 69 73 20 6e 6f 74 20 6d 65 74  n (a) is not met
9a80: 2c 20 61 73 73 75 6d 65 20 28 62 29 20 69 73 20  , assume (b) is 
9a90: 74 72 75 65 2e 20 53 74 72 75 63 74 75 72 65 50  true. StructureP
9aa0: 72 6f 6d 6f 74 65 54 6f 28 29 0a 20 20 20 20 2a  romoteTo().    *
9ab0: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  * is a no-op if 
9ac0: 69 74 20 69 73 20 6e 6f 74 2e 20 20 2a 2f 0a 20  it is not.  */. 
9ad0: 20 20 20 69 66 28 20 69 50 72 6f 6d 6f 74 65 3c     if( iPromote<
9ae0: 30 20 29 7b 0a 20 20 20 20 20 20 69 50 72 6f 6d  0 ){.      iProm
9af0: 6f 74 65 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20  ote = iLvl;.    
9b00: 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a    szPromote = sz
9b10: 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  Seg;.    }.    f
9b20: 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d  ts5StructureProm
9b30: 6f 74 65 54 6f 28 70 2c 20 69 50 72 6f 6d 6f 74  oteTo(p, iPromot
9b40: 65 2c 20 73 7a 50 72 6f 6d 6f 74 65 2c 20 70 53  e, szPromote, pS
9b50: 74 72 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  truct);.  }.}...
9b60: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
9b70: 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
9b80: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
9b90: 67 75 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 65  gument. If the e
9ba0: 6e 64 20 6f 66 20 74 68 65 20 0a 2a 2a 20 64 6f  nd of the .** do
9bb0: 63 6c 69 73 74 2d 69 6e 64 65 78 20 70 61 67 65  clist-index page
9bc0: 20 69 73 20 72 65 61 63 68 65 64 2c 20 72 65 74   is reached, ret
9bd0: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f  urn non-zero..*/
9be0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
9bf0: 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 46 74 73  DlidxLvlNext(Fts
9c00: 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29  5DlidxLvl *pLvl)
9c10: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  {.  Fts5Data *pD
9c20: 61 74 61 20 3d 20 70 4c 76 6c 2d 3e 70 44 61 74  ata = pLvl->pDat
9c30: 61 3b 0a 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e  a;..  if( pLvl->
9c40: 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  iOff==0 ){.    a
9c50: 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45 6f  ssert( pLvl->bEo
9c60: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76 6c  f==0 );.    pLvl
9c70: 2d 3e 69 4f 66 66 20 3d 20 31 3b 0a 20 20 20 20  ->iOff = 1;.    
9c80: 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66 74  pLvl->iOff += ft
9c90: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
9ca0: 44 61 74 61 2d 3e 70 5b 31 5d 2c 20 70 4c 76 6c  Data->p[1], pLvl
9cb0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20  ->iLeafPgno);.  
9cc0: 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20    pLvl->iOff += 
9cd0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  fts5GetVarint(&p
9ce0: 44 61 74 61 2d 3e 70 5b 70 4c 76 6c 2d 3e 69 4f  Data->p[pLvl->iO
9cf0: 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 4c 76 6c  ff], (u64*)&pLvl
9d00: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70  ->iRowid);.    p
9d10: 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 3d  Lvl->iFirstOff =
9d20: 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 20 20 7d   pLvl->iOff;.  }
9d30: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 4f  else{.    int iO
9d40: 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66 66  ff;.    for(iOff
9d50: 3d 70 4c 76 6c 2d 3e 69 4f 66 66 3b 20 69 4f 66  =pLvl->iOff; iOf
9d60: 66 3c 70 44 61 74 61 2d 3e 6e 6e 3b 20 69 4f 66  f<pData->nn; iOf
9d70: 66 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  f++){.      if( 
9d80: 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 20 29  pData->p[iOff] )
9d90: 20 62 72 65 61 6b 3b 20 0a 20 20 20 20 7d 0a 0a   break; .    }..
9da0: 20 20 20 20 69 66 28 20 69 4f 66 66 3c 70 44 61      if( iOff<pDa
9db0: 74 61 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 20 20  ta->nn ){.      
9dc0: 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 20 20  i64 iVal;.      
9dd0: 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  pLvl->iLeafPgno 
9de0: 2b 3d 20 28 69 4f 66 66 20 2d 20 70 4c 76 6c 2d  += (iOff - pLvl-
9df0: 3e 69 4f 66 66 29 20 2b 20 31 3b 0a 20 20 20 20  >iOff) + 1;.    
9e00: 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
9e10: 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e  tVarint(&pData->
9e20: 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  p[iOff], (u64*)&
9e30: 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 70 4c 76  iVal);.      pLv
9e40: 6c 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 56 61  l->iRowid += iVa
9e50: 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69  l;.      pLvl->i
9e60: 4f 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20  Off = iOff;.    
9e70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 76  }else{.      pLv
9e80: 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20  l->bEof = 1;.   
9e90: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
9ea0: 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a   pLvl->bEof;.}..
9eb0: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
9ec0: 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
9ed0: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
9ee0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
9ef0: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49  c int fts5DlidxI
9f00: 74 65 72 4e 65 78 74 52 28 46 74 73 35 49 6e 64  terNextR(Fts5Ind
9f10: 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78  ex *p, Fts5Dlidx
9f20: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
9f30: 20 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 6c   iLvl){.  Fts5Dl
9f40: 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26  idxLvl *pLvl = &
9f50: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c  pIter->aLvl[iLvl
9f60: 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  ];..  assert( iL
9f70: 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29  vl<pIter->nLvl )
9f80: 3b 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69 64  ;.  if( fts5Dlid
9f90: 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 20 29  xLvlNext(pLvl) )
9fa0: 7b 0a 20 20 20 20 69 66 28 20 28 69 4c 76 6c 2b  {.    if( (iLvl+
9fb0: 31 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76 6c  1) < pIter->nLvl
9fc0: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c   ){.      fts5Dl
9fd0: 69 64 78 49 74 65 72 4e 65 78 74 52 28 70 2c 20  idxIterNextR(p, 
9fe0: 70 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a  pIter, iLvl+1);.
9ff0: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 5b 31        if( pLvl[1
a000: 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20  ].bEof==0 ){.   
a010: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
a020: 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61  ease(pLvl->pData
a030: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
a040: 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pLvl, 0, sizeo
a050: 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29  f(Fts5DlidxLvl))
a060: 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e  ;.        pLvl->
a070: 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61  pData = fts5Data
a080: 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20  Read(p, .       
a090: 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f       FTS5_DLIDX_
a0a0: 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65  ROWID(pIter->iSe
a0b0: 67 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b  gid, iLvl, pLvl[
a0c0: 31 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20  1].iLeafPgno).  
a0d0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
a0e0: 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61   if( pLvl->pData
a0f0: 20 29 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e   ) fts5DlidxLvlN
a100: 65 78 74 28 70 4c 76 6c 29 3b 0a 20 20 20 20 20  ext(pLvl);.     
a110: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
a120: 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c  return pIter->aL
a130: 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74  vl[0].bEof;.}.st
a140: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
a150: 64 78 49 74 65 72 4e 65 78 74 28 46 74 73 35 49  dxIterNext(Fts5I
a160: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69  ndex *p, Fts5Dli
a170: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
a180: 20 20 72 65 74 75 72 6e 20 66 74 73 35 44 6c 69    return fts5Dli
a190: 64 78 49 74 65 72 4e 65 78 74 52 28 70 2c 20 70  dxIterNextR(p, p
a1a0: 49 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  Iter, 0);.}../*.
a1b0: 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20  ** The iterator 
a1c0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
a1d0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 68 61 73  rst argument has
a1e0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
a1f0: 69 65 6c 64 73 20 73 65 74 0a 2a 2a 20 61 73 20  ields set.** as 
a200: 66 6f 6c 6c 6f 77 73 2e 20 54 68 69 73 20 66 75  follows. This fu
a210: 6e 63 74 69 6f 6e 20 73 65 74 73 20 75 70 20 74  nction sets up t
a220: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 69  he rest of the i
a230: 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20  terator so that 
a240: 69 74 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  it.** points to 
a250: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
a260: 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  in the doclist-i
a270: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 44  ndex..**.**   pD
a280: 61 74 61 3a 0a 2a 2a 20 20 20 20 20 70 6f 69 6e  ata:.**     poin
a290: 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 2d 69  ter to doclist-i
a2a0: 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 0a 2a 2a  ndex record, .**
a2b0: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
a2c0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
a2d0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
a2e0: 6f 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  o is the page nu
a2f0: 6d 62 65 72 20 74 68 65 0a 2a 2a 20 64 6f 63 6c  mber the.** docl
a300: 69 73 74 20 69 73 20 61 73 73 6f 63 69 61 74 65  ist is associate
a310: 64 20 77 69 74 68 20 28 74 68 65 20 6f 6e 65 20  d with (the one 
a320: 66 65 61 74 75 72 69 6e 67 20 74 68 65 20 74 65  featuring the te
a330: 72 6d 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rm)..*/.static i
a340: 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  nt fts5DlidxIter
a350: 46 69 72 73 74 28 46 74 73 35 44 6c 69 64 78 49  First(Fts5DlidxI
a360: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
a370: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
a380: 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20   i<pIter->nLvl; 
a390: 69 2b 2b 29 7b 0a 20 20 20 20 66 74 73 35 44 6c  i++){.    fts5Dl
a3a0: 69 64 78 4c 76 6c 4e 65 78 74 28 26 70 49 74 65  idxLvlNext(&pIte
a3b0: 72 2d 3e 61 4c 76 6c 5b 69 5d 29 3b 0a 20 20 7d  r->aLvl[i]);.  }
a3c0: 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
a3d0: 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d  >aLvl[0].bEof;.}
a3e0: 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  ...static int ft
a3f0: 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 46  s5DlidxIterEof(F
a400: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
a410: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
a420: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  r){.  return p->
a430: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
a440: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
a450: 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  bEof;.}..static 
a460: 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74  void fts5DlidxIt
a470: 65 72 4c 61 73 74 28 46 74 73 35 49 6e 64 65 78  erLast(Fts5Index
a480: 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74   *p, Fts5DlidxIt
a490: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
a4a0: 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e  t i;..  /* Advan
a4b0: 63 65 20 65 61 63 68 20 6c 65 76 65 6c 20 74 6f  ce each level to
a4c0: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
a4d0: 6f 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  on the last page
a4e0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 49 74 65   */.  for(i=pIte
a4f0: 72 2d 3e 6e 4c 76 6c 2d 31 3b 20 70 2d 3e 72 63  r->nLvl-1; p->rc
a500: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
a510: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 46  >=0; i--){.    F
a520: 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76  ts5DlidxLvl *pLv
a530: 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c  l = &pIter->aLvl
a540: 5b 69 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [i];.    while( 
a550: 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74  fts5DlidxLvlNext
a560: 28 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20 20 20  (pLvl)==0 );.   
a570: 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b   pLvl->bEof = 0;
a580: 0a 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b  ..    if( i>0 ){
a590: 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64 78  .      Fts5Dlidx
a5a0: 4c 76 6c 20 2a 70 43 68 69 6c 64 20 3d 20 26 70  Lvl *pChild = &p
a5b0: 4c 76 6c 5b 2d 31 5d 3b 0a 20 20 20 20 20 20 66  Lvl[-1];.      f
a5c0: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
a5d0: 43 68 69 6c 64 2d 3e 70 44 61 74 61 29 3b 0a 20  Child->pData);. 
a5e0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 68 69       memset(pChi
a5f0: 6c 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  ld, 0, sizeof(Ft
a600: 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
a610: 20 20 20 20 70 43 68 69 6c 64 2d 3e 70 44 61 74      pChild->pDat
a620: 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
a630: 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46  (p, .          F
a640: 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28  TS5_DLIDX_ROWID(
a650: 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69  pIter->iSegid, i
a660: 2d 31 2c 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50  -1, pLvl->iLeafP
a670: 67 6e 6f 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  gno).      );.  
a680: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
a690: 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74   Move the iterat
a6a0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
a6b0: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 74   only argument t
a6c0: 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  o the previous e
a6d0: 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ntry..*/.static 
a6e0: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  int fts5DlidxLvl
a6f0: 50 72 65 76 28 46 74 73 35 44 6c 69 64 78 4c 76  Prev(Fts5DlidxLv
a700: 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20 69 6e 74 20  l *pLvl){.  int 
a710: 69 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66  iOff = pLvl->iOf
a720: 66 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c  f;..  assert( pL
a730: 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20  vl->bEof==0 );. 
a740: 20 69 66 28 20 69 4f 66 66 3c 3d 70 4c 76 6c 2d   if( iOff<=pLvl-
a750: 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20 20  >iFirstOff ){.  
a760: 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 31    pLvl->bEof = 1
a770: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
a780: 38 20 2a 61 20 3d 20 70 4c 76 6c 2d 3e 70 44 61  8 *a = pLvl->pDa
a790: 74 61 2d 3e 70 3b 0a 20 20 20 20 69 36 34 20 69  ta->p;.    i64 i
a7a0: 56 61 6c 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69  Val;.    int iLi
a7b0: 6d 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b  mit;.    int ii;
a7c0: 0a 20 20 20 20 69 6e 74 20 6e 5a 65 72 6f 20 3d  .    int nZero =
a7d0: 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72   0;..    /* Curr
a7e0: 65 6e 74 6c 79 20 69 4f 66 66 20 70 6f 69 6e 74  ently iOff point
a7f0: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  s to the first b
a800: 79 74 65 20 6f 66 20 61 20 76 61 72 69 6e 74 2e  yte of a varint.
a810: 20 54 68 69 73 20 62 6c 6f 63 6b 20 0a 20 20 20   This block .   
a820: 20 2a 2a 20 64 65 63 72 65 6d 65 6e 74 73 20 69   ** decrements i
a830: 4f 66 66 20 75 6e 74 69 6c 20 69 74 20 70 6f 69  Off until it poi
a840: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
a850: 20 62 79 74 65 20 6f 66 20 74 68 65 20 70 72 65   byte of the pre
a860: 76 69 6f 75 73 20 0a 20 20 20 20 2a 2a 20 76 61  vious .    ** va
a870: 72 69 6e 74 2e 20 54 61 6b 69 6e 67 20 63 61 72  rint. Taking car
a880: 65 20 6e 6f 74 20 74 6f 20 72 65 61 64 20 61 6e  e not to read an
a890: 79 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  y memory locatio
a8a0: 6e 73 20 74 68 61 74 20 6f 63 63 75 72 0a 20 20  ns that occur.  
a8b0: 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20    ** before the 
a8c0: 62 75 66 66 65 72 20 69 6e 20 6d 65 6d 6f 72 79  buffer in memory
a8d0: 2e 20 20 2a 2f 0a 20 20 20 20 69 4c 69 6d 69 74  .  */.    iLimit
a8e0: 20 3d 20 28 69 4f 66 66 3e 39 20 3f 20 69 4f 66   = (iOff>9 ? iOf
a8f0: 66 2d 39 20 3a 20 30 29 3b 0a 20 20 20 20 66 6f  f-9 : 0);.    fo
a900: 72 28 69 4f 66 66 2d 2d 3b 20 69 4f 66 66 3e 69  r(iOff--; iOff>i
a910: 4c 69 6d 69 74 3b 20 69 4f 66 66 2d 2d 29 7b 0a  Limit; iOff--){.
a920: 20 20 20 20 20 20 69 66 28 20 28 61 5b 69 4f 66        if( (a[iOf
a930: 66 2d 31 5d 20 26 20 30 78 38 30 29 3d 3d 30 20  f-1] & 0x80)==0 
a940: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a  ) break;.    }..
a950: 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e      fts5GetVarin
a960: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
a970: 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 70 4c  *)&iVal);.    pL
a980: 76 6c 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 56  vl->iRowid -= iV
a990: 61 6c 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4c  al;.    pLvl->iL
a9a0: 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a 20 20 20 20  eafPgno--;..    
a9b0: 2f 2a 20 53 6b 69 70 20 62 61 63 6b 77 61 72 64  /* Skip backward
a9c0: 73 20 70 61 73 74 20 61 6e 79 20 30 78 30 30 20  s past any 0x00 
a9d0: 76 61 72 69 6e 74 73 2e 20 2a 2f 0a 20 20 20 20  varints. */.    
a9e0: 66 6f 72 28 69 69 3d 69 4f 66 66 2d 31 3b 20 69  for(ii=iOff-1; i
a9f0: 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f  i>=pLvl->iFirstO
aa00: 66 66 20 26 26 20 61 5b 69 69 5d 3d 3d 30 78 30  ff && a[ii]==0x0
aa10: 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20  0; ii--){.      
aa20: 6e 5a 65 72 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nZero++;.    }. 
aa30: 20 20 20 69 66 28 20 69 69 3e 3d 70 4c 76 6c 2d     if( ii>=pLvl-
aa40: 3e 69 46 69 72 73 74 4f 66 66 20 26 26 20 28 61  >iFirstOff && (a
aa50: 5b 69 69 5d 20 26 20 30 78 38 30 29 20 29 7b 0a  [ii] & 0x80) ){.
aa60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74        /* The byt
aa70: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62 65  e immediately be
aa80: 66 6f 72 65 20 74 68 65 20 6c 61 73 74 20 30 78  fore the last 0x
aa90: 30 30 20 62 79 74 65 20 68 61 73 20 74 68 65 20  00 byte has the 
aaa0: 30 78 38 30 20 62 69 74 0a 20 20 20 20 20 20 2a  0x80 bit.      *
aab0: 2a 20 73 65 74 2e 20 53 6f 20 74 68 65 20 6c 61  * set. So the la
aac0: 73 74 20 30 78 30 30 20 69 73 20 6f 6e 6c 79 20  st 0x00 is only 
aad0: 61 20 76 61 72 69 6e 74 20 30 20 69 66 20 74 68  a varint 0 if th
aae0: 65 72 65 20 61 72 65 20 38 20 6d 6f 72 65 20 30  ere are 8 more 0
aaf0: 78 38 30 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  x80.      ** byt
ab00: 65 73 20 62 65 66 6f 72 65 20 61 5b 69 69 5d 2e  es before a[ii].
ab10: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 5a   */.      int bZ
ab20: 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ero = 0;        
ab30: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
ab40: 20 6c 61 73 74 20 30 78 30 30 20 63 6f 75 6e 74   last 0x00 count
ab50: 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28  s */.      if( (
ab60: 69 69 2d 38 29 3e 3d 70 4c 76 6c 2d 3e 69 46 69  ii-8)>=pLvl->iFi
ab70: 72 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  rstOff ){.      
ab80: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
ab90: 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 38 20 26   for(j=1; j<=8 &
aba0: 26 20 28 61 5b 69 69 2d 6a 5d 20 26 20 30 78 38  & (a[ii-j] & 0x8
abb0: 30 29 3b 20 6a 2b 2b 29 3b 0a 20 20 20 20 20 20  0); j++);.      
abc0: 20 20 62 5a 65 72 6f 20 3d 20 28 6a 3e 38 29 3b    bZero = (j>8);
abd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
abe0: 66 28 20 62 5a 65 72 6f 3d 3d 30 20 29 20 6e 5a  f( bZero==0 ) nZ
abf0: 65 72 6f 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  ero--;.    }.   
ac00: 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f   pLvl->iLeafPgno
ac10: 20 2d 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20 20 70   -= nZero;.    p
ac20: 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66  Lvl->iOff = iOff
ac30: 20 2d 20 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 0a 20   - nZero;.  }.. 
ac40: 20 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45   return pLvl->bE
ac50: 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  of;.}..static in
ac60: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  t fts5DlidxIterP
ac70: 72 65 76 52 28 46 74 73 35 49 6e 64 65 78 20 2a  revR(Fts5Index *
ac80: 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  p, Fts5DlidxIter
ac90: 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4c 76   *pIter, int iLv
aca0: 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c  l){.  Fts5DlidxL
acb0: 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65  vl *pLvl = &pIte
acc0: 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a  r->aLvl[iLvl];..
acd0: 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70    assert( iLvl<p
ace0: 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20  Iter->nLvl );.  
acf0: 69 66 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  if( fts5DlidxLvl
ad00: 50 72 65 76 28 70 4c 76 6c 29 20 29 7b 0a 20 20  Prev(pLvl) ){.  
ad10: 20 20 69 66 28 20 28 69 4c 76 6c 2b 31 29 20 3c    if( (iLvl+1) <
ad20: 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a   pIter->nLvl ){.
ad30: 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
ad40: 74 65 72 50 72 65 76 52 28 70 2c 20 70 49 74 65  terPrevR(p, pIte
ad50: 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20 20  r, iLvl+1);.    
ad60: 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62 45    if( pLvl[1].bE
ad70: 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  of==0 ){.       
ad80: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
ad90: 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20  (pLvl->pData);. 
ada0: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c         memset(pL
adb0: 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  vl, 0, sizeof(Ft
adc0: 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
add0: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74        pLvl->pDat
ade0: 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
adf0: 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  (p, .           
ae00: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
ae10: 44 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c  D(pIter->iSegid,
ae20: 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69   iLvl, pLvl[1].i
ae30: 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20  LeafPgno).      
ae40: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
ae50: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a   pLvl->pData ){.
ae60: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
ae70: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78   fts5DlidxLvlNex
ae80: 74 28 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20 20  t(pLvl)==0 );.  
ae90: 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62 45          pLvl->bE
aea0: 6f 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  of = 0;.        
aeb0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
aec0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49    }..  return pI
aed0: 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f  ter->aLvl[0].bEo
aee0: 66 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  f;.}.static int 
aef0: 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65  fts5DlidxIterPre
af00: 76 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  v(Fts5Index *p, 
af10: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
af20: 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Iter){.  return 
af30: 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65  fts5DlidxIterPre
af40: 76 52 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b  vR(p, pIter, 0);
af50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
af60: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69   doclist-index i
af70: 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 61  terator object a
af80: 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74 73 35  llocated by fts5
af90: 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 29 2e  DlidxIterInit().
afa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
afb0: 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
afc0: 65 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  e(Fts5DlidxIter 
afd0: 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
afe0: 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  Iter ){.    int 
aff0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
b000: 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69  i<pIter->nLvl; i
b010: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44  ++){.      fts5D
b020: 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
b030: 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44 61 74 61 29  ->aLvl[i].pData)
b040: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
b050: 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b  te3_free(pIter);
b060: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46  .  }.}..static F
b070: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 66 74  ts5DlidxIter *ft
b080: 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28  s5DlidxIterInit(
b090: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0b0: 20 20 20 2f 2a 20 46 74 73 35 20 42 61 63 6b 65     /* Fts5 Backe
b0c0: 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69  nd to iterate wi
b0d0: 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 52  thin */.  int bR
b0e0: 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ev,             
b0f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
b100: 65 20 66 6f 72 20 4f 52 44 45 52 20 42 59 20 41  e for ORDER BY A
b110: 53 43 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67  SC */.  int iSeg
b120: 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
b130: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65          /* Segme
b140: 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69  nt id */.  int i
b150: 4c 65 61 66 50 67 20 20 20 20 20 20 20 20 20 20  LeafPg          
b160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
b170: 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  af page number t
b180: 6f 20 6c 6f 61 64 20 64 6c 69 64 78 20 66 6f 72  o load dlidx for
b190: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69   */.){.  Fts5Dli
b1a0: 64 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  dxIter *pIter = 
b1b0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  0;.  int i;.  in
b1c0: 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20  t bDone = 0;..  
b1d0: 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d  for(i=0; p->rc==
b1e0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44 6f  SQLITE_OK && bDo
b1f0: 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ne==0; i++){.   
b200: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
b210: 65 6f 66 28 46 74 73 35 44 6c 69 64 78 49 74 65  eof(Fts5DlidxIte
b220: 72 29 20 2b 20 69 20 2a 20 73 69 7a 65 6f 66 28  r) + i * sizeof(
b230: 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 3b 0a 20  Fts5DlidxLvl);. 
b240: 20 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72     Fts5DlidxIter
b250: 20 2a 70 4e 65 77 3b 0a 0a 20 20 20 20 70 4e 65   *pNew;..    pNe
b260: 77 20 3d 20 28 46 74 73 35 44 6c 69 64 78 49 74  w = (Fts5DlidxIt
b270: 65 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  er*)sqlite3_real
b280: 6c 6f 63 28 70 49 74 65 72 2c 20 6e 42 79 74 65  loc(pIter, nByte
b290: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
b2a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  =0 ){.      p->r
b2b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
b2c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
b2d0: 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
b2e0: 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44  FTS5_DLIDX_ROWID
b2f0: 28 69 53 65 67 69 64 2c 20 69 2c 20 69 4c 65 61  (iSegid, i, iLea
b300: 66 50 67 29 3b 0a 20 20 20 20 20 20 46 74 73 35  fPg);.      Fts5
b310: 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d  DlidxLvl *pLvl =
b320: 20 26 70 4e 65 77 2d 3e 61 4c 76 6c 5b 69 5d 3b   &pNew->aLvl[i];
b330: 0a 20 20 20 20 20 20 70 49 74 65 72 20 3d 20 70  .      pIter = p
b340: 4e 65 77 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  New;.      memse
b350: 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pLvl, 0, sizeo
b360: 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29  f(Fts5DlidxLvl))
b370: 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44  ;.      pLvl->pD
b380: 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65  ata = fts5DataRe
b390: 61 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20  ad(p, iRowid);. 
b3a0: 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70       if( pLvl->p
b3b0: 44 61 74 61 20 26 26 20 28 70 4c 76 6c 2d 3e 70  Data && (pLvl->p
b3c0: 44 61 74 61 2d 3e 70 5b 30 5d 20 26 20 30 78 30  Data->p[0] & 0x0
b3d0: 30 30 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  001)==0 ){.     
b3e0: 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20     bDone = 1;.  
b3f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65      }.      pIte
b400: 72 2d 3e 6e 4c 76 6c 20 3d 20 69 2b 31 3b 0a 20  r->nLvl = i+1;. 
b410: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
b420: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
b430: 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   ){.    pIter->i
b440: 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a  Segid = iSegid;.
b450: 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20      if( bRev==0 
b460: 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  ){.      fts5Dli
b470: 64 78 49 74 65 72 46 69 72 73 74 28 70 49 74 65  dxIterFirst(pIte
b480: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
b490: 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
b4a0: 65 72 4c 61 73 74 28 70 2c 20 70 49 74 65 72 29  erLast(p, pIter)
b4b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
b4c0: 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  f( p->rc!=SQLITE
b4d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74 73 35 44  _OK ){.    fts5D
b4e0: 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 49 74  lidxIterFree(pIt
b4f0: 65 72 29 3b 0a 20 20 20 20 70 49 74 65 72 20 3d  er);.    pIter =
b500: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   0;.  }..  retur
b510: 6e 20 70 49 74 65 72 3b 0a 7d 0a 0a 73 74 61 74  n pIter;.}..stat
b520: 69 63 20 69 36 34 20 66 74 73 35 44 6c 69 64 78  ic i64 fts5Dlidx
b530: 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 44 6c  IterRowid(Fts5Dl
b540: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
b550: 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
b560: 3e 61 4c 76 6c 5b 30 5d 2e 69 52 6f 77 69 64 3b  >aLvl[0].iRowid;
b570: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  .}.static int ft
b580: 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
b590: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
b5a0: 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Iter){.  return 
b5b0: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69  pIter->aLvl[0].i
b5c0: 4c 65 61 66 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  LeafPgno;.}../*.
b5d0: 2a 2a 20 4c 6f 61 64 20 74 68 65 20 6e 65 78 74  ** Load the next
b5e0: 20 6c 65 61 66 20 70 61 67 65 20 69 6e 74 6f 20   leaf page into 
b5f0: 74 68 65 20 73 65 67 6d 65 6e 74 20 69 74 65 72  the segment iter
b600: 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
b610: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
b620: 4e 65 78 74 50 61 67 65 28 0a 20 20 46 74 73 35  NextPage(.  Fts5
b630: 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
b640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
b650: 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
b660: 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ct */.  Fts5SegI
b670: 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
b680: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
b690: 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 74  tor to advance t
b6a0: 6f 20 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a 29  o next page */.)
b6b0: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c  {.  Fts5Data *pL
b6c0: 65 61 66 3b 0a 20 20 46 74 73 35 53 74 72 75 63  eaf;.  Fts5Struc
b6d0: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
b6e0: 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 3b  g = pIter->pSeg;
b6f0: 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
b700: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
b710: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  ;.  pIter->iLeaf
b720: 50 67 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 70 49  Pgno++;.  if( pI
b730: 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 29  ter->pNextLeaf )
b740: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65  {.    pIter->pLe
b750: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4e 65 78  af = pIter->pNex
b760: 74 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72  tLeaf;.    pIter
b770: 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 30 3b  ->pNextLeaf = 0;
b780: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74  .  }else if( pIt
b790: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d 70  er->iLeafPgno<=p
b7a0: 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b  Seg->pgnoLast ){
b7b0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  .    pIter->pLea
b7c0: 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  f = fts5DataRead
b7d0: 28 70 2c 20 0a 20 20 20 20 20 20 20 20 46 54 53  (p, .        FTS
b7e0: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
b7f0: 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 49  pSeg->iSegid, pI
b800: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a  ter->iLeafPgno).
b810: 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
b820: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
b830: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 65 61   = 0;.  }.  pLea
b840: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
b850: 3b 0a 0a 20 20 69 66 28 20 70 4c 65 61 66 20 29  ;..  if( pLeaf )
b860: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67  {.    pIter->iPg
b870: 69 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e  idxOff = pLeaf->
b880: 73 7a 4c 65 61 66 3b 0a 20 20 20 20 69 66 28 20  szLeaf;.    if( 
b890: 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65  fts5LeafIsTermle
b8a0: 73 73 28 70 4c 65 61 66 29 20 29 7b 0a 20 20 20  ss(pLeaf) ){.   
b8b0: 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
b8c0: 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61 66 2d  Doclist = pLeaf-
b8d0: 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  >nn+1;.    }else
b8e0: 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  {.      pIter->i
b8f0: 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35  PgidxOff += fts5
b900: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65  GetVarint32(&pLe
b910: 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 50 67  af->p[pIter->iPg
b920: 69 64 78 4f 66 66 5d 2c 0a 20 20 20 20 20 20 20  idxOff],.       
b930: 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
b940: 44 6f 63 6c 69 73 74 0a 20 20 20 20 20 20 29 3b  Doclist.      );
b950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
b960: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20 70  .** Argument p p
b970: 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
b980: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 76  r containing a v
b990: 61 72 69 6e 74 20 74 6f 20 62 65 20 69 6e 74 65  arint to be inte
b9a0: 72 70 72 65 74 65 64 20 61 73 20 61 0a 2a 2a 20  rpreted as a.** 
b9b0: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73 69  position list si
b9c0: 7a 65 20 66 69 65 6c 64 2e 20 52 65 61 64 20 74  ze field. Read t
b9d0: 68 65 20 76 61 72 69 6e 74 20 61 6e 64 20 72 65  he varint and re
b9e0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
b9f0: 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61 64  of bytes.** read
ba00: 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  . Before returni
ba10: 6e 67 2c 20 73 65 74 20 2a 70 6e 53 7a 20 74 6f  ng, set *pnSz to
ba20: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
ba30: 79 74 65 73 20 69 6e 20 74 68 65 20 70 6f 73 69  ytes in the posi
ba40: 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 2c 20 61 6e  tion.** list, an
ba50: 64 20 2a 70 62 44 65 6c 20 74 6f 20 74 72 75 65  d *pbDel to true
ba60: 20 69 66 20 74 68 65 20 64 65 6c 65 74 65 20 66   if the delete f
ba70: 6c 61 67 20 69 73 20 73 65 74 2c 20 6f 72 20 66  lag is set, or f
ba80: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  alse otherwise..
ba90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
baa0: 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65  s5GetPoslistSize
bab0: 28 63 6f 6e 73 74 20 75 38 20 2a 70 2c 20 69 6e  (const u8 *p, in
bac0: 74 20 2a 70 6e 53 7a 2c 20 69 6e 74 20 2a 70 62  t *pnSz, int *pb
bad0: 44 65 6c 29 7b 0a 20 20 69 6e 74 20 6e 53 7a 3b  Del){.  int nSz;
bae0: 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
baf0: 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
bb00: 74 33 32 28 70 2c 20 6e 2c 20 6e 53 7a 29 3b 0a  t32(p, n, nSz);.
bb10: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 53 7a    assert_nc( nSz
bb20: 3e 3d 30 20 29 3b 0a 20 20 2a 70 6e 53 7a 20 3d  >=0 );.  *pnSz =
bb30: 20 6e 53 7a 2f 32 3b 0a 20 20 2a 70 62 44 65 6c   nSz/2;.  *pbDel
bb40: 20 3d 20 6e 53 7a 20 26 20 30 78 30 30 30 31 3b   = nSz & 0x0001;
bb50: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
bb60: 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65  /*.** Fts5SegIte
bb70: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63 75  r.iLeafOffset cu
bb80: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
bb90: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
bba0: 20 6f 66 20 61 0a 2a 2a 20 70 6f 73 69 74 69 6f   of a.** positio
bbb0: 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c  n-list size fiel
bbc0: 64 2e 20 52 65 61 64 20 74 68 65 20 76 61 6c 75  d. Read the valu
bbd0: 65 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20 61  e of the field a
bbe0: 6e 64 20 73 74 6f 72 65 20 69 74 0a 2a 2a 20 69  nd store it.** i
bbf0: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
bc00: 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a  variables:.**.**
bc10: 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 6e     Fts5SegIter.n
bc20: 50 6f 73 0a 2a 2a 20 20 20 46 74 73 35 53 65 67  Pos.**   Fts5Seg
bc30: 49 74 65 72 2e 62 44 65 6c 0a 2a 2a 0a 2a 2a 20  Iter.bDel.**.** 
bc40: 4c 65 61 76 65 20 46 74 73 35 53 65 67 49 74 65  Leave Fts5SegIte
bc50: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f  r.iLeafOffset po
bc60: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
bc70: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
bc80: 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  .** position lis
bc90: 74 20 63 6f 6e 74 65 6e 74 20 28 69 66 20 61 6e  t content (if an
bca0: 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  y)..*/.static vo
bcb0: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  id fts5SegIterLo
bcc0: 61 64 4e 50 6f 73 28 46 74 73 35 49 6e 64 65 78  adNPos(Fts5Index
bcd0: 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
bce0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
bcf0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
bd00: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66   ){.    int iOff
bd10: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
bd20: 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65  ffset;  /* Offse
bd30: 74 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f 0a  t to read at */.
bd40: 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41      ASSERT_SZLEA
bd50: 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61  F_OK(pIter->pLea
bd60: 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  f);.    if( p->p
bd70: 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d  Config->eDetail=
bd80: 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e  =FTS5_DETAIL_NON
bd90: 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  E ){.      int i
bda0: 45 6f 64 20 3d 20 4d 49 4e 28 70 49 74 65 72 2d  Eod = MIN(pIter-
bdb0: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 2c 20  >iEndofDoclist, 
bdc0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
bdd0: 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70 49 74  Leaf);.      pIt
bde0: 65 72 2d 3e 62 44 65 6c 20 3d 20 30 3b 0a 20 20  er->bDel = 0;.  
bdf0: 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20      pIter->nPos 
be00: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = 1;.      if( i
be10: 4f 66 66 3c 69 45 6f 64 20 26 26 20 70 49 74 65  Off<iEod && pIte
be20: 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  r->pLeaf->p[iOff
be30: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
be40: 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 31 3b  pIter->bDel = 1;
be50: 0a 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b  .        iOff++;
be60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66  .        if( iOf
be70: 66 3c 69 45 6f 64 20 26 26 20 70 49 74 65 72 2d  f<iEod && pIter-
be80: 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 3d  >pLeaf->p[iOff]=
be90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
bea0: 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 31 3b  pIter->nPos = 1;
beb0: 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 2b  .          iOff+
bec0: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
bed0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
bee0: 72 2d 3e 6e 50 6f 73 20 3d 20 30 3b 0a 20 20 20  r->nPos = 0;.   
bef0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
bf00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bf10: 69 6e 74 20 6e 53 7a 3b 0a 20 20 20 20 20 20 66  int nSz;.      f
bf20: 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
bf30: 33 32 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  32(pIter->pLeaf-
bf40: 3e 70 2c 20 69 4f 66 66 2c 20 6e 53 7a 29 3b 0a  >p, iOff, nSz);.
bf50: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65        pIter->bDe
bf60: 6c 20 3d 20 28 6e 53 7a 20 26 20 30 78 30 30 30  l = (nSz & 0x000
bf70: 31 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  1);.      pIter-
bf80: 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a  >nPos = nSz>>1;.
bf90: 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
bfa0: 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3e 3d 30 20   pIter->nPos>=0 
bfb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74  );.    }.    pIt
bfc0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
bfd0: 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a 7d 0a 0a 73  = iOff;.  }.}..s
bfe0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
bff0: 65 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64 28  egIterLoadRowid(
c000: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
c010: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
c020: 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74  ){.  u8 *a = pIt
c030: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20 20  er->pLeaf->p;   
c040: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
c050: 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d  o read data from
c060: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d   */.  int iOff =
c070: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
c080: 73 65 74 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53  set;..  ASSERT_S
c090: 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e  ZLEAF_OK(pIter->
c0a0: 70 4c 65 61 66 29 3b 0a 20 20 69 66 28 20 69 4f  pLeaf);.  if( iO
c0b0: 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66  ff>=pIter->pLeaf
c0c0: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
c0d0: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
c0e0: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
c0f0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c     if( pIter->pL
c100: 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eaf==0 ){.      
c110: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
c120: 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 46  E_OK ) p->rc = F
c130: 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
c140: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
c150: 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20  .    iOff = 4;. 
c160: 20 20 20 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c     a = pIter->pL
c170: 65 61 66 2d 3e 70 3b 0a 20 20 7d 0a 20 20 69 4f  eaf->p;.  }.  iO
c180: 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  ff += sqlite3Fts
c190: 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f  5GetVarint(&a[iO
c1a0: 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ff], (u64*)&pIte
c1b0: 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 70 49  r->iRowid);.  pI
c1c0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
c1d0: 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a   = iOff;.}../*.*
c1e0: 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c  * Fts5SegIter.iL
c1f0: 65 61 66 4f 66 66 73 65 74 20 63 75 72 72 65 6e  eafOffset curren
c200: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  tly points to th
c210: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
c220: 74 68 65 20 0a 2a 2a 20 22 6e 53 75 66 66 69 78  the .** "nSuffix
c230: 22 20 66 69 65 6c 64 20 6f 66 20 61 20 74 65 72  " field of a ter
c240: 6d 2e 20 46 75 6e 63 74 69 6f 6e 20 70 61 72 61  m. Function para
c250: 6d 65 74 65 72 20 6e 4b 65 65 70 20 63 6f 6e 74  meter nKeep cont
c260: 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 0a 2a  ains the value.*
c270: 2a 20 6f 66 20 74 68 65 20 22 6e 50 72 65 66 69  * of the "nPrefi
c280: 78 22 20 66 69 65 6c 64 20 28 69 66 20 74 68 65  x" field (if the
c290: 72 65 20 77 61 73 20 6f 6e 65 20 2d 20 69 74 20  re was one - it 
c2a0: 69 73 20 70 61 73 73 65 64 20 30 20 69 66 20 74  is passed 0 if t
c2b0: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
c2c0: 72 73 74 20 74 65 72 6d 20 69 6e 20 74 68 65 20  rst term in the 
c2d0: 73 65 67 6d 65 6e 74 29 2e 0a 2a 2a 0a 2a 2a 20  segment)..**.** 
c2e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 6f  This function po
c2f0: 70 75 6c 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  pulates:.**.**  
c300: 20 46 74 73 35 53 65 67 49 74 65 72 2e 74 65 72   Fts5SegIter.ter
c310: 6d 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74  m.**   Fts5SegIt
c320: 65 72 2e 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 61  er.rowid.**.** a
c330: 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 20 6c  ccordingly and l
c340: 65 61 76 65 73 20 28 46 74 73 35 53 65 67 49 74  eaves (Fts5SegIt
c350: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 29 20  er.iLeafOffset) 
c360: 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6e 74 65  set to the conte
c370: 6e 74 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72  nt of.** the fir
c380: 73 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  st position list
c390: 2e 20 54 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  . The position l
c3a0: 69 73 74 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  ist belonging to
c3b0: 20 64 6f 63 75 6d 65 6e 74 20 0a 2a 2a 20 28 46   document .** (F
c3c0: 74 73 35 53 65 67 49 74 65 72 2e 69 52 6f 77 69  ts5SegIter.iRowi
c3d0: 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  d)..*/.static vo
c3e0: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  id fts5SegIterLo
c3f0: 61 64 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78  adTerm(Fts5Index
c400: 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
c410: 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 6e 4b 65   *pIter, int nKe
c420: 65 70 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70  ep){.  u8 *a = p
c430: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20  Iter->pLeaf->p; 
c440: 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
c450: 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72   to read data fr
c460: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66  om */.  int iOff
c470: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
c480: 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65  ffset;  /* Offse
c490: 74 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f 0a  t to read at */.
c4a0: 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20    int nNew;     
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4c0: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6e 65    /* Bytes of ne
c4d0: 77 20 64 61 74 61 20 2a 2f 0a 0a 20 20 69 4f 66  w data */..  iOf
c4e0: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
c4f0: 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
c500: 4e 65 77 29 3b 0a 20 20 69 66 28 20 69 4f 66 66  New);.  if( iOff
c510: 2b 6e 4e 65 77 3e 70 49 74 65 72 2d 3e 70 4c 65  +nNew>pIter->pLe
c520: 61 66 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 70 2d  af->nn ){.    p-
c530: 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
c540: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
c550: 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 74 65 72    }.  pIter->ter
c560: 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 66  m.n = nKeep;.  f
c570: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
c580: 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 49 74  lob(&p->rc, &pIt
c590: 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20  er->term, nNew, 
c5a0: 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 69 4f 66  &a[iOff]);.  iOf
c5b0: 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 70 49 74  f += nNew;.  pIt
c5c0: 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66  er->iTermLeafOff
c5d0: 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 70 49  set = iOff;.  pI
c5e0: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
c5f0: 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  no = pIter->iLea
c600: 66 50 67 6e 6f 3b 0a 20 20 70 49 74 65 72 2d 3e  fPgno;.  pIter->
c610: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
c620: 66 66 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72  ff;..  if( pIter
c630: 2d 3e 69 50 67 69 64 78 4f 66 66 3e 3d 70 49 74  ->iPgidxOff>=pIt
c640: 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 29 7b  er->pLeaf->nn ){
c650: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64  .    pIter->iEnd
c660: 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 49 74 65  ofDoclist = pIte
c670: 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a  r->pLeaf->nn+1;.
c680: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
c690: 20 6e 45 78 74 72 61 3b 0a 20 20 20 20 70 49 74   nExtra;.    pIt
c6a0: 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 2b 3d  er->iPgidxOff +=
c6b0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
c6c0: 28 26 61 5b 70 49 74 65 72 2d 3e 69 50 67 69 64  (&a[pIter->iPgid
c6d0: 78 4f 66 66 5d 2c 20 6e 45 78 74 72 61 29 3b 0a  xOff], nExtra);.
c6e0: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
c6f0: 66 44 6f 63 6c 69 73 74 20 2b 3d 20 6e 45 78 74  fDoclist += nExt
c700: 72 61 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53  ra;.  }..  fts5S
c710: 65 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64 28  egIterLoadRowid(
c720: 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 73 74  p, pIter);.}..st
c730: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
c740: 67 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e  gIterNext(Fts5In
c750: 64 65 78 2a 2c 20 46 74 73 35 53 65 67 49 74 65  dex*, Fts5SegIte
c760: 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74 69  r*, int*);.stati
c770: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
c780: 65 72 4e 65 78 74 5f 52 65 76 65 72 73 65 28 46  erNext_Reverse(F
c790: 74 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53  ts5Index*, Fts5S
c7a0: 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a  egIter*, int*);.
c7b0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
c7c0: 53 65 67 49 74 65 72 4e 65 78 74 5f 4e 6f 6e 65  SegIterNext_None
c7d0: 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74 73  (Fts5Index*, Fts
c7e0: 35 53 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29  5SegIter*, int*)
c7f0: 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  ;..static void f
c800: 74 73 35 53 65 67 49 74 65 72 53 65 74 4e 65 78  ts5SegIterSetNex
c810: 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  t(Fts5Index *p, 
c820: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
c830: 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72  er){.  if( pIter
c840: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
c850: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 29  EGITER_REVERSE )
c860: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 78 4e 65  {.    pIter->xNe
c870: 78 74 20 3d 20 66 74 73 35 53 65 67 49 74 65 72  xt = fts5SegIter
c880: 4e 65 78 74 5f 52 65 76 65 72 73 65 3b 0a 20 20  Next_Reverse;.  
c890: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 43 6f  }else if( p->pCo
c8a0: 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46  nfig->eDetail==F
c8b0: 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
c8c0: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 78 4e  ){.    pIter->xN
c8d0: 65 78 74 20 3d 20 66 74 73 35 53 65 67 49 74 65  ext = fts5SegIte
c8e0: 72 4e 65 78 74 5f 4e 6f 6e 65 3b 0a 20 20 7d 65  rNext_None;.  }e
c8f0: 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  lse{.    pIter->
c900: 78 4e 65 78 74 20 3d 20 66 74 73 35 53 65 67 49  xNext = fts5SegI
c910: 74 65 72 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a  terNext;.  }.}..
c920: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
c930: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62   the iterator ob
c940: 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 69 74  ject pIter to it
c950: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
c960: 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a 20  e entries in.** 
c970: 73 65 67 6d 65 6e 74 20 70 53 65 67 2e 20 54 68  segment pSeg. Th
c980: 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65  e iterator is le
c990: 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ft pointing to t
c9a0: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 77  he first entry w
c9b0: 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e  hen .** this fun
c9c0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a  ction returns..*
c9d0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
c9e0: 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64   occurs, Fts5Ind
c9f0: 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20  ex.rc is set to 
ca00: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
ca10: 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a  rror code. If .*
ca20: 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  * an error has a
ca30: 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
ca40: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
ca50: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
ca60: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
ca70: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
ca80: 53 65 67 49 74 65 72 49 6e 69 74 28 0a 20 20 46  SegIterInit(.  F
ca90: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cab0: 2a 20 46 54 53 20 69 6e 64 65 78 20 6f 62 6a 65  * FTS index obje
cac0: 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
cad0: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
cae0: 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  eg,     /* Descr
caf0: 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e  iption of segmen
cb00: 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
cb10: 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
cb20: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
cb30: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a   to populate */.
cb40: 29 7b 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 70  ){.  if( pSeg->p
cb50: 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20  gnoFirst==0 ){. 
cb60: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
cb70: 6e 73 20 69 66 20 74 68 65 20 73 65 67 6d 65 6e  ns if the segmen
cb80: 74 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20  t is being used 
cb90: 61 73 20 61 6e 20 69 6e 70 75 74 20 74 6f 20 61  as an input to a
cba0: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 20 20  n incremental.  
cbb0: 20 20 2a 2a 20 6d 65 72 67 65 20 61 6e 64 20 61    ** merge and a
cbc0: 6c 6c 20 64 61 74 61 20 68 61 73 20 61 6c 72 65  ll data has alre
cbd0: 61 64 79 20 62 65 65 6e 20 22 74 72 69 6d 6d 65  ady been "trimme
cbe0: 64 22 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e  d". See function
cbf0: 0a 20 20 20 20 2a 2a 20 66 74 73 35 54 72 69 6d  .    ** fts5Trim
cc00: 53 65 67 6d 65 6e 74 73 28 29 20 66 6f 72 20 64  Segments() for d
cc10: 65 74 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 20  etails. In this 
cc20: 63 61 73 65 20 6c 65 61 76 65 20 74 68 65 20 69  case leave the i
cc30: 74 65 72 61 74 6f 72 20 65 6d 70 74 79 2e 0a 20  terator empty.. 
cc40: 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72     ** The caller
cc50: 20 77 69 6c 6c 20 73 65 65 20 74 68 65 20 28 70   will see the (p
cc60: 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 29 20  Iter->pLeaf==0) 
cc70: 61 6e 64 20 61 73 73 75 6d 65 20 74 68 65 20 69  and assume the i
cc80: 74 65 72 61 74 6f 72 20 69 73 0a 20 20 20 20 2a  terator is.    *
cc90: 2a 20 61 74 20 45 4f 46 20 61 6c 72 65 61 64 79  * at EOF already
cca0: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
ccb0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
ccc0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
ccd0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
cce0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
ccf0: 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c     memset(pIter,
cd00: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
cd10: 72 29 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67  r));.    fts5Seg
cd20: 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20 70  IterSetNext(p, p
cd30: 49 74 65 72 29 3b 0a 20 20 20 20 70 49 74 65 72  Iter);.    pIter
cd40: 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 20  ->pSeg = pSeg;. 
cd50: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50     pIter->iLeafP
cd60: 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  gno = pSeg->pgno
cd70: 46 69 72 73 74 2d 31 3b 0a 20 20 20 20 66 74 73  First-1;.    fts
cd80: 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65  5SegIterNextPage
cd90: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a  (p, pIter);.  }.
cda0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
cdb0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
cdc0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
cdd0: 74 20 3d 20 34 3b 0a 20 20 20 20 61 73 73 65 72  t = 4;.    asser
cde0: 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e 70 4c 65  t_nc( pIter->pLe
cdf0: 61 66 2d 3e 6e 6e 3e 34 20 29 3b 0a 20 20 20 20  af->nn>4 );.    
ce00: 61 73 73 65 72 74 28 20 66 74 73 35 4c 65 61 66  assert( fts5Leaf
ce10: 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70 49 74  FirstTermOff(pIt
ce20: 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 34 20 29 3b  er->pLeaf)==4 );
ce30: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69  .    pIter->iPgi
ce40: 64 78 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 70  dxOff = pIter->p
ce50: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 2b 31 3b 0a  Leaf->szLeaf+1;.
ce60: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
ce70: 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72  oadTerm(p, pIter
ce80: 2c 20 30 29 3b 0a 20 20 20 20 66 74 73 35 53 65  , 0);.    fts5Se
ce90: 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
cea0: 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a   pIter);.  }.}..
ceb0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
cec0: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65 72  ion is only ever
ced0: 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74 65 72 61   called on itera
cee0: 74 6f 72 73 20 63 72 65 61 74 65 64 20 62 79 20  tors created by 
cef0: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46 74 73 35  calls to.** Fts5
cf00: 49 6e 64 65 78 51 75 65 72 79 28 29 20 77 69 74  IndexQuery() wit
cf10: 68 20 74 68 65 20 46 54 53 35 49 4e 44 45 58 5f  h the FTS5INDEX_
cf20: 51 55 45 52 59 5f 44 45 53 43 20 66 6c 61 67 20  QUERY_DESC flag 
cf30: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  set..**.** The i
cf40: 74 65 72 61 74 6f 72 20 69 73 20 69 6e 20 61 6e  terator is in an
cf50: 20 75 6e 75 73 75 61 6c 20 73 74 61 74 65 20 77   unusual state w
cf60: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
cf70: 6e 20 69 73 20 63 61 6c 6c 65 64 3a 20 74 68 65  n is called: the
cf80: 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e  .** Fts5SegIter.
cf90: 69 4c 65 61 66 4f 66 66 73 65 74 20 76 61 72 69  iLeafOffset vari
cfa0: 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74  able is set to t
cfb0: 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  he offset of the
cfc0: 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65   start of.** the
cfd0: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
cfe0: 69 7a 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68  ize field for th
cff0: 65 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e 74  e first relevant
d000: 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61   rowid on the pa
d010: 67 65 2e 0a 2a 2a 20 46 74 73 35 53 65 67 49 74  ge..** Fts5SegIt
d020: 65 72 2e 72 6f 77 69 64 20 69 73 20 73 65 74 2c  er.rowid is set,
d030: 20 62 75 74 20 6e 50 6f 73 20 61 6e 64 20 62 44   but nPos and bD
d040: 65 6c 20 61 72 65 20 6e 6f 74 2e 0a 2a 2a 0a 2a  el are not..**.*
d050: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d060: 61 64 76 61 6e 63 65 73 20 74 68 65 20 69 74 65  advances the ite
d070: 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74  rator so that it
d080: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
d090: 61 73 74 20 0a 2a 2a 20 72 65 6c 65 76 61 6e 74  ast .** relevant
d0a0: 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61   rowid on the pa
d0b0: 67 65 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73  ge and, if neces
d0c0: 73 61 72 79 2c 20 69 6e 69 74 69 61 6c 69 7a 65  sary, initialize
d0d0: 73 20 74 68 65 20 0a 2a 2a 20 61 52 6f 77 69 64  s the .** aRowid
d0e0: 4f 66 66 73 65 74 5b 5d 20 61 6e 64 20 69 52 6f  Offset[] and iRo
d0f0: 77 69 64 4f 66 66 73 65 74 20 76 61 72 69 61 62  widOffset variab
d100: 6c 65 73 2e 20 41 74 20 74 68 69 73 20 70 6f 69  les. At this poi
d110: 6e 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a  nt the iterator.
d120: 2a 2a 20 69 73 20 69 6e 20 69 74 73 20 72 65 67  ** is in its reg
d130: 75 6c 61 72 20 73 74 61 74 65 20 2d 20 46 74 73  ular state - Fts
d140: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
d150: 66 73 65 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  fset points to t
d160: 68 65 20 66 69 72 73 74 0a 2a 2a 20 62 79 74 65  he first.** byte
d170: 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   of the position
d180: 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 61 73   list content as
d190: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 61  sociated with sa
d1a0: 69 64 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61  id rowid..*/.sta
d1b0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
d1c0: 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50  IterReverseInitP
d1d0: 61 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  age(Fts5Index *p
d1e0: 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
d1f0: 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 65 44 65  Iter){.  int eDe
d200: 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  tail = p->pConfi
d210: 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 69 6e  g->eDetail;.  in
d220: 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  t n = pIter->pLe
d230: 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 69 6e  af->szLeaf;.  in
d240: 74 20 69 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  t i = pIter->iLe
d250: 61 66 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a  afOffset;.  u8 *
d260: 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
d270: 2d 3e 70 3b 0a 20 20 69 6e 74 20 69 52 6f 77 69  ->p;.  int iRowi
d280: 64 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20  dOffset = 0;..  
d290: 69 66 28 20 6e 3e 70 49 74 65 72 2d 3e 69 45 6e  if( n>pIter->iEn
d2a0: 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20  dofDoclist ){.  
d2b0: 20 20 6e 20 3d 20 70 49 74 65 72 2d 3e 69 45 6e    n = pIter->iEn
d2c0: 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a  dofDoclist;.  }.
d2d0: 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46  .  ASSERT_SZLEAF
d2e0: 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  _OK(pIter->pLeaf
d2f0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  );.  while( 1 ){
d300: 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 20  .    i64 iDelta 
d310: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 65 44  = 0;..    if( eD
d320: 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
d330: 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  IL_NONE ){.     
d340: 20 2f 2a 20 74 6f 64 6f 20 2a 2f 0a 20 20 20 20   /* todo */.    
d350: 20 20 69 66 28 20 69 3c 6e 20 26 26 20 61 5b 69    if( i<n && a[i
d360: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
d370: 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  i++;.        if(
d380: 20 69 3c 6e 20 26 26 20 61 5b 69 5d 3d 3d 30 20   i<n && a[i]==0 
d390: 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ) i++;.      }. 
d3a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d3b0: 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20  int nPos;.      
d3c0: 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20  int bDummy;.    
d3d0: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 50 6f    i += fts5GetPo
d3e0: 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 5d 2c  slistSize(&a[i],
d3f0: 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29   &nPos, &bDummy)
d400: 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 6e 50 6f  ;.      i += nPo
d410: 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  s;.    }.    if(
d420: 20 69 3e 3d 6e 20 29 20 62 72 65 61 6b 3b 0a 20   i>=n ) break;. 
d430: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
d440: 61 72 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75 36  arint(&a[i], (u6
d450: 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
d460: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b   pIter->iRowid +
d470: 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 2f  = iDelta;..    /
d480: 2a 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c 20  * If necessary, 
d490: 67 72 6f 77 20 74 68 65 20 70 49 74 65 72 2d 3e  grow the pIter->
d4a0: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61  aRowidOffset[] a
d4b0: 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  rray. */.    if(
d4c0: 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 3d 70   iRowidOffset>=p
d4d0: 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73  Iter->nRowidOffs
d4e0: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  et ){.      int 
d4f0: 6e 4e 65 77 20 3d 20 70 49 74 65 72 2d 3e 6e 52  nNew = pIter->nR
d500: 6f 77 69 64 4f 66 66 73 65 74 20 2b 20 38 3b 0a  owidOffset + 8;.
d510: 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 20        int *aNew 
d520: 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f  = (int*)sqlite3_
d530: 72 65 61 6c 6c 6f 63 28 70 49 74 65 72 2d 3e 61  realloc(pIter->a
d540: 52 6f 77 69 64 4f 66 66 73 65 74 2c 20 6e 4e 65  RowidOffset, nNe
d550: 77 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a  w*sizeof(int));.
d560: 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d        if( aNew==
d570: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
d580: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
d590: 4d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  M;.        break
d5a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d5b0: 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66  pIter->aRowidOff
d5c0: 73 65 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  set = aNew;.    
d5d0: 20 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f    pIter->nRowidO
d5e0: 66 66 73 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20  ffset = nNew;.  
d5f0: 20 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e    }..    pIter->
d600: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 69 52 6f  aRowidOffset[iRo
d610: 77 69 64 4f 66 66 73 65 74 2b 2b 5d 20 3d 20 70  widOffset++] = p
d620: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
d630: 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  t;.    pIter->iL
d640: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20  eafOffset = i;. 
d650: 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 52 6f 77   }.  pIter->iRow
d660: 69 64 4f 66 66 73 65 74 20 3d 20 69 52 6f 77 69  idOffset = iRowi
d670: 64 4f 66 66 73 65 74 3b 0a 20 20 66 74 73 35 53  dOffset;.  fts5S
d680: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
d690: 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pIter);.}../*.
d6a0: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  **.*/.static voi
d6b0: 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76  d fts5SegIterRev
d6c0: 65 72 73 65 4e 65 77 50 61 67 65 28 46 74 73 35  erseNewPage(Fts5
d6d0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
d6e0: 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
d6f0: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
d700: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
d710: 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 3b 0a  ITER_REVERSE );.
d720: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
d730: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
d740: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b  GITER_ONETERM );
d750: 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ..  fts5DataRele
d760: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
d770: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  );.  pIter->pLea
d780: 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  f = 0;.  while( 
d790: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
d7a0: 20 26 26 20 70 49 74 65 72 2d 3e 69 4c 65 61 66   && pIter->iLeaf
d7b0: 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 54 65 72  Pgno>pIter->iTer
d7c0: 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20  mLeafPgno ){.   
d7d0: 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77 3b   Fts5Data *pNew;
d7e0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
d7f0: 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 70 4e 65  fPgno--;.    pNe
d800: 77 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  w = fts5DataRead
d810: 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  (p, FTS5_SEGMENT
d820: 5f 52 4f 57 49 44 28 0a 20 20 20 20 20 20 20 20  _ROWID(.        
d830: 20 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69    pIter->pSeg->i
d840: 53 65 67 69 64 2c 20 70 49 74 65 72 2d 3e 69 4c  Segid, pIter->iL
d850: 65 61 66 50 67 6e 6f 0a 20 20 20 20 29 29 3b 0a  eafPgno.    ));.
d860: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
d870: 20 20 20 20 20 20 2f 2a 20 69 54 65 72 6d 4c 65        /* iTermLe
d880: 61 66 4f 66 66 73 65 74 20 6d 61 79 20 62 65 20  afOffset may be 
d890: 65 71 75 61 6c 20 74 6f 20 73 7a 4c 65 61 66 20  equal to szLeaf 
d8a0: 69 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 74  if the term is t
d8b0: 68 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a  he last.      **
d8c0: 20 74 68 69 6e 67 20 6f 6e 20 74 68 65 20 70 61   thing on the pa
d8d0: 67 65 20 2d 20 69 2e 65 2e 20 74 68 65 20 66 69  ge - i.e. the fi
d8e0: 72 73 74 20 72 6f 77 69 64 20 69 73 20 6f 6e 20  rst rowid is on 
d8f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61  the following pa
d900: 67 65 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20  ge..      ** In 
d910: 74 68 69 73 20 63 61 73 65 20 6c 65 61 76 65 20  this case leave 
d920: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 2c  pIter->pLeaf==0,
d930: 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20 69   this iterator i
d940: 73 20 61 74 20 45 4f 46 2e 20 2a 2f 0a 20 20 20  s at EOF. */.   
d950: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c     if( pIter->iL
d960: 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e  eafPgno==pIter->
d970: 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b  iTermLeafPgno ){
d980: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d990: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
d9a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
d9b0: 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
d9c0: 4f 66 66 73 65 74 3c 70 4e 65 77 2d 3e 73 7a 4c  Offset<pNew->szL
d9d0: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
d9e0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
d9f0: 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  pNew;.          
da00: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
da10: 65 74 20 3d 20 70 49 74 65 72 2d 3e 69 54 65 72  et = pIter->iTer
da20: 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20  mLeafOffset;.   
da30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
da40: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
da50: 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20  iRowidOff;.     
da60: 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66     iRowidOff = f
da70: 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69  ts5LeafFirstRowi
da80: 64 4f 66 66 28 70 4e 65 77 29 3b 0a 20 20 20 20  dOff(pNew);.    
da90: 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66      if( iRowidOf
daa0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  f ){.          p
dab0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e  Iter->pLeaf = pN
dac0: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  ew;.          pI
dad0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
dae0: 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20   = iRowidOff;.  
daf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
db00: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
db10: 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ->pLeaf ){.     
db20: 20 20 20 75 38 20 2a 61 20 3d 20 26 70 49 74 65     u8 *a = &pIte
db30: 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65  r->pLeaf->p[pIte
db40: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b  r->iLeafOffset];
db50: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
db60: 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20 66  iLeafOffset += f
db70: 74 73 35 47 65 74 56 61 72 69 6e 74 28 61 2c 20  ts5GetVarint(a, 
db80: 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
db90: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 62  owid);.        b
dba0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
dbb0: 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  e{.        fts5D
dbc0: 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77 29  ataRelease(pNew)
dbd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dbe0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65 72    }..  if( pIter
dbf0: 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 70  ->pLeaf ){.    p
dc00: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
dc10: 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  ist = pIter->pLe
dc20: 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 66 74  af->nn+1;.    ft
dc30: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
dc40: 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65  InitPage(p, pIte
dc50: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
dc60: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
dc70: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
dc80: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
dc90: 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65  d argument curre
dca0: 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  ntly.** points t
dcb0: 6f 20 61 20 64 65 6c 65 74 65 20 6d 61 72 6b 65  o a delete marke
dcc0: 72 2e 20 41 20 64 65 6c 65 74 65 20 6d 61 72 6b  r. A delete mark
dcd0: 65 72 20 69 73 20 61 6e 20 65 6e 74 72 79 20 77  er is an entry w
dce0: 69 74 68 20 61 20 30 20 62 79 74 65 0a 2a 2a 20  ith a 0 byte.** 
dcf0: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a 2a  position-list..*
dd00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
dd10: 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74  5MultiIterIsEmpt
dd20: 79 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  y(Fts5Index *p, 
dd30: 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29  Fts5Iter *pIter)
dd40: 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  {.  Fts5SegIter 
dd50: 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
dd60: 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72  aSeg[pIter->aFir
dd70: 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20  st[1].iFirst];. 
dd80: 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d   return (p->rc==
dd90: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 65  SQLITE_OK && pSe
dda0: 67 2d 3e 70 4c 65 61 66 20 26 26 20 70 53 65 67  g->pLeaf && pSeg
ddb0: 2d 3e 6e 50 6f 73 3d 3d 30 29 3b 0a 7d 0a 0a 2f  ->nPos==0);.}../
ddc0: 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74 65  *.** Advance ite
ddd0: 72 61 74 6f 72 20 70 49 74 65 72 20 74 6f 20 74  rator pIter to t
dde0: 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 0a 2a  he next entry..*
ddf0: 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f  *.** This versio
de00: 6e 20 6f 66 20 66 74 73 35 53 65 67 49 74 65 72  n of fts5SegIter
de10: 4e 65 78 74 28 29 20 69 73 20 6f 6e 6c 79 20 75  Next() is only u
de20: 73 65 64 20 62 79 20 72 65 76 65 72 73 65 20 69  sed by reverse i
de30: 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61  terators..*/.sta
de40: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
de50: 49 74 65 72 4e 65 78 74 5f 52 65 76 65 72 73 65  IterNext_Reverse
de60: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
de70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
de80: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
de90: 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
dea0: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
deb0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
dec0: 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
ded0: 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20  dvance */.  int 
dee0: 2a 70 62 55 6e 75 73 65 64 20 20 20 20 20 20 20  *pbUnused       
def0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
df00: 6e 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73  nused */.){.  as
df10: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
df20: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
df30: 52 5f 52 45 56 45 52 53 45 20 29 3b 0a 20 20 61  R_REVERSE );.  a
df40: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4e  ssert( pIter->pN
df50: 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  extLeaf==0 );.  
df60: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 62 55  UNUSED_PARAM(pbU
df70: 6e 75 73 65 64 29 3b 0a 0a 20 20 69 66 28 20 70  nused);..  if( p
df80: 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73  Iter->iRowidOffs
df90: 65 74 3e 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  et>0 ){.    u8 *
dfa0: 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
dfb0: 2d 3e 70 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66  ->p;.    int iOf
dfc0: 66 3b 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74  f;.    i64 iDelt
dfd0: 61 3b 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  a;..    pIter->i
dfe0: 52 6f 77 69 64 4f 66 66 73 65 74 2d 2d 3b 0a 20  RowidOffset--;. 
dff0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
e000: 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 61  ffset = pIter->a
e010: 52 6f 77 69 64 4f 66 66 73 65 74 5b 70 49 74 65  RowidOffset[pIte
e020: 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 5d  r->iRowidOffset]
e030: 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  ;.    fts5SegIte
e040: 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
e050: 65 72 29 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20  er);.    iOff = 
e060: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e070: 65 74 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  et;.    if( p->p
e080: 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21  Config->eDetail!
e090: 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e  =FTS5_DETAIL_NON
e0a0: 45 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20  E ){.      iOff 
e0b0: 2b 3d 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a  += pIter->nPos;.
e0c0: 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 47 65      }.    fts5Ge
e0d0: 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
e0e0: 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
e0f0: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f  ;.    pIter->iRo
e100: 77 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 20  wid -= iDelta;. 
e110: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
e120: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65  SegIterReverseNe
e130: 77 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  wPage(p, pIter);
e140: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
e150: 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 70  vance iterator p
e160: 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74  Iter to the next
e170: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
e180: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 74  is version of ft
e190: 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 29 20  s5SegIterNext() 
e1a0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20  is only used if 
e1b0: 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 61 6e 64 20  detail=none and 
e1c0: 74 68 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20  the.** iterator 
e1d0: 69 73 20 6e 6f 74 20 61 20 72 65 76 65 72 73 65  is not a reverse
e1e0: 20 64 69 72 65 63 74 69 6f 6e 20 69 74 65 72 61   direction itera
e1f0: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tor..*/.static v
e200: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e  oid fts5SegIterN
e210: 65 78 74 5f 4e 6f 6e 65 28 0a 20 20 46 74 73 35  ext_None(.  Fts5
e220: 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
e230: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
e240: 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
e250: 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ct */.  Fts5SegI
e260: 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
e270: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
e280: 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a  tor to advance *
e290: 2f 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77 54 65  /.  int *pbNewTe
e2a0: 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
e2b0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20      /* OUT: Set 
e2c0: 66 6f 72 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a  for new term */.
e2d0: 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a  ){.  int iOff;..
e2e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
e2f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
e300: 61 73 73 65 72 74 28 20 28 70 49 74 65 72 2d 3e  assert( (pIter->
e310: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
e320: 49 54 45 52 5f 52 45 56 45 52 53 45 29 3d 3d 30  ITER_REVERSE)==0
e330: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
e340: 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
e350: 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l==FTS5_DETAIL_N
e360: 4f 4e 45 20 29 3b 0a 0a 20 20 41 53 53 45 52 54  ONE );..  ASSERT
e370: 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72  _SZLEAF_OK(pIter
e380: 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 69 4f 66 66  ->pLeaf);.  iOff
e390: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
e3a0: 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 4e 65 78  ffset;..  /* Nex
e3b0: 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20 74 68  t entry is on th
e3c0: 65 20 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a 20  e next page */. 
e3d0: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65 67   if( pIter->pSeg
e3e0: 20 26 26 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d   && iOff>=pIter-
e3f0: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
e400: 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  {.    fts5SegIte
e410: 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74  rNextPage(p, pIt
e420: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  er);.    if( p->
e430: 72 63 20 7c 7c 20 70 49 74 65 72 2d 3e 70 4c 65  rc || pIter->pLe
e440: 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  af==0 ) return;.
e450: 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
e460: 64 20 3d 20 30 3b 0a 20 20 20 20 69 4f 66 66 20  d = 0;.    iOff 
e470: 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  = 4;.  }..  if( 
e480: 69 4f 66 66 3c 70 49 74 65 72 2d 3e 69 45 6e 64  iOff<pIter->iEnd
e490: 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  ofDoclist ){.   
e4a0: 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 69   /* Next entry i
e4b0: 73 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s on the current
e4c0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 36 34   page */.    i64
e4d0: 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 69 4f 66   iDelta;.    iOf
e4e0: 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  f += sqlite3Fts5
e4f0: 47 65 74 56 61 72 69 6e 74 28 26 70 49 74 65 72  GetVarint(&pIter
e500: 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  ->pLeaf->p[iOff]
e510: 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
e520: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
e530: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
e540: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77  .    pIter->iRow
e550: 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20  id += iDelta;.  
e560: 7d 65 6c 73 65 20 69 66 28 20 28 70 49 74 65 72  }else if( (pIter
e570: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
e580: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 3d  EGITER_ONETERM)=
e590: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  =0 ){.    if( pI
e5a0: 74 65 72 2d 3e 70 53 65 67 20 29 7b 0a 20 20 20  ter->pSeg ){.   
e5b0: 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30     int nKeep = 0
e5c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66  ;.      if( iOff
e5d0: 21 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74 54  !=fts5LeafFirstT
e5e0: 65 72 6d 4f 66 66 28 70 49 74 65 72 2d 3e 70 4c  ermOff(pIter->pL
e5f0: 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eaf) ){.        
e600: 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
e610: 61 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e  arint32(&pIter->
e620: 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pLeaf->p[iOff], 
e630: 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 7d 0a  nKeep);.      }.
e640: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
e650: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
e660: 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
e670: 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49  erLoadTerm(p, pI
e680: 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  ter, nKeep);.   
e690: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
e6a0: 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20  nst u8 *pList = 
e6b0: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  0;.      const c
e6c0: 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 30 3b 0a  har *zTerm = 0;.
e6d0: 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 3b        int nList;
e6e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
e6f0: 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28 70  s5HashScanNext(p
e700: 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 20 20  ->pHash);.      
e710: 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
e720: 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70 48 61 73  canEntry(p->pHas
e730: 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 4c 69 73  h, &zTerm, &pLis
e740: 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20  t, &nList);.    
e750: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
e760: 20 67 6f 74 6f 20 6e 65 78 74 5f 6e 6f 6e 65 5f   goto next_none_
e770: 65 6f 66 3b 0a 20 20 20 20 20 20 70 49 74 65 72  eof;.      pIter
e780: 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38  ->pLeaf->p = (u8
e790: 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 70  *)pList;.      p
e7a0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20  Iter->pLeaf->nn 
e7b0: 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70  = nList;.      p
e7c0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
e7d0: 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  eaf = nList;.   
e7e0: 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
e7f0: 44 6f 63 6c 69 73 74 20 3d 20 6e 4c 69 73 74 3b  Doclist = nList;
e800: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
e810: 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
e820: 72 63 2c 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  rc,&pIter->term,
e830: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65   (int)strlen(zTe
e840: 72 6d 29 2c 20 28 75 38 2a 29 7a 54 65 72 6d 29  rm), (u8*)zTerm)
e850: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  ;.      pIter->i
e860: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73  LeafOffset = fts
e870: 35 47 65 74 56 61 72 69 6e 74 28 70 4c 69 73 74  5GetVarint(pList
e880: 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
e890: 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 0a  iRowid);.    }..
e8a0: 20 20 20 20 69 66 28 20 70 62 4e 65 77 54 65 72      if( pbNewTer
e8b0: 6d 20 29 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d  m ) *pbNewTerm =
e8c0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
e8d0: 20 67 6f 74 6f 20 6e 65 78 74 5f 6e 6f 6e 65 5f   goto next_none_
e8e0: 65 6f 66 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  eof;.  }..  fts5
e8f0: 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
e900: 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 72 65  p, pIter);..  re
e910: 74 75 72 6e 3b 0a 20 6e 65 78 74 5f 6e 6f 6e 65  turn;. next_none
e920: 5f 65 6f 66 3a 0a 20 20 66 74 73 35 44 61 74 61  _eof:.  fts5Data
e930: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
e940: 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e  Leaf);.  pIter->
e950: 70 4c 65 61 66 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f  pLeaf = 0;.}.../
e960: 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74 65  *.** Advance ite
e970: 72 61 74 6f 72 20 70 49 74 65 72 20 74 6f 20 74  rator pIter to t
e980: 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a  he next entry. .
e990: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
e9a0: 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e  r occurs, Fts5In
e9b0: 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f  dex.rc is set to
e9c0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
e9d0: 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 74 20 0a  error code. It .
e9e0: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64  ** is not consid
e9f0: 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66  ered an error if
ea00: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65   the iterator re
ea10: 61 63 68 65 73 20 45 4f 46 2e 20 49 66 20 61 6e  aches EOF. If an
ea20: 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61   error has .** a
ea30: 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
ea40: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
ea50: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
ea60: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
ea70: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
ea80: 53 65 67 49 74 65 72 4e 65 78 74 28 0a 20 20 46  SegIterNext(.  F
ea90: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
eaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
eab0: 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
eac0: 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
ead0: 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  egIter *pIter,  
eae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
eaf0: 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63  erator to advanc
eb00: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e 65  e */.  int *pbNe
eb10: 77 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  wTerm           
eb20: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
eb30: 65 74 20 66 6f 72 20 6e 65 77 20 74 65 72 6d 20  et for new term 
eb40: 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 61 74 61  */.){.  Fts5Data
eb50: 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d   *pLeaf = pIter-
eb60: 3e 70 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69 4f  >pLeaf;.  int iO
eb70: 66 66 3b 0a 20 20 69 6e 74 20 62 4e 65 77 54 65  ff;.  int bNewTe
eb80: 72 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b  rm = 0;.  int nK
eb90: 65 65 70 20 3d 20 30 3b 0a 20 20 75 38 20 2a 61  eep = 0;.  u8 *a
eba0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 61 73  ;.  int n;..  as
ebb0: 73 65 72 74 28 20 70 62 4e 65 77 54 65 72 6d 3d  sert( pbNewTerm=
ebc0: 3d 30 20 7c 7c 20 2a 70 62 4e 65 77 54 65 72 6d  =0 || *pbNewTerm
ebd0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
ebe0: 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
ebf0: 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49  tail!=FTS5_DETAI
ec00: 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 2f 2a 20  L_NONE );..  /* 
ec10: 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 65  Search for the e
ec20: 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69  nd of the positi
ec30: 6f 6e 20 6c 69 73 74 20 77 69 74 68 69 6e 20 74  on list within t
ec40: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
ec50: 20 2a 2f 0a 20 20 61 20 3d 20 70 4c 65 61 66 2d   */.  a = pLeaf-
ec60: 3e 70 3b 0a 20 20 6e 20 3d 20 70 4c 65 61 66 2d  >p;.  n = pLeaf-
ec70: 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20 41 53 53 45  >szLeaf;..  ASSE
ec80: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65  RT_SZLEAF_OK(pLe
ec90: 61 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 70 49  af);.  iOff = pI
eca0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
ecb0: 20 2b 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a   + pIter->nPos;.
ecc0: 0a 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b  .  if( iOff<n ){
ecd0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  .    /* The next
ece0: 20 65 6e 74 72 79 20 69 73 20 6f 6e 20 74 68 65   entry is on the
ecf0: 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 2a   current page. *
ed00: 2f 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28  /.    assert_nc(
ed10: 20 69 4f 66 66 3c 3d 70 49 74 65 72 2d 3e 69 45   iOff<=pIter->iE
ed20: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 3b 0a 20  ndofDoclist );. 
ed30: 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49 74     if( iOff>=pIt
ed40: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
ed50: 74 20 29 7b 0a 20 20 20 20 20 20 62 4e 65 77 54  t ){.      bNewT
ed60: 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  erm = 1;.      i
ed70: 66 28 20 69 4f 66 66 21 3d 66 74 73 35 4c 65 61  f( iOff!=fts5Lea
ed80: 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70 4c  fFirstTermOff(pL
ed90: 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eaf) ){.        
eda0: 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
edb0: 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
edc0: 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20  , nKeep);.      
edd0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
ede0: 20 20 20 75 36 34 20 69 44 65 6c 74 61 3b 0a 20     u64 iDelta;. 
edf0: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c       iOff += sql
ee00: 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
ee10: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 26 69 44 65  t(&a[iOff], &iDe
ee20: 6c 74 61 29 3b 0a 20 20 20 20 20 20 70 49 74 65  lta);.      pIte
ee30: 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65  r->iRowid += iDe
ee40: 6c 74 61 3b 0a 20 20 20 20 20 20 61 73 73 65 72  lta;.      asser
ee50: 74 5f 6e 63 28 20 69 44 65 6c 74 61 3e 30 20 29  t_nc( iDelta>0 )
ee60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65  ;.    }.    pIte
ee70: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
ee80: 20 69 4f 66 66 3b 0a 0a 20 20 7d 65 6c 73 65 20   iOff;..  }else 
ee90: 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65 67 3d  if( pIter->pSeg=
eea0: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
eeb0: 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20  u8 *pList = 0;. 
eec0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
eed0: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Term = 0;.    in
eee0: 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  t nList = 0;.   
eef0: 20 61 73 73 65 72 74 28 20 28 70 49 74 65 72 2d   assert( (pIter-
ef00: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
ef10: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 20 7c  GITER_ONETERM) |
ef20: 7c 20 70 62 4e 65 77 54 65 72 6d 20 29 3b 0a 20  | pbNewTerm );. 
ef30: 20 20 20 69 66 28 20 30 3d 3d 28 70 49 74 65 72     if( 0==(pIter
ef40: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
ef50: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 20  EGITER_ONETERM) 
ef60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ef70: 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74  Fts5HashScanNext
ef80: 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20  (p->pHash);.    
ef90: 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
efa0: 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70 48  hScanEntry(p->pH
efb0: 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 4c  ash, &zTerm, &pL
efc0: 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20  ist, &nList);.  
efd0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73    }.    if( pLis
efe0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74  t==0 ){.      ft
eff0: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
f000: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
f010: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
f020: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
f030: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
f040: 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69  af->p = (u8*)pLi
f050: 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  st;.      pIter-
f060: 3e 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 6e 4c 69  >pLeaf->nn = nLi
f070: 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  st;.      pIter-
f080: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d  >pLeaf->szLeaf =
f090: 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49   nList;.      pI
f0a0: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
f0b0: 73 74 20 3d 20 6e 4c 69 73 74 2b 31 3b 0a 20 20  st = nList+1;.  
f0c0: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
f0d0: 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
f0e0: 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 28   &pIter->term, (
f0f0: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d  int)strlen(zTerm
f100: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28 75 38  ),.          (u8
f110: 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  *)zTerm);.      
f120: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
f130: 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72 69  et = fts5GetVari
f140: 6e 74 28 70 4c 69 73 74 2c 20 28 75 36 34 2a 29  nt(pList, (u64*)
f150: 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
f160: 0a 20 20 20 20 20 20 2a 70 62 4e 65 77 54 65 72  .      *pbNewTer
f170: 6d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  m = 1;.    }.  }
f180: 65 6c 73 65 7b 0a 20 20 20 20 69 4f 66 66 20 3d  else{.    iOff =
f190: 20 30 3b 0a 20 20 20 20 2f 2a 20 4e 65 78 74 20   0;.    /* Next 
f1a0: 65 6e 74 72 79 20 69 73 20 6e 6f 74 20 6f 6e 20  entry is not on 
f1b0: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
f1c0: 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 69   */.    while( i
f1d0: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Off==0 ){.      
f1e0: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
f1f0: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
f200: 20 20 20 20 20 70 4c 65 61 66 20 3d 20 70 49 74       pLeaf = pIt
f210: 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20 20  er->pLeaf;.     
f220: 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20   if( pLeaf==0 ) 
f230: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 41 53 53  break;.      ASS
f240: 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c  ERT_SZLEAF_OK(pL
f250: 65 61 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  eaf);.      if( 
f260: 28 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66  (iOff = fts5Leaf
f270: 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c  FirstRowidOff(pL
f280: 65 61 66 29 29 20 26 26 20 69 4f 66 66 3c 70 4c  eaf)) && iOff<pL
f290: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
f2a0: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73         iOff += s
f2b0: 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
f2c0: 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  int(&pLeaf->p[iO
f2d0: 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ff], (u64*)&pIte
f2e0: 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
f2f0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
f300: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a  Offset = iOff;..
f310: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
f320: 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c  f->nn>pLeaf->szL
f330: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
f340: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
f350: 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  f = pLeaf->szLea
f360: 66 20 2b 20 66 74 73 35 47 65 74 56 61 72 69 6e  f + fts5GetVarin
f370: 74 33 32 28 0a 20 20 20 20 20 20 20 20 20 20 20  t32(.           
f380: 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65     &pLeaf->p[pLe
f390: 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 70 49 74  af->szLeaf], pIt
f3a0: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
f3b0: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
f3c0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
f3d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65      }.      else
f3e0: 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3e 70   if( pLeaf->nn>p
f3f0: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
f400: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
f410: 50 67 69 64 78 4f 66 66 20 3d 20 70 4c 65 61 66  PgidxOff = pLeaf
f420: 2d 3e 73 7a 4c 65 61 66 20 2b 20 66 74 73 35 47  ->szLeaf + fts5G
f430: 65 74 56 61 72 69 6e 74 33 32 28 0a 20 20 20 20  etVarint32(.    
f440: 20 20 20 20 20 20 20 20 26 70 4c 65 61 66 2d 3e          &pLeaf->
f450: 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 5d  p[pLeaf->szLeaf]
f460: 2c 20 69 4f 66 66 0a 20 20 20 20 20 20 20 20 20  , iOff.         
f470: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49     );.        pI
f480: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
f490: 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20   = iOff;.       
f4a0: 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
f4b0: 63 6c 69 73 74 20 3d 20 69 4f 66 66 3b 0a 20 20  clist = iOff;.  
f4c0: 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20 3d        bNewTerm =
f4d0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
f4e0: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66    assert_nc( iOf
f4f0: 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  f<pLeaf->szLeaf 
f500: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  );.      if( iOf
f510: 66 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  f>pLeaf->szLeaf 
f520: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
f530: 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
f540: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
f550: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f560: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
f570: 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  f the iterator i
f580: 73 20 6e 6f 77 20 61 74 20 45 4f 46 2e 20 49 66  s now at EOF. If
f590: 20 73 6f 2c 20 72 65 74 75 72 6e 20 65 61 72 6c   so, return earl
f5a0: 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 74 65  y. */.  if( pIte
f5b0: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
f5c0: 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a  if( bNewTerm ){.
f5d0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
f5e0: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
f5f0: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 7b  GITER_ONETERM ){
f600: 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
f610: 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
f620: 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
f630: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
f640: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f650: 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
f660: 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49  erLoadTerm(p, pI
f670: 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  ter, nKeep);.   
f680: 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
f690: 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
f6a0: 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
f6b0: 70 62 4e 65 77 54 65 72 6d 20 29 20 2a 70 62 4e  pbNewTerm ) *pbN
f6c0: 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  ewTerm = 1;.    
f6d0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
f6e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c       /* The foll
f6f0: 6f 77 69 6e 67 20 63 6f 75 6c 64 20 62 65 20 64  owing could be d
f700: 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 66  one by calling f
f710: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
f720: 6f 73 28 29 2e 20 42 75 74 0a 20 20 20 20 20 20  os(). But.      
f730: 2a 2a 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73  ** this block is
f740: 20 70 61 72 74 69 63 75 6c 61 72 6c 79 20 70 65   particularly pe
f750: 72 66 6f 72 6d 61 6e 63 65 20 63 72 69 74 69 63  rformance critic
f760: 61 6c 2c 20 73 6f 20 65 71 75 69 76 61 6c 65 6e  al, so equivalen
f770: 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 20  t.      ** code 
f780: 69 73 20 69 6e 6c 69 6e 65 64 2e 20 0a 20 20 20  is inlined. .   
f790: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4c     **.      ** L
f7a0: 61 74 65 72 3a 20 53 77 69 74 63 68 65 64 20 62  ater: Switched b
f7b0: 61 63 6b 20 74 6f 20 66 74 73 35 53 65 67 49 74  ack to fts5SegIt
f7c0: 65 72 4c 6f 61 64 4e 50 6f 73 28 29 20 62 65 63  erLoadNPos() bec
f7d0: 61 75 73 65 20 69 74 20 73 75 70 70 6f 72 74 73  ause it supports
f7e0: 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 61 69 6c  .      ** detail
f7f0: 3d 6e 6f 6e 65 20 6d 6f 64 65 2e 20 4e 6f 74 20  =none mode. Not 
f800: 69 64 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a  ideal..      */.
f810: 20 20 20 20 20 20 69 6e 74 20 6e 53 7a 3b 0a 20        int nSz;. 
f820: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
f830: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
f840: 0a 20 20 20 20 20 20 66 74 73 35 46 61 73 74 47  .      fts5FastG
f850: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
f860: 2d 3e 70 4c 65 61 66 2d 3e 70 2c 20 70 49 74 65  ->pLeaf->p, pIte
f870: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2c 20  r->iLeafOffset, 
f880: 6e 53 7a 29 3b 0a 20 20 20 20 20 20 70 49 74 65  nSz);.      pIte
f890: 72 2d 3e 62 44 65 6c 20 3d 20 28 6e 53 7a 20 26  r->bDel = (nSz &
f8a0: 20 30 78 30 30 30 31 29 3b 0a 20 20 20 20 20 20   0x0001);.      
f8b0: 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 6e 53  pIter->nPos = nS
f8c0: 7a 3e 3e 31 3b 0a 20 20 20 20 20 20 61 73 73 65  z>>1;.      asse
f8d0: 72 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e 6e 50  rt_nc( pIter->nP
f8e0: 6f 73 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  os>=0 );.    }. 
f8f0: 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 53 57   }.}..#define SW
f900: 41 50 56 41 4c 28 54 2c 20 61 2c 20 62 29 20 7b  APVAL(T, a, b) {
f910: 20 54 20 74 6d 70 3b 20 74 6d 70 3d 61 3b 20 61   T tmp; tmp=a; a
f920: 3d 62 3b 20 62 3d 74 6d 70 3b 20 7d 0a 0a 23 64  =b; b=tmp; }..#d
f930: 65 66 69 6e 65 20 66 74 73 35 49 6e 64 65 78 53  efine fts5IndexS
f940: 6b 69 70 56 61 72 69 6e 74 28 61 2c 20 69 4f 66  kipVarint(a, iOf
f950: 66 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  f) {            
f960: 5c 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69  \.  int iEnd = i
f970: 4f 66 66 2b 39 3b 20 20 20 20 20 20 20 20 20 20  Off+9;          
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f990: 20 20 20 20 5c 0a 20 20 77 68 69 6c 65 28 20 28      \.  while( (
f9a0: 61 5b 69 4f 66 66 2b 2b 5d 20 26 20 30 78 38 30  a[iOff++] & 0x80
f9b0: 29 20 26 26 20 69 4f 66 66 3c 69 45 6e 64 20 29  ) && iOff<iEnd )
f9c0: 3b 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a  ;       \.}../*.
f9d0: 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65  ** Iterator pIte
f9e0: 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
f9f0: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
fa00: 72 6f 77 69 64 20 69 6e 20 61 20 64 6f 63 6c 69  rowid in a docli
fa10: 73 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  st. This.** func
fa20: 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 69 74  tion sets the it
fa30: 65 72 61 74 6f 72 20 75 70 20 73 6f 20 74 68 61  erator up so tha
fa40: 74 20 69 74 65 72 61 74 65 73 20 69 6e 20 72 65  t iterates in re
fa50: 76 65 72 73 65 20 6f 72 64 65 72 20 74 68 72 6f  verse order thro
fa60: 75 67 68 0a 2a 2a 20 74 68 65 20 64 6f 63 6c 69  ugh.** the docli
fa70: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
fa80: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65  id fts5SegIterRe
fa90: 76 65 72 73 65 28 46 74 73 35 49 6e 64 65 78 20  verse(Fts5Index 
faa0: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
fab0: 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 44  *pIter){.  Fts5D
fac0: 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
fad0: 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78   = pIter->pDlidx
fae0: 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c  ;.  Fts5Data *pL
faf0: 61 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70  ast = 0;.  int p
fb00: 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 0a 20 20  gnoLast = 0;..  
fb10: 69 66 28 20 70 44 6c 69 64 78 20 29 7b 0a 20 20  if( pDlidx ){.  
fb20: 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 70    int iSegid = p
fb30: 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67  Iter->pSeg->iSeg
fb40: 69 64 3b 0a 20 20 20 20 70 67 6e 6f 4c 61 73 74  id;.    pgnoLast
fb50: 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
fb60: 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20  Pgno(pDlidx);.  
fb70: 20 20 70 4c 61 73 74 20 3d 20 66 74 73 35 44 61    pLast = fts5Da
fb80: 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53  taRead(p, FTS5_S
fb90: 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65  EGMENT_ROWID(iSe
fba0: 67 69 64 2c 20 70 67 6e 6f 4c 61 73 74 29 29 3b  gid, pgnoLast));
fbb0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74  .  }else{.    Ft
fbc0: 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20  s5Data *pLeaf = 
fbd0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20 20 20  pIter->pLeaf;   
fbe0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
fbf0: 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20   leaf data */.. 
fc00: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 2c     /* Currently,
fc10: 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65   Fts5SegIter.iLe
fc20: 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 73 20  afOffset points 
fc30: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
fc40: 65 20 6f 66 0a 20 20 20 20 2a 2a 20 70 6f 73 69  e of.    ** posi
fc50: 74 69 6f 6e 2d 6c 69 73 74 20 63 6f 6e 74 65 6e  tion-list conten
fc60: 74 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  t for the curren
fc70: 74 20 72 6f 77 69 64 2e 20 42 61 63 6b 20 69 74  t rowid. Back it
fc80: 20 75 70 20 73 6f 20 74 68 61 74 20 69 74 0a 20   up so that it. 
fc90: 20 20 20 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20     ** points to 
fca0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
fcb0: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
fcc0: 69 7a 65 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  ize field. */.  
fcd0: 20 20 69 6e 74 20 69 50 6f 73 6c 69 73 74 3b 0a    int iPoslist;.
fce0: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
fcf0: 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70 49  TermLeafPgno==pI
fd00: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29  ter->iLeafPgno )
fd10: 7b 0a 20 20 20 20 20 20 69 50 6f 73 6c 69 73 74  {.      iPoslist
fd20: 20 3d 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c   = pIter->iTermL
fd30: 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 7d  eafOffset;.    }
fd40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 50 6f 73  else{.      iPos
fd50: 6c 69 73 74 20 3d 20 34 3b 0a 20 20 20 20 7d 0a  list = 4;.    }.
fd60: 20 20 20 20 66 74 73 35 49 6e 64 65 78 53 6b 69      fts5IndexSki
fd70: 70 56 61 72 69 6e 74 28 70 4c 65 61 66 2d 3e 70  pVarint(pLeaf->p
fd80: 2c 20 69 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20  , iPoslist);.   
fd90: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
fda0: 73 65 74 20 3d 20 69 50 6f 73 6c 69 73 74 3b 0a  set = iPoslist;.
fdb0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
fdc0: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75  condition is tru
fdd0: 65 20 74 68 65 6e 20 74 68 65 20 6c 61 72 67 65  e then the large
fde0: 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  st rowid for the
fdf0: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20   current.    ** 
fe00: 74 65 72 6d 20 6d 61 79 20 6e 6f 74 20 62 65 20  term may not be 
fe10: 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 63 75  stored on the cu
fe20: 72 72 65 6e 74 20 70 61 67 65 2e 20 53 6f 20 73  rrent page. So s
fe30: 65 61 72 63 68 20 66 6f 72 77 61 72 64 20 74 6f  earch forward to
fe40: 0a 20 20 20 20 2a 2a 20 73 65 65 20 77 68 65 72  .    ** see wher
fe50: 65 20 73 61 69 64 20 72 6f 77 69 64 20 72 65 61  e said rowid rea
fe60: 6c 6c 79 20 69 73 2e 20 20 2a 2f 0a 20 20 20 20  lly is.  */.    
fe70: 69 66 28 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f  if( pIter->iEndo
fe80: 66 44 6f 63 6c 69 73 74 3e 3d 70 4c 65 61 66 2d  fDoclist>=pLeaf-
fe90: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
fea0: 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 20 20 20   int pgno;.     
feb0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
fec0: 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49  gment *pSeg = pI
fed0: 74 65 72 2d 3e 70 53 65 67 3b 0a 0a 20 20 20 20  ter->pSeg;..    
fee0: 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 72 6f    /* The last ro
fef0: 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69  wid in the docli
ff00: 73 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 6e  st may not be on
ff10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
ff20: 65 2e 20 53 65 61 72 63 68 0a 20 20 20 20 20 20  e. Search.      
ff30: 2a 2a 20 66 6f 72 77 61 72 64 20 74 6f 20 66 69  ** forward to fi
ff40: 6e 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  nd the page cont
ff50: 61 69 6e 69 6e 67 20 74 68 65 20 6c 61 73 74 20  aining the last 
ff60: 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20 20  rowid.  */.     
ff70: 20 66 6f 72 28 70 67 6e 6f 3d 70 49 74 65 72 2d   for(pgno=pIter-
ff80: 3e 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 20 21 70  >iLeafPgno+1; !p
ff90: 2d 3e 72 63 20 26 26 20 70 67 6e 6f 3c 3d 70 53  ->rc && pgno<=pS
ffa0: 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 20 70 67  eg->pgnoLast; pg
ffb0: 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  no++){.        i
ffc0: 36 34 20 69 41 62 73 20 3d 20 46 54 53 35 5f 53  64 iAbs = FTS5_S
ffd0: 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65  EGMENT_ROWID(pSe
ffe0: 67 2d 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f 29  g->iSegid, pgno)
fff0: 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35 44 61  ;.        Fts5Da
10000 74 61 20 2a 70 4e 65 77 20 3d 20 66 74 73 35 44  ta *pNew = fts5D
10010 61 74 61 52 65 61 64 28 70 2c 20 69 41 62 73 29  ataRead(p, iAbs)
10020 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
10030 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ew ){.          
10040 69 6e 74 20 69 52 6f 77 69 64 2c 20 62 54 65 72  int iRowid, bTer
10050 6d 6c 65 73 73 3b 0a 20 20 20 20 20 20 20 20 20  mless;.         
10060 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4c 65   iRowid = fts5Le
10070 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28  afFirstRowidOff(
10080 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20  pNew);.         
10090 20 62 54 65 72 6d 6c 65 73 73 20 3d 20 66 74 73   bTermless = fts
100a0 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28  5LeafIsTermless(
100b0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20  pNew);.         
100c0 20 69 66 28 20 69 52 6f 77 69 64 20 29 7b 0a 20   if( iRowid ){. 
100d0 20 20 20 20 20 20 20 20 20 20 20 53 57 41 50 56             SWAPV
100e0 41 4c 28 46 74 73 35 44 61 74 61 2a 2c 20 70 4e  AL(Fts5Data*, pN
100f0 65 77 2c 20 70 4c 61 73 74 29 3b 0a 20 20 20 20  ew, pLast);.    
10100 20 20 20 20 20 20 20 20 70 67 6e 6f 4c 61 73 74          pgnoLast
10110 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20   = pgno;.       
10120 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
10130 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
10140 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  New);.          
10150 69 66 28 20 62 54 65 72 6d 6c 65 73 73 3d 3d 30  if( bTermless==0
10160 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
10170 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10180 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70  }.  }..  /* If p
10190 4c 61 73 74 20 69 73 20 4e 55 4c 4c 20 61 74 20  Last is NULL at 
101a0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
101b0 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20   the last rowid 
101c0 66 6f 72 20 74 68 69 73 20 64 6f 63 6c 69 73 74  for this doclist
101d0 0a 20 20 2a 2a 20 6c 69 65 73 20 6f 6e 20 74 68  .  ** lies on th
101e0 65 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  e page currently
101f0 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
10200 65 20 69 74 65 72 61 74 6f 72 2e 20 49 6e 20 74  e iterator. In t
10210 68 69 73 20 63 61 73 65 20 0a 20 20 2a 2a 20 70  his case .  ** p
10220 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
10230 74 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74  t is already set
10240 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
10250 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
10260 69 7a 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 61  ize.  ** field a
10270 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
10280 68 65 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e  he first relevan
10290 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70  t rowid on the p
102a0 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  age..  **.  ** O
102b0 72 2c 20 69 66 20 70 4c 61 73 74 20 69 73 20 6e  r, if pLast is n
102c0 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  on-NULL, then it
102d0 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61   is the page tha
102e0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  t contains the l
102f0 61 73 74 0a 20 20 2a 2a 20 72 6f 77 69 64 2e 20  ast.  ** rowid. 
10300 49 6e 20 74 68 69 73 20 63 61 73 65 20 63 6f 6e  In this case con
10310 66 69 67 75 72 65 20 74 68 65 20 69 74 65 72 61  figure the itera
10320 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  tor so that it p
10330 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 20 20 2a  oints to the.  *
10340 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  * first rowid on
10350 20 74 68 69 73 20 70 61 67 65 2e 0a 20 20 2a 2f   this page..  */
10360 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29 7b 0a  .  if( pLast ){.
10370 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
10380 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
10390 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
103a0 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  .    pIter->pLea
103b0 66 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 70  f = pLast;.    p
103c0 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
103d0 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20  = pgnoLast;.    
103e0 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46  iOff = fts5LeafF
103f0 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 61  irstRowidOff(pLa
10400 73 74 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  st);.    iOff +=
10410 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
10420 70 4c 61 73 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pLast->p[iOff], 
10430 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
10440 6f 77 69 64 29 3b 0a 20 20 20 20 70 49 74 65 72  owid);.    pIter
10450 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
10460 69 4f 66 66 3b 0a 0a 20 20 20 20 69 66 28 20 66  iOff;..    if( f
10470 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73  ts5LeafIsTermles
10480 73 28 70 4c 61 73 74 29 20 29 7b 0a 20 20 20 20  s(pLast) ){.    
10490 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
104a0 6f 63 6c 69 73 74 20 3d 20 70 4c 61 73 74 2d 3e  oclist = pLast->
104b0 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nn+1;.    }else{
104c0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45  .      pIter->iE
104d0 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 66 74  ndofDoclist = ft
104e0 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f  s5LeafFirstTermO
104f0 66 66 28 70 4c 61 73 74 29 3b 0a 20 20 20 20 7d  ff(pLast);.    }
10500 0a 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67  ..  }..  fts5Seg
10510 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50  IterReverseInitP
10520 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d  age(p, pIter);.}
10530 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72  ../*.** Iterator
10540 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79   pIter currently
10550 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
10560 69 72 73 74 20 72 6f 77 69 64 20 6f 66 20 61 20  irst rowid of a 
10570 64 6f 63 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 72  doclist..** Ther
10580 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69  e is a doclist-i
10590 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
105a0 77 69 74 68 20 74 68 65 20 66 69 6e 61 6c 20 74  with the final t
105b0 65 72 6d 20 6f 6e 20 74 68 65 20 63 75 72 72 65  erm on the curre
105c0 6e 74 20 0a 2a 2a 20 70 61 67 65 2e 20 49 66 20  nt .** page. If 
105d0 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d  the current term
105e0 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 65 72   is the last ter
105f0 6d 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6c  m on the page, l
10600 6f 61 64 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c  oad the .** docl
10610 69 73 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20 64  ist-index from d
10620 69 73 6b 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  isk and initiali
10630 7a 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20 61  ze an iterator a
10640 74 20 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78  t (pIter->pDlidx
10650 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
10660 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61  d fts5SegIterLoa
10670 64 44 6c 69 64 78 28 46 74 73 35 49 6e 64 65 78  dDlidx(Fts5Index
10680 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
10690 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
106a0 69 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53  iSeg = pIter->pS
106b0 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 69 6e  eg->iSegid;.  in
106c0 74 20 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d  t bRev = (pIter-
106d0 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
106e0 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a  GITER_REVERSE);.
106f0 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
10700 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
10710 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61  ; /* Current lea
10720 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20 61 73 73  f data */..  ass
10730 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67  ert( pIter->flag
10740 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
10750 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73  _ONETERM );.  as
10760 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c  sert( pIter->pDl
10770 69 64 78 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  idx==0 );..  /* 
10780 43 68 65 63 6b 20 69 66 20 74 68 65 20 63 75 72  Check if the cur
10790 72 65 6e 74 20 64 6f 63 6c 69 73 74 20 65 6e 64  rent doclist end
107a0 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 20  s on this page. 
107b0 49 66 20 69 74 20 64 6f 65 73 2c 20 72 65 74 75  If it does, retu
107c0 72 6e 0a 20 20 2a 2a 20 65 61 72 6c 79 20 77 69  rn.  ** early wi
107d0 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 74 68  thout loading th
107e0 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  e doclist-index 
107f0 28 61 73 20 69 74 20 62 65 6c 6f 6e 67 73 20 74  (as it belongs t
10800 6f 20 61 20 64 69 66 66 65 72 65 6e 74 0a 20 20  o a different.  
10810 2a 2a 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 69 66  ** term. */.  if
10820 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  ( pIter->iTermLe
10830 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69  afPgno==pIter->i
10840 4c 65 61 66 50 67 6e 6f 20 0a 20 20 20 26 26 20  LeafPgno .   && 
10850 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
10860 6c 69 73 74 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65  list<pLeaf->szLe
10870 61 66 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  af .  ){.    ret
10880 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65  urn;.  }..  pIte
10890 72 2d 3e 70 44 6c 69 64 78 20 3d 20 66 74 73 35  r->pDlidx = fts5
108a0 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c  DlidxIterInit(p,
108b0 20 62 52 65 76 2c 20 69 53 65 67 2c 20 70 49 74   bRev, iSeg, pIt
108c0 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  er->iTermLeafPgn
108d0 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  o);.}../*.** The
108e0 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
108f0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
10900 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
10910 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
10920 73 0a 2a 2a 20 6e 6f 20 76 61 6c 69 64 20 76 61  s.** no valid va
10930 6c 75 65 73 20 65 78 63 65 70 74 20 66 6f 72 20  lues except for 
10940 74 68 65 20 46 74 73 35 53 65 67 49 74 65 72 2e  the Fts5SegIter.
10950 70 4c 65 61 66 20 6d 65 6d 62 65 72 20 76 61 72  pLeaf member var
10960 69 61 62 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 66  iable. This.** f
10970 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73  unction searches
10980 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 66   the leaf page f
10990 6f 72 20 61 20 74 65 72 6d 20 6d 61 74 63 68 69  or a term matchi
109a0 6e 67 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  ng (pTerm/nTerm)
109b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
109c0 70 65 63 69 66 69 65 64 20 74 65 72 6d 20 69 73  pecified term is
109d0 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 70 61   found on the pa
109e0 67 65 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65  ge, then the ite
109f0 72 61 74 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a  rator is left.**
10a00 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e   pointing to it.
10a10 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 47 65   If argument bGe
10a20 20 69 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65   is zero and the
10a30 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 66 6f 75   term is not fou
10a40 6e 64 2c 0a 2a 2a 20 74 68 65 20 69 74 65 72 61  nd,.** the itera
10a50 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  tor is left poin
10a60 74 69 6e 67 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a  ting at EOF..**.
10a70 2a 2a 20 49 66 20 62 47 65 20 69 73 20 6e 6f 6e  ** If bGe is non
10a80 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 73 70  -zero and the sp
10a90 65 63 69 66 69 65 64 20 74 65 72 6d 20 69 73 20  ecified term is 
10aa0 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  not found, then 
10ab0 74 68 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20  the.** iterator 
10ac0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
10ad0 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74   to the smallest
10ae0 20 74 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67   term in the seg
10af0 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20 69 73 20  ment that.** is 
10b00 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
10b10 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 2c 20  specified term, 
10b20 65 76 65 6e 20 69 66 20 74 68 69 73 20 74 65 72  even if this ter
10b30 6d 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 0a  m is not on the.
10b40 2a 2a 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  ** current page.
10b50 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10b60 66 74 73 35 4c 65 61 66 53 65 65 6b 28 0a 20 20  fts5LeafSeek(.  
10b70 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
10b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b90 2f 2a 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72  /* Leave any err
10ba0 6f 72 20 63 6f 64 65 20 68 65 72 65 20 2a 2f 0a  or code here */.
10bb0 20 20 69 6e 74 20 62 47 65 2c 20 20 20 20 20 20    int bGe,      
10bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bd0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
10be0 3e 3d 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 46  >= search */.  F
10bf0 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
10c00 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
10c10 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 73 65  * Iterator to se
10c20 65 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  ek */.  const u8
10c30 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65   *pTerm, int nTe
10c40 72 6d 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20  rm      /* Term 
10c50 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f  to search for */
10c60 0a 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a  .){.  int iOff;.
10c70 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20    const u8 *a = 
10c80 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
10c90 0a 20 20 69 6e 74 20 73 7a 4c 65 61 66 20 3d 20  .  int szLeaf = 
10ca0 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
10cb0 4c 65 61 66 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  Leaf;.  int n = 
10cc0 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
10cd0 3b 0a 0a 20 20 69 6e 74 20 6e 4d 61 74 63 68 20  ;..  int nMatch 
10ce0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70  = 0;.  int nKeep
10cf0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4e 65 77   = 0;.  int nNew
10d00 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 65 72   = 0;.  int iTer
10d10 6d 4f 66 66 3b 0a 20 20 69 6e 74 20 69 50 67 69  mOff;.  int iPgi
10d20 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
10d30 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
10d40 6e 74 20 6f 66 66 73 65 74 20 69 6e 20 70 67 69  nt offset in pgi
10d50 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6e 64  dx */.  int bEnd
10d60 4f 66 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  OfPage = 0;..  a
10d70 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
10d80 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 50  LITE_OK );..  iP
10d90 67 69 64 78 20 3d 20 73 7a 4c 65 61 66 3b 0a 20  gidx = szLeaf;. 
10da0 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47   iPgidx += fts5G
10db0 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50  etVarint32(&a[iP
10dc0 67 69 64 78 5d 2c 20 69 54 65 72 6d 4f 66 66 29  gidx], iTermOff)
10dd0 3b 0a 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d  ;.  iOff = iTerm
10de0 4f 66 66 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31  Off;..  while( 1
10df0 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75   ){..    /* Figu
10e00 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
10e10 6e 65 77 20 62 79 74 65 73 20 61 72 65 20 69 6e  new bytes are in
10e20 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20   this term */.  
10e30 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72    fts5FastGetVar
10e40 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e  int32(a, iOff, n
10e50 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 6e 4b  New);.    if( nK
10e60 65 65 70 3c 6e 4d 61 74 63 68 20 29 7b 0a 20 20  eep<nMatch ){.  
10e70 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f      goto search_
10e80 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
10e90 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 65 70     assert( nKeep
10ea0 3e 3d 6e 4d 61 74 63 68 20 29 3b 0a 20 20 20 20  >=nMatch );.    
10eb0 69 66 28 20 6e 4b 65 65 70 3d 3d 6e 4d 61 74 63  if( nKeep==nMatc
10ec0 68 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  h ){.      int n
10ed0 43 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Cmp;.      int i
10ee0 3b 0a 20 20 20 20 20 20 6e 43 6d 70 20 3d 20 4d  ;.      nCmp = M
10ef0 49 4e 28 6e 4e 65 77 2c 20 6e 54 65 72 6d 2d 6e  IN(nNew, nTerm-n
10f00 4d 61 74 63 68 29 3b 0a 20 20 20 20 20 20 66 6f  Match);.      fo
10f10 72 28 69 3d 30 3b 20 69 3c 6e 43 6d 70 3b 20 69  r(i=0; i<nCmp; i
10f20 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
10f30 20 61 5b 69 4f 66 66 2b 69 5d 21 3d 70 54 65 72   a[iOff+i]!=pTer
10f40 6d 5b 6e 4d 61 74 63 68 2b 69 5d 20 29 20 62 72  m[nMatch+i] ) br
10f50 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
10f60 20 20 20 6e 4d 61 74 63 68 20 2b 3d 20 69 3b 0a     nMatch += i;.
10f70 0a 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d  .      if( nTerm
10f80 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20  ==nMatch ){.    
10f90 20 20 20 20 69 66 28 20 69 3d 3d 6e 4e 65 77 20      if( i==nNew 
10fa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
10fb0 6f 20 73 65 61 72 63 68 5f 73 75 63 63 65 73 73  o search_success
10fc0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
10fd0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
10fe0 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20  search_failed;. 
10ff0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11000 65 6c 73 65 20 69 66 28 20 69 3c 6e 4e 65 77 20  else if( i<nNew 
11010 26 26 20 61 5b 69 4f 66 66 2b 69 5d 3e 70 54 65  && a[iOff+i]>pTe
11020 72 6d 5b 6e 4d 61 74 63 68 5d 20 29 7b 0a 20 20  rm[nMatch] ){.  
11030 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63        goto searc
11040 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  h_failed;.      
11050 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
11060 20 69 50 67 69 64 78 3e 3d 6e 20 29 7b 0a 20 20   iPgidx>=n ){.  
11070 20 20 20 20 62 45 6e 64 4f 66 50 61 67 65 20 3d      bEndOfPage =
11080 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
11090 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 50 67 69  .    }..    iPgi
110a0 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  dx += fts5GetVar
110b0 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 5d  int32(&a[iPgidx]
110c0 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 69 54  , nKeep);.    iT
110d0 65 72 6d 4f 66 66 20 2b 3d 20 6e 4b 65 65 70 3b  ermOff += nKeep;
110e0 0a 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72  .    iOff = iTer
110f0 6d 4f 66 66 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  mOff;..    /* Re
11100 61 64 20 74 68 65 20 6e 4b 65 65 70 20 66 69 65  ad the nKeep fie
11110 6c 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20 74  ld of the next t
11120 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35  erm. */.    fts5
11130 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28  FastGetVarint32(
11140 61 2c 20 69 4f 66 66 2c 20 6e 4b 65 65 70 29 3b  a, iOff, nKeep);
11150 0a 20 20 7d 0a 0a 20 73 65 61 72 63 68 5f 66 61  .  }.. search_fa
11160 69 6c 65 64 3a 0a 20 20 69 66 28 20 62 47 65 3d  iled:.  if( bGe=
11170 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 44 61  =0 ){.    fts5Da
11180 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
11190 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74  >pLeaf);.    pIt
111a0 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20  er->pLeaf = 0;. 
111b0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c     return;.  }el
111c0 73 65 20 69 66 28 20 62 45 6e 64 4f 66 50 61 67  se if( bEndOfPag
111d0 65 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  e ){.    do {.  
111e0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
111f0 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
11200 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
11210 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72  er->pLeaf==0 ) r
11220 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 20 3d  eturn;.      a =
11230 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
11240 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35  ;.      if( fts5
11250 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70  LeafIsTermless(p
11260 49 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 30 20  Iter->pLeaf)==0 
11270 29 7b 0a 20 20 20 20 20 20 20 20 69 50 67 69 64  ){.        iPgid
11280 78 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  x = pIter->pLeaf
11290 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20  ->szLeaf;.      
112a0 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35    iPgidx += fts5
112b0 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  GetVarint32(&pIt
112c0 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 50 67  er->pLeaf->p[iPg
112d0 69 64 78 5d 2c 20 69 4f 66 66 29 3b 0a 20 20 20  idx], iOff);.   
112e0 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20       if( iOff<4 
112f0 7c 7c 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  || iOff>=pIter->
11300 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
11310 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
11320 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
11330 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
11340 20 20 20 20 20 20 20 20 20 20 6e 4b 65 65 70 20            nKeep 
11350 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
11360 54 65 72 6d 4f 66 66 20 3d 20 69 4f 66 66 3b 0a  TermOff = iOff;.
11370 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 49            n = pI
11380 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a  ter->pLeaf->nn;.
11390 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b            iOff +
113a0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
113b0 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77  2(&a[iOff], nNew
113c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
113d0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
113e0 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65      }.    }while
113f0 28 20 31 20 29 3b 0a 20 20 7d 0a 0a 20 73 65 61  ( 1 );.  }.. sea
11400 72 63 68 5f 73 75 63 63 65 73 73 3a 0a 0a 20 20  rch_success:..  
11410 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
11420 65 74 20 3d 20 69 4f 66 66 20 2b 20 6e 4e 65 77  et = iOff + nNew
11430 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  ;.  pIter->iTerm
11440 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74  LeafOffset = pIt
11450 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
11460 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  .  pIter->iTermL
11470 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d  eafPgno = pIter-
11480 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20 20 66  >iLeafPgno;..  f
11490 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
114a0 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72  >rc, &pIter->ter
114b0 6d 2c 20 6e 4b 65 65 70 2c 20 70 54 65 72 6d 29  m, nKeep, pTerm)
114c0 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  ;.  fts5BufferAp
114d0 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
114e0 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e   &pIter->term, n
114f0 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a  New, &a[iOff]);.
11500 0a 20 20 69 66 28 20 69 50 67 69 64 78 3e 3d 6e  .  if( iPgidx>=n
11510 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   ){.    pIter->i
11520 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70  EndofDoclist = p
11530 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b  Iter->pLeaf->nn+
11540 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
11550 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20 20 20 20  int nExtra;.    
11560 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65  iPgidx += fts5Ge
11570 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67  tVarint32(&a[iPg
11580 69 64 78 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20  idx], nExtra);. 
11590 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
115a0 44 6f 63 6c 69 73 74 20 3d 20 69 54 65 72 6d 4f  Doclist = iTermO
115b0 66 66 20 2b 20 6e 45 78 74 72 61 3b 0a 20 20 7d  ff + nExtra;.  }
115c0 0a 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78  .  pIter->iPgidx
115d0 4f 66 66 20 3d 20 69 50 67 69 64 78 3b 0a 0a 20  Off = iPgidx;.. 
115e0 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
115f0 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72 29 3b  Rowid(p, pIter);
11600 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  .  fts5SegIterLo
11610 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
11620 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
11630 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74  alize the object
11640 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
11650 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54  to term pTerm/nT
11660 65 72 6d 20 77 69 74 68 69 6e 20 73 65 67 6d 65  erm within segme
11670 6e 74 0a 2a 2a 20 70 53 65 67 2e 20 49 66 20 74  nt.** pSeg. If t
11680 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20  here is no such 
11690 74 65 72 6d 20 69 6e 20 74 68 65 20 69 6e 64 65  term in the inde
116a0 78 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  x, the iterator 
116b0 69 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a  is set to EOF..*
116c0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
116d0 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64   occurs, Fts5Ind
116e0 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20  ex.rc is set to 
116f0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
11700 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a  rror code. If .*
11710 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  * an error has a
11720 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
11730 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
11740 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
11750 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
11760 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
11770 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28  SegIterSeekInit(
11780 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
11790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117a0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
117b0 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  nd */.  const u8
117c0 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65   *pTerm, int nTe
117d0 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20  rm,     /* Term 
117e0 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20  to seek to */.  
117f0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11810 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 49  /* Mask of FTS5I
11820 4e 44 45 58 5f 58 58 58 20 66 6c 61 67 73 20 2a  NDEX_XXX flags *
11830 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
11840 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20  eSegment *pSeg, 
11850 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
11860 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f  on of segment */
11870 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
11880 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20  pIter           
11890 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20     /* Object to 
118a0 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20  populate */.){. 
118b0 20 69 6e 74 20 69 50 67 20 3d 20 31 3b 0a 20 20   int iPg = 1;.  
118c0 69 6e 74 20 62 47 65 20 3d 20 28 66 6c 61 67 73  int bGe = (flags
118d0 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
118e0 52 59 5f 53 43 41 4e 29 3b 0a 20 20 69 6e 74 20  RY_SCAN);.  int 
118f0 62 44 6c 69 64 78 20 3d 20 30 3b 20 20 20 20 20  bDlidx = 0;     
11900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11910 72 75 65 20 69 66 20 74 68 65 72 65 20 69 73 20  rue if there is 
11920 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
11930 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 62 47  */..  assert( bG
11940 65 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26  e==0 || (flags &
11950 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
11960 5f 44 45 53 43 29 3d 3d 30 20 29 3b 0a 20 20 61  _DESC)==0 );.  a
11970 73 73 65 72 74 28 20 70 54 65 72 6d 20 26 26 20  ssert( pTerm && 
11980 6e 54 65 72 6d 20 29 3b 0a 20 20 6d 65 6d 73 65  nTerm );.  memse
11990 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
119a0 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70  of(*pIter));.  p
119b0 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65  Iter->pSeg = pSe
119c0 67 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c  g;..  /* This bl
119d0 6f 63 6b 20 73 65 74 73 20 73 74 61 63 6b 20 76  ock sets stack v
119e0 61 72 69 61 62 6c 65 20 69 50 67 20 74 6f 20 74  ariable iPg to t
119f0 68 65 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  he leaf page num
11a00 62 65 72 20 74 68 61 74 20 6d 61 79 0a 20 20 2a  ber that may.  *
11a10 2a 20 63 6f 6e 74 61 69 6e 20 74 65 72 6d 20 28  * contain term (
11a20 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c 20 69 66  pTerm/nTerm), if
11a30 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 20 69   it is present i
11a40 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 20 2a  n the segment. *
11a50 2f 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 78 53  /.  if( p->pIdxS
11a60 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
11a70 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
11a80 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
11a90 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 50  ;.    fts5IndexP
11aa0 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70  repareStmt(p, &p
11ab0 2d 3e 70 49 64 78 53 65 6c 65 63 74 2c 20 73 71  ->pIdxSelect, sq
11ac0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
11ad0 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
11ae0 20 70 67 6e 6f 20 46 52 4f 4d 20 27 25 71 27 2e   pgno FROM '%q'.
11af0 27 25 71 5f 69 64 78 27 20 57 48 45 52 45 20 22  '%q_idx' WHERE "
11b00 0a 20 20 20 20 20 20 20 20 20 20 22 73 65 67 69  .          "segi
11b10 64 3d 3f 20 41 4e 44 20 74 65 72 6d 3c 3d 3f 20  d=? AND term<=? 
11b20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 44 45  ORDER BY term DE
11b30 53 43 20 4c 49 4d 49 54 20 31 22 2c 0a 20 20 20  SC LIMIT 1",.   
11b40 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e         pConfig->
11b50 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e  zDb, pConfig->zN
11b60 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a  ame.    ));.  }.
11b70 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
11b80 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f  turn;.  sqlite3_
11b90 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78  bind_int(p->pIdx
11ba0 53 65 6c 65 63 74 2c 20 31 2c 20 70 53 65 67 2d  Select, 1, pSeg-
11bb0 3e 69 53 65 67 69 64 29 3b 0a 20 20 73 71 6c 69  >iSegid);.  sqli
11bc0 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d  te3_bind_blob(p-
11bd0 3e 70 49 64 78 53 65 6c 65 63 74 2c 20 32 2c 20  >pIdxSelect, 2, 
11be0 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 53 51  pTerm, nTerm, SQ
11bf0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
11c00 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
11c10 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e  sqlite3_step(p->
11c20 70 49 64 78 53 65 6c 65 63 74 29 20 29 7b 0a 20  pIdxSelect) ){. 
11c30 20 20 20 69 36 34 20 76 61 6c 20 3d 20 73 71 6c     i64 val = sql
11c40 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
11c50 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 2c 20 30  p->pIdxSelect, 0
11c60 29 3b 0a 20 20 20 20 69 50 67 20 3d 20 28 69 6e  );.    iPg = (in
11c70 74 29 28 76 61 6c 3e 3e 31 29 3b 0a 20 20 20 20  t)(val>>1);.    
11c80 62 44 6c 69 64 78 20 3d 20 28 76 61 6c 20 26 20  bDlidx = (val & 
11c90 30 78 30 30 30 31 29 3b 0a 20 20 7d 0a 20 20 70  0x0001);.  }.  p
11ca0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  ->rc = sqlite3_r
11cb0 65 73 65 74 28 70 2d 3e 70 49 64 78 53 65 6c 65  eset(p->pIdxSele
11cc0 63 74 29 3b 0a 0a 20 20 69 66 28 20 69 50 67 3c  ct);..  if( iPg<
11cd0 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
11ce0 29 7b 0a 20 20 20 20 69 50 67 20 3d 20 70 53 65  ){.    iPg = pSe
11cf0 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 20 20  g->pgnoFirst;.  
11d00 20 20 62 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20    bDlidx = 0;.  
11d10 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  }..  pIter->iLea
11d20 66 50 67 6e 6f 20 3d 20 69 50 67 20 2d 20 31 3b  fPgno = iPg - 1;
11d30 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  .  fts5SegIterNe
11d40 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
11d50 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  ;..  if( pIter->
11d60 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73  pLeaf ){.    fts
11d70 35 4c 65 61 66 53 65 65 6b 28 70 2c 20 62 47 65  5LeafSeek(p, bGe
11d80 2c 20 70 49 74 65 72 2c 20 70 54 65 72 6d 2c 20  , pIter, pTerm, 
11d90 6e 54 65 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 69  nTerm);.  }..  i
11da0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
11db0 5f 4f 4b 20 26 26 20 62 47 65 3d 3d 30 20 29 7b  _OK && bGe==0 ){
11dc0 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67  .    pIter->flag
11dd0 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
11de0 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69  R_ONETERM;.    i
11df0 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  f( pIter->pLeaf 
11e00 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61  ){.      if( fla
11e10 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
11e20 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20  UERY_DESC ){.   
11e30 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67       pIter->flag
11e40 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
11e50 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20  R_REVERSE;.     
11e60 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62 44 6c   }.      if( bDl
11e70 69 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 66  idx ){.        f
11e80 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44 6c  ts5SegIterLoadDl
11e90 69 64 78 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  idx(p, pIter);. 
11ea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11eb0 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
11ec0 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b  EX_QUERY_DESC ){
11ed0 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
11ee0 49 74 65 72 52 65 76 65 72 73 65 28 70 2c 20 70  IterReverse(p, p
11ef0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
11f00 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35     }.  }..  fts5
11f10 53 65 67 49 74 65 72 53 65 74 4e 65 78 74 28 70  SegIterSetNext(p
11f20 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  , pIter);..  /* 
11f30 45 69 74 68 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a  Either:.  **.  *
11f40 2a 20 20 20 31 29 20 61 6e 20 65 72 72 6f 72 20  *   1) an error 
11f50 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 6f 72  has occurred, or
11f60 0a 20 20 2a 2a 20 20 20 32 29 20 74 68 65 20 69  .  **   2) the i
11f70 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74  terator points t
11f80 6f 20 45 4f 46 2c 20 6f 72 0a 20 20 2a 2a 20 20  o EOF, or.  **  
11f90 20 33 29 20 74 68 65 20 69 74 65 72 61 74 6f 72   3) the iterator
11fa0 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
11fb0 74 72 79 20 77 69 74 68 20 74 65 72 6d 20 28 70  try with term (p
11fc0 54 65 72 6d 2f 6e 54 65 72 6d 29 2c 20 6f 72 0a  Term/nTerm), or.
11fd0 20 20 2a 2a 20 20 20 34 29 20 74 68 65 20 46 54    **   4) the FT
11fe0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
11ff0 41 4e 20 66 6c 61 67 20 77 61 73 20 73 65 74 20  AN flag was set 
12000 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 6f 72  and the iterator
12010 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 20 20 20   points.  **    
12020 20 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 77 69    to an entry wi
12030 74 68 20 61 20 74 65 72 6d 20 67 72 65 61 74 65  th a term greate
12040 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
12050 74 6f 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  to (pTerm/nTerm)
12060 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
12070 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
12080 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K               
12090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
120b0 2a 2f 0a 20 20 20 7c 7c 20 70 49 74 65 72 2d 3e  */.   || pIter->
120c0 70 4c 65 61 66 3d 3d 30 20 20 20 20 20 20 20 20  pLeaf==0        
120d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120f0 20 20 20 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20         /* 2 */. 
12100 20 20 7c 7c 20 66 74 73 35 42 75 66 66 65 72 43    || fts5BufferC
12110 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70 49 74 65  ompareBlob(&pIte
12120 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20  r->term, pTerm, 
12130 6e 54 65 72 6d 29 3d 3d 30 20 20 20 20 20 20 20  nTerm)==0       
12140 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 7c 7c     /* 3 */.   ||
12150 20 28 62 47 65 20 26 26 20 66 74 73 35 42 75 66   (bGe && fts5Buf
12160 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26  ferCompareBlob(&
12170 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65  pIter->term, pTe
12180 72 6d 2c 20 6e 54 65 72 6d 29 3e 30 29 20 20 2f  rm, nTerm)>0)  /
12190 2a 20 34 20 2a 2f 0a 20 20 29 3b 0a 7d 0a 0a 2f  * 4 */.  );.}../
121a0 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
121b0 74 68 65 20 6f 62 6a 65 63 74 20 70 49 74 65 72  the object pIter
121c0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 65 72   to point to ter
121d0 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69  m pTerm/nTerm wi
121e0 74 68 69 6e 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d  thin the.** in-m
121f0 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
12200 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
12210 20 73 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68   such term in th
12220 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 74 68  e hash-table, th
12230 65 20 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 69  e .** iterator i
12240 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a  s set to EOF..**
12250 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
12260 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65  occurs, Fts5Inde
12270 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61  x.rc is set to a
12280 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
12290 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a  ror code. If .**
122a0 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
122b0 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
122c0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
122d0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
122e0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
122f0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
12300 65 67 49 74 65 72 48 61 73 68 49 6e 69 74 28 0a  egIterHashInit(.
12310 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12330 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
12340 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  d */.  const u8 
12350 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72  *pTerm, int nTer
12360 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74  m,     /* Term t
12370 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69  o seek to */.  i
12380 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
12390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
123a0 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e  * Mask of FTS5IN
123b0 44 45 58 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  DEX_XXX flags */
123c0 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
123d0 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20  pIter           
123e0 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20     /* Object to 
123f0 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20  populate */.){. 
12400 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73 74   const u8 *pList
12410 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4c 69 73   = 0;.  int nLis
12420 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75  t = 0;.  const u
12430 38 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 6e 74 20  8 *z = 0;.  int 
12440 6e 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  n = 0;..  assert
12450 28 20 70 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20  ( p->pHash );.  
12460 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
12470 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69  QLITE_OK );..  i
12480 66 28 20 70 54 65 72 6d 3d 3d 30 20 7c 7c 20 28  f( pTerm==0 || (
12490 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
124a0 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 20 29 7b  X_QUERY_SCAN) ){
124b0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
124c0 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
124d0 49 6e 69 74 28 70 2d 3e 70 48 61 73 68 2c 20 28  Init(p->pHash, (
124e0 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 65 72  const char*)pTer
124f0 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 73  m, nTerm);.    s
12500 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
12510 61 6e 45 6e 74 72 79 28 70 2d 3e 70 48 61 73 68  anEntry(p->pHash
12520 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  , (const char**)
12530 26 7a 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69  &z, &pList, &nLi
12540 73 74 29 3b 0a 20 20 20 20 6e 20 3d 20 28 7a 20  st);.    n = (z 
12550 3f 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 28 63  ? (int)strlen((c
12560 6f 6e 73 74 20 63 68 61 72 2a 29 7a 29 20 3a 20  onst char*)z) : 
12570 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
12580 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d   pIter->flags |=
12590 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
125a0 45 54 45 52 4d 3b 0a 20 20 20 20 73 71 6c 69 74  ETERM;.    sqlit
125b0 65 33 46 74 73 35 48 61 73 68 51 75 65 72 79 28  e3Fts5HashQuery(
125c0 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74  p->pHash, (const
125d0 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54   char*)pTerm, nT
125e0 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c  erm, &pList, &nL
125f0 69 73 74 29 3b 0a 20 20 20 20 7a 20 3d 20 70 54  ist);.    z = pT
12600 65 72 6d 3b 0a 20 20 20 20 6e 20 3d 20 6e 54 65  erm;.    n = nTe
12610 72 6d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rm;.  }..  if( p
12620 4c 69 73 74 20 29 7b 0a 20 20 20 20 46 74 73 35  List ){.    Fts5
12630 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20  Data *pLeaf;.   
12640 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
12650 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
12660 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 2c 20 7a  Iter->term, n, z
12670 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66  );.    pLeaf = f
12680 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
12690 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29  sizeof(Fts5Data)
126a0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  );.    if( pLeaf
126b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
126c0 20 20 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38    pLeaf->p = (u8
126d0 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c 65  *)pList;.    pLe
126e0 61 66 2d 3e 6e 6e 20 3d 20 70 4c 65 61 66 2d 3e  af->nn = pLeaf->
126f0 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a  szLeaf = nList;.
12700 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
12710 20 3d 20 70 4c 65 61 66 3b 0a 20 20 20 20 70 49   = pLeaf;.    pI
12720 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
12730 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   = fts5GetVarint
12740 28 70 4c 65 61 66 2d 3e 70 2c 20 28 75 36 34 2a  (pLeaf->p, (u64*
12750 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
12760 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e  ;.    pIter->iEn
12770 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65  dofDoclist = pLe
12780 61 66 2d 3e 6e 6e 3b 0a 0a 20 20 20 20 69 66 28  af->nn;..    if(
12790 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
127a0 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b  EX_QUERY_DESC ){
127b0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c  .      pIter->fl
127c0 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49  ags |= FTS5_SEGI
127d0 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20  TER_REVERSE;.   
127e0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65     fts5SegIterRe
127f0 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c  verseInitPage(p,
12800 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c   pIter);.    }el
12810 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65  se{.      fts5Se
12820 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
12830 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20   pIter);.    }. 
12840 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65   }..  fts5SegIte
12850 72 53 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65  rSetNext(p, pIte
12860 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72  r);.}../*.** Zer
12870 6f 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  o the iterator p
12880 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
12890 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  y argument..*/.s
128a0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
128b0 65 67 49 74 65 72 43 6c 65 61 72 28 46 74 73 35  egIterClear(Fts5
128c0 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
128d0 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
128e0 65 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b  e(&pIter->term);
128f0 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
12900 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
12910 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ;.  fts5DataRele
12920 61 73 65 28 70 49 74 65 72 2d 3e 70 4e 65 78 74  ase(pIter->pNext
12930 4c 65 61 66 29 3b 0a 20 20 66 74 73 35 44 6c 69  Leaf);.  fts5Dli
12940 64 78 49 74 65 72 46 72 65 65 28 70 49 74 65 72  dxIterFree(pIter
12950 2d 3e 70 44 6c 69 64 78 29 3b 0a 20 20 73 71 6c  ->pDlidx);.  sql
12960 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d  ite3_free(pIter-
12970 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 29 3b 0a  >aRowidOffset);.
12980 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
12990 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65  0, sizeof(Fts5Se
129a0 67 49 74 65 72 29 29 3b 0a 7d 0a 0a 23 69 66 64  gIter));.}..#ifd
129b0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
129c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
129d0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20  tion is used as 
129e0 70 61 72 74 20 6f 66 20 74 68 65 20 62 69 67 20  part of the big 
129f0 61 73 73 65 72 74 28 29 20 70 72 6f 63 65 64 75  assert() procedu
12a00 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  re implemented b
12a10 79 0a 2a 2a 20 66 74 73 35 41 73 73 65 72 74 4d  y.** fts5AssertM
12a20 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 29 2e  ultiIterSetup().
12a30 20 49 74 20 65 6e 73 75 72 65 73 20 74 68 61 74   It ensures that
12a40 20 74 68 65 20 72 65 73 75 6c 74 20 63 75 72 72   the result curr
12a50 65 6e 74 6c 79 20 73 74 6f 72 65 64 0a 2a 2a 20  ently stored.** 
12a60 69 6e 20 2a 70 52 65 73 20 69 73 20 74 68 65 20  in *pRes is the 
12a70 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 20 6f  correct result o
12a80 66 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  f comparing the 
12a90 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
12aa0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20  s of the.** two 
12ab0 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74  iterators..*/.st
12ac0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 73  atic void fts5As
12ad0 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65  sertComparisonRe
12ae0 73 75 6c 74 28 0a 20 20 46 74 73 35 49 74 65 72  sult(.  Fts5Iter
12af0 20 2a 70 49 74 65 72 2c 20 0a 20 20 46 74 73 35   *pIter, .  Fts5
12b00 53 65 67 49 74 65 72 20 2a 70 31 2c 0a 20 20 46  SegIter *p1,.  F
12b10 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 2c 0a  ts5SegIter *p2,.
12b20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
12b30 52 65 73 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20  Res.){.  int i1 
12b40 3d 20 70 31 20 2d 20 70 49 74 65 72 2d 3e 61 53  = p1 - pIter->aS
12b50 65 67 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 70  eg;.  int i2 = p
12b60 32 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b  2 - pIter->aSeg;
12b70 0a 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61  ..  if( p1->pLea
12b80 66 20 7c 7c 20 70 32 2d 3e 70 4c 65 61 66 20 29  f || p2->pLeaf )
12b90 7b 0a 20 20 20 20 69 66 28 20 70 31 2d 3e 70 4c  {.    if( p1->pL
12ba0 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eaf==0 ){.      
12bb0 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46  assert( pRes->iF
12bc0 69 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20  irst==i2 );.    
12bd0 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c  }else if( p2->pL
12be0 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eaf==0 ){.      
12bf0 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46  assert( pRes->iF
12c00 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20  irst==i1 );.    
12c10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
12c20 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 70 31 2d 3e   nMin = MIN(p1->
12c30 74 65 72 6d 2e 6e 2c 20 70 32 2d 3e 74 65 72 6d  term.n, p2->term
12c40 2e 6e 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  .n);.      int r
12c50 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 31 2d 3e  es = memcmp(p1->
12c60 74 65 72 6d 2e 70 2c 20 70 32 2d 3e 74 65 72 6d  term.p, p2->term
12c70 2e 70 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 20  .p, nMin);.     
12c80 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65   if( res==0 ) re
12c90 73 20 3d 20 70 31 2d 3e 74 65 72 6d 2e 6e 20 2d  s = p1->term.n -
12ca0 20 70 32 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a 20 20   p2->term.n;..  
12cb0 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
12cc0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
12cd0 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d  ( pRes->bTermEq=
12ce0 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =1 );.        as
12cf0 73 65 72 74 28 20 70 31 2d 3e 69 52 6f 77 69 64  sert( p1->iRowid
12d00 21 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 3b 0a  !=p2->iRowid );.
12d10 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 28 28          res = ((
12d20 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d  p1->iRowid > p2-
12d30 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d  >iRowid)==pIter-
12d40 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20 31 3b  >bRev) ? -1 : 1;
12d50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12d60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
12d70 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 29  es->bTermEq==0 )
12d80 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
12d90 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
12da0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
12db0 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20 29  es->iFirst==i1 )
12dc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12dd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12de0 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20  Res->iFirst==i2 
12df0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
12e00 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
12e10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
12e20 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51   no-op unless SQ
12e30 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
12e40 66 69 6e 65 64 20 77 68 65 6e 20 74 68 69 73 20  fined when this 
12e50 6d 6f 64 75 6c 65 0a 2a 2a 20 69 73 20 63 6f 6d  module.** is com
12e60 70 69 6c 65 64 2e 20 49 6e 20 74 68 61 74 20 63  piled. In that c
12e70 61 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ase, this functi
12e80 6f 6e 20 69 73 20 65 73 73 65 6e 74 69 61 6c 6c  on is essentiall
12e90 79 20 61 6e 20 61 73 73 65 72 74 28 29 20 0a 2a  y an assert() .*
12ea0 2a 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64  * statement used
12eb0 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
12ec0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12ed0 74 68 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73  the pIter->aFirs
12ee0 74 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65  t[] array.** are
12ef0 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61   correct..*/.sta
12f00 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 73 73  tic void fts5Ass
12f10 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75  ertMultiIterSetu
12f20 70 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  p(Fts5Index *p, 
12f30 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29  Fts5Iter *pIter)
12f40 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
12f50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12f60 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 46 69  Fts5SegIter *pFi
12f70 72 73 74 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  rst = &pIter->aS
12f80 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
12f90 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  t[1].iFirst ];. 
12fa0 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 61     int i;..    a
12fb0 73 73 65 72 74 28 20 28 70 46 69 72 73 74 2d 3e  ssert( (pFirst->
12fc0 70 4c 65 61 66 3d 3d 30 29 3d 3d 70 49 74 65 72  pLeaf==0)==pIter
12fd0 2d 3e 62 61 73 65 2e 62 45 6f 66 20 29 3b 0a 0a  ->base.bEof );..
12fe0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
12ff0 74 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68  t pIter->iSwitch
13000 52 6f 77 69 64 20 69 73 20 73 65 74 20 63 6f 72  Rowid is set cor
13010 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 66  rectly. */.    f
13020 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
13030 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSeg; i++){.   
13040 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
13050 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p1 = &pIter->aSe
13060 67 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  g[i];.      asse
13070 72 74 28 20 70 31 3d 3d 70 46 69 72 73 74 20 0a  rt( p1==pFirst .
13080 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 31             || p1
13090 2d 3e 70 4c 65 61 66 3d 3d 30 20 0a 20 20 20 20  ->pLeaf==0 .    
130a0 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35 42 75         || fts5Bu
130b0 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70 46 69  fferCompare(&pFi
130c0 72 73 74 2d 3e 74 65 72 6d 2c 20 26 70 31 2d 3e  rst->term, &p1->
130d0 74 65 72 6d 29 20 0a 20 20 20 20 20 20 20 20 20  term) .         
130e0 20 20 7c 7c 20 70 31 2d 3e 69 52 6f 77 69 64 3d    || p1->iRowid=
130f0 3d 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52  =pIter->iSwitchR
13100 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20 20 20  owid.           
13110 7c 7c 20 28 70 31 2d 3e 69 52 6f 77 69 64 3c 70  || (p1->iRowid<p
13120 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
13130 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76  id)==pIter->bRev
13140 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
13150 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
13160 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 3d  pIter->nSeg; i+=
13170 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65  2){.      Fts5Se
13180 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74  gIter *p1 = &pIt
13190 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20  er->aSeg[i];.   
131a0 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
131b0 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p2 = &pIter->aSe
131c0 67 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 46 74  g[i+1];.      Ft
131d0 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20  s5CResult *pRes 
131e0 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74  = &pIter->aFirst
131f0 5b 28 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20  [(pIter->nSeg + 
13200 69 29 20 2f 20 32 5d 3b 0a 20 20 20 20 20 20 66  i) / 2];.      f
13210 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69  ts5AssertCompari
13220 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65 72 2c  sonResult(pIter,
13230 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a   p1, p2, pRes);.
13240 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
13250 3d 31 3b 20 69 3c 28 70 49 74 65 72 2d 3e 6e 53  =1; i<(pIter->nS
13260 65 67 20 2f 20 32 29 3b 20 69 2b 3d 32 29 7b 0a  eg / 2); i+=2){.
13270 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
13280 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e  r *p1 = &pIter->
13290 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
132a0 72 73 74 5b 69 2a 32 5d 2e 69 46 69 72 73 74 20  rst[i*2].iFirst 
132b0 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ];.      Fts5Seg
132c0 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74 65  Iter *p2 = &pIte
132d0 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
132e0 61 46 69 72 73 74 5b 69 2a 32 2b 31 5d 2e 69 46  aFirst[i*2+1].iF
132f0 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46 74  irst ];.      Ft
13300 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20  s5CResult *pRes 
13310 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74  = &pIter->aFirst
13320 5b 69 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 41  [i];.      fts5A
13330 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52  ssertComparisonR
13340 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31 2c  esult(pIter, p1,
13350 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20 20   p2, pRes);.    
13360 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  }.  }.}.#else.# 
13370 64 65 66 69 6e 65 20 66 74 73 35 41 73 73 65 72  define fts5Asser
13380 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28  tMultiIterSetup(
13390 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  x,y).#endif../*.
133a0 2a 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72  ** Do the compar
133b0 69 73 6f 6e 20 6e 65 63 65 73 73 61 72 79 20 74  ison necessary t
133c0 6f 20 70 6f 70 75 6c 61 74 65 20 70 49 74 65 72  o populate pIter
133d0 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 2e 0a  ->aFirst[iOut]..
133e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 74  **.** If the ret
133f0 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 6e  urned value is n
13400 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74  on-zero, then it
13410 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
13420 20 61 6e 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20   an entry.** in 
13430 74 68 65 20 70 49 74 65 72 2d 3e 61 53 65 67 5b  the pIter->aSeg[
13440 5d 20 61 72 72 61 79 20 74 68 61 74 20 69 73 20  ] array that is 
13450 28 61 29 20 6e 6f 74 20 61 74 20 45 4f 46 2c 20  (a) not at EOF, 
13460 61 6e 64 20 28 62 29 20 70 6f 69 6e 74 69 6e 67  and (b) pointing
13470 0a 2a 2a 20 74 6f 20 61 20 6b 65 79 20 74 68 61  .** to a key tha
13480 74 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65  t is a duplicate
13490 20 6f 66 20 61 6e 6f 74 68 65 72 2c 20 68 69 67   of another, hig
134a0 68 65 72 20 70 72 69 6f 72 69 74 79 2c 20 0a 2a  her priority, .*
134b0 2a 20 73 65 67 6d 65 6e 74 2d 69 74 65 72 61 74  * segment-iterat
134c0 6f 72 20 69 6e 20 74 68 65 20 70 53 65 67 2d 3e  or in the pSeg->
134d0 61 53 65 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  aSeg[] array..*/
134e0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
134f0 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61  MultiIterDoCompa
13500 72 65 28 46 74 73 35 49 74 65 72 20 2a 70 49 74  re(Fts5Iter *pIt
13510 65 72 2c 20 69 6e 74 20 69 4f 75 74 29 7b 0a 20  er, int iOut){. 
13520 20 69 6e 74 20 69 31 3b 20 20 20 20 20 20 20 20   int i1;        
13530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13540 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6c 65 66   /* Index of lef
13550 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74  t-hand Fts5SegIt
13560 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 32 3b 20  er */.  int i2; 
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13580 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
13590 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 46   of right-hand F
135a0 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20  ts5SegIter */.  
135b0 69 6e 74 20 69 52 65 73 3b 0a 20 20 46 74 73 35  int iRes;.  Fts5
135c0 53 65 67 49 74 65 72 20 2a 70 31 3b 20 20 20 20  SegIter *p1;    
135d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
135e0 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67  eft-hand Fts5Seg
135f0 49 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 53 65  Iter */.  Fts5Se
13600 67 49 74 65 72 20 2a 70 32 3b 20 20 20 20 20 20  gIter *p2;      
13610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
13620 68 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49  ht-hand Fts5SegI
13630 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 52 65  ter */.  Fts5CRe
13640 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49  sult *pRes = &pI
13650 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74  ter->aFirst[iOut
13660 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4f  ];..  assert( iO
13670 75 74 3c 70 49 74 65 72 2d 3e 6e 53 65 67 20 26  ut<pIter->nSeg &
13680 26 20 69 4f 75 74 3e 30 20 29 3b 0a 20 20 61 73  & iOut>0 );.  as
13690 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 52 65  sert( pIter->bRe
136a0 76 3d 3d 30 20 7c 7c 20 70 49 74 65 72 2d 3e 62  v==0 || pIter->b
136b0 52 65 76 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28  Rev==1 );..  if(
136c0 20 69 4f 75 74 3e 3d 28 70 49 74 65 72 2d 3e 6e   iOut>=(pIter->n
136d0 53 65 67 2f 32 29 20 29 7b 0a 20 20 20 20 69 31  Seg/2) ){.    i1
136e0 20 3d 20 28 69 4f 75 74 20 2d 20 70 49 74 65 72   = (iOut - pIter
136f0 2d 3e 6e 53 65 67 2f 32 29 20 2a 20 32 3b 0a 20  ->nSeg/2) * 2;. 
13700 20 20 20 69 32 20 3d 20 69 31 20 2b 20 31 3b 0a     i2 = i1 + 1;.
13710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 31 20    }else{.    i1 
13720 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  = pIter->aFirst[
13730 69 4f 75 74 2a 32 5d 2e 69 46 69 72 73 74 3b 0a  iOut*2].iFirst;.
13740 20 20 20 20 69 32 20 3d 20 70 49 74 65 72 2d 3e      i2 = pIter->
13750 61 46 69 72 73 74 5b 69 4f 75 74 2a 32 2b 31 5d  aFirst[iOut*2+1]
13760 2e 69 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 70  .iFirst;.  }.  p
13770 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  1 = &pIter->aSeg
13780 5b 69 31 5d 3b 0a 20 20 70 32 20 3d 20 26 70 49  [i1];.  p2 = &pI
13790 74 65 72 2d 3e 61 53 65 67 5b 69 32 5d 3b 0a 0a  ter->aSeg[i2];..
137a0 20 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20    pRes->bTermEq 
137b0 3d 20 30 3b 0a 20 20 69 66 28 20 70 31 2d 3e 70  = 0;.  if( p1->p
137c0 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 20  Leaf==0 ){      
137d0 20 20 20 20 20 2f 2a 20 49 66 20 70 31 20 69 73       /* If p1 is
137e0 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69   at EOF */.    i
137f0 52 65 73 20 3d 20 69 32 3b 0a 20 20 7d 65 6c 73  Res = i2;.  }els
13800 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d  e if( p2->pLeaf=
13810 3d 30 20 29 7b 20 20 20 20 20 2f 2a 20 49 66 20  =0 ){     /* If 
13820 70 32 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a  p2 is at EOF */.
13830 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20      iRes = i1;. 
13840 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
13850 72 65 73 20 3d 20 66 74 73 35 42 75 66 66 65 72  res = fts5Buffer
13860 43 6f 6d 70 61 72 65 28 26 70 31 2d 3e 74 65 72  Compare(&p1->ter
13870 6d 2c 20 26 70 32 2d 3e 74 65 72 6d 29 3b 0a 20  m, &p2->term);. 
13880 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
13890 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
138a0 32 3e 69 31 20 29 3b 0a 20 20 20 20 20 20 61 73  2>i1 );.      as
138b0 73 65 72 74 28 20 69 32 21 3d 30 20 29 3b 0a 20  sert( i2!=0 );. 
138c0 20 20 20 20 20 70 52 65 73 2d 3e 62 54 65 72 6d       pRes->bTerm
138d0 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  Eq = 1;.      if
138e0 28 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 32  ( p1->iRowid==p2
138f0 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  ->iRowid ){.    
13900 20 20 20 20 70 31 2d 3e 62 44 65 6c 20 3d 20 70      p1->bDel = p
13910 32 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20 20 20  2->bDel;.       
13920 20 72 65 74 75 72 6e 20 69 32 3b 0a 20 20 20 20   return i2;.    
13930 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20    }.      res = 
13940 28 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70  ((p1->iRowid > p
13950 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65  2->iRowid)==pIte
13960 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20  r->bRev) ? -1 : 
13970 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  +1;.    }.    as
13980 73 65 72 74 28 20 72 65 73 21 3d 30 20 29 3b 0a  sert( res!=0 );.
13990 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
139a0 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69 31  .      iRes = i1
139b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
139c0 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20     iRes = i2;.  
139d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 65 73 2d    }.  }..  pRes-
139e0 3e 69 46 69 72 73 74 20 3d 20 28 75 31 36 29 69  >iFirst = (u16)i
139f0 52 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  Res;.  return 0;
13a00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
13a10 68 65 20 73 65 67 2d 69 74 65 72 20 73 6f 20 74  he seg-iter so t
13a20 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
13a30 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
13a40 20 6f 6e 20 70 61 67 65 20 69 4c 65 61 66 50 67   on page iLeafPg
13a50 6e 6f 2e 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20  no..** It is an 
13a60 65 72 72 6f 72 20 69 66 20 6c 65 61 66 20 69 4c  error if leaf iL
13a70 65 61 66 50 67 6e 6f 20 64 6f 65 73 20 6e 6f 74  eafPgno does not
13a80 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69   exist or contai
13a90 6e 73 20 6e 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f  ns no rowids..*/
13aa0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
13ab0 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67 65  5SegIterGotoPage
13ac0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
13ad0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13ae0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
13af0 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
13b00 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
13b10 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
13b20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
13b30 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20  dvance */.  int 
13b40 69 4c 65 61 66 50 67 6e 6f 0a 29 7b 0a 20 20 61  iLeafPgno.){.  a
13b50 73 73 65 72 74 28 20 69 4c 65 61 66 50 67 6e 6f  ssert( iLeafPgno
13b60 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  >pIter->iLeafPgn
13b70 6f 20 29 3b 0a 0a 20 20 69 66 28 20 69 4c 65 61  o );..  if( iLea
13b80 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 70 53 65  fPgno>pIter->pSe
13b90 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20  g->pgnoLast ){. 
13ba0 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
13bb0 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65  CORRUPT;.  }else
13bc0 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  {.    fts5DataRe
13bd0 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4e 65  lease(pIter->pNe
13be0 78 74 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74  xtLeaf);.    pIt
13bf0 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20  er->pNextLeaf = 
13c00 30 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  0;.    pIter->iL
13c10 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50  eafPgno = iLeafP
13c20 67 6e 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35 53  gno-1;.    fts5S
13c30 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70  egIterNextPage(p
13c40 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61 73  , pIter);.    as
13c50 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c  sert( p->rc!=SQL
13c60 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d  ITE_OK || pIter-
13c70 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 69 4c 65 61  >iLeafPgno==iLea
13c80 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66  fPgno );..    if
13c90 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
13ca0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
13cb0 69 4f 66 66 3b 0a 20 20 20 20 20 20 75 38 20 2a  iOff;.      u8 *
13cc0 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
13cd0 2d 3e 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ->p;.      int n
13ce0 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
13cf0 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20 20 20 20 20  >szLeaf;..      
13d00 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46  iOff = fts5LeafF
13d10 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 49 74  irstRowidOff(pIt
13d20 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20  er->pLeaf);.    
13d30 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20    if( iOff<4 || 
13d40 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20  iOff>=n ){.     
13d50 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
13d60 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
13d70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f  else{.        iO
13d80 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
13d90 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75  int(&a[iOff], (u
13da0 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
13db0 69 64 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74  id);.        pIt
13dc0 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
13dd0 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  = iOff;.        
13de0 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
13df0 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
13e00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
13e10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
13e20 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  e the iterator p
13e30 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
13e40 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 75 6e 74  ond argument unt
13e50 69 6c 20 69 74 20 69 73 20 61 74 20 6f 72 20 0a  il it is at or .
13e60 2a 2a 20 70 61 73 74 20 72 6f 77 69 64 20 69 46  ** past rowid iF
13e70 72 6f 6d 2e 20 52 65 67 61 72 64 6c 65 73 73 20  rom. Regardless 
13e80 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
13e90 69 46 72 6f 6d 2c 20 74 68 65 20 69 74 65 72 61  iFrom, the itera
13ea0 74 6f 72 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73  tor is.** always
13eb0 20 61 64 76 61 6e 63 65 64 20 61 74 20 6c 65 61   advanced at lea
13ec0 73 74 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  st once..*/.stat
13ed0 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
13ee0 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46  terNextFrom(.  F
13ef0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
13f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13f10 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
13f20 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
13f30 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  egIter *pIter,  
13f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
13f50 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63  erator to advanc
13f60 65 20 2a 2f 0a 20 20 69 36 34 20 69 4d 61 74 63  e */.  i64 iMatc
13f70 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h               
13f80 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63         /* Advanc
13f90 65 20 69 74 65 72 61 74 6f 72 20 61 74 20 6c 65  e iterator at le
13fa0 61 73 74 20 74 68 69 73 20 66 61 72 20 2a 2f 0a  ast this far */.
13fb0 29 7b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20  ){.  int bRev = 
13fc0 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  (pIter->flags & 
13fd0 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
13fe0 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44 6c 69  ERSE);.  Fts5Dli
13ff0 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  dxIter *pDlidx =
14000 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a   pIter->pDlidx;.
14010 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 20    int iLeafPgno 
14020 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  = pIter->iLeafPg
14030 6e 6f 3b 0a 20 20 69 6e 74 20 62 4d 6f 76 65 20  no;.  int bMove 
14040 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 1;..  assert( 
14050 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
14060 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
14070 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ERM );.  assert(
14080 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 29   pIter->pDlidx )
14090 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
140a0 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 69  r->pLeaf );..  i
140b0 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20  f( bRev==0 ){.  
140c0 20 20 77 68 69 6c 65 28 20 21 66 74 73 35 44 6c    while( !fts5Dl
140d0 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
140e0 6c 69 64 78 29 20 26 26 20 69 4d 61 74 63 68 3e  lidx) && iMatch>
140f0 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77  fts5DlidxIterRow
14100 69 64 28 70 44 6c 69 64 78 29 20 29 7b 0a 20 20  id(pDlidx) ){.  
14110 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20      iLeafPgno = 
14120 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
14130 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20  o(pDlidx);.     
14140 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
14150 78 74 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20  xt(p, pDlidx);. 
14160 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 5f     }.    assert_
14170 6e 63 28 20 69 4c 65 61 66 50 67 6e 6f 3e 3d 70  nc( iLeafPgno>=p
14180 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
14190 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a 20 20 20 20  || p->rc );.    
141a0 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49  if( iLeafPgno>pI
141b0 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29  ter->iLeafPgno )
141c0 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
141d0 74 65 72 47 6f 74 6f 50 61 67 65 28 70 2c 20 70  terGotoPage(p, p
141e0 49 74 65 72 2c 20 69 4c 65 61 66 50 67 6e 6f 29  Iter, iLeafPgno)
141f0 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20  ;.      bMove = 
14200 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
14210 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
14220 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d  ter->pNextLeaf==
14230 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
14240 20 69 4d 61 74 63 68 3c 70 49 74 65 72 2d 3e 69   iMatch<pIter->i
14250 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 77 68 69  Rowid );.    whi
14260 6c 65 28 20 21 66 74 73 35 44 6c 69 64 78 49 74  le( !fts5DlidxIt
14270 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
14280 20 26 26 20 69 4d 61 74 63 68 3c 66 74 73 35 44   && iMatch<fts5D
14290 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44  lidxIterRowid(pD
142a0 6c 69 64 78 29 20 29 7b 0a 20 20 20 20 20 20 66  lidx) ){.      f
142b0 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76  ts5DlidxIterPrev
142c0 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20 20 20  (p, pDlidx);.   
142d0 20 7d 0a 20 20 20 20 69 4c 65 61 66 50 67 6e 6f   }.    iLeafPgno
142e0 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
142f0 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20  Pgno(pDlidx);.. 
14300 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35 44     assert( fts5D
14310 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
14320 44 6c 69 64 78 29 20 7c 7c 20 69 4c 65 61 66 50  Dlidx) || iLeafP
14330 67 6e 6f 3c 3d 70 49 74 65 72 2d 3e 69 4c 65 61  gno<=pIter->iLea
14340 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66  fPgno );..    if
14350 28 20 69 4c 65 61 66 50 67 6e 6f 3c 70 49 74 65  ( iLeafPgno<pIte
14360 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a  r->iLeafPgno ){.
14370 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
14380 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67  afPgno = iLeafPg
14390 6e 6f 2b 31 3b 0a 20 20 20 20 20 20 66 74 73 35  no+1;.      fts5
143a0 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65  SegIterReverseNe
143b0 77 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  wPage(p, pIter);
143c0 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30  .      bMove = 0
143d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64  ;.    }.  }..  d
143e0 6f 7b 0a 20 20 20 20 69 66 28 20 62 4d 6f 76 65  o{.    if( bMove
143f0 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   && p->rc==SQLIT
14400 45 5f 4f 4b 20 29 20 70 49 74 65 72 2d 3e 78 4e  E_OK ) pIter->xN
14410 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 29  ext(p, pIter, 0)
14420 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
14430 3e 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61  >pLeaf==0 ) brea
14440 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d  k;.    if( bRev=
14450 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f  =0 && pIter->iRo
14460 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72  wid>=iMatch ) br
14470 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65  eak;.    if( bRe
14480 76 21 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69  v!=0 && pIter->i
14490 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20  Rowid<=iMatch ) 
144a0 62 72 65 61 6b 3b 0a 20 20 20 20 62 4d 6f 76 65  break;.    bMove
144b0 20 3d 20 31 3b 0a 20 20 7d 77 68 69 6c 65 28 20   = 1;.  }while( 
144c0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
144d0 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72   );.}.../*.** Fr
144e0 65 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ee the iterator 
144f0 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
14500 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
14510 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
14520 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
14530 65 72 46 72 65 65 28 46 74 73 35 49 74 65 72 20  erFree(Fts5Iter 
14540 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
14550 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  Iter ){.    int 
14560 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
14570 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69  i<pIter->nSeg; i
14580 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  ++){.      fts5S
14590 65 67 49 74 65 72 43 6c 65 61 72 28 26 70 49 74  egIterClear(&pIt
145a0 65 72 2d 3e 61 53 65 67 5b 69 5d 29 3b 0a 20 20  er->aSeg[i]);.  
145b0 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75    }.    fts5Stru
145c0 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 49 74  ctureRelease(pIt
145d0 65 72 2d 3e 70 53 74 72 75 63 74 29 3b 0a 20 20  er->pStruct);.  
145e0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
145f0 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  (&pIter->poslist
14600 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
14610 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a  ree(pIter);.  }.
14620 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
14630 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
14640 6e 63 65 64 28 0a 20 20 46 74 73 35 49 6e 64 65  nced(.  Fts5Inde
14650 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
14660 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
14670 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61  backend to itera
14680 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46  te within */.  F
14690 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20  ts5Iter *pIter, 
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
146b0 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 75 70  * Iterator to up
146c0 64 61 74 65 20 61 46 69 72 73 74 5b 5d 20 61 72  date aFirst[] ar
146d0 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ray for */.  int
146e0 20 69 43 68 61 6e 67 65 64 2c 20 20 20 20 20 20   iChanged,      
146f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14700 49 6e 64 65 78 20 6f 66 20 73 75 62 2d 69 74 65  Index of sub-ite
14710 72 61 74 6f 72 20 6a 75 73 74 20 61 64 76 61 6e  rator just advan
14720 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69  ced */.  int iMi
14730 6e 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  nset            
14740 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69           /* Mini
14750 6d 75 6d 20 65 6e 74 72 79 20 69 6e 20 61 46 69  mum entry in aFi
14760 72 73 74 5b 5d 20 74 6f 20 73 65 74 20 2a 2f 0a  rst[] to set */.
14770 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
14780 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67  r(i=(pIter->nSeg
14790 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b 20 69 3e  +iChanged)/2; i>
147a0 3d 69 4d 69 6e 73 65 74 20 26 26 20 70 2d 3e 72  =iMinset && p->r
147b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 3d  c==SQLITE_OK; i=
147c0 69 2f 32 29 7b 0a 20 20 20 20 69 6e 74 20 69 45  i/2){.    int iE
147d0 71 3b 0a 20 20 20 20 69 66 28 20 28 69 45 71 20  q;.    if( (iEq 
147e0 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44  = fts5MultiIterD
147f0 6f 43 6f 6d 70 61 72 65 28 70 49 74 65 72 2c 20  oCompare(pIter, 
14800 69 29 29 20 29 7b 0a 20 20 20 20 20 20 46 74 73  i)) ){.      Fts
14810 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
14820 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 45   &pIter->aSeg[iE
14830 71 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  q];.      assert
14840 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
14850 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 53 65 67  OK );.      pSeg
14860 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53 65 67 2c  ->xNext(p, pSeg,
14870 20 30 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 70   0);.      i = p
14880 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69 45 71  Iter->nSeg + iEq
14890 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
148a0 2a 0a 2a 2a 20 53 75 62 2d 69 74 65 72 61 74 6f  *.** Sub-iterato
148b0 72 20 69 43 68 61 6e 67 65 64 20 6f 66 20 69 74  r iChanged of it
148c0 65 72 61 74 6f 72 20 70 49 74 65 72 20 68 61 73  erator pIter has
148d0 20 6a 75 73 74 20 62 65 65 6e 20 61 64 76 61 6e   just been advan
148e0 63 65 64 2e 20 49 74 20 73 74 69 6c 6c 0a 2a 2a  ced. It still.**
148f0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73   points to the s
14900 61 6d 65 20 74 65 72 6d 20 74 68 6f 75 67 68 20  ame term though 
14910 2d 20 6a 75 73 74 20 61 20 64 69 66 66 65 72 65  - just a differe
14920 6e 74 20 72 6f 77 69 64 2e 20 54 68 69 73 20 66  nt rowid. This f
14930 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 74 74 65 6d  unction.** attem
14940 70 74 73 20 74 6f 20 75 70 64 61 74 65 20 74 68  pts to update th
14950 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
14960 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  e pIter->aFirst[
14970 5d 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  ] accordingly..*
14980 2a 20 49 66 20 69 74 20 64 6f 65 73 20 73 6f 20  * If it does so 
14990 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 30 20  successfully, 0 
149a0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
149b0 65 72 77 69 73 65 20 31 2e 0a 2a 2a 0a 2a 2a 20  erwise 1..**.** 
149c0 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  If non-zero is r
149d0 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c  eturned, the cal
149e0 6c 65 72 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20  ler should call 
149f0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
14a00 61 6e 63 65 64 28 29 0a 2a 2a 20 6f 6e 20 74 68  anced().** on th
14a10 65 20 69 74 65 72 61 74 6f 72 20 69 6e 73 74 65  e iterator inste
14a20 61 64 2e 20 54 68 61 74 20 66 75 6e 63 74 69 6f  ad. That functio
14a30 6e 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20  n does the same 
14a40 61 73 20 74 68 69 73 20 6f 6e 65 2c 20 65 78 63  as this one, exc
14a50 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 64  ept.** that it d
14a60 65 61 6c 73 20 77 69 74 68 20 6d 6f 72 65 20 63  eals with more c
14a70 6f 6d 70 6c 69 63 61 74 65 64 20 63 61 73 65 73  omplicated cases
14a80 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 20 0a 73 74   as well..*/ .st
14a90 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c  atic int fts5Mul
14aa0 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f 77  tiIterAdvanceRow
14ab0 69 64 28 0a 20 20 46 74 73 35 49 74 65 72 20 2a  id(.  Fts5Iter *
14ac0 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
14ad0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
14ae0 72 20 74 6f 20 75 70 64 61 74 65 20 61 46 69 72  r to update aFir
14af0 73 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 2a  st[] array for *
14b00 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65 64  /.  int iChanged
14b10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14b20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
14b30 73 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75 73  sub-iterator jus
14b40 74 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20  t advanced */.  
14b50 46 74 73 35 53 65 67 49 74 65 72 20 2a 2a 70 70  Fts5SegIter **pp
14b60 46 69 72 73 74 0a 29 7b 0a 20 20 46 74 73 35 53  First.){.  Fts5S
14b70 65 67 49 74 65 72 20 2a 70 4e 65 77 20 3d 20 26  egIter *pNew = &
14b80 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61  pIter->aSeg[iCha
14b90 6e 67 65 64 5d 3b 0a 0a 20 20 69 66 28 20 70 4e  nged];..  if( pN
14ba0 65 77 2d 3e 69 52 6f 77 69 64 3d 3d 70 49 74 65  ew->iRowid==pIte
14bb0 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 0a  r->iSwitchRowid.
14bc0 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 69 52 6f     || (pNew->iRo
14bd0 77 69 64 3c 70 49 74 65 72 2d 3e 69 53 77 69 74  wid<pIter->iSwit
14be0 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d  chRowid)==pIter-
14bf0 3e 62 52 65 76 0a 20 20 29 7b 0a 20 20 20 20 69  >bRev.  ){.    i
14c00 6e 74 20 69 3b 0a 20 20 20 20 46 74 73 35 53 65  nt i;.    Fts5Se
14c10 67 49 74 65 72 20 2a 70 4f 74 68 65 72 20 3d 20  gIter *pOther = 
14c20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 43 68  &pIter->aSeg[iCh
14c30 61 6e 67 65 64 20 5e 20 30 78 30 30 30 31 5d 3b  anged ^ 0x0001];
14c40 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69  .    pIter->iSwi
14c50 74 63 68 52 6f 77 69 64 20 3d 20 70 49 74 65 72  tchRowid = pIter
14c60 2d 3e 62 52 65 76 20 3f 20 53 4d 41 4c 4c 45 53  ->bRev ? SMALLES
14c70 54 5f 49 4e 54 36 34 20 3a 20 4c 41 52 47 45 53  T_INT64 : LARGES
14c80 54 5f 49 4e 54 36 34 3b 0a 20 20 20 20 66 6f 72  T_INT64;.    for
14c90 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b  (i=(pIter->nSeg+
14ca0 69 43 68 61 6e 67 65 64 29 2f 32 3b 20 31 3b 20  iChanged)/2; 1; 
14cb0 69 3d 69 2f 32 29 7b 0a 20 20 20 20 20 20 46 74  i=i/2){.      Ft
14cc0 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20  s5CResult *pRes 
14cd0 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74  = &pIter->aFirst
14ce0 5b 69 5d 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  [i];..      asse
14cf0 72 74 28 20 70 4e 65 77 2d 3e 70 4c 65 61 66 20  rt( pNew->pLeaf 
14d00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14d10 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d   pRes->bTermEq==
14d20 30 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 4c 65  0 || pOther->pLe
14d30 61 66 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  af );..      if(
14d40 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 29   pRes->bTermEq )
14d50 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  {.        if( pN
14d60 65 77 2d 3e 69 52 6f 77 69 64 3d 3d 70 4f 74 68  ew->iRowid==pOth
14d70 65 72 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20  er->iRowid ){.  
14d80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
14d90 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
14da0 69 66 28 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f  if( (pOther->iRo
14db0 77 69 64 3e 70 4e 65 77 2d 3e 69 52 6f 77 69 64  wid>pNew->iRowid
14dc0 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 20 29  )==pIter->bRev )
14dd0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
14de0 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20  r->iSwitchRowid 
14df0 3d 20 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64  = pOther->iRowid
14e00 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
14e10 20 3d 20 70 4f 74 68 65 72 3b 0a 20 20 20 20 20   = pOther;.     
14e20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f     }else if( (pO
14e30 74 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70 49 74  ther->iRowid>pIt
14e40 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
14e50 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 20 29  )==pIter->bRev )
14e60 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
14e70 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20  r->iSwitchRowid 
14e80 3d 20 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64  = pOther->iRowid
14e90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14ea0 20 20 7d 0a 20 20 20 20 20 20 70 52 65 73 2d 3e    }.      pRes->
14eb0 69 46 69 72 73 74 20 3d 20 28 75 31 36 29 28 70  iFirst = (u16)(p
14ec0 4e 65 77 20 2d 20 70 49 74 65 72 2d 3e 61 53 65  New - pIter->aSe
14ed0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  g);.      if( i=
14ee0 3d 31 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  =1 ) break;..   
14ef0 20 20 20 70 4f 74 68 65 72 20 3d 20 26 70 49 74     pOther = &pIt
14f00 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
14f10 3e 61 46 69 72 73 74 5b 69 20 5e 20 30 78 30 30  >aFirst[i ^ 0x00
14f20 30 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  01].iFirst ];.  
14f30 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 46 69    }.  }..  *ppFi
14f40 72 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65  rst = pNew;.  re
14f50 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
14f60 20 53 65 74 20 74 68 65 20 70 49 74 65 72 2d 3e   Set the pIter->
14f70 62 45 6f 66 20 76 61 72 69 61 62 6c 65 20 62 61  bEof variable ba
14f80 73 65 64 20 6f 6e 20 74 68 65 20 73 74 61 74 65  sed on the state
14f90 20 6f 66 20 74 68 65 20 73 75 62 2d 69 74 65 72   of the sub-iter
14fa0 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ators..*/.static
14fb0 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
14fc0 74 65 72 53 65 74 45 6f 66 28 46 74 73 35 49 74  terSetEof(Fts5It
14fd0 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74  er *pIter){.  Ft
14fe0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
14ff0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  = &pIter->aSeg[ 
15000 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
15010 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 70 49 74  .iFirst ];.  pIt
15020 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20  er->base.bEof = 
15030 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 3b 0a  pSeg->pLeaf==0;.
15040 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68    pIter->iSwitch
15050 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52  Rowid = pSeg->iR
15060 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  owid;.}../*.** M
15070 6f 76 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ove the iterator
15080 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
15090 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ry. .**.** If an
150a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
150b0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
150c0 6c 65 66 74 20 69 6e 20 46 74 73 35 49 6e 64 65  left in Fts5Inde
150d0 78 2e 72 63 2e 20 49 74 20 69 73 20 6e 6f 74 20  x.rc. It is not 
150e0 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
150f0 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 69  n error if the i
15100 74 65 72 61 74 6f 72 20 72 65 61 63 68 65 73 20  terator reaches 
15110 45 4f 46 2c 20 6f 72 20 69 66 20 69 74 20 69 73  EOF, or if it is
15120 20 61 6c 72 65 61 64 79 20 61 74 20 0a 2a 2a 20   already at .** 
15130 45 4f 46 20 77 68 65 6e 20 74 68 69 73 20 66 75  EOF when this fu
15140 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
15150 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15160 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
15170 78 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  xt(.  Fts5Index 
15180 2a 70 2c 20 0a 20 20 46 74 73 35 49 74 65 72 20  *p, .  Fts5Iter 
15190 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20 62 46  *pIter,.  int bF
151a0 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  rom,            
151b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
151c0 65 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69 46  e if argument iF
151d0 72 6f 6d 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  rom is valid */.
151e0 20 20 69 36 34 20 69 46 72 6f 6d 20 20 20 20 20    i64 iFrom     
151f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15200 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 61 74 20    /* Advance at 
15210 6c 65 61 73 74 20 61 73 20 66 61 72 20 61 73 20  least as far as 
15220 74 68 69 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  this */.){.  int
15230 20 62 55 73 65 46 72 6f 6d 20 3d 20 62 46 72 6f   bUseFrom = bFro
15240 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  m;.  while( p->r
15250 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15260 20 20 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d      int iFirst =
15270 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
15280 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20 20 69 6e  ].iFirst;.    in
15290 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a  t bNewTerm = 0;.
152a0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
152b0 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
152c0 61 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20  aSeg[iFirst];.  
152d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
152e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
152f0 20 20 69 66 28 20 62 55 73 65 46 72 6f 6d 20 26    if( bUseFrom &
15300 26 20 70 53 65 67 2d 3e 70 44 6c 69 64 78 20 29  & pSeg->pDlidx )
15310 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
15320 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 2c 20 70  terNextFrom(p, p
15330 53 65 67 2c 20 69 46 72 6f 6d 29 3b 0a 20 20 20  Seg, iFrom);.   
15340 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 53   }else{.      pS
15350 65 67 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53 65  eg->xNext(p, pSe
15360 67 2c 20 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20  g, &bNewTerm);. 
15370 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 53     }..    if( pS
15380 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20  eg->pLeaf==0 || 
15390 62 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20 7c  bNewTerm .     |
153a0 7c 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41  | fts5MultiIterA
153b0 64 76 61 6e 63 65 52 6f 77 69 64 28 70 49 74 65  dvanceRowid(pIte
153c0 72 2c 20 69 46 69 72 73 74 2c 20 26 70 53 65 67  r, iFirst, &pSeg
153d0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 66  ).    ){.      f
153e0 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
153f0 6e 63 65 64 28 70 2c 20 70 49 74 65 72 2c 20 69  nced(p, pIter, i
15400 46 69 72 73 74 2c 20 31 29 3b 0a 20 20 20 20 20  First, 1);.     
15410 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65   fts5MultiIterSe
15420 74 45 6f 66 28 70 49 74 65 72 29 3b 0a 20 20 20  tEof(pIter);.   
15430 20 20 20 70 53 65 67 20 3d 20 26 70 49 74 65 72     pSeg = &pIter
15440 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46  ->aSeg[pIter->aF
15450 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b  irst[1].iFirst];
15460 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d  .      if( pSeg-
15470 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75  >pLeaf==0 ) retu
15480 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  rn;.    }..    f
15490 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74  ts5AssertMultiIt
154a0 65 72 53 65 74 75 70 28 70 2c 20 70 49 74 65 72  erSetup(p, pIter
154b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
154c0 53 65 67 3d 3d 26 70 49 74 65 72 2d 3e 61 53 65  Seg==&pIter->aSe
154d0 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  g[pIter->aFirst[
154e0 31 5d 2e 69 46 69 72 73 74 5d 20 26 26 20 70 53  1].iFirst] && pS
154f0 65 67 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20 20  eg->pLeaf );.   
15500 20 69 66 28 20 70 49 74 65 72 2d 3e 62 53 6b 69   if( pIter->bSki
15510 70 45 6d 70 74 79 3d 3d 30 20 7c 7c 20 70 53 65  pEmpty==0 || pSe
15520 67 2d 3e 6e 50 6f 73 20 29 7b 0a 20 20 20 20 20  g->nPos ){.     
15530 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70   pIter->xSetOutp
15540 75 74 73 28 70 49 74 65 72 2c 20 70 53 65 67 29  uts(pIter, pSeg)
15550 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
15560 20 20 20 20 7d 0a 20 20 20 20 62 55 73 65 46 72      }.    bUseFr
15570 6f 6d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73  om = 0;.  }.}..s
15580 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
15590 75 6c 74 69 49 74 65 72 4e 65 78 74 32 28 0a 20  ultiIterNext2(. 
155a0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
155b0 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65    Fts5Iter *pIte
155c0 72 2c 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77 54  r,.  int *pbNewT
155d0 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
155e0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75       /* OUT: Tru
155f0 65 20 69 66 20 2a 6d 69 67 68 74 2a 20 62 65 20  e if *might* be 
15600 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20  new term */.){. 
15610 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
15620 62 53 6b 69 70 45 6d 70 74 79 20 29 3b 0a 20 20  bSkipEmpty );.  
15630 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
15640 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 6f 20 7b  E_OK ){.    do {
15650 0a 20 20 20 20 20 20 69 6e 74 20 69 46 69 72 73  .      int iFirs
15660 74 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73  t = pIter->aFirs
15670 74 5b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20  t[1].iFirst;.   
15680 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
15690 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
156a0 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20  Seg[iFirst];.   
156b0 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20     int bNewTerm 
156c0 3d 20 30 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  = 0;..      asse
156d0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
156e0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 53  E_OK );.      pS
156f0 65 67 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53 65  eg->xNext(p, pSe
15700 67 2c 20 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20  g, &bNewTerm);. 
15710 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70       if( pSeg->p
15720 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e 65 77 54  Leaf==0 || bNewT
15730 65 72 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20 66  erm .       || f
15740 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
15750 6e 63 65 52 6f 77 69 64 28 70 49 74 65 72 2c 20  nceRowid(pIter, 
15760 69 46 69 72 73 74 2c 20 26 70 53 65 67 29 0a 20  iFirst, &pSeg). 
15770 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
15780 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
15790 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72 2c 20  anced(p, pIter, 
157a0 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20 20 20  iFirst, 1);.    
157b0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
157c0 72 53 65 74 45 6f 66 28 70 49 74 65 72 29 3b 0a  rSetEof(pIter);.
157d0 20 20 20 20 20 20 20 20 2a 70 62 4e 65 77 54 65          *pbNewTe
157e0 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  rm = 1;.      }e
157f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 62  lse{.        *pb
15800 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20  NewTerm = 0;.   
15810 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 41     }.      fts5A
15820 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65  ssertMultiIterSe
15830 74 75 70 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a  tup(p, pIter);..
15840 20 20 20 20 7d 77 68 69 6c 65 28 20 66 74 73 35      }while( fts5
15850 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79  MultiIterIsEmpty
15860 28 70 2c 20 70 49 74 65 72 29 20 29 3b 0a 20 20  (p, pIter) );.  
15870 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
15880 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
15890 75 74 73 5f 4e 6f 6f 70 28 46 74 73 35 49 74 65  uts_Noop(Fts5Ite
158a0 72 20 2a 70 55 6e 75 73 65 64 31 2c 20 46 74 73  r *pUnused1, Fts
158b0 35 53 65 67 49 74 65 72 20 2a 70 55 6e 75 73 65  5SegIter *pUnuse
158c0 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
158d0 52 41 4d 32 28 70 55 6e 75 73 65 64 31 2c 20 70  RAM2(pUnused1, p
158e0 55 6e 75 73 65 64 32 29 3b 0a 7d 0a 0a 73 74 61  Unused2);.}..sta
158f0 74 69 63 20 46 74 73 35 49 74 65 72 20 2a 66 74  tic Fts5Iter *ft
15900 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63  s5MultiIterAlloc
15910 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
15920 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15930 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
15940 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
15950 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ithin */.  int n
15960 53 65 67 0a 29 7b 0a 20 20 46 74 73 35 49 74 65  Seg.){.  Fts5Ite
15970 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  r *pNew;.  int n
15980 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20  Slot;           
15990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
159a0 77 65 72 20 6f 66 20 74 77 6f 20 3e 3d 20 6e 53  wer of two >= nS
159b0 65 67 20 2a 2f 0a 0a 20 20 66 6f 72 28 6e 53 6c  eg */..  for(nSl
159c0 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65 67  ot=2; nSlot<nSeg
159d0 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32 29  ; nSlot=nSlot*2)
159e0 3b 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35 49  ;.  pNew = fts5I
159f0 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20 20 20  dxMalloc(p, .   
15a00 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 49 74     sizeof(Fts5It
15a10 65 72 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  er) +           
15a20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 20 2a         /* pNew *
15a30 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46  /.      sizeof(F
15a40 74 73 35 53 65 67 49 74 65 72 29 20 2a 20 28 6e  ts5SegIter) * (n
15a50 53 6c 6f 74 2d 31 29 20 2b 20 20 20 2f 2a 20 70  Slot-1) +   /* p
15a60 4e 65 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a 20  New->aSeg[] */. 
15a70 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
15a80 43 52 65 73 75 6c 74 29 20 2a 20 6e 53 6c 6f 74  CResult) * nSlot
15a90 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77           /* pNew
15aa0 2d 3e 61 46 69 72 73 74 5b 5d 20 2a 2f 0a 20 20  ->aFirst[] */.  
15ab0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b  );.  if( pNew ){
15ac0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67 20  .    pNew->nSeg 
15ad0 3d 20 6e 53 6c 6f 74 3b 0a 20 20 20 20 70 4e 65  = nSlot;.    pNe
15ae0 77 2d 3e 61 46 69 72 73 74 20 3d 20 28 46 74 73  w->aFirst = (Fts
15af0 35 43 52 65 73 75 6c 74 2a 29 26 70 4e 65 77 2d  5CResult*)&pNew-
15b00 3e 61 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20  >aSeg[nSlot];.  
15b10 20 20 70 4e 65 77 2d 3e 70 49 6e 64 65 78 20 3d    pNew->pIndex =
15b20 20 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 78 53   p;.    pNew->xS
15b30 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35  etOutputs = fts5
15b40 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e  IterSetOutputs_N
15b50 6f 6f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  oop;.  }.  retur
15b60 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 73 74 61 74 69  n pNew;.}..stati
15b70 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69  c void fts5Posli
15b80 73 74 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74  stCallback(.  Ft
15b90 73 35 49 6e 64 65 78 20 2a 70 55 6e 75 73 65 64  s5Index *pUnused
15ba0 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74  , .  void *pCont
15bb0 65 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  ext, .  const u8
15bc0 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43   *pChunk, int nC
15bd0 68 75 6e 6b 0a 29 7b 0a 20 20 55 4e 55 53 45 44  hunk.){.  UNUSED
15be0 5f 50 41 52 41 4d 28 70 55 6e 75 73 65 64 29 3b  _PARAM(pUnused);
15bf0 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43  .  assert_nc( nC
15c00 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28  hunk>=0 );.  if(
15c10 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20   nChunk>0 ){.   
15c20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
15c30 70 70 65 6e 64 42 6c 6f 62 28 28 46 74 73 35 42  ppendBlob((Fts5B
15c40 75 66 66 65 72 2a 29 70 43 6f 6e 74 65 78 74 2c  uffer*)pContext,
15c50 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29   pChunk, nChunk)
15c60 3b 0a 20 20 7d 0a 7d 0a 0a 74 79 70 65 64 65 66  ;.  }.}..typedef
15c70 20 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74 43   struct PoslistC
15c80 61 6c 6c 62 61 63 6b 43 74 78 20 50 6f 73 6c 69  allbackCtx Posli
15c90 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 3b 0a 73  stCallbackCtx;.s
15ca0 74 72 75 63 74 20 50 6f 73 6c 69 73 74 43 61 6c  truct PoslistCal
15cb0 6c 62 61 63 6b 43 74 78 20 7b 0a 20 20 46 74 73  lbackCtx {.  Fts
15cc0 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20  5Buffer *pBuf;  
15cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15ce0 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 62  Append to this b
15cf0 75 66 66 65 72 20 2a 2f 0a 20 20 46 74 73 35 43  uffer */.  Fts5C
15d00 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20  olset *pColset; 
15d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
15d20 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74  strict matches t
15d30 6f 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f  o this column */
15d40 0a 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20  .  int eState;  
15d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d60 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76 65 20     /* See above 
15d70 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 73  */.};..typedef s
15d80 74 72 75 63 74 20 50 6f 73 6c 69 73 74 4f 66 66  truct PoslistOff
15d90 73 65 74 73 43 74 78 20 50 6f 73 6c 69 73 74 4f  setsCtx PoslistO
15da0 66 66 73 65 74 73 43 74 78 3b 0a 73 74 72 75 63  ffsetsCtx;.struc
15db0 74 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73  t PoslistOffsets
15dc0 43 74 78 20 7b 0a 20 20 46 74 73 35 42 75 66 66  Ctx {.  Fts5Buff
15dd0 65 72 20 2a 70 42 75 66 3b 20 20 20 20 20 20 20  er *pBuf;       
15de0 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e          /* Appen
15df0 64 20 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  d to this buffer
15e00 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74   */.  Fts5Colset
15e10 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20 20 20   *pColset;      
15e20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
15e30 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74 68 69  t matches to thi
15e40 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e  s column */.  in
15e50 74 20 69 52 65 61 64 3b 0a 20 20 69 6e 74 20 69  t iRead;.  int i
15e60 57 72 69 74 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Write;.};../*.**
15e70 20 54 4f 44 4f 3a 20 4d 61 6b 65 20 74 68 69 73   TODO: Make this
15e80 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 21   more efficient!
15e90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
15ea0 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65  ts5IndexColsetTe
15eb0 73 74 28 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  st(Fts5Colset *p
15ec0 43 6f 6c 73 65 74 2c 20 69 6e 74 20 69 43 6f 6c  Colset, int iCol
15ed0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
15ee0 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 73 65 74  r(i=0; i<pColset
15ef0 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
15f00 20 20 69 66 28 20 70 43 6f 6c 73 65 74 2d 3e 61    if( pColset->a
15f10 69 43 6f 6c 5b 69 5d 3d 3d 69 43 6f 6c 20 29 20  iCol[i]==iCol ) 
15f20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
15f30 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61  return 0;.}..sta
15f40 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73  tic void fts5Pos
15f50 6c 69 73 74 4f 66 66 73 65 74 73 43 61 6c 6c 62  listOffsetsCallb
15f60 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ack(.  Fts5Index
15f70 20 2a 70 55 6e 75 73 65 64 2c 20 0a 20 20 76 6f   *pUnused, .  vo
15f80 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20  id *pContext, . 
15f90 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e   const u8 *pChun
15fa0 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b  k, int nChunk.){
15fb0 0a 20 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74  .  PoslistOffset
15fc0 73 43 74 78 20 2a 70 43 74 78 20 3d 20 28 50 6f  sCtx *pCtx = (Po
15fd0 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78 2a  slistOffsetsCtx*
15fe0 29 70 43 6f 6e 74 65 78 74 3b 0a 20 20 55 4e 55  )pContext;.  UNU
15ff0 53 45 44 5f 50 41 52 41 4d 28 70 55 6e 75 73 65  SED_PARAM(pUnuse
16000 64 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63 28  d);.  assert_nc(
16010 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20   nChunk>=0 );.  
16020 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a  if( nChunk>0 ){.
16030 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20      int i = 0;. 
16040 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 43 68 75     while( i<nChu
16050 6e 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  nk ){.      int 
16060 69 56 61 6c 3b 0a 20 20 20 20 20 20 69 20 2b 3d  iVal;.      i +=
16070 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
16080 28 26 70 43 68 75 6e 6b 5b 69 5d 2c 20 69 56 61  (&pChunk[i], iVa
16090 6c 29 3b 0a 20 20 20 20 20 20 69 56 61 6c 20 2b  l);.      iVal +
160a0 3d 20 70 43 74 78 2d 3e 69 52 65 61 64 20 2d 20  = pCtx->iRead - 
160b0 32 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 69  2;.      pCtx->i
160c0 52 65 61 64 20 3d 20 69 56 61 6c 3b 0a 20 20 20  Read = iVal;.   
160d0 20 20 20 69 66 28 20 66 74 73 35 49 6e 64 65 78     if( fts5Index
160e0 43 6f 6c 73 65 74 54 65 73 74 28 70 43 74 78 2d  ColsetTest(pCtx-
160f0 3e 70 43 6f 6c 73 65 74 2c 20 69 56 61 6c 29 20  >pColset, iVal) 
16100 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
16110 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
16120 61 72 69 6e 74 28 70 43 74 78 2d 3e 70 42 75 66  arint(pCtx->pBuf
16130 2c 20 69 56 61 6c 20 2b 20 32 20 2d 20 70 43 74  , iVal + 2 - pCt
16140 78 2d 3e 69 57 72 69 74 65 29 3b 0a 20 20 20 20  x->iWrite);.    
16150 20 20 20 20 70 43 74 78 2d 3e 69 57 72 69 74 65      pCtx->iWrite
16160 20 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 7d   = iVal;.      }
16170 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74  .    }.  }.}..st
16180 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f  atic void fts5Po
16190 73 6c 69 73 74 46 69 6c 74 65 72 43 61 6c 6c 62  slistFilterCallb
161a0 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ack(.  Fts5Index
161b0 20 2a 70 55 6e 75 73 65 64 2c 0a 20 20 76 6f 69   *pUnused,.  voi
161c0 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20  d *pContext, .  
161d0 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b  const u8 *pChunk
161e0 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a  , int nChunk.){.
161f0 20 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63    PoslistCallbac
16200 6b 43 74 78 20 2a 70 43 74 78 20 3d 20 28 50 6f  kCtx *pCtx = (Po
16210 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78  slistCallbackCtx
16220 2a 29 70 43 6f 6e 74 65 78 74 3b 0a 20 20 55 4e  *)pContext;.  UN
16230 55 53 45 44 5f 50 41 52 41 4d 28 70 55 6e 75 73  USED_PARAM(pUnus
16240 65 64 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63  ed);.  assert_nc
16250 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20  ( nChunk>=0 );. 
16260 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b   if( nChunk>0 ){
16270 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74  .    /* Search t
16280 68 72 6f 75 67 68 20 74 6f 20 66 69 6e 64 20 74  hrough to find t
16290 68 65 20 66 69 72 73 74 20 76 61 72 69 6e 74 20  he first varint 
162a0 77 69 74 68 20 76 61 6c 75 65 20 31 2e 20 54 68  with value 1. Th
162b0 69 73 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  is is the.    **
162c0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
162d0 78 74 20 63 6f 6c 75 6d 6e 73 20 68 69 74 73 2e  xt columns hits.
162e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   */.    int i = 
162f0 30 3b 0a 20 20 20 20 69 6e 74 20 69 53 74 61 72  0;.    int iStar
16300 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
16310 70 43 74 78 2d 3e 65 53 74 61 74 65 3d 3d 32 20  pCtx->eState==2 
16320 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
16330 6c 3b 0a 20 20 20 20 20 20 66 74 73 35 46 61 73  l;.      fts5Fas
16340 74 47 65 74 56 61 72 69 6e 74 33 32 28 70 43 68  tGetVarint32(pCh
16350 75 6e 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a 20  unk, i, iCol);. 
16360 20 20 20 20 20 69 66 28 20 66 74 73 35 49 6e 64       if( fts5Ind
16370 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43 74  exColsetTest(pCt
16380 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c  x->pColset, iCol
16390 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74  ) ){.        pCt
163a0 78 2d 3e 65 53 74 61 74 65 20 3d 20 31 3b 0a 20  x->eState = 1;. 
163b0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
163c0 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
163d0 74 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 31 29  t(pCtx->pBuf, 1)
163e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
163f0 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74         pCtx->eSt
16400 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ate = 0;.      }
16410 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 6f 20 7b  .    }..    do {
16420 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c  .      while( i<
16430 6e 43 68 75 6e 6b 20 26 26 20 70 43 68 75 6e 6b  nChunk && pChunk
16440 5b 69 5d 21 3d 30 78 30 31 20 29 7b 0a 20 20 20  [i]!=0x01 ){.   
16450 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 68 75       while( pChu
16460 6e 6b 5b 69 5d 20 26 20 30 78 38 30 20 29 20 69  nk[i] & 0x80 ) i
16470 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b  ++;.        i++;
16480 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16490 66 28 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20  f( pCtx->eState 
164a0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
164b0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
164c0 6c 6f 62 28 70 43 74 78 2d 3e 70 42 75 66 2c 20  lob(pCtx->pBuf, 
164d0 26 70 43 68 75 6e 6b 5b 69 53 74 61 72 74 5d 2c  &pChunk[iStart],
164e0 20 69 2d 69 53 74 61 72 74 29 3b 0a 20 20 20 20   i-iStart);.    
164f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c    }.      if( i<
16500 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  nChunk ){.      
16510 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
16520 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 3b 0a      iStart = i;.
16530 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
16540 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 68 75       if( i>=nChu
16550 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
16560 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20 32  pCtx->eState = 2
16570 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
16580 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 46  .          fts5F
16590 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70  astGetVarint32(p
165a0 43 68 75 6e 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b  Chunk, i, iCol);
165b0 0a 20 20 20 20 20 20 20 20 20 20 70 43 74 78 2d  .          pCtx-
165c0 3e 65 53 74 61 74 65 20 3d 20 66 74 73 35 49 6e  >eState = fts5In
165d0 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43  dexColsetTest(pC
165e0 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 43 6f  tx->pColset, iCo
165f0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  l);.          if
16600 28 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 29  ( pCtx->eState )
16610 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
16620 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
16630 6e 64 42 6c 6f 62 28 70 43 74 78 2d 3e 70 42 75  ndBlob(pCtx->pBu
16640 66 2c 20 26 70 43 68 75 6e 6b 5b 69 53 74 61 72  f, &pChunk[iStar
16650 74 5d 2c 20 69 2d 69 53 74 61 72 74 29 3b 0a 20  t], i-iStart);. 
16660 20 20 20 20 20 20 20 20 20 20 20 69 53 74 61 72             iStar
16670 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
16680 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
16690 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
166a0 20 69 3c 6e 43 68 75 6e 6b 20 29 3b 0a 20 20 7d   i<nChunk );.  }
166b0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
166c0 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65  fts5ChunkIterate
166d0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
166e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
166f0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 62 6a      /* Index obj
16700 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
16710 49 74 65 72 20 2a 70 53 65 67 2c 20 20 20 20 20  Iter *pSeg,     
16720 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 6c           /* Posl
16730 69 73 74 20 6f 66 20 74 68 69 73 20 69 74 65 72  ist of this iter
16740 61 74 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ator */.  void *
16750 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20  pCtx,           
16760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
16770 74 65 78 74 20 70 6f 69 6e 74 65 72 20 66 6f 72  text pointer for
16780 20 78 43 68 75 6e 6b 20 63 61 6c 6c 62 61 63 6b   xChunk callback
16790 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 68   */.  void (*xCh
167a0 75 6e 6b 29 28 46 74 73 35 49 6e 64 65 78 2a 2c  unk)(Fts5Index*,
167b0 20 76 6f 69 64 2a 2c 20 63 6f 6e 73 74 20 75 38   void*, const u8
167c0 2a 2c 20 69 6e 74 29 0a 29 7b 0a 20 20 69 6e 74  *, int).){.  int
167d0 20 6e 52 65 6d 20 3d 20 70 53 65 67 2d 3e 6e 50   nRem = pSeg->nP
167e0 6f 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  os;          /* 
167f0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
16800 73 74 69 6c 6c 20 74 6f 20 63 6f 6d 65 20 2a 2f  still to come */
16810 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61  .  Fts5Data *pDa
16820 74 61 20 3d 20 30 3b 0a 20 20 75 38 20 2a 70 43  ta = 0;.  u8 *pC
16830 68 75 6e 6b 20 3d 20 26 70 53 65 67 2d 3e 70 4c  hunk = &pSeg->pL
16840 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65  eaf->p[pSeg->iLe
16850 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 69 6e 74  afOffset];.  int
16860 20 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52   nChunk = MIN(nR
16870 65 6d 2c 20 70 53 65 67 2d 3e 70 4c 65 61 66 2d  em, pSeg->pLeaf-
16880 3e 73 7a 4c 65 61 66 20 2d 20 70 53 65 67 2d 3e  >szLeaf - pSeg->
16890 69 4c 65 61 66 4f 66 66 73 65 74 29 3b 0a 20 20  iLeafOffset);.  
168a0 69 6e 74 20 70 67 6e 6f 20 3d 20 70 53 65 67 2d  int pgno = pSeg-
168b0 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e  >iLeafPgno;.  in
168c0 74 20 70 67 6e 6f 53 61 76 65 20 3d 20 30 3b 0a  t pgnoSave = 0;.
168d0 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
168e0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 6d 77 6f 72  ion does notmwor
168f0 6b 20 77 69 74 68 20 64 65 74 61 69 6c 3d 6e 6f  k with detail=no
16900 6e 65 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f  ne databases. */
16910 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43  .  assert( p->pC
16920 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d  onfig->eDetail!=
16930 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
16940 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 53 65 67   );..  if( (pSeg
16950 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
16960 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3d  EGITER_REVERSE)=
16970 3d 30 20 29 7b 0a 20 20 20 20 70 67 6e 6f 53 61  =0 ){.    pgnoSa
16980 76 65 20 3d 20 70 67 6e 6f 2b 31 3b 0a 20 20 7d  ve = pgno+1;.  }
16990 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
169a0 20 20 20 20 78 43 68 75 6e 6b 28 70 2c 20 70 43      xChunk(p, pC
169b0 74 78 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75  tx, pChunk, nChu
169c0 6e 6b 29 3b 0a 20 20 20 20 6e 52 65 6d 20 2d 3d  nk);.    nRem -=
169d0 20 6e 43 68 75 6e 6b 3b 0a 20 20 20 20 66 74 73   nChunk;.    fts
169e0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61  5DataRelease(pDa
169f0 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 65  ta);.    if( nRe
16a00 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72  m<=0 ){.      br
16a10 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
16a20 20 20 20 20 20 20 70 67 6e 6f 2b 2b 3b 0a 20 20        pgno++;.  
16a30 20 20 20 20 70 44 61 74 61 20 3d 20 66 74 73 35      pData = fts5
16a40 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35  DataRead(p, FTS5
16a50 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
16a60 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  Seg->pSeg->iSegi
16a70 64 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  d, pgno));.     
16a80 20 69 66 28 20 70 44 61 74 61 3d 3d 30 20 29 20   if( pData==0 ) 
16a90 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 43 68  break;.      pCh
16aa0 75 6e 6b 20 3d 20 26 70 44 61 74 61 2d 3e 70 5b  unk = &pData->p[
16ab0 34 5d 3b 0a 20 20 20 20 20 20 6e 43 68 75 6e 6b  4];.      nChunk
16ac0 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20 70 44 61   = MIN(nRem, pDa
16ad0 74 61 2d 3e 73 7a 4c 65 61 66 20 2d 20 34 29 3b  ta->szLeaf - 4);
16ae0 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  .      if( pgno=
16af0 3d 70 67 6e 6f 53 61 76 65 20 29 7b 0a 20 20 20  =pgnoSave ){.   
16b00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65       assert( pSe
16b10 67 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20  g->pNextLeaf==0 
16b20 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 67 2d  );.        pSeg-
16b30 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 70 44 61  >pNextLeaf = pDa
16b40 74 61 3b 0a 20 20 20 20 20 20 20 20 70 44 61 74  ta;.        pDat
16b50 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  a = 0;.      }. 
16b60 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
16b70 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72  * Iterator pIter
16b80 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
16b90 73 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  s to a valid ent
16ba0 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68  ry (not EOF). Th
16bb0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
16bc0 70 70 65 6e 64 73 20 74 68 65 20 70 6f 73 69 74  ppends the posit
16bd0 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 20 66 6f  ion list data fo
16be0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
16bf0 74 72 79 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72  try to.** buffer
16c00 20 70 42 75 66 2e 20 49 74 20 64 6f 65 73 20 6e   pBuf. It does n
16c10 6f 74 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  ot make a copy o
16c20 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c  f the position-l
16c30 69 73 74 20 73 69 7a 65 0a 2a 2a 20 66 69 65 6c  ist size.** fiel
16c40 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
16c50 64 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73  d fts5SegiterPos
16c60 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65  list(.  Fts5Inde
16c70 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 65 67 49  x *p,.  Fts5SegI
16c80 74 65 72 20 2a 70 53 65 67 2c 0a 20 20 46 74 73  ter *pSeg,.  Fts
16c90 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
16ca0 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ,.  Fts5Buffer *
16cb0 70 42 75 66 0a 29 7b 0a 20 20 69 66 28 20 30 3d  pBuf.){.  if( 0=
16cc0 3d 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28  =fts5BufferGrow(
16cd0 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 70 53  &p->rc, pBuf, pS
16ce0 65 67 2d 3e 6e 50 6f 73 29 20 29 7b 0a 20 20 20  eg->nPos) ){.   
16cf0 20 69 66 28 20 70 43 6f 6c 73 65 74 3d 3d 30 20   if( pColset==0 
16d00 29 7b 0a 20 20 20 20 20 20 66 74 73 35 43 68 75  ){.      fts5Chu
16d10 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65  nkIterate(p, pSe
16d20 67 2c 20 28 76 6f 69 64 2a 29 70 42 75 66 2c 20  g, (void*)pBuf, 
16d30 66 74 73 35 50 6f 73 6c 69 73 74 43 61 6c 6c 62  fts5PoslistCallb
16d40 61 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ack);.    }else{
16d50 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 43  .      if( p->pC
16d60 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
16d70 46 54 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c  FTS5_DETAIL_FULL
16d80 20 29 7b 0a 20 20 20 20 20 20 20 20 50 6f 73 6c   ){.        Posl
16d90 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 73  istCallbackCtx s
16da0 43 74 78 3b 0a 20 20 20 20 20 20 20 20 73 43 74  Ctx;.        sCt
16db0 78 2e 70 42 75 66 20 3d 20 70 42 75 66 3b 0a 20  x.pBuf = pBuf;. 
16dc0 20 20 20 20 20 20 20 73 43 74 78 2e 70 43 6f 6c         sCtx.pCol
16dd0 73 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20  set = pColset;. 
16de0 20 20 20 20 20 20 20 73 43 74 78 2e 65 53 74 61         sCtx.eSta
16df0 74 65 20 3d 20 66 74 73 35 49 6e 64 65 78 43 6f  te = fts5IndexCo
16e00 6c 73 65 74 54 65 73 74 28 70 43 6f 6c 73 65 74  lsetTest(pColset
16e10 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73  , 0);.        as
16e20 73 65 72 74 28 20 73 43 74 78 2e 65 53 74 61 74  sert( sCtx.eStat
16e30 65 3d 3d 30 20 7c 7c 20 73 43 74 78 2e 65 53 74  e==0 || sCtx.eSt
16e40 61 74 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ate==1 );.      
16e50 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61    fts5ChunkItera
16e60 74 65 28 70 2c 20 70 53 65 67 2c 20 28 76 6f 69  te(p, pSeg, (voi
16e70 64 2a 29 26 73 43 74 78 2c 20 66 74 73 35 50 6f  d*)&sCtx, fts5Po
16e80 73 6c 69 73 74 46 69 6c 74 65 72 43 61 6c 6c 62  slistFilterCallb
16e90 61 63 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ack);.      }els
16ea0 65 7b 0a 20 20 20 20 20 20 20 20 50 6f 73 6c 69  e{.        Posli
16eb0 73 74 4f 66 66 73 65 74 73 43 74 78 20 73 43 74  stOffsetsCtx sCt
16ec0 78 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  x;.        memse
16ed0 74 28 26 73 43 74 78 2c 20 30 2c 20 73 69 7a 65  t(&sCtx, 0, size
16ee0 6f 66 28 73 43 74 78 29 29 3b 0a 20 20 20 20 20  of(sCtx));.     
16ef0 20 20 20 73 43 74 78 2e 70 42 75 66 20 3d 20 70     sCtx.pBuf = p
16f00 42 75 66 3b 0a 20 20 20 20 20 20 20 20 73 43 74  Buf;.        sCt
16f10 78 2e 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c  x.pColset = pCol
16f20 73 65 74 3b 0a 20 20 20 20 20 20 20 20 66 74 73  set;.        fts
16f30 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c  5ChunkIterate(p,
16f40 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 26 73   pSeg, (void*)&s
16f50 43 74 78 2c 20 66 74 73 35 50 6f 73 6c 69 73 74  Ctx, fts5Poslist
16f60 4f 66 66 73 65 74 73 43 61 6c 6c 62 61 63 6b 29  OffsetsCallback)
16f70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16f80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 4e 2f    }.}../*.** IN/
16f90 4f 55 54 20 70 61 72 61 6d 65 74 65 72 20 28 2a  OUT parameter (*
16fa0 70 61 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  pa) points to a 
16fb0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 6e 20  position list n 
16fc0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 49  bytes in size. I
16fd0 66 0a 2a 2a 20 74 68 65 20 70 6f 73 69 74 69 6f  f.** the positio
16fe0 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20  n list contains 
16ff0 65 6e 74 72 69 65 73 20 66 6f 72 20 63 6f 6c 75  entries for colu
17000 6d 6e 20 69 43 6f 6c 2c 20 74 68 65 6e 20 28 2a  mn iCol, then (*
17010 70 61 29 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f  pa) is set.** to
17020 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 75   point to the su
17030 62 2d 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  b-position-list 
17040 66 6f 72 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  for that column 
17050 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
17060 66 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 69 74  f.** bytes in it
17070 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69   returned. Or, i
17080 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 70  f the argument p
17090 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 6f 65  osition list doe
170a0 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  s not.** contain
170b0 20 61 6e 79 20 65 6e 74 72 69 65 73 20 66 6f 72   any entries for
170c0 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 72 65   column iCol, re
170d0 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
170e0 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 45  c int fts5IndexE
170f0 78 74 72 61 63 74 43 6f 6c 28 0a 20 20 63 6f 6e  xtractCol(.  con
17100 73 74 20 75 38 20 2a 2a 70 61 2c 20 20 20 20 20  st u8 **pa,     
17110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17120 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20  IN/OUT: Pointer 
17130 74 6f 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20  to poslist */.  
17140 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
17150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17160 2f 2a 20 49 4e 3a 20 53 69 7a 65 20 6f 66 20 70  /* IN: Size of p
17170 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20  oslist in bytes 
17180 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20  */.  int iCol   
17190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171a0 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
171b0 6f 20 65 78 74 72 61 63 74 20 66 72 6f 6d 20 70  o extract from p
171c0 6f 73 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 69  oslist */.){.  i
171d0 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b  nt iCurrent = 0;
171e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
171f0 2a 20 41 6e 79 74 68 69 6e 67 20 62 65 66 6f 72  * Anything befor
17200 65 20 74 68 65 20 66 69 72 73 74 20 30 78 30 31  e the first 0x01
17210 20 69 73 20 63 6f 6c 20 30 20 2a 2f 0a 20 20 63   is col 0 */.  c
17220 6f 6e 73 74 20 75 38 20 2a 70 20 3d 20 2a 70 61  onst u8 *p = *pa
17230 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 45  ;.  const u8 *pE
17240 6e 64 20 3d 20 26 70 5b 6e 5d 3b 20 20 20 20 20  nd = &p[n];     
17250 20 20 20 20 2f 2a 20 4f 6e 65 20 62 79 74 65 20      /* One byte 
17260 70 61 73 74 20 65 6e 64 20 6f 66 20 70 6f 73 69  past end of posi
17270 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 0a 20 20  tion list */..  
17280 77 68 69 6c 65 28 20 69 43 6f 6c 3e 69 43 75 72  while( iCol>iCur
17290 72 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 41  rent ){.    /* A
172a0 64 76 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 70  dvance pointer p
172b0 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73   until it points
172c0 20 74 6f 20 70 45 6e 64 20 6f 72 20 61 6e 20 30   to pEnd or an 0
172d0 78 30 31 20 62 79 74 65 20 74 68 61 74 20 69 73  x01 byte that is
172e0 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 70 61 72 74  .    ** not part
172f0 20 6f 66 20 61 20 76 61 72 69 6e 74 2e 20 4e 6f   of a varint. No
17300 74 65 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  te that it is no
17310 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
17320 20 6e 65 67 61 74 69 76 65 0a 20 20 20 20 2a 2a   negative.    **
17330 20 6f 72 20 65 78 74 72 65 6d 65 6c 79 20 6c 61   or extremely la
17340 72 67 65 20 76 61 72 69 6e 74 20 74 6f 20 6f 63  rge varint to oc
17350 63 75 72 20 77 69 74 68 69 6e 20 61 6e 20 75 6e  cur within an un
17360 63 6f 72 72 75 70 74 65 64 20 70 6f 73 69 74 69  corrupted positi
17370 6f 6e 20 0a 20 20 20 20 2a 2a 20 6c 69 73 74 2e  on .    ** list.
17380 20 53 6f 20 74 68 65 20 6c 61 73 74 20 62 79 74   So the last byt
17390 65 20 6f 66 20 65 61 63 68 20 76 61 72 69 6e 74  e of each varint
173a0 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20   may be assumed 
173b0 74 6f 20 68 61 76 65 20 61 20 63 6c 65 61 72 0a  to have a clear.
173c0 20 20 20 20 2a 2a 20 30 78 38 30 20 62 69 74 2e      ** 0x80 bit.
173d0 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
173e0 2a 70 21 3d 30 78 30 31 20 29 7b 0a 20 20 20 20  *p!=0x01 ){.    
173f0 20 20 77 68 69 6c 65 28 20 2a 70 2b 2b 20 26 20    while( *p++ & 
17400 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 69 66  0x80 );.      if
17410 28 20 70 3e 3d 70 45 6e 64 20 29 20 72 65 74 75  ( p>=pEnd ) retu
17420 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
17430 2a 70 61 20 3d 20 70 2b 2b 3b 0a 20 20 20 20 69  *pa = p++;.    i
17440 43 75 72 72 65 6e 74 20 3d 20 2a 70 2b 2b 3b 0a  Current = *p++;.
17450 20 20 20 20 69 66 28 20 69 43 75 72 72 65 6e 74      if( iCurrent
17460 20 26 20 30 78 38 30 20 29 7b 0a 20 20 20 20 20   & 0x80 ){.     
17470 20 70 2d 2d 3b 0a 20 20 20 20 20 20 70 20 2b 3d   p--;.      p +=
17480 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
17490 28 70 2c 20 69 43 75 72 72 65 6e 74 29 3b 0a 20  (p, iCurrent);. 
174a0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
174b0 43 6f 6c 21 3d 69 43 75 72 72 65 6e 74 20 29 20  Col!=iCurrent ) 
174c0 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
174d0 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65 72 20  Advance pointer 
174e0 70 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74  p until it point
174f0 73 20 74 6f 20 70 45 6e 64 20 6f 72 20 61 6e 20  s to pEnd or an 
17500 30 78 30 31 20 62 79 74 65 20 74 68 61 74 20 69  0x01 byte that i
17510 73 0a 20 20 2a 2a 20 6e 6f 74 20 70 61 72 74 20  s.  ** not part 
17520 6f 66 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20  of a varint */. 
17530 20 77 68 69 6c 65 28 20 70 3c 70 45 6e 64 20 26   while( p<pEnd &
17540 26 20 2a 70 21 3d 30 78 30 31 20 29 7b 0a 20 20  & *p!=0x01 ){.  
17550 20 20 77 68 69 6c 65 28 20 2a 70 2b 2b 20 26 20    while( *p++ & 
17560 30 78 38 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 72  0x80 );.  }..  r
17570 65 74 75 72 6e 20 70 20 2d 20 28 2a 70 61 29 3b  eturn p - (*pa);
17580 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
17590 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43  ts5IndexExtractC
175a0 6f 6c 73 65 74 20 28 0a 20 20 46 74 73 35 43 6f  olset (.  Fts5Co
175b0 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20  lset *pColset,  
175c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
175d0 73 65 74 20 74 6f 20 66 69 6c 74 65 72 20 6f 6e  set to filter on
175e0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
175f0 70 50 6f 73 2c 20 69 6e 74 20 6e 50 6f 73 2c 20  pPos, int nPos, 
17600 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
17610 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 35  n list */.  Fts5
17620 42 75 66 66 65 72 20 2a 70 42 75 66 20 20 20 20  Buffer *pBuf    
17630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
17640 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
17650 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
17660 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
17670 3b 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a  ;..  fts5BufferZ
17680 65 72 6f 28 70 42 75 66 29 3b 0a 20 20 66 6f 72  ero(pBuf);.  for
17690 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d  (i=0; i<pColset-
176a0 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
176b0 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 75 62 20   const u8 *pSub 
176c0 3d 20 70 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20  = pPos;.    int 
176d0 6e 53 75 62 20 3d 20 66 74 73 35 49 6e 64 65 78  nSub = fts5Index
176e0 45 78 74 72 61 63 74 43 6f 6c 28 26 70 53 75 62  ExtractCol(&pSub
176f0 2c 20 6e 50 6f 73 2c 20 70 43 6f 6c 73 65 74 2d  , nPos, pColset-
17700 3e 61 69 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20  >aiCol[i]);.    
17710 69 66 28 20 6e 53 75 62 20 29 7b 0a 20 20 20 20  if( nSub ){.    
17720 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
17730 6e 64 42 6c 6f 62 28 26 72 63 2c 20 70 42 75 66  ndBlob(&rc, pBuf
17740 2c 20 6e 53 75 62 2c 20 70 53 75 62 29 3b 0a 20  , nSub, pSub);. 
17750 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
17760 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78  n rc;.}../*.** x
17770 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62  SetOutputs callb
17780 61 63 6b 20 75 73 65 64 20 62 79 20 64 65 74 61  ack used by deta
17790 69 6c 3d 6e 6f 6e 65 20 74 61 62 6c 65 73 2e 0a  il=none tables..
177a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
177b0 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
177c0 73 5f 4e 6f 6e 65 28 46 74 73 35 49 74 65 72 20  s_None(Fts5Iter 
177d0 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65 67 49  *pIter, Fts5SegI
177e0 74 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 61 73  ter *pSeg){.  as
177f0 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e  sert( pIter->pIn
17800 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  dex->pConfig->eD
17810 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
17820 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 20 20 70 49 74  IL_NONE );.  pIt
17830 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20  er->base.iRowid 
17840 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a  = pSeg->iRowid;.
17850 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44    pIter->base.nD
17860 61 74 61 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73  ata = pSeg->nPos
17870 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f  ;.}../*.** xSetO
17880 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20  utputs callback 
17890 75 73 65 64 20 62 79 20 64 65 74 61 69 6c 3d 66  used by detail=f
178a0 75 6c 6c 20 61 6e 64 20 64 65 74 61 69 6c 3d 63  ull and detail=c
178b0 6f 6c 20 74 61 62 6c 65 73 20 77 68 65 6e 20 6e  ol tables when n
178c0 6f 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 66 69 6c 74  o.** column filt
178d0 65 72 73 20 61 72 65 20 73 70 65 63 69 66 69 65  ers are specifie
178e0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
178f0 64 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  d fts5IterSetOut
17900 70 75 74 73 5f 4e 6f 63 6f 6c 73 65 74 28 46 74  puts_Nocolset(Ft
17910 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46  s5Iter *pIter, F
17920 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
17930 29 7b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65  ){.  pIter->base
17940 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e  .iRowid = pSeg->
17950 69 52 6f 77 69 64 3b 0a 20 20 70 49 74 65 72 2d  iRowid;.  pIter-
17960 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 53  >base.nData = pS
17970 65 67 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 61 73 73  eg->nPos;..  ass
17980 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
17990 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65  ex->pConfig->eDe
179a0 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49  tail!=FTS5_DETAI
179b0 4c 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65  L_NONE );.  asse
179c0 72 74 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73  rt( pIter->pCols
179d0 65 74 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  et==0 );..  if( 
179e0 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
179f0 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53  t+pSeg->nPos<=pS
17a00 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  eg->pLeaf->szLea
17a10 66 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20  f ){.    /* All 
17a20 64 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 6f  data is stored o
17a30 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
17a40 67 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  ge. Populate the
17a50 20 6f 75 74 70 75 74 20 0a 20 20 20 20 2a 2a 20   output .    ** 
17a60 76 61 72 69 61 62 6c 65 73 20 74 6f 20 70 6f 69  variables to poi
17a70 6e 74 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79  nt into the body
17a80 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 62 6a   of the page obj
17a90 65 63 74 2e 20 2a 2f 0a 20 20 20 20 70 49 74 65  ect. */.    pIte
17aa0 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20  r->base.pData = 
17ab0 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b  &pSeg->pLeaf->p[
17ac0 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
17ad0 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t];.  }else{.   
17ae0 20 2f 2a 20 54 68 65 20 64 61 74 61 20 69 73 20   /* The data is 
17af0 64 69 73 74 72 69 62 75 74 65 64 20 6f 76 65 72  distributed over
17b00 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67   two or more pag
17b10 65 73 2e 20 43 6f 70 79 20 69 74 20 69 6e 74 6f  es. Copy it into
17b20 20 74 68 65 0a 20 20 20 20 2a 2a 20 46 74 73 35   the.    ** Fts5
17b30 49 74 65 72 2e 70 6f 73 6c 69 73 74 20 62 75 66  Iter.poslist buf
17b40 66 65 72 20 61 6e 64 20 74 68 65 6e 20 73 65 74  fer and then set
17b50 20 74 68 65 20 6f 75 74 70 75 74 20 70 6f 69 6e   the output poin
17b60 74 65 72 20 74 6f 20 70 6f 69 6e 74 0a 20 20 20  ter to point.   
17b70 20 2a 2a 20 74 6f 20 74 68 69 73 20 62 75 66 66   ** to this buff
17b80 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66 74 73 35  er.  */.    fts5
17b90 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65  BufferZero(&pIte
17ba0 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
17bb0 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c   fts5SegiterPosl
17bc0 69 73 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  ist(pIter->pInde
17bd0 78 2c 20 70 53 65 67 2c 20 30 2c 20 26 70 49 74  x, pSeg, 0, &pIt
17be0 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20  er->poslist);.  
17bf0 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44    pIter->base.pD
17c00 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73  ata = pIter->pos
17c10 6c 69 73 74 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f  list.p;.  }.}../
17c20 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73  *.** xSetOutputs
17c30 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62   callback used b
17c40 79 20 64 65 74 61 69 6c 3d 63 6f 6c 20 77 68 65  y detail=col whe
17c50 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6c  n there is a col
17c60 75 6d 6e 20 66 69 6c 74 65 72 0a 2a 2a 20 61 6e  umn filter.** an
17c70 64 20 74 68 65 72 65 20 61 72 65 20 31 30 30 20  d there are 100 
17c80 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 2e  or more columns.
17c90 20 41 6c 73 6f 20 63 61 6c 6c 65 64 20 61 73 20   Also called as 
17ca0 61 20 66 61 6c 6c 62 61 63 6b 20 66 72 6f 6d 0a  a fallback from.
17cb0 2a 2a 20 66 74 73 35 49 74 65 72 53 65 74 4f 75  ** fts5IterSetOu
17cc0 74 70 75 74 73 5f 43 6f 6c 31 30 30 20 69 66 20  tputs_Col100 if 
17cd0 74 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20  the column-list 
17ce0 73 70 61 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20  spans more than 
17cf0 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  one page..*/.sta
17d00 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65  tic void fts5Ite
17d10 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 28  rSetOutputs_Col(
17d20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c  Fts5Iter *pIter,
17d30 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
17d40 65 67 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65  eg){.  fts5Buffe
17d50 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f  rZero(&pIter->po
17d60 73 6c 69 73 74 29 3b 0a 20 20 66 74 73 35 53 65  slist);.  fts5Se
17d70 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70 49 74  giterPoslist(pIt
17d80 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 53 65 67  er->pIndex, pSeg
17d90 2c 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74  , pIter->pColset
17da0 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  , &pIter->poslis
17db0 74 29 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73  t);.  pIter->bas
17dc0 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d  e.iRowid = pSeg-
17dd0 3e 69 52 6f 77 69 64 3b 0a 20 20 70 49 74 65 72  >iRowid;.  pIter
17de0 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70  ->base.pData = p
17df0 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b  Iter->poslist.p;
17e00 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e  .  pIter->base.n
17e10 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f  Data = pIter->po
17e20 73 6c 69 73 74 2e 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  slist.n;.}../*.*
17e30 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20 63 61  * xSetOutputs ca
17e40 6c 6c 62 61 63 6b 20 75 73 65 64 20 77 68 65 6e  llback used when
17e50 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 64 65 74  : .**.**   * det
17e60 61 69 6c 3d 63 6f 6c 2c 0a 2a 2a 20 20 20 2a 20  ail=col,.**   * 
17e70 74 68 65 72 65 20 69 73 20 61 20 63 6f 6c 75 6d  there is a colum
17e80 6e 20 66 69 6c 74 65 72 2c 20 61 6e 64 0a 2a 2a  n filter, and.**
17e90 20 20 20 2a 20 74 68 65 20 74 61 62 6c 65 20 63     * the table c
17ea0 6f 6e 74 61 69 6e 73 20 31 30 30 20 6f 72 20 66  ontains 100 or f
17eb0 65 77 65 72 20 63 6f 6c 75 6d 6e 73 2e 20 0a 2a  ewer columns. .*
17ec0 2a 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 70 6f  *.** The last po
17ed0 69 6e 74 20 69 73 20 74 6f 20 65 6e 73 75 72 65  int is to ensure
17ee0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   all column numb
17ef0 65 72 73 20 61 72 65 20 73 74 6f 72 65 64 20 61  ers are stored a
17f00 73 20 0a 2a 2a 20 73 69 6e 67 6c 65 2d 62 79 74  s .** single-byt
17f10 65 20 76 61 72 69 6e 74 73 2e 0a 2a 2f 0a 73 74  e varints..*/.st
17f20 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74  atic void fts5It
17f30 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c  erSetOutputs_Col
17f40 31 30 30 28 46 74 73 35 49 74 65 72 20 2a 70 49  100(Fts5Iter *pI
17f50 74 65 72 2c 20 46 74 73 35 53 65 67 49 74 65 72  ter, Fts5SegIter
17f60 20 2a 70 53 65 67 29 7b 0a 0a 20 20 61 73 73 65   *pSeg){..  asse
17f70 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  rt( pIter->pInde
17f80 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  x->pConfig->eDet
17f90 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
17fa0 5f 43 4f 4c 55 4d 4e 53 20 29 3b 0a 20 20 61 73  _COLUMNS );.  as
17fb0 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 43 6f  sert( pIter->pCo
17fc0 6c 73 65 74 20 29 3b 0a 0a 20 20 69 66 28 20 70  lset );..  if( p
17fd0 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  Seg->iLeafOffset
17fe0 2b 70 53 65 67 2d 3e 6e 50 6f 73 3e 70 53 65 67  +pSeg->nPos>pSeg
17ff0 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  ->pLeaf->szLeaf 
18000 29 7b 0a 20 20 20 20 66 74 73 35 49 74 65 72 53  ){.    fts5IterS
18010 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 28 70 49  etOutputs_Col(pI
18020 74 65 72 2c 20 70 53 65 67 29 3b 0a 20 20 7d 65  ter, pSeg);.  }e
18030 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d  lse{.    u8 *a =
18040 20 28 75 38 2a 29 26 70 53 65 67 2d 3e 70 4c 65   (u8*)&pSeg->pLe
18050 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61  af->p[pSeg->iLea
18060 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 75 38  fOffset];.    u8
18070 20 2a 70 45 6e 64 20 3d 20 28 75 38 2a 29 26 61   *pEnd = (u8*)&a
18080 5b 70 53 65 67 2d 3e 6e 50 6f 73 5d 3b 20 0a 20  [pSeg->nPos]; . 
18090 20 20 20 69 6e 74 20 69 50 72 65 76 20 3d 20 30     int iPrev = 0
180a0 3b 0a 20 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c  ;.    int *aiCol
180b0 20 3d 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65   = pIter->pColse
180c0 74 2d 3e 61 69 43 6f 6c 3b 0a 20 20 20 20 69 6e  t->aiCol;.    in
180d0 74 20 2a 61 69 43 6f 6c 45 6e 64 20 3d 20 26 61  t *aiColEnd = &a
180e0 69 43 6f 6c 5b 70 49 74 65 72 2d 3e 70 43 6f 6c  iCol[pIter->pCol
180f0 73 65 74 2d 3e 6e 43 6f 6c 5d 3b 0a 0a 20 20 20  set->nCol];..   
18100 20 75 38 20 2a 61 4f 75 74 20 3d 20 70 49 74 65   u8 *aOut = pIte
18110 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20  r->poslist.p;.  
18120 20 20 69 6e 74 20 69 50 72 65 76 4f 75 74 20 3d    int iPrevOut =
18130 20 30 3b 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e   0;..    pIter->
18140 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53  base.iRowid = pS
18150 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 20  eg->iRowid;..   
18160 20 77 68 69 6c 65 28 20 61 3c 70 45 6e 64 20 29   while( a<pEnd )
18170 7b 0a 20 20 20 20 20 20 69 50 72 65 76 20 2b 3d  {.      iPrev +=
18180 20 28 69 6e 74 29 61 2b 2b 5b 30 5d 20 2d 20 32   (int)a++[0] - 2
18190 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a  ;.      while( *
181a0 61 69 43 6f 6c 3c 69 50 72 65 76 20 29 7b 0a 20  aiCol<iPrev ){. 
181b0 20 20 20 20 20 20 20 61 69 43 6f 6c 2b 2b 3b 0a         aiCol++;.
181c0 20 20 20 20 20 20 20 20 69 66 28 20 61 69 43 6f          if( aiCo
181d0 6c 3d 3d 61 69 43 6f 6c 45 6e 64 20 29 20 67 6f  l==aiColEnd ) go
181e0 74 6f 20 73 65 74 6f 75 74 70 75 74 73 5f 63 6f  to setoutputs_co
181f0 6c 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  l_out;.      }. 
18200 20 20 20 20 20 69 66 28 20 2a 61 69 43 6f 6c 3d       if( *aiCol=
18210 3d 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  =iPrev ){.      
18220 20 20 2a 61 4f 75 74 2b 2b 20 3d 20 28 69 50 72    *aOut++ = (iPr
18230 65 76 20 2d 20 69 50 72 65 76 4f 75 74 29 20 2b  ev - iPrevOut) +
18240 20 32 3b 0a 20 20 20 20 20 20 20 20 69 50 72 65   2;.        iPre
18250 76 4f 75 74 20 3d 20 69 50 72 65 76 3b 0a 20 20  vOut = iPrev;.  
18260 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 73 65 74      }.    }..set
18270 6f 75 74 70 75 74 73 5f 63 6f 6c 5f 6f 75 74 3a  outputs_col_out:
18280 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65  .    pIter->base
18290 2e 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e  .pData = pIter->
182a0 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 70  poslist.p;.    p
182b0 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61  Iter->base.nData
182c0 20 3d 20 61 4f 75 74 20 2d 20 70 49 74 65 72 2d   = aOut - pIter-
182d0 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 7d 0a  >poslist.p;.  }.
182e0 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74  }../*.** xSetOut
182f0 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73  puts callback us
18300 65 64 20 62 79 20 64 65 74 61 69 6c 3d 66 75 6c  ed by detail=ful
18310 6c 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  l when there is 
18320 61 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 2e  a column filter.
18330 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18340 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
18350 74 73 5f 46 75 6c 6c 28 46 74 73 35 49 74 65 72  ts_Full(Fts5Iter
18360 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65 67   *pIter, Fts5Seg
18370 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 46  Iter *pSeg){.  F
18380 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
18390 65 74 20 3d 20 70 49 74 65 72 2d 3e 70 43 6f 6c  et = pIter->pCol
183a0 73 65 74 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61  set;.  pIter->ba
183b0 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67  se.iRowid = pSeg
183c0 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 61 73 73  ->iRowid;..  ass
183d0 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
183e0 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65  ex->pConfig->eDe
183f0 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
18400 4c 5f 46 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65  L_FULL );.  asse
18410 72 74 28 20 70 43 6f 6c 73 65 74 20 29 3b 0a 0a  rt( pColset );..
18420 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61    if( pSeg->iLea
18430 66 4f 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50  fOffset+pSeg->nP
18440 6f 73 3c 3d 70 53 65 67 2d 3e 70 4c 65 61 66 2d  os<=pSeg->pLeaf-
18450 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 2f  >szLeaf ){.    /
18460 2a 20 41 6c 6c 20 64 61 74 61 20 69 73 20 73 74  * All data is st
18470 6f 72 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72  ored on the curr
18480 65 6e 74 20 70 61 67 65 2e 20 50 6f 70 75 6c 61  ent page. Popula
18490 74 65 20 74 68 65 20 6f 75 74 70 75 74 20 0a 20  te the output . 
184a0 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20     ** variables 
184b0 74 6f 20 70 6f 69 6e 74 20 69 6e 74 6f 20 74 68  to point into th
184c0 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 70 61  e body of the pa
184d0 67 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  ge object. */.  
184e0 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20    const u8 *a = 
184f0 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b  &pSeg->pLeaf->p[
18500 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
18510 74 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  t];.    if( pCol
18520 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 31 20 29 7b 0a  set->nCol==1 ){.
18530 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73        pIter->bas
18540 65 2e 6e 44 61 74 61 20 3d 20 66 74 73 35 49 6e  e.nData = fts5In
18550 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28 26 61  dexExtractCol(&a
18560 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c 70 43 6f  , pSeg->nPos,pCo
18570 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 30 5d 29 3b  lset->aiCol[0]);
18580 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 61  .      pIter->ba
18590 73 65 2e 70 44 61 74 61 20 3d 20 61 3b 0a 20 20  se.pData = a;.  
185a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
185b0 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
185c0 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a  Iter->poslist);.
185d0 20 20 20 20 20 20 66 74 73 35 49 6e 64 65 78 45        fts5IndexE
185e0 78 74 72 61 63 74 43 6f 6c 73 65 74 28 70 43 6f  xtractColset(pCo
185f0 6c 73 65 74 2c 20 61 2c 20 70 53 65 67 2d 3e 6e  lset, a, pSeg->n
18600 50 6f 73 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73  Pos, &pIter->pos
18610 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74  list);.      pIt
18620 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d  er->base.pData =
18630 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
18640 70 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  p;.      pIter->
18650 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 49 74  base.nData = pIt
18660 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20  er->poslist.n;. 
18670 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
18680 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 69 73    /* The data is
18690 20 64 69 73 74 72 69 62 75 74 65 64 20 6f 76 65   distributed ove
186a0 72 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 70 61  r two or more pa
186b0 67 65 73 2e 20 43 6f 70 79 20 69 74 20 69 6e 74  ges. Copy it int
186c0 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 46 74 73  o the.    ** Fts
186d0 35 49 74 65 72 2e 70 6f 73 6c 69 73 74 20 62 75  5Iter.poslist bu
186e0 66 66 65 72 20 61 6e 64 20 74 68 65 6e 20 73 65  ffer and then se
186f0 74 20 74 68 65 20 6f 75 74 70 75 74 20 70 6f 69  t the output poi
18700 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 0a 20 20  nter to point.  
18710 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 62 75 66    ** to this buf
18720 66 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66 74 73  fer.  */.    fts
18730 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74  5BufferZero(&pIt
18740 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20  er->poslist);.  
18750 20 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73    fts5SegiterPos
18760 6c 69 73 74 28 70 49 74 65 72 2d 3e 70 49 6e 64  list(pIter->pInd
18770 65 78 2c 20 70 53 65 67 2c 20 70 43 6f 6c 73 65  ex, pSeg, pColse
18780 74 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  t, &pIter->posli
18790 73 74 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  st);.    pIter->
187a0 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74  base.pData = pIt
187b0 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20  er->poslist.p;. 
187c0 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e     pIter->base.n
187d0 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f  Data = pIter->po
187e0 73 6c 69 73 74 2e 6e 3b 0a 20 20 7d 0a 7d 0a 0a  slist.n;.  }.}..
187f0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
18800 49 74 65 72 53 65 74 4f 75 74 70 75 74 43 62 28  IterSetOutputCb(
18810 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 49 74  int *pRc, Fts5It
18820 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66  er *pIter){.  if
18830 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
18840 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e  K ){.    Fts5Con
18850 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
18860 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43  Iter->pIndex->pC
18870 6f 6e 66 69 67 3b 0a 20 20 20 20 69 66 28 20 70  onfig;.    if( p
18880 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d  Config->eDetail=
18890 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e  =FTS5_DETAIL_NON
188a0 45 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72  E ){.      pIter
188b0 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20  ->xSetOutputs = 
188c0 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
188d0 74 73 5f 4e 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a  ts_None;.    }..
188e0 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 49 74      else if( pIt
188f0 65 72 2d 3e 70 43 6f 6c 73 65 74 3d 3d 30 20 29  er->pColset==0 )
18900 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78  {.      pIter->x
18910 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73  SetOutputs = fts
18920 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
18930 4e 6f 63 6f 6c 73 65 74 3b 0a 20 20 20 20 7d 0a  Nocolset;.    }.
18940 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 43  .    else if( pC
18950 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
18960 46 54 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c  FTS5_DETAIL_FULL
18970 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
18980 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66  >xSetOutputs = f
18990 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
189a0 73 5f 46 75 6c 6c 3b 0a 20 20 20 20 7d 0a 0a 20  s_Full;.    }.. 
189b0 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 61     else{.      a
189c0 73 73 65 72 74 28 20 70 43 6f 6e 66 69 67 2d 3e  ssert( pConfig->
189d0 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
189e0 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20 29 3b 0a  TAIL_COLUMNS );.
189f0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69        if( pConfi
18a00 67 2d 3e 6e 43 6f 6c 3c 3d 31 30 30 20 29 7b 0a  g->nCol<=100 ){.
18a10 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78          pIter->x
18a20 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73  SetOutputs = fts
18a30 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
18a40 43 6f 6c 31 30 30 3b 0a 20 20 20 20 20 20 20 20  Col100;.        
18a50 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
18a60 72 53 69 7a 65 28 70 52 63 2c 20 26 70 49 74 65  rSize(pRc, &pIte
18a70 72 2d 3e 70 6f 73 6c 69 73 74 2c 20 70 43 6f 6e  r->poslist, pCon
18a80 66 69 67 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20  fig->nCol);.    
18a90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18aa0 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70   pIter->xSetOutp
18ab0 75 74 73 20 3d 20 66 74 73 35 49 74 65 72 53 65  uts = fts5IterSe
18ac0 74 4f 75 74 70 75 74 73 5f 43 6f 6c 3b 0a 20 20  tOutputs_Col;.  
18ad0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18ae0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  }.../*.** Alloca
18af0 74 65 20 61 20 6e 65 77 20 46 74 73 35 49 74 65  te a new Fts5Ite
18b00 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  r object..**.** 
18b10 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77  The new object w
18b20 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69  ill be used to i
18b30 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 64  terate through d
18b40 61 74 61 20 69 6e 20 73 74 72 75 63 74 75 72 65  ata in structure
18b50 20 70 53 74 72 75 63 74 2e 0a 2a 2a 20 49 66 20   pStruct..** If 
18b60 69 4c 65 76 65 6c 20 69 73 20 2d 76 65 2c 20 74  iLevel is -ve, t
18b70 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 6e 20  hen all data in 
18b80 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 73 20  all segments is 
18b90 6d 65 72 67 65 64 2e 20 4f 72 2c 20 69 66 20 69  merged. Or, if i
18ba0 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 7a 65 72 6f  Level.** is zero
18bb0 20 6f 72 20 67 72 65 61 74 65 72 2c 20 64 61 74   or greater, dat
18bc0 61 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74  a from the first
18bd0 20 6e 53 65 67 6d 65 6e 74 20 73 65 67 6d 65 6e   nSegment segmen
18be0 74 73 20 6f 6e 20 6c 65 76 65 6c 20 69 4c 65 76  ts on level iLev
18bf0 65 6c 0a 2a 2a 20 69 73 20 6d 65 72 67 65 64 2e  el.** is merged.
18c00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61  .**.** The itera
18c10 74 6f 72 20 69 6e 69 74 69 61 6c 6c 79 20 70 6f  tor initially po
18c20 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
18c30 74 20 74 65 72 6d 2f 72 6f 77 69 64 20 65 6e 74  t term/rowid ent
18c40 72 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 69 74  ry in the .** it
18c50 65 72 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a  erated data..*/.
18c60 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
18c70 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 0a 20 20  MultiIterNew(.  
18c80 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
18c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ca0 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
18cb0 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
18cc0 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  n */.  Fts5Struc
18cd0 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 20  ture *pStruct,  
18ce0 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74         /* Struct
18cf0 75 72 65 20 6f 66 20 73 70 65 63 69 66 69 63 20  ure of specific 
18d00 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 66  index */.  int f
18d10 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
18d20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
18d30 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 58  S5INDEX_QUERY_XX
18d40 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73  X flags */.  Fts
18d50 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
18d60 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
18d70 43 6f 6c 73 65 74 20 74 6f 20 66 69 6c 74 65 72  Colset to filter
18d80 20 6f 6e 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f   on (or NULL) */
18d90 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65  .  const u8 *pTe
18da0 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20  rm, int nTerm,  
18db0 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65     /* Term to se
18dc0 65 6b 20 74 6f 20 28 6f 72 20 4e 55 4c 4c 2f 30  ek to (or NULL/0
18dd0 29 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65  ) */.  int iLeve
18de0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
18df0 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20         /* Level 
18e00 74 6f 20 69 74 65 72 61 74 65 20 28 2d 31 20 66  to iterate (-1 f
18e10 6f 72 20 61 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74  or all) */.  int
18e20 20 6e 53 65 67 6d 65 6e 74 2c 20 20 20 20 20 20   nSegment,      
18e30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18e40 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e  Number of segmen
18e50 74 73 20 74 6f 20 6d 65 72 67 65 20 28 69 4c 65  ts to merge (iLe
18e60 76 65 6c 3e 3d 30 29 20 2a 2f 0a 20 20 46 74 73  vel>=0) */.  Fts
18e70 35 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20  5Iter **ppOut   
18e80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18e90 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  New object */.){
18ea0 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b  .  int nSeg = 0;
18eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ec0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18ed0 73 65 67 6d 65 6e 74 2d 69 74 65 72 73 20 69 6e  segment-iters in
18ee0 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49   use */.  int iI
18ef0 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ter = 0;        
18f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2a 2f 0a            /* */.
18f10 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20    int iSeg;     
18f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f30 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
18f40 72 61 74 65 20 74 68 72 6f 75 67 68 20 73 65 67  rate through seg
18f50 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53  ments */.  Fts5S
18f60 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
18f70 4c 76 6c 3b 0a 20 20 46 74 73 35 49 74 65 72 20  Lvl;.  Fts5Iter 
18f80 2a 70 4e 65 77 3b 0a 0a 20 20 61 73 73 65 72 74  *pNew;..  assert
18f90 28 20 28 70 54 65 72 6d 3d 3d 30 20 26 26 20 6e  ( (pTerm==0 && n
18fa0 54 65 72 6d 3d 3d 30 29 20 7c 7c 20 69 4c 65 76  Term==0) || iLev
18fb0 65 6c 3c 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  el<0 );..  /* Al
18fc0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
18fd0 20 74 68 65 20 6e 65 77 20 6d 75 6c 74 69 2d 73   the new multi-s
18fe0 65 67 2d 69 74 65 72 61 74 6f 72 2e 20 2a 2f 0a  eg-iterator. */.
18ff0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
19000 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
19010 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20  ( iLevel<0 ){.  
19020 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72      assert( pStr
19030 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66  uct->nSegment==f
19040 74 73 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e  ts5StructureCoun
19050 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63  tSegments(pStruc
19060 74 29 20 29 3b 0a 20 20 20 20 20 20 6e 53 65 67  t) );.      nSeg
19070 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67   = pStruct->nSeg
19080 6d 65 6e 74 3b 0a 20 20 20 20 20 20 6e 53 65 67  ment;.      nSeg
19090 20 2b 3d 20 28 70 2d 3e 70 48 61 73 68 20 3f 20   += (p->pHash ? 
190a0 31 20 3a 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  1 : 0);.    }els
190b0 65 7b 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20  e{.      nSeg = 
190c0 4d 49 4e 28 70 53 74 72 75 63 74 2d 3e 61 4c 65  MIN(pStruct->aLe
190d0 76 65 6c 5b 69 4c 65 76 65 6c 5d 2e 6e 53 65 67  vel[iLevel].nSeg
190e0 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  , nSegment);.   
190f0 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 4f 75 74 20   }.  }.  *ppOut 
19100 3d 20 70 4e 65 77 20 3d 20 66 74 73 35 4d 75 6c  = pNew = fts5Mul
19110 74 69 49 74 65 72 41 6c 6c 6f 63 28 70 2c 20 6e  tiIterAlloc(p, n
19120 53 65 67 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  Seg);.  if( pNew
19130 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
19140 70 4e 65 77 2d 3e 62 52 65 76 20 3d 20 28 30 21  pNew->bRev = (0!
19150 3d 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e  =(flags & FTS5IN
19160 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 29 29  DEX_QUERY_DESC))
19170 3b 0a 20 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45  ;.  pNew->bSkipE
19180 6d 70 74 79 20 3d 20 28 30 21 3d 28 66 6c 61 67  mpty = (0!=(flag
19190 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
191a0 45 52 59 5f 53 4b 49 50 45 4d 50 54 59 29 29 3b  ERY_SKIPEMPTY));
191b0 0a 20 20 70 4e 65 77 2d 3e 70 53 74 72 75 63 74  .  pNew->pStruct
191c0 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 70 4e   = pStruct;.  pN
191d0 65 77 2d 3e 70 43 6f 6c 73 65 74 20 3d 20 70 43  ew->pColset = pC
191e0 6f 6c 73 65 74 3b 0a 20 20 66 74 73 35 53 74 72  olset;.  fts5Str
191f0 75 63 74 75 72 65 52 65 66 28 70 53 74 72 75 63  uctureRef(pStruc
19200 74 29 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73  t);.  if( (flags
19210 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
19220 52 59 5f 4e 4f 4f 55 54 50 55 54 29 3d 3d 30 20  RY_NOOUTPUT)==0 
19230 29 7b 0a 20 20 20 20 66 74 73 35 49 74 65 72 53  ){.    fts5IterS
19240 65 74 4f 75 74 70 75 74 43 62 28 26 70 2d 3e 72  etOutputCb(&p->r
19250 63 2c 20 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20  c, pNew);.  }.. 
19260 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 65   /* Initialize e
19270 61 63 68 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  ach of the compo
19280 6e 65 6e 74 20 73 65 67 6d 65 6e 74 20 69 74 65  nent segment ite
19290 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 69 66 28  rators. */.  if(
192a0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
192b0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 65  K ){.    if( iLe
192c0 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 46  vel<0 ){.      F
192d0 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
192e0 6c 20 2a 70 45 6e 64 20 3d 20 26 70 53 74 72 75  l *pEnd = &pStru
192f0 63 74 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75  ct->aLevel[pStru
19300 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20  ct->nLevel];.   
19310 20 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68 20     if( p->pHash 
19320 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ){.        /* Ad
19330 64 20 61 20 73 65 67 6d 65 6e 74 20 69 74 65 72  d a segment iter
19340 61 74 6f 72 20 66 6f 72 20 74 68 65 20 63 75 72  ator for the cur
19350 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
19360 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
19370 20 2a 2f 0a 20 20 20 20 20 20 20 20 46 74 73 35   */.        Fts5
19380 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d  SegIter *pIter =
19390 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74   &pNew->aSeg[iIt
193a0 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 66  er++];.        f
193b0 74 73 35 53 65 67 49 74 65 72 48 61 73 68 49 6e  ts5SegIterHashIn
193c0 69 74 28 70 2c 20 70 54 65 72 6d 2c 20 6e 54 65  it(p, pTerm, nTe
193d0 72 6d 2c 20 66 6c 61 67 73 2c 20 70 49 74 65 72  rm, flags, pIter
193e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
193f0 20 66 6f 72 28 70 4c 76 6c 3d 26 70 53 74 72 75   for(pLvl=&pStru
19400 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b 20 70  ct->aLevel[0]; p
19410 4c 76 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c 2b 2b  Lvl<pEnd; pLvl++
19420 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
19430 53 65 67 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31  Seg=pLvl->nSeg-1
19440 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d  ; iSeg>=0; iSeg-
19450 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74  -){.          Ft
19460 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
19470 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c  nt *pSeg = &pLvl
19480 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20  ->aSeg[iSeg];.  
19490 20 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49          Fts5SegI
194a0 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e  ter *pIter = &pN
194b0 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b  ew->aSeg[iIter++
194c0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
194d0 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20   pTerm==0 ){.   
194e0 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
194f0 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65 67  IterInit(p, pSeg
19500 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
19510 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19520 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
19530 65 72 53 65 65 6b 49 6e 69 74 28 70 2c 20 70 54  erSeekInit(p, pT
19540 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67  erm, nTerm, flag
19550 73 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b  s, pSeg, pIter);
19560 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
19570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
19580 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19590 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
195a0 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b  >aLevel[iLevel];
195b0 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d  .      for(iSeg=
195c0 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b  nSeg-1; iSeg>=0;
195d0 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20   iSeg--){.      
195e0 20 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69    fts5SegIterIni
195f0 74 28 70 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67  t(p, &pLvl->aSeg
19600 5b 69 53 65 67 5d 2c 20 26 70 4e 65 77 2d 3e 61  [iSeg], &pNew->a
19610 53 65 67 5b 69 49 74 65 72 2b 2b 5d 29 3b 0a 20  Seg[iIter++]);. 
19620 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
19630 20 61 73 73 65 72 74 28 20 69 49 74 65 72 3d 3d   assert( iIter==
19640 6e 53 65 67 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  nSeg );.  }..  /
19650 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 77  * If the above w
19660 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 65  as successful, e
19670 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 69 74  ach component it
19680 65 72 61 74 6f 72 73 20 6e 6f 77 20 70 6f 69 6e  erators now poin
19690 74 73 20 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ts .  ** to the 
196a0 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 69  first entry in i
196b0 74 73 20 73 65 67 6d 65 6e 74 2e 20 49 6e 20 74  ts segment. In t
196c0 68 69 73 20 63 61 73 65 20 69 6e 69 74 69 61 6c  his case initial
196d0 69 7a 65 20 74 68 65 20 0a 20 20 2a 2a 20 61 46  ize the .  ** aF
196e0 69 72 73 74 5b 5d 20 61 72 72 61 79 2e 20 4f 72  irst[] array. Or
196f0 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61  , if an error ha
19700 73 20 6f 63 63 75 72 72 65 64 2c 20 66 72 65 65  s occurred, free
19710 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 20 20   the iterator.  
19720 2a 2a 20 6f 62 6a 65 63 74 20 61 6e 64 20 73 65  ** object and se
19730 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
19740 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e 20 20  iable to NULL.  
19750 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  */.  if( p->rc==
19760 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19770 20 66 6f 72 28 69 49 74 65 72 3d 70 4e 65 77 2d   for(iIter=pNew-
19780 3e 6e 53 65 67 2d 31 3b 20 69 49 74 65 72 3e 30  >nSeg-1; iIter>0
19790 3b 20 69 49 74 65 72 2d 2d 29 7b 0a 20 20 20 20  ; iIter--){.    
197a0 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 20    int iEq;.     
197b0 20 69 66 28 20 28 69 45 71 20 3d 20 66 74 73 35   if( (iEq = fts5
197c0 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61  MultiIterDoCompa
197d0 72 65 28 70 4e 65 77 2c 20 69 49 74 65 72 29 29  re(pNew, iIter))
197e0 20 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35   ){.        Fts5
197f0 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
19800 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 45 71 5d  &pNew->aSeg[iEq]
19810 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
19820 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
19830 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c 20   pSeg->xNext(p, 
19840 70 53 65 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  pSeg, 0);.      
19850 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41    fts5MultiIterA
19860 64 76 61 6e 63 65 64 28 70 2c 20 70 4e 65 77 2c  dvanced(p, pNew,
19870 20 69 45 71 2c 20 69 49 74 65 72 29 3b 0a 20 20   iEq, iIter);.  
19880 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
19890 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74  fts5MultiIterSet
198a0 45 6f 66 28 70 4e 65 77 29 3b 0a 20 20 20 20 66  Eof(pNew);.    f
198b0 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74  ts5AssertMultiIt
198c0 65 72 53 65 74 75 70 28 70 2c 20 70 4e 65 77 29  erSetup(p, pNew)
198d0 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d  ;..    if( pNew-
198e0 3e 62 53 6b 69 70 45 6d 70 74 79 20 26 26 20 66  >bSkipEmpty && f
198f0 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d  ts5MultiIterIsEm
19900 70 74 79 28 70 2c 20 70 4e 65 77 29 20 29 7b 0a  pty(p, pNew) ){.
19910 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
19920 74 65 72 4e 65 78 74 28 70 2c 20 70 4e 65 77 2c  terNext(p, pNew,
19930 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73   0, 0);.    }els
19940 65 20 69 66 28 20 70 4e 65 77 2d 3e 62 61 73 65  e if( pNew->base
19950 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20  .bEof==0 ){.    
19960 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
19970 53 65 67 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65  Seg = &pNew->aSe
19980 67 5b 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 31  g[pNew->aFirst[1
19990 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20  ].iFirst];.     
199a0 20 70 4e 65 77 2d 3e 78 53 65 74 4f 75 74 70 75   pNew->xSetOutpu
199b0 74 73 28 70 4e 65 77 2c 20 70 53 65 67 29 3b 0a  ts(pNew, pSeg);.
199c0 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
199d0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
199e0 72 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  rFree(pNew);.   
199f0 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20 20 7d   *ppOut = 0;.  }
19a00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
19a10 20 61 6e 20 46 74 73 35 49 74 65 72 20 74 68 61   an Fts5Iter tha
19a20 74 20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75  t iterates throu
19a30 67 68 20 74 68 65 20 64 6f 63 6c 69 73 74 20 70  gh the doclist p
19a40 72 6f 76 69 64 65 64 0a 2a 2a 20 61 73 20 74 68  rovided.** as th
19a50 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
19a60 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
19a70 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  d fts5MultiIterN
19a80 65 77 32 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ew2(.  Fts5Index
19a90 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
19aa0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
19ab0 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74  ackend to iterat
19ac0 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74  e within */.  Ft
19ad0 73 35 44 61 74 61 20 2a 70 44 61 74 61 2c 20 20  s5Data *pData,  
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19af0 20 44 6f 63 6c 69 73 74 20 74 6f 20 69 74 65 72   Doclist to iter
19b00 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  ate through */. 
19b10 20 69 6e 74 20 62 44 65 73 63 2c 20 20 20 20 20   int bDesc,     
19b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b30 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 64 65 73   /* True for des
19b40 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72  cending rowid or
19b50 64 65 72 20 2a 2f 0a 20 20 46 74 73 35 49 74 65  der */.  Fts5Ite
19b60 72 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20  r **ppOut       
19b70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
19b80 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46  object */.){.  F
19b90 74 73 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20  ts5Iter *pNew;. 
19ba0 20 70 4e 65 77 20 3d 20 66 74 73 35 4d 75 6c 74   pNew = fts5Mult
19bb0 69 49 74 65 72 41 6c 6c 6f 63 28 70 2c 20 32 29  iIterAlloc(p, 2)
19bc0 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
19bd0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
19be0 2a 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e  *pIter = &pNew->
19bf0 61 53 65 67 5b 31 5d 3b 0a 0a 20 20 20 20 70 49  aSeg[1];..    pI
19c00 74 65 72 2d 3e 66 6c 61 67 73 20 3d 20 46 54 53  ter->flags = FTS
19c10 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
19c20 4d 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61  M;.    if( pData
19c30 2d 3e 73 7a 4c 65 61 66 3e 30 20 29 7b 0a 20 20  ->szLeaf>0 ){.  
19c40 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
19c50 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20   = pData;.      
19c60 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
19c70 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72 69  et = fts5GetVari
19c80 6e 74 28 70 44 61 74 61 2d 3e 70 2c 20 28 75 36  nt(pData->p, (u6
19c90 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
19ca0 64 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  d);.      pIter-
19cb0 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
19cc0 20 70 44 61 74 61 2d 3e 6e 6e 3b 0a 20 20 20 20   pData->nn;.    
19cd0 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 31    pNew->aFirst[1
19ce0 5d 2e 69 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  ].iFirst = 1;.  
19cf0 20 20 20 20 69 66 28 20 62 44 65 73 63 20 29 7b      if( bDesc ){
19d00 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 62  .        pNew->b
19d10 52 65 76 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Rev = 1;.       
19d20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d   pIter->flags |=
19d30 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
19d40 56 45 52 53 45 3b 0a 20 20 20 20 20 20 20 20 66  VERSE;.        f
19d50 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
19d60 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74  eInitPage(p, pIt
19d70 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  er);.      }else
19d80 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  {.        fts5Se
19d90 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
19da0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   pIter);.      }
19db0 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 30  .      pData = 0
19dc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19dd0 20 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e 62 45     pNew->base.bE
19de0 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  of = 1;.    }.  
19df0 20 20 66 74 73 35 53 65 67 49 74 65 72 53 65 74    fts5SegIterSet
19e00 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a  Next(p, pIter);.
19e10 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e  .    *ppOut = pN
19e20 65 77 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44  ew;.  }..  fts5D
19e30 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61  ataRelease(pData
19e40 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
19e50 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
19e60 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45 4f  terator is at EO
19e70 46 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  F or if an error
19e80 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a   has occurred. .
19e90 2a 2a 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69  ** False otherwi
19ea0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
19eb0 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45  t fts5MultiIterE
19ec0 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  of(Fts5Index *p,
19ed0 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
19ee0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
19ef0 72 63 20 0a 20 20 20 20 20 20 7c 7c 20 28 70 49  rc .      || (pI
19f00 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
19f10 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
19f20 73 74 20 5d 2e 70 4c 65 61 66 3d 3d 30 29 3d 3d  st ].pLeaf==0)==
19f30 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66  pIter->base.bEof
19f40 20 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20   .  );.  return 
19f50 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d  (p->rc || pIter-
19f60 3e 62 61 73 65 2e 62 45 6f 66 29 3b 0a 7d 0a 0a  >base.bEof);.}..
19f70 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
19f80 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 65 6e   rowid of the en
19f90 74 72 79 20 74 68 61 74 20 74 68 65 20 69 74 65  try that the ite
19fa0 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  rator currently 
19fb0 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 2e 20 49 66  points.** to. If
19fc0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f   the iterator po
19fd0 69 6e 74 73 20 74 6f 20 45 4f 46 20 77 68 65 6e  ints to EOF when
19fe0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
19ff0 73 20 63 61 6c 6c 65 64 20 74 68 65 0a 2a 2a 20  s called the.** 
1a000 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 64 65  results are unde
1a010 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
1a020 20 69 36 34 20 66 74 73 35 4d 75 6c 74 69 49 74   i64 fts5MultiIt
1a030 65 72 52 6f 77 69 64 28 46 74 73 35 49 74 65 72  erRowid(Fts5Iter
1a040 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65   *pIter){.  asse
1a050 72 74 28 20 70 49 74 65 72 2d 3e 61 53 65 67 5b  rt( pIter->aSeg[
1a060 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
1a070 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66  ].iFirst ].pLeaf
1a080 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 74   );.  return pIt
1a090 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
1a0a0 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
1a0b0 74 20 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  t ].iRowid;.}../
1a0c0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74  *.** Move the it
1a0d0 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  erator to the ne
1a0e0 78 74 20 65 6e 74 72 79 20 61 74 20 6f 72 20 66  xt entry at or f
1a0f0 6f 6c 6c 6f 77 69 6e 67 20 69 4d 61 74 63 68 2e  ollowing iMatch.
1a100 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1a110 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
1a120 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64  tFrom(.  Fts5Ind
1a130 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49 74  ex *p, .  Fts5It
1a140 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 69 36  er *pIter, .  i6
1a150 34 20 69 4d 61 74 63 68 0a 29 7b 0a 20 20 77 68  4 iMatch.){.  wh
1a160 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36  ile( 1 ){.    i6
1a170 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 66 74  4 iRowid;.    ft
1a180 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
1a190 70 2c 20 70 49 74 65 72 2c 20 31 2c 20 69 4d 61  p, pIter, 1, iMa
1a1a0 74 63 68 29 3b 0a 20 20 20 20 69 66 28 20 66 74  tch);.    if( ft
1a1b0 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
1a1c0 2c 20 70 49 74 65 72 29 20 29 20 62 72 65 61 6b  , pIter) ) break
1a1d0 3b 0a 20 20 20 20 69 52 6f 77 69 64 20 3d 20 66  ;.    iRowid = f
1a1e0 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69  ts5MultiIterRowi
1a1f0 64 28 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66  d(pIter);.    if
1a200 28 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30  ( pIter->bRev==0
1a210 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4d 61 74   && iRowid>=iMat
1a220 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ch ) break;.    
1a230 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76 21  if( pIter->bRev!
1a240 3d 30 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4d  =0 && iRowid<=iM
1a250 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20  atch ) break;.  
1a260 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
1a270 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
1a280 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
1a290 6e 67 20 74 68 65 20 74 65 72 6d 20 61 73 73 6f  ng the term asso
1a2a0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1a2b0 0a 2a 2a 20 65 6e 74 72 79 20 74 68 61 74 20 74  .** entry that t
1a2c0 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
1a2d0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
1a2e0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
1a2f0 20 75 38 20 2a 66 74 73 35 4d 75 6c 74 69 49 74   u8 *fts5MultiIt
1a300 65 72 54 65 72 6d 28 46 74 73 35 49 74 65 72 20  erTerm(Fts5Iter 
1a310 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29  *pIter, int *pn)
1a320 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  {.  Fts5SegIter 
1a330 2a 70 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  *p = &pIter->aSe
1a340 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
1a350 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
1a360 2a 70 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e 6e 3b  *pn = p->term.n;
1a370 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 74 65 72  .  return p->ter
1a380 6d 2e 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  m.p;.}../*.** Al
1a390 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 67  locate a new seg
1a3a0 6d 65 6e 74 2d 69 64 20 66 6f 72 20 74 68 65 20  ment-id for the 
1a3b0 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63  structure pStruc
1a3c0 74 2e 20 54 68 65 20 6e 65 77 20 73 65 67 6d 65  t. The new segme
1a3d0 6e 74 0a 2a 2a 20 69 64 20 6d 75 73 74 20 62 65  nt.** id must be
1a3e0 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 36   between 1 and 6
1a3f0 35 33 33 35 20 69 6e 63 6c 75 73 69 76 65 2c 20  5335 inclusive, 
1a400 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  and must not be 
1a410 75 73 65 64 20 62 79 20 0a 2a 2a 20 61 6e 79 20  used by .** any 
1a420 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 69  currently existi
1a430 6e 67 20 73 65 67 6d 65 6e 74 2e 20 49 66 20 61  ng segment. If a
1a440 20 66 72 65 65 20 73 65 67 6d 65 6e 74 20 69 64   free segment id
1a450 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
1a460 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  ,.** SQLITE_FULL
1a470 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
1a480 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1a490 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
1a4a0 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  rred, this funct
1a4b0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
1a4c0 30 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  0 is .** returne
1a4d0 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
1a4e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
1a4f0 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28  s5AllocateSegid(
1a500 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
1a510 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
1a520 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 69 53 65  ruct){.  int iSe
1a530 67 69 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  gid = 0;..  if( 
1a540 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1a550 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 74 72   ){.    if( pStr
1a560 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3e 3d 46  uct->nSegment>=F
1a570 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20  TS5_MAX_SEGMENT 
1a580 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
1a590 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
1a5a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77    }else{.      w
1a5b0 68 69 6c 65 28 20 69 53 65 67 69 64 3d 3d 30 20  hile( iSegid==0 
1a5c0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
1a5d0 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20  Lvl, iSeg;.     
1a5e0 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
1a5f0 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 75 33 32  mness(sizeof(u32
1a600 29 2c 20 28 76 6f 69 64 2a 29 26 69 53 65 67 69  ), (void*)&iSegi
1a610 64 29 3b 0a 20 20 20 20 20 20 20 20 69 53 65 67  d);.        iSeg
1a620 69 64 20 3d 20 69 53 65 67 69 64 20 26 20 28 28  id = iSegid & ((
1a630 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49  1 << FTS5_DATA_I
1a640 44 5f 42 29 2d 31 29 3b 0a 20 20 20 20 20 20 20  D_B)-1);.       
1a650 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
1a660 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
1a670 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
1a680 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30        for(iSeg=0
1a690 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e  ; iSeg<pStruct->
1a6a0 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
1a6b0 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20  g; iSeg++){.    
1a6c0 20 20 20 20 20 20 20 20 69 66 28 20 69 53 65 67          if( iSeg
1a6d0 69 64 3d 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65  id==pStruct->aLe
1a6e0 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69  vel[iLvl].aSeg[i
1a6f0 53 65 67 5d 2e 69 53 65 67 69 64 20 29 7b 0a 20  Seg].iSegid ){. 
1a700 20 20 20 20 20 20 20 20 20 20 20 20 20 69 53 65               iSe
1a710 67 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  gid = 0;.       
1a720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1a730 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1a740 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1a750 20 20 72 65 74 75 72 6e 20 69 53 65 67 69 64 3b    return iSegid;
1a760 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
1a770 64 20 61 6c 6c 20 64 61 74 61 20 63 75 72 72 65  d all data curre
1a780 6e 74 6c 79 20 63 61 63 68 65 64 20 69 6e 20 74  ntly cached in t
1a790 68 65 20 68 61 73 68 2d 74 61 62 6c 65 73 2e 0a  he hash-tables..
1a7a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1a7b0 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64 44  ts5IndexDiscardD
1a7c0 61 74 61 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ata(Fts5Index *p
1a7d0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
1a7e0 70 48 61 73 68 20 7c 7c 20 70 2d 3e 6e 50 65 6e  pHash || p->nPen
1a7f0 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20  dingData==0 );. 
1a800 20 69 66 28 20 70 2d 3e 70 48 61 73 68 20 29 7b   if( p->pHash ){
1a810 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
1a820 48 61 73 68 43 6c 65 61 72 28 70 2d 3e 70 48 61  HashClear(p->pHa
1a830 73 68 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e  sh);.    p->nPen
1a840 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20  dingData = 0;.  
1a850 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
1a860 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
1a870 65 20 70 72 65 66 69 78 2c 20 69 6e 20 62 79 74  e prefix, in byt
1a880 65 73 2c 20 74 68 61 74 20 62 75 66 66 65 72 20  es, that buffer 
1a890 0a 2a 2a 20 28 70 4e 65 77 2f 3c 6c 65 6e 67 74  .** (pNew/<lengt
1a8a0 68 2d 75 6e 6b 6e 6f 77 6e 3e 29 20 73 68 61 72  h-unknown>) shar
1a8b0 65 73 20 77 69 74 68 20 62 75 66 66 65 72 20 28  es with buffer (
1a8c0 70 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a 2a 2a 0a 2a  pOld/nOld)..**.*
1a8d0 2a 20 42 75 66 66 65 72 20 28 70 4e 65 77 2f 3c  * Buffer (pNew/<
1a8e0 6c 65 6e 67 74 68 2d 75 6e 6b 6e 6f 77 6e 3e 29  length-unknown>)
1a8f0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
1a900 6f 20 62 65 20 67 72 65 61 74 65 72 20 0a 2a 2a  o be greater .**
1a910 20 74 68 61 6e 20 62 75 66 66 65 72 20 28 70 4f   than buffer (pO
1a920 6c 64 2f 6e 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61  ld/nOld)..*/.sta
1a930 74 69 63 20 69 6e 74 20 66 74 73 35 50 72 65 66  tic int fts5Pref
1a940 69 78 43 6f 6d 70 72 65 73 73 28 69 6e 74 20 6e  ixCompress(int n
1a950 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  Old, const u8 *p
1a960 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  Old, const u8 *p
1a970 4e 65 77 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  New){.  int i;. 
1a980 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64   for(i=0; i<nOld
1a990 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1a9a0 70 4f 6c 64 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d  pOld[i]!=pNew[i]
1a9b0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
1a9c0 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 73 74 61  return i;.}..sta
1a9d0 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
1a9e0 74 65 44 6c 69 64 78 43 6c 65 61 72 28 0a 20 20  teDlidxClear(.  
1a9f0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
1aa00 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1aa10 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 62  pWriter,.  int b
1aa20 46 6c 75 73 68 20 20 20 20 20 20 20 20 20 20 20  Flush           
1aa30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1aa40 20 74 72 75 65 2c 20 77 72 69 74 65 20 64 6c 69   true, write dli
1aa50 64 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 29 7b  dx to disk */.){
1aa60 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
1aa70 72 74 28 20 62 46 6c 75 73 68 3d 3d 30 20 7c 7c  rt( bFlush==0 ||
1aa80 20 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64   (pWriter->nDlid
1aa90 78 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e  x>0 && pWriter->
1aaa0 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e  aDlidx[0].buf.n>
1aab0 30 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  0) );.  for(i=0;
1aac0 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69   i<pWriter->nDli
1aad0 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74  dx; i++){.    Ft
1aae0 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70  s5DlidxWriter *p
1aaf0 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72  Dlidx = &pWriter
1ab00 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20  ->aDlidx[i];.   
1ab10 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75 66   if( pDlidx->buf
1ab20 2e 6e 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  .n==0 ) break;. 
1ab30 20 20 20 69 66 28 20 62 46 6c 75 73 68 20 29 7b     if( bFlush ){
1ab40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ab50 44 6c 69 64 78 2d 3e 70 67 6e 6f 21 3d 30 20 29  Dlidx->pgno!=0 )
1ab60 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  ;.      fts5Data
1ab70 57 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20  Write(p, .      
1ab80 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52      FTS5_DLIDX_R
1ab90 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53  OWID(pWriter->iS
1aba0 65 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d  egid, i, pDlidx-
1abb0 3e 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20  >pgno),.        
1abc0 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c    pDlidx->buf.p,
1abd0 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20   pDlidx->buf.n. 
1abe0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
1abf0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1ac00 66 65 72 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d  ferZero(&pDlidx-
1ac10 3e 62 75 66 29 3b 0a 20 20 20 20 70 44 6c 69 64  >buf);.    pDlid
1ac20 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20  x->bPrevValid = 
1ac30 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
1ac40 47 72 6f 77 20 74 68 65 20 70 57 72 69 74 65 72  Grow the pWriter
1ac50 2d 3e 61 44 6c 69 64 78 5b 5d 20 61 72 72 61 79  ->aDlidx[] array
1ac60 20 74 6f 20 61 74 20 6c 65 61 73 74 20 6e 4c 76   to at least nLv
1ac70 6c 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 73 69  l elements in si
1ac80 7a 65 2e 0a 2a 2a 20 41 6e 79 20 6e 65 77 20 61  ze..** Any new a
1ac90 72 72 61 79 20 65 6c 65 6d 65 6e 74 73 20 61 72  rray elements ar
1aca0 65 20 7a 65 72 6f 65 64 20 62 65 66 6f 72 65 20  e zeroed before 
1acb0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
1acc0 61 74 69 63 20 69 6e 74 20 66 74 73 35 57 72 69  atic int fts5Wri
1acd0 74 65 44 6c 69 64 78 47 72 6f 77 28 0a 20 20 46  teDlidxGrow(.  F
1ace0 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46  ts5Index *p,.  F
1acf0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
1ad00 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 4c 76  riter,.  int nLv
1ad10 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  l.){.  if( p->rc
1ad20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
1ad30 4c 76 6c 3e 3d 70 57 72 69 74 65 72 2d 3e 6e 44  Lvl>=pWriter->nD
1ad40 6c 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73 35  lidx ){.    Fts5
1ad50 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44 6c  DlidxWriter *aDl
1ad60 69 64 78 20 3d 20 28 46 74 73 35 44 6c 69 64 78  idx = (Fts5Dlidx
1ad70 57 72 69 74 65 72 2a 29 73 71 6c 69 74 65 33 5f  Writer*)sqlite3_
1ad80 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
1ad90 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
1ada0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  , sizeof(Fts5Dli
1adb0 64 78 57 72 69 74 65 72 29 20 2a 20 6e 4c 76 6c  dxWriter) * nLvl
1adc0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
1add0 61 44 6c 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20  aDlidx==0 ){.   
1ade0 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
1adf0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
1ae00 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42  se{.      int nB
1ae10 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73  yte = sizeof(Fts
1ae20 35 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a 20  5DlidxWriter) * 
1ae30 28 6e 4c 76 6c 20 2d 20 70 57 72 69 74 65 72 2d  (nLvl - pWriter-
1ae40 3e 6e 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20  >nDlidx);.      
1ae50 6d 65 6d 73 65 74 28 26 61 44 6c 69 64 78 5b 70  memset(&aDlidx[p
1ae60 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 5d 2c  Writer->nDlidx],
1ae70 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20   0, nByte);.    
1ae80 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64    pWriter->aDlid
1ae90 78 20 3d 20 61 44 6c 69 64 78 3b 0a 20 20 20 20  x = aDlidx;.    
1aea0 20 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64    pWriter->nDlid
1aeb0 78 20 3d 20 6e 4c 76 6c 3b 0a 20 20 20 20 7d 0a  x = nLvl;.    }.
1aec0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e    }.  return p->
1aed0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
1aee0 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
1aef0 69 73 74 2d 69 6e 64 65 78 20 61 63 63 75 6d 75  ist-index accumu
1af00 6c 61 74 69 6e 67 20 69 6e 20 70 57 72 69 74 65  lating in pWrite
1af10 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 69 73 20 6c  r->aDlidx[] is l
1af20 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 2c 20  arge.** enough, 
1af30 66 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b  flush it to disk
1af40 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 4f   and return 1. O
1af50 74 68 65 72 77 69 73 65 20 64 69 73 63 61 72 64  therwise discard
1af60 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a   it and return.*
1af70 2a 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  * zero..*/.stati
1af80 63 20 69 6e 74 20 66 74 73 35 57 72 69 74 65 46  c int fts5WriteF
1af90 6c 75 73 68 44 6c 69 64 78 28 46 74 73 35 49 6e  lushDlidx(Fts5In
1afa0 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57  dex *p, Fts5SegW
1afb0 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b  riter *pWriter){
1afc0 0a 20 20 69 6e 74 20 62 46 6c 61 67 20 3d 20 30  .  int bFlag = 0
1afd0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
1afe0 20 77 65 72 65 20 46 54 53 35 5f 4d 49 4e 5f 44   were FTS5_MIN_D
1aff0 4c 49 44 58 5f 53 49 5a 45 20 6f 72 20 6d 6f 72  LIDX_SIZE or mor
1b000 65 20 65 6d 70 74 79 20 6c 65 61 66 20 70 61 67  e empty leaf pag
1b010 65 73 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  es written.  ** 
1b020 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  to the database,
1b030 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20   also write the 
1b040 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 74 6f  doclist-index to
1b050 20 64 69 73 6b 2e 20 20 2a 2f 0a 20 20 69 66 28   disk.  */.  if(
1b060 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
1b070 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 26 26 20 70  [0].buf.n>0 && p
1b080 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d  Writer->nEmpty>=
1b090 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53  FTS5_MIN_DLIDX_S
1b0a0 49 5a 45 20 29 7b 0a 20 20 20 20 62 46 6c 61 67  IZE ){.    bFlag
1b0b0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 74 73 35   = 1;.  }.  fts5
1b0c0 57 72 69 74 65 44 6c 69 64 78 43 6c 65 61 72 28  WriteDlidxClear(
1b0d0 70 2c 20 70 57 72 69 74 65 72 2c 20 62 46 6c 61  p, pWriter, bFla
1b0e0 67 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e  g);.  pWriter->n
1b0f0 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20 72 65 74  Empty = 0;.  ret
1b100 75 72 6e 20 62 46 6c 61 67 3b 0a 7d 0a 0a 2f 2a  urn bFlag;.}../*
1b110 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1b120 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
1b130 65 76 65 72 20 70 72 6f 63 65 73 73 69 6e 67 20  ever processing 
1b140 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66  of the doclist f
1b150 6f 72 20 74 68 65 20 0a 2a 2a 20 6c 61 73 74 20  or the .** last 
1b160 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 70 61 67  term on leaf pag
1b170 65 20 28 70 57 72 69 74 65 72 2d 3e 69 42 74 50  e (pWriter->iBtP
1b180 61 67 65 29 20 69 73 20 63 6f 6d 70 6c 65 74 65  age) is complete
1b190 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f  d. .**.** The do
1b1a0 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6f 72 20  clist-index for 
1b1b0 74 68 61 74 20 74 65 72 6d 20 69 73 20 63 75 72  that term is cur
1b1c0 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
1b1d0 2d 6d 65 6d 6f 72 79 20 77 69 74 68 69 6e 20 74  -memory within t
1b1e0 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 57 72 69  he.** Fts5SegWri
1b1f0 74 65 72 2e 61 44 6c 69 64 78 5b 5d 20 61 72 72  ter.aDlidx[] arr
1b200 61 79 2e 20 49 66 20 69 74 20 69 73 20 6c 61 72  ay. If it is lar
1b210 67 65 20 65 6e 6f 75 67 68 2c 20 74 68 69 73 20  ge enough, this 
1b220 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 77 72 69 74  function.** writ
1b230 65 73 20 69 74 20 6f 75 74 20 74 6f 20 64 69 73  es it out to dis
1b240 6b 2e 20 4f 72 2c 20 69 66 20 69 74 20 69 73 20  k. Or, if it is 
1b250 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 62 6f 74  too small to bot
1b260 68 65 72 20 77 69 74 68 2c 20 64 69 73 63 61 72  her with, discar
1b270 64 73 0a 2a 2a 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ds.** it..**.** 
1b280 46 74 73 35 53 65 67 57 72 69 74 65 72 2e 62 74  Fts5SegWriter.bt
1b290 74 65 72 6d 20 63 75 72 72 65 6e 74 6c 79 20 63  term currently c
1b2a0 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 72 73  ontains the firs
1b2b0 74 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 69  t term on page i
1b2c0 42 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  BtPage..*/.stati
1b2d0 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
1b2e0 46 6c 75 73 68 42 74 72 65 65 28 46 74 73 35 49  FlushBtree(Fts5I
1b2f0 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
1b300 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
1b310 7b 0a 20 20 69 6e 74 20 62 46 6c 61 67 3b 0a 0a  {.  int bFlag;..
1b320 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65    assert( pWrite
1b330 72 2d 3e 69 42 74 50 61 67 65 20 7c 7c 20 70 57  r->iBtPage || pW
1b340 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3d 3d 30  riter->nEmpty==0
1b350 20 29 3b 0a 20 20 69 66 28 20 70 57 72 69 74 65   );.  if( pWrite
1b360 72 2d 3e 69 42 74 50 61 67 65 3d 3d 30 20 29 20  r->iBtPage==0 ) 
1b370 72 65 74 75 72 6e 3b 0a 20 20 62 46 6c 61 67 20  return;.  bFlag 
1b380 3d 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68  = fts5WriteFlush
1b390 44 6c 69 64 78 28 70 2c 20 70 57 72 69 74 65 72  Dlidx(p, pWriter
1b3a0 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  );..  if( p->rc=
1b3b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b3c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
1b3d0 3d 20 28 70 57 72 69 74 65 72 2d 3e 62 74 74 65  = (pWriter->btte
1b3e0 72 6d 2e 6e 3e 30 3f 28 63 6f 6e 73 74 20 63 68  rm.n>0?(const ch
1b3f0 61 72 2a 29 70 57 72 69 74 65 72 2d 3e 62 74 74  ar*)pWriter->btt
1b400 65 72 6d 2e 70 3a 22 22 29 3b 0a 20 20 20 20 2f  erm.p:"");.    /
1b410 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1b420 77 61 73 20 61 6c 72 65 61 64 79 20 64 6f 6e 65  was already done
1b430 20 69 6e 20 66 74 73 35 57 72 69 74 65 49 6e 69   in fts5WriteIni
1b440 74 28 29 3a 20 2a 2f 0a 20 20 20 20 2f 2a 20 73  t(): */.    /* s
1b450 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
1b460 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 31  p->pIdxWriter, 1
1b470 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69  , pWriter->iSegi
1b480 64 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  d); */.    sqlit
1b490 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e  e3_bind_blob(p->
1b4a0 70 49 64 78 57 72 69 74 65 72 2c 20 32 2c 20 7a  pIdxWriter, 2, z
1b4b0 2c 20 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72  , pWriter->btter
1b4c0 6d 2e 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  m.n, SQLITE_STAT
1b4d0 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
1b4e0 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70  _bind_int64(p->p
1b4f0 49 64 78 57 72 69 74 65 72 2c 20 33 2c 20 62 46  IdxWriter, 3, bF
1b500 6c 61 67 20 2b 20 28 28 69 36 34 29 70 57 72 69  lag + ((i64)pWri
1b510 74 65 72 2d 3e 69 42 74 50 61 67 65 3c 3c 31 29  ter->iBtPage<<1)
1b520 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
1b530 74 65 70 28 70 2d 3e 70 49 64 78 57 72 69 74 65  tep(p->pIdxWrite
1b540 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  r);.    p->rc = 
1b550 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d  sqlite3_reset(p-
1b560 3e 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20  >pIdxWriter);.  
1b570 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74  }.  pWriter->iBt
1b580 50 61 67 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Page = 0;.}../*.
1b590 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  ** This is calle
1b5a0 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
1b5b0 6c 65 61 66 20 70 61 67 65 20 65 78 63 65 70 74  leaf page except
1b5c0 20 74 68 65 20 66 69 72 73 74 20 74 68 61 74 20   the first that 
1b5d0 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74 20 6c  contains.** at l
1b5e0 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 20 41  east one term. A
1b5f0 72 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d 2f 70  rgument (nTerm/p
1b600 54 65 72 6d 29 20 69 73 20 74 68 65 20 73 70 6c  Term) is the spl
1b610 69 74 2d 6b 65 79 20 2d 20 61 20 74 65 72 6d 20  it-key - a term 
1b620 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67 65  that.** is large
1b630 72 20 74 68 61 6e 20 61 6c 6c 20 74 65 72 6d 73  r than all terms
1b640 20 77 72 69 74 74 65 6e 20 74 6f 20 65 61 72 6c   written to earl
1b650 69 65 72 20 6c 65 61 76 65 73 2c 20 61 6e 64 20  ier leaves, and 
1b660 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20 73  equal to or.** s
1b670 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
1b680 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74 68  first term on th
1b690 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a 2a  e new leaf..**.*
1b6a0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1b6b0 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
1b6c0 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46  ode is left in F
1b6d0 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 66 20  ts5Index.rc. If 
1b6e0 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61 73 20  an error.** has 
1b6f0 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
1b700 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
1b710 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
1b720 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
1b730 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1b740 35 57 72 69 74 65 42 74 72 65 65 54 65 72 6d 28  5WriteBtreeTerm(
1b750 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b770 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
1b780 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
1b790 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
1b7a0 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f  riter,         /
1b7b0 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20  * Writer object 
1b7c0 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20  */.  int nTerm, 
1b7d0 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20  const u8 *pTerm 
1b7e0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 65       /* First te
1b7f0 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65 20 2a  rm on new page *
1b800 2f 0a 29 7b 0a 20 20 66 74 73 35 57 72 69 74 65  /.){.  fts5Write
1b810 46 6c 75 73 68 42 74 72 65 65 28 70 2c 20 70 57  FlushBtree(p, pW
1b820 72 69 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75  riter);.  fts5Bu
1b830 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
1b840 26 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d  &pWriter->btterm
1b850 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
1b860 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50  .  pWriter->iBtP
1b870 61 67 65 20 3d 20 70 57 72 69 74 65 72 2d 3e 77  age = pWriter->w
1b880 72 69 74 65 72 2e 70 67 6e 6f 3b 0a 7d 0a 0a 2f  riter.pgno;.}../
1b890 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1b8a0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
1b8b0 6e 20 66 6c 75 73 68 69 6e 67 20 61 20 6c 65 61  n flushing a lea
1b8c0 66 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  f page that cont
1b8d0 61 69 6e 73 20 6e 6f 0a 2a 2a 20 74 65 72 6d 73  ains no.** terms
1b8e0 20 61 74 20 61 6c 6c 20 74 6f 20 64 69 73 6b 2e   at all to disk.
1b8f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b900 66 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f  fts5WriteBtreeNo
1b910 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65  Term(.  Fts5Inde
1b920 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
1b930 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
1b940 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
1b950 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  /.  Fts5SegWrite
1b960 72 20 2a 70 57 72 69 74 65 72 20 20 20 20 20 20  r *pWriter      
1b970 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
1b980 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20  ject */.){.  /* 
1b990 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f  If there were no
1b9a0 20 72 6f 77 69 64 73 20 6f 6e 20 74 68 65 20 6c   rowids on the l
1b9b0 65 61 66 20 70 61 67 65 20 65 69 74 68 65 72 20  eaf page either 
1b9c0 61 6e 64 20 74 68 65 20 64 6f 63 6c 69 73 74 2d  and the doclist-
1b9d0 69 6e 64 65 78 0a 20 20 2a 2a 20 68 61 73 20 61  index.  ** has a
1b9e0 6c 72 65 61 64 79 20 62 65 65 6e 20 73 74 61 72  lready been star
1b9f0 74 65 64 2c 20 61 70 70 65 6e 64 20 61 6e 20 30  ted, append an 0
1ba00 78 30 30 20 62 79 74 65 20 74 6f 20 69 74 2e 20  x00 byte to it. 
1ba10 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65   */.  if( pWrite
1ba20 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
1ba30 50 61 67 65 20 26 26 20 70 57 72 69 74 65 72 2d  Page && pWriter-
1ba40 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e  >aDlidx[0].buf.n
1ba50 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35 44 6c  >0 ){.    Fts5Dl
1ba60 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64  idxWriter *pDlid
1ba70 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44  x = &pWriter->aD
1ba80 6c 69 64 78 5b 30 5d 3b 0a 20 20 20 20 61 73 73  lidx[0];.    ass
1ba90 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 62 50 72  ert( pDlidx->bPr
1baa0 65 76 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 73  evValid );.    s
1bab0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1bac0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1bad0 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75  >rc, &pDlidx->bu
1bae0 66 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  f, 0);.  }..  /*
1baf0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 22   Increment the "
1bb00 6e 75 6d 62 65 72 20 6f 66 20 73 65 71 75 65 6e  number of sequen
1bb10 74 69 61 6c 20 6c 65 61 76 65 73 20 77 69 74 68  tial leaves with
1bb20 6f 75 74 20 61 20 74 65 72 6d 22 20 63 6f 75 6e  out a term" coun
1bb30 74 65 72 2e 20 2a 2f 0a 20 20 70 57 72 69 74 65  ter. */.  pWrite
1bb40 72 2d 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a  r->nEmpty++;.}..
1bb50 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35 44  static i64 fts5D
1bb60 6c 69 64 78 45 78 74 72 61 63 74 46 69 72 73 74  lidxExtractFirst
1bb70 52 6f 77 69 64 28 46 74 73 35 42 75 66 66 65 72  Rowid(Fts5Buffer
1bb80 20 2a 70 42 75 66 29 7b 0a 20 20 69 36 34 20 69   *pBuf){.  i64 i
1bb90 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 69 4f 66  Rowid;.  int iOf
1bba0 66 3b 0a 0a 20 20 69 4f 66 66 20 3d 20 31 20 2b  f;..  iOff = 1 +
1bbb0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
1bbc0 70 42 75 66 2d 3e 70 5b 31 5d 2c 20 28 75 36 34  pBuf->p[1], (u64
1bbd0 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 66 74  *)&iRowid);.  ft
1bbe0 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 42 75  s5GetVarint(&pBu
1bbf0 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  f->p[iOff], (u64
1bc00 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 72 65  *)&iRowid);.  re
1bc10 74 75 72 6e 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a  turn iRowid;.}..
1bc20 2f 2a 0a 2a 2a 20 52 6f 77 69 64 20 69 52 6f 77  /*.** Rowid iRow
1bc30 69 64 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  id has just been
1bc40 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
1bc50 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   current leaf pa
1bc60 67 65 2e 20 49 74 20 69 73 20 74 68 65 0a 2a 2a  ge. It is the.**
1bc70 20 66 69 72 73 74 20 6f 6e 20 74 68 65 20 70 61   first on the pa
1bc80 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ge. This functio
1bc90 6e 20 61 70 70 65 6e 64 73 20 61 6e 20 61 70 70  n appends an app
1bca0 72 6f 70 72 69 61 74 65 20 65 6e 74 72 79 20 74  ropriate entry t
1bcb0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  o the current.**
1bcc0 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a   doclist-index..
1bcd0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1bce0 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70  ts5WriteDlidxApp
1bcf0 65 6e 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78  end(.  Fts5Index
1bd00 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
1bd10 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20  riter *pWriter, 
1bd20 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b  .  i64 iRowid.){
1bd30 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
1bd40 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66 6f  bDone = 0;..  fo
1bd50 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51  r(i=0; p->rc==SQ
1bd60 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e 65  LITE_OK && bDone
1bd70 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ==0; i++){.    i
1bd80 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 46 74 73  64 iVal;.    Fts
1bd90 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44  5DlidxWriter *pD
1bda0 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d  lidx = &pWriter-
1bdb0 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 0a 20 20 20  >aDlidx[i];..   
1bdc0 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75 66   if( pDlidx->buf
1bdd0 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  .n>=p->pConfig->
1bde0 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pgsz ){.      /*
1bdf0 20 54 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63   The current doc
1be00 6c 69 73 74 2d 69 6e 64 65 78 20 70 61 67 65 20  list-index page 
1be10 69 73 20 66 75 6c 6c 2e 20 57 72 69 74 65 20 69  is full. Write i
1be20 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 70 75  t to disk and pu
1be30 73 68 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  sh.      ** a co
1be40 70 79 20 6f 66 20 69 52 6f 77 69 64 20 28 77 68  py of iRowid (wh
1be50 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  ich will become 
1be60 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
1be70 6f 6e 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  on the next.    
1be80 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64    ** doclist-ind
1be90 65 78 20 6c 65 61 66 20 70 61 67 65 29 20 75 70  ex leaf page) up
1bea0 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74 20 6c   into the next l
1beb0 65 76 65 6c 20 6f 66 20 74 68 65 20 62 2d 74 72  evel of the b-tr
1bec0 65 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 69 65  ee .      ** hie
1bed0 72 61 72 63 68 79 2e 20 49 66 20 74 68 65 20 6e  rarchy. If the n
1bee0 6f 64 65 20 62 65 69 6e 67 20 66 6c 75 73 68 65  ode being flushe
1bef0 64 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74  d is currently t
1bf00 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2c 0a 20 20  he root node,.  
1bf10 20 20 20 20 2a 2a 20 61 6c 73 6f 20 70 75 73 68      ** also push
1bf20 20 69 74 73 20 66 69 72 73 74 20 72 6f 77 69 64   its first rowid
1bf30 20 75 70 77 61 72 64 73 2e 20 2a 2f 0a 20 20 20   upwards. */.   
1bf40 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70     pDlidx->buf.p
1bf50 5b 30 5d 20 3d 20 30 78 30 31 3b 20 20 20 20 2f  [0] = 0x01;    /
1bf60 2a 20 4e 6f 74 20 74 68 65 20 72 6f 6f 74 20 6e  * Not the root n
1bf70 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 66 74 73  ode */.      fts
1bf80 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20  5DataWrite(p, . 
1bf90 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c           FTS5_DL
1bfa0 49 44 58 5f 52 4f 57 49 44 28 70 57 72 69 74 65  IDX_ROWID(pWrite
1bfb0 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 44  r->iSegid, i, pD
1bfc0 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20  lidx->pgno),.   
1bfd0 20 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62         pDlidx->b
1bfe0 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62 75  uf.p, pDlidx->bu
1bff0 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  f.n.      );.   
1c000 20 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64     fts5WriteDlid
1c010 78 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72  xGrow(p, pWriter
1c020 2c 20 69 2b 32 29 3b 0a 20 20 20 20 20 20 70 44  , i+2);.      pD
1c030 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d  lidx = &pWriter-
1c040 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20  >aDlidx[i];.    
1c050 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1c060 49 54 45 5f 4f 4b 20 26 26 20 70 44 6c 69 64 78  ITE_OK && pDlidx
1c070 5b 31 5d 2e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a  [1].buf.n==0 ){.
1c080 20 20 20 20 20 20 20 20 69 36 34 20 69 46 69 72          i64 iFir
1c090 73 74 20 3d 20 66 74 73 35 44 6c 69 64 78 45 78  st = fts5DlidxEx
1c0a0 74 72 61 63 74 46 69 72 73 74 52 6f 77 69 64 28  tractFirstRowid(
1c0b0 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 0a  &pDlidx->buf);..
1c0c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
1c0d0 77 61 73 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64  was the root nod
1c0e0 65 2e 20 50 75 73 68 20 69 74 73 20 66 69 72 73  e. Push its firs
1c0f0 74 20 72 6f 77 69 64 20 75 70 20 74 6f 20 74 68  t rowid up to th
1c100 65 20 6e 65 77 20 72 6f 6f 74 2e 20 2a 2f 0a 20  e new root. */. 
1c110 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d         pDlidx[1]
1c120 2e 70 67 6e 6f 20 3d 20 70 44 6c 69 64 78 2d 3e  .pgno = pDlidx->
1c130 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73 71  pgno;.        sq
1c140 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1c150 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1c160 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62  rc, &pDlidx[1].b
1c170 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  uf, 0);.        
1c180 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1c190 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1c1a0 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d  ->rc, &pDlidx[1]
1c1b0 2e 62 75 66 2c 20 70 44 6c 69 64 78 2d 3e 70 67  .buf, pDlidx->pg
1c1c0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  no);.        sql
1c1d0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
1c1e0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1c1f0 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75  c, &pDlidx[1].bu
1c200 66 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20  f, iFirst);.    
1c210 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 62 50      pDlidx[1].bP
1c220 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  revValid = 1;.  
1c230 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e        pDlidx[1].
1c240 69 50 72 65 76 20 3d 20 69 46 69 72 73 74 3b 0a  iPrev = iFirst;.
1c250 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
1c260 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1c270 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62 75  Zero(&pDlidx->bu
1c280 66 29 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78  f);.      pDlidx
1c290 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 30  ->bPrevValid = 0
1c2a0 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e  ;.      pDlidx->
1c2b0 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  pgno++;.    }els
1c2c0 65 7b 0a 20 20 20 20 20 20 62 44 6f 6e 65 20 3d  e{.      bDone =
1c2d0 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   1;.    }..    i
1c2e0 66 28 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76  f( pDlidx->bPrev
1c2f0 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 69  Valid ){.      i
1c300 56 61 6c 20 3d 20 69 52 6f 77 69 64 20 2d 20 70  Val = iRowid - p
1c310 44 6c 69 64 78 2d 3e 69 50 72 65 76 3b 0a 20 20  Dlidx->iPrev;.  
1c320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1c330 36 34 20 69 50 67 6e 6f 20 3d 20 28 69 3d 3d 30  64 iPgno = (i==0
1c340 20 3f 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74   ? pWriter->writ
1c350 65 72 2e 70 67 6e 6f 20 3a 20 70 44 6c 69 64 78  er.pgno : pDlidx
1c360 5b 2d 31 5d 2e 70 67 6e 6f 29 3b 0a 20 20 20 20  [-1].pgno);.    
1c370 20 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78    assert( pDlidx
1c380 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20  ->buf.n==0 );.  
1c390 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
1c3a0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1c3b0 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
1c3c0 78 2d 3e 62 75 66 2c 20 21 62 44 6f 6e 65 29 3b  x->buf, !bDone);
1c3d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
1c3e0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1c3f0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44  rint(&p->rc, &pD
1c400 6c 69 64 78 2d 3e 62 75 66 2c 20 69 50 67 6e 6f  lidx->buf, iPgno
1c410 29 3b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20  );.      iVal = 
1c420 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 0a 20  iRowid;.    }.. 
1c430 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1c440 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1c450 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
1c460 2d 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20 20  ->buf, iVal);.  
1c470 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56    pDlidx->bPrevV
1c480 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 70 44  alid = 1;.    pD
1c490 6c 69 64 78 2d 3e 69 50 72 65 76 20 3d 20 69 52  lidx->iPrev = iR
1c4a0 6f 77 69 64 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  owid;.  }.}..sta
1c4b0 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
1c4c0 74 65 46 6c 75 73 68 4c 65 61 66 28 46 74 73 35  teFlushLeaf(Fts5
1c4d0 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
1c4e0 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
1c4f0 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
1c500 74 20 75 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20  t u8 zero[] = { 
1c510 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
1c520 2c 20 30 78 30 30 20 7d 3b 0a 20 20 46 74 73 35  , 0x00 };.  Fts5
1c530 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67  PageWriter *pPag
1c540 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72  e = &pWriter->wr
1c550 69 74 65 72 3b 0a 20 20 69 36 34 20 69 52 6f 77  iter;.  i64 iRow
1c560 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  id;..  assert( (
1c570 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d  pPage->pgidx.n==
1c580 30 29 3d 3d 28 70 57 72 69 74 65 72 2d 3e 62 46  0)==(pWriter->bF
1c590 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 29 20  irstTermInPage) 
1c5a0 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
1c5b0 20 73 7a 4c 65 61 66 20 68 65 61 64 65 72 20 66   szLeaf header f
1c5c0 69 65 6c 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72  ield. */.  asser
1c5d0 74 28 20 30 3d 3d 66 74 73 35 47 65 74 55 31 36  t( 0==fts5GetU16
1c5e0 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32  (&pPage->buf.p[2
1c5f0 5d 29 20 29 3b 0a 20 20 66 74 73 35 50 75 74 55  ]) );.  fts5PutU
1c600 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70  16(&pPage->buf.p
1c610 5b 32 5d 2c 20 28 75 31 36 29 70 50 61 67 65 2d  [2], (u16)pPage-
1c620 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 69 66 28 20  >buf.n);..  if( 
1c630 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
1c640 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20 20 20  ermInPage ){.   
1c650 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77 61 73 20   /* No term was 
1c660 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20  written to this 
1c670 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
1c680 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 69 64  ert( pPage->pgid
1c690 78 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74  x.n==0 );.    ft
1c6a0 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65  s5WriteBtreeNoTe
1c6b0 72 6d 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  rm(p, pWriter);.
1c6c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1c6d0 41 70 70 65 6e 64 20 74 68 65 20 70 67 69 64 78  Append the pgidx
1c6e0 20 74 6f 20 74 68 65 20 70 61 67 65 20 62 75 66   to the page buf
1c6f0 66 65 72 2e 20 53 65 74 20 74 68 65 20 73 7a 4c  fer. Set the szL
1c700 65 61 66 20 68 65 61 64 65 72 20 66 69 65 6c 64  eaf header field
1c710 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75 66  . */.    fts5Buf
1c720 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1c730 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
1c740 66 2c 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e  f, pPage->pgidx.
1c750 6e 2c 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e  n, pPage->pgidx.
1c760 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72  p);.  }..  /* Wr
1c770 69 74 65 20 74 68 65 20 70 61 67 65 20 6f 75 74  ite the page out
1c780 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 52   to disk */.  iR
1c790 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d  owid = FTS5_SEGM
1c7a0 45 4e 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65  ENT_ROWID(pWrite
1c7b0 72 2d 3e 69 53 65 67 69 64 2c 20 70 50 61 67 65  r->iSegid, pPage
1c7c0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 66 74 73 35 44  ->pgno);.  fts5D
1c7d0 61 74 61 57 72 69 74 65 28 70 2c 20 69 52 6f 77  ataWrite(p, iRow
1c7e0 69 64 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 70  id, pPage->buf.p
1c7f0 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b  , pPage->buf.n);
1c800 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
1c810 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 2e  e the next page.
1c820 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72   */.  fts5Buffer
1c830 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 62 75 66  Zero(&pPage->buf
1c840 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a  );.  fts5BufferZ
1c850 65 72 6f 28 26 70 50 61 67 65 2d 3e 70 67 69 64  ero(&pPage->pgid
1c860 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  x);.  fts5Buffer
1c870 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1c880 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
1c890 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 70 50 61 67  4, zero);.  pPag
1c8a0 65 2d 3e 69 50 72 65 76 50 67 69 64 78 20 3d 20  e->iPrevPgidx = 
1c8b0 30 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f  0;.  pPage->pgno
1c8c0 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 61  ++;..  /* Increa
1c8d0 73 65 20 74 68 65 20 6c 65 61 76 65 73 20 77 72  se the leaves wr
1c8e0 69 74 74 65 6e 20 63 6f 75 6e 74 65 72 20 2a 2f  itten counter */
1c8f0 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61  .  pWriter->nLea
1c900 66 57 72 69 74 74 65 6e 2b 2b 3b 0a 0a 20 20 2f  fWritten++;..  /
1c910 2a 20 54 68 65 20 6e 65 77 20 6c 65 61 66 20 68  * The new leaf h
1c920 6f 6c 64 73 20 6e 6f 20 74 65 72 6d 73 20 6f 72  olds no terms or
1c930 20 72 6f 77 69 64 73 20 2a 2f 0a 20 20 70 57 72   rowids */.  pWr
1c940 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d  iter->bFirstTerm
1c950 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 70 57  InPage = 1;.  pW
1c960 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1c970 69 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a 7d 0a  idInPage = 1;.}.
1c980 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65  ./*.** Append te
1c990 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 74  rm pTerm/nTerm t
1c9a0 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 65  o the segment be
1c9b0 69 6e 67 20 77 72 69 74 74 65 6e 20 62 79 20 74  ing written by t
1c9c0 68 65 20 77 72 69 74 65 72 20 70 61 73 73 65 64  he writer passed
1c9d0 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e  .** as the secon
1c9e0 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
1c9f0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1ca00 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74  curs, set the Ft
1ca10 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72  s5Index.rc error
1ca20 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72   code. If an err
1ca30 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61  or has .** alrea
1ca40 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
1ca50 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1ca60 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
1ca70 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41   void fts5WriteA
1ca80 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 46 74 73  ppendTerm(.  Fts
1ca90 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
1caa0 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1cab0 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 54 65 72  iter,.  int nTer
1cac0 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65  m, const u8 *pTe
1cad0 72 6d 20 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 72  rm .){.  int nPr
1cae0 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  efix;           
1caf0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
1cb00 73 20 6f 66 20 70 72 65 66 69 78 20 63 6f 6d 70  s of prefix comp
1cb10 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 65 72 6d  ression for term
1cb20 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72   */.  Fts5PageWr
1cb30 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70  iter *pPage = &p
1cb40 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a  Writer->writer;.
1cb50 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 50    Fts5Buffer *pP
1cb60 67 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d  gidx = &pWriter-
1cb70 3e 77 72 69 74 65 72 2e 70 67 69 64 78 3b 0a 0a  >writer.pgidx;..
1cb80 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
1cb90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1cba0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62  assert( pPage->b
1cbb0 75 66 2e 6e 3e 3d 34 20 29 3b 0a 20 20 61 73 73  uf.n>=4 );.  ass
1cbc0 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e  ert( pPage->buf.
1cbd0 6e 3e 34 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e  n>4 || pWriter->
1cbe0 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
1cbf0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1cc00 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   current leaf pa
1cc10 67 65 20 69 73 20 66 75 6c 6c 2c 20 66 6c 75 73  ge is full, flus
1cc20 68 20 69 74 20 74 6f 20 64 69 73 6b 2e 20 2a 2f  h it to disk. */
1cc30 0a 20 20 69 66 28 20 28 70 50 61 67 65 2d 3e 62  .  if( (pPage->b
1cc40 75 66 2e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e  uf.n + pPgidx->n
1cc50 20 2b 20 6e 54 65 72 6d 20 2b 20 32 29 3e 3d 70   + nTerm + 2)>=p
1cc60 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
1cc70 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
1cc80 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20  ->buf.n>4 ){.   
1cc90 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
1cca0 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72  hLeaf(p, pWriter
1ccb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
1ccc0 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e  5BufferGrow(&p->
1ccd0 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
1cce0 20 6e 54 65 72 6d 2b 46 54 53 35 5f 44 41 54 41   nTerm+FTS5_DATA
1ccf0 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 7d 0a 20  _PADDING);.  }. 
1cd00 20 0a 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 55 70   .  /* TODO1: Up
1cd10 64 61 74 69 6e 67 20 70 67 69 64 78 20 68 65 72  dating pgidx her
1cd20 65 2e 20 2a 2f 0a 20 20 70 50 67 69 64 78 2d 3e  e. */.  pPgidx->
1cd30 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  n += sqlite3Fts5
1cd40 50 75 74 56 61 72 69 6e 74 28 0a 20 20 20 20 20  PutVarint(.     
1cd50 20 26 70 50 67 69 64 78 2d 3e 70 5b 70 50 67 69   &pPgidx->p[pPgi
1cd60 64 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62  dx->n], pPage->b
1cd70 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 69 50  uf.n - pPage->iP
1cd80 72 65 76 50 67 69 64 78 0a 20 20 29 3b 0a 20 20  revPgidx.  );.  
1cd90 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64  pPage->iPrevPgid
1cda0 78 20 3d 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  x = pPage->buf.n
1cdb0 3b 0a 23 69 66 20 30 0a 20 20 66 74 73 35 50 75  ;.#if 0.  fts5Pu
1cdc0 74 55 31 36 28 26 70 50 67 69 64 78 2d 3e 70 5b  tU16(&pPgidx->p[
1cdd0 70 50 67 69 64 78 2d 3e 6e 5d 2c 20 70 50 61 67  pPgidx->n], pPag
1cde0 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 70 50 67  e->buf.n);.  pPg
1cdf0 69 64 78 2d 3e 6e 20 2b 3d 20 32 3b 0a 23 65 6e  idx->n += 2;.#en
1ce00 64 69 66 0a 0a 20 20 69 66 28 20 70 57 72 69 74  dif..  if( pWrit
1ce10 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
1ce20 50 61 67 65 20 29 7b 0a 20 20 20 20 6e 50 72 65  Page ){.    nPre
1ce30 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  fix = 0;.    if(
1ce40 20 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 31 20   pPage->pgno!=1 
1ce50 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
1ce60 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65   is the first te
1ce70 72 6d 20 6f 6e 20 61 20 6c 65 61 66 20 74 68 61  rm on a leaf tha
1ce80 74 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 65 66  t is not the lef
1ce90 74 6d 6f 73 74 20 6c 65 61 66 20 69 6e 0a 20 20  tmost leaf in.  
1cea0 20 20 20 20 2a 2a 20 74 68 65 20 73 65 67 6d 65      ** the segme
1ceb0 6e 74 20 62 2d 74 72 65 65 2e 20 49 6e 20 74 68  nt b-tree. In th
1cec0 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 65  is case it is ne
1ced0 63 65 73 73 61 72 79 20 74 6f 20 61 64 64 20 61  cessary to add a
1cee0 20 74 65 72 6d 20 74 6f 0a 20 20 20 20 20 20 2a   term to.      *
1cef0 2a 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65  * the b-tree hie
1cf00 72 61 72 63 68 79 20 74 68 61 74 20 69 73 20 28  rarchy that is (
1cf10 61 29 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  a) larger than t
1cf20 68 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20  he largest term 
1cf30 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  .      ** alread
1cf40 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
1cf50 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 28 62 29   segment and (b)
1cf60 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72   smaller than or
1cf70 20 65 71 75 61 6c 20 74 6f 0a 20 20 20 20 20 20   equal to.      
1cf80 2a 2a 20 74 68 69 73 20 74 65 72 6d 2e 20 49 6e  ** this term. In
1cf90 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20   other words, a 
1cfa0 70 72 65 66 69 78 20 6f 66 20 28 70 54 65 72 6d  prefix of (pTerm
1cfb0 2f 6e 54 65 72 6d 29 20 74 68 61 74 20 69 73 20  /nTerm) that is 
1cfc0 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  one.      ** byt
1cfd0 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68  e longer than th
1cfe0 65 20 6c 6f 6e 67 65 73 74 20 70 72 65 66 69 78  e longest prefix
1cff0 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 73   (pTerm/nTerm) s
1d000 68 61 72 65 73 20 77 69 74 68 20 74 68 65 0a 20  hares with the. 
1d010 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
1d020 20 74 65 72 6d 2e 20 0a 20 20 20 20 20 20 2a 2a   term. .      **
1d030 0a 20 20 20 20 20 20 2a 2a 20 55 73 75 61 6c 6c  .      ** Usuall
1d040 79 2c 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  y, the previous 
1d050 74 65 72 6d 20 69 73 20 61 76 61 69 6c 61 62 6c  term is availabl
1d060 65 20 69 6e 20 70 50 61 67 65 2d 3e 74 65 72 6d  e in pPage->term
1d070 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 0a  . The exception.
1d080 20 20 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74        ** is if t
1d090 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
1d0a0 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20 69 6e   term written in
1d0b0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
1d0c0 6d 65 72 67 65 20 73 74 65 70 2e 0a 20 20 20 20  merge step..    
1d0d0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
1d0e0 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74  e the previous t
1d0f0 65 72 6d 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  erm is not avail
1d100 61 62 6c 65 2c 20 73 6f 20 6a 75 73 74 20 77 72  able, so just wr
1d110 69 74 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63  ite a.      ** c
1d120 6f 70 79 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54  opy of (pTerm/nT
1d130 65 72 6d 29 20 69 6e 74 6f 20 74 68 65 20 70 61  erm) into the pa
1d140 72 65 6e 74 20 6e 6f 64 65 2e 20 54 68 69 73 20  rent node. This 
1d150 69 73 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20  is slightly.    
1d160 20 20 2a 2a 20 69 6e 65 66 66 69 63 69 65 6e 74    ** inefficient
1d170 2c 20 62 75 74 20 73 74 69 6c 6c 20 63 6f 72 72  , but still corr
1d180 65 63 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ect.  */.      i
1d190 6e 74 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20  nt n = nTerm;.  
1d1a0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 74      if( pPage->t
1d1b0 65 72 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20  erm.n ){.       
1d1c0 20 6e 20 3d 20 31 20 2b 20 66 74 73 35 50 72 65   n = 1 + fts5Pre
1d1d0 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67  fixCompress(pPag
1d1e0 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65  e->term.n, pPage
1d1f0 2d 3e 74 65 72 6d 2e 70 2c 20 70 54 65 72 6d 29  ->term.p, pTerm)
1d200 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d210 66 74 73 35 57 72 69 74 65 42 74 72 65 65 54 65  fts5WriteBtreeTe
1d220 72 6d 28 70 2c 20 70 57 72 69 74 65 72 2c 20 6e  rm(p, pWriter, n
1d230 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
1d240 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
1d250 2d 3e 77 72 69 74 65 72 3b 0a 20 20 20 20 7d 0a  ->writer;.    }.
1d260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72    }else{.    nPr
1d270 65 66 69 78 20 3d 20 66 74 73 35 50 72 65 66 69  efix = fts5Prefi
1d280 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d  xCompress(pPage-
1d290 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e  >term.n, pPage->
1d2a0 74 65 72 6d 2e 70 2c 20 70 54 65 72 6d 29 3b 0a  term.p, pTerm);.
1d2b0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1d2c0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1d2d0 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
1d2e0 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a 0a 20  nPrefix);.  }.. 
1d2f0 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e   /* Append the n
1d300 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
1d310 66 20 6e 65 77 20 64 61 74 61 2c 20 74 68 65 6e  f new data, then
1d320 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 20 69   the term data i
1d330 74 73 65 6c 66 0a 20 20 2a 2a 20 74 6f 20 74 68  tself.  ** to th
1d340 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73  e page. */.  fts
1d350 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1d360 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  int(&p->rc, &pPa
1d370 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d  ge->buf, nTerm -
1d380 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 66 74 73   nPrefix);.  fts
1d390 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1d3a0 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  b(&p->rc, &pPage
1d3b0 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e  ->buf, nTerm - n
1d3c0 50 72 65 66 69 78 2c 20 26 70 54 65 72 6d 5b 6e  Prefix, &pTerm[n
1d3d0 50 72 65 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20  Prefix]);..  /* 
1d3e0 55 70 64 61 74 65 20 74 68 65 20 46 74 73 35 50  Update the Fts5P
1d3f0 61 67 65 57 72 69 74 65 72 2e 74 65 72 6d 20 66  ageWriter.term f
1d400 69 65 6c 64 2e 20 2a 2f 0a 20 20 66 74 73 35 42  ield. */.  fts5B
1d410 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
1d420 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e   &pPage->term, n
1d430 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
1d440 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
1d450 65 72 6d 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a  ermInPage = 0;..
1d460 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
1d470 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30  tRowidInPage = 0
1d480 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ;.  pWriter->bFi
1d490 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73  rstRowidInDoclis
1d4a0 74 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74  t = 1;..  assert
1d4b0 28 20 70 2d 3e 72 63 20 7c 7c 20 28 70 57 72 69  ( p->rc || (pWri
1d4c0 74 65 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26  ter->nDlidx>0 &&
1d4d0 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
1d4e0 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30 29 20 29 3b  [0].buf.n==0) );
1d4f0 0a 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  .  pWriter->aDli
1d500 64 78 5b 30 5d 2e 70 67 6e 6f 20 3d 20 70 50 61  dx[0].pgno = pPa
1d510 67 65 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ge->pgno;.}../*.
1d520 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 6f 77 69  ** Append a rowi
1d530 64 20 61 6e 64 20 70 6f 73 69 74 69 6f 6e 2d 6c  d and position-l
1d540 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20 74  ist size field t
1d550 6f 20 74 68 65 20 77 72 69 74 65 72 73 20 6f 75  o the writers ou
1d560 74 70 75 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  tput. .*/.static
1d570 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41   void fts5WriteA
1d580 70 70 65 6e 64 52 6f 77 69 64 28 0a 20 20 46 74  ppendRowid(.  Ft
1d590 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
1d5a0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
1d5b0 72 69 74 65 72 2c 0a 20 20 69 36 34 20 69 52 6f  riter,.  i64 iRo
1d5c0 77 69 64 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e  wid.){.  if( p->
1d5d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d5e0 0a 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69  .    Fts5PageWri
1d5f0 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57  ter *pPage = &pW
1d600 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 0a  riter->writer;..
1d610 20 20 20 20 69 66 28 20 28 70 50 61 67 65 2d 3e      if( (pPage->
1d620 62 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e 70  buf.n + pPage->p
1d630 67 69 64 78 2e 6e 29 3e 3d 70 2d 3e 70 43 6f 6e  gidx.n)>=p->pCon
1d640 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20  fig->pgsz ){.   
1d650 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
1d660 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72  hLeaf(p, pWriter
1d670 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1d680 20 49 66 20 74 68 69 73 20 69 73 20 74 6f 20 62   If this is to b
1d690 65 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69  e the first rowi
1d6a0 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  d written to the
1d6b0 20 70 61 67 65 2c 20 73 65 74 20 74 68 65 20 0a   page, set the .
1d6c0 20 20 20 20 2a 2a 20 72 6f 77 69 64 2d 70 6f 69      ** rowid-poi
1d6d0 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65  nter in the page
1d6e0 2d 68 65 61 64 65 72 2e 20 41 6c 73 6f 20 61 70  -header. Also ap
1d6f0 70 65 6e 64 20 61 20 76 61 6c 75 65 20 74 6f 20  pend a value to 
1d700 74 68 65 20 64 6c 69 64 78 0a 20 20 20 20 2a 2a  the dlidx.    **
1d710 20 62 75 66 66 65 72 2c 20 69 6e 20 63 61 73 65   buffer, in case
1d720 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
1d730 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a   is required.  *
1d740 2f 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65  /.    if( pWrite
1d750 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
1d760 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74  Page ){.      ft
1d770 73 35 50 75 74 55 31 36 28 70 50 61 67 65 2d 3e  s5PutU16(pPage->
1d780 62 75 66 2e 70 2c 20 28 75 31 36 29 70 50 61 67  buf.p, (u16)pPag
1d790 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20  e->buf.n);.     
1d7a0 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 41   fts5WriteDlidxA
1d7b0 70 70 65 6e 64 28 70 2c 20 70 57 72 69 74 65 72  ppend(p, pWriter
1d7c0 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  , iRowid);.    }
1d7d0 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  ..    /* Write t
1d7e0 68 65 20 72 6f 77 69 64 2e 20 2a 2f 0a 20 20 20  he rowid. */.   
1d7f0 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46   if( pWriter->bF
1d800 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69  irstRowidInDocli
1d810 73 74 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62  st || pWriter->b
1d820 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
1d830 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75   ){.      fts5Bu
1d840 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1d850 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
1d860 3e 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20  >buf, iRowid);. 
1d870 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d880 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c  assert( p->rc ||
1d890 20 69 52 6f 77 69 64 3e 70 57 72 69 74 65 72 2d   iRowid>pWriter-
1d8a0 3e 69 50 72 65 76 52 6f 77 69 64 20 29 3b 0a 20  >iPrevRowid );. 
1d8b0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1d8c0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1d8d0 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
1d8e0 20 69 52 6f 77 69 64 20 2d 20 70 57 72 69 74 65   iRowid - pWrite
1d8f0 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 29 3b 0a  r->iPrevRowid);.
1d900 20 20 20 20 7d 0a 20 20 20 20 70 57 72 69 74 65      }.    pWrite
1d910 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 3d 20  r->iPrevRowid = 
1d920 69 52 6f 77 69 64 3b 0a 20 20 20 20 70 57 72 69  iRowid;.    pWri
1d930 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
1d940 49 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b 0a 20  InDoclist = 0;. 
1d950 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72     pWriter->bFir
1d960 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20  stRowidInPage = 
1d970 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  0;.  }.}..static
1d980 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41   void fts5WriteA
1d990 70 70 65 6e 64 50 6f 73 6c 69 73 74 44 61 74 61  ppendPoslistData
1d9a0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1d9b0 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  , .  Fts5SegWrit
1d9c0 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20  er *pWriter, .  
1d9d0 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 2c  const u8 *aData,
1d9e0 20 0a 20 20 69 6e 74 20 6e 44 61 74 61 0a 29 7b   .  int nData.){
1d9f0 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65  .  Fts5PageWrite
1da00 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69  r *pPage = &pWri
1da10 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 63  ter->writer;.  c
1da20 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 61 44 61  onst u8 *a = aDa
1da30 74 61 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 6e 44  ta;.  int n = nD
1da40 61 74 61 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ata;.  .  assert
1da50 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  ( p->pConfig->pg
1da60 73 7a 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  sz>0 );.  while(
1da70 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1da80 4b 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67  K .     && (pPag
1da90 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67 65  e->buf.n + pPage
1daa0 2d 3e 70 67 69 64 78 2e 6e 20 2b 20 6e 29 3e 3d  ->pgidx.n + n)>=
1dab0 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a  p->pConfig->pgsz
1dac0 20 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e   .  ){.    int n
1dad0 52 65 71 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  Req = p->pConfig
1dae0 2d 3e 70 67 73 7a 20 2d 20 70 50 61 67 65 2d 3e  ->pgsz - pPage->
1daf0 62 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 70  buf.n - pPage->p
1db00 67 69 64 78 2e 6e 3b 0a 20 20 20 20 69 6e 74 20  gidx.n;.    int 
1db10 6e 43 6f 70 79 20 3d 20 30 3b 0a 20 20 20 20 77  nCopy = 0;.    w
1db20 68 69 6c 65 28 20 6e 43 6f 70 79 3c 6e 52 65 71  hile( nCopy<nReq
1db30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 64 75   ){.      i64 du
1db40 6d 6d 79 3b 0a 20 20 20 20 20 20 6e 43 6f 70 79  mmy;.      nCopy
1db50 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
1db60 74 28 26 61 5b 6e 43 6f 70 79 5d 2c 20 28 75 36  t(&a[nCopy], (u6
1db70 34 2a 29 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  4*)&dummy);.    
1db80 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  }.    fts5Buffer
1db90 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1dba0 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
1dbb0 6e 43 6f 70 79 2c 20 61 29 3b 0a 20 20 20 20 61  nCopy, a);.    a
1dbc0 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 6e   += nCopy;.    n
1dbd0 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 66   -= nCopy;.    f
1dbe0 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
1dbf0 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  f(p, pWriter);. 
1dc00 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a   }.  if( n>0 ){.
1dc10 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1dc20 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1dc30 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 2c   &pPage->buf, n,
1dc40 20 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   a);.  }.}../*.*
1dc50 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61  * Flush any data
1dc60 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20 77   cached by the w
1dc70 72 69 74 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  riter object to 
1dc80 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 46 72  the database. Fr
1dc90 65 65 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61  ee any.** alloca
1dca0 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
1dcb0 20 77 69 74 68 20 74 68 65 20 77 72 69 74 65 72   with the writer
1dcc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1dcd0 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68   fts5WriteFinish
1dce0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1dcf0 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  , .  Fts5SegWrit
1dd00 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20  er *pWriter,    
1dd10 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f       /* Writer o
1dd20 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  bject */.  int *
1dd30 70 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20  pnLeaf          
1dd40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1dd50 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  T: Number of lea
1dd60 66 20 70 61 67 65 73 20 69 6e 20 62 2d 74 72 65  f pages in b-tre
1dd70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
1dd80 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65  .  Fts5PageWrite
1dd90 72 20 2a 70 4c 65 61 66 20 3d 20 26 70 57 72 69  r *pLeaf = &pWri
1dda0 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69  ter->writer;.  i
1ddb0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1ddc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
1ddd0 74 28 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 3e 3d  t( pLeaf->pgno>=
1dde0 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  1 );.    if( pLe
1ddf0 61 66 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20  af->buf.n>4 ){. 
1de00 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c       fts5WriteFl
1de10 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74  ushLeaf(p, pWrit
1de20 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  er);.    }.    *
1de30 70 6e 4c 65 61 66 20 3d 20 70 4c 65 61 66 2d 3e  pnLeaf = pLeaf->
1de40 70 67 6e 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35  pgno-1;.    fts5
1de50 57 72 69 74 65 46 6c 75 73 68 42 74 72 65 65 28  WriteFlushBtree(
1de60 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d  p, pWriter);.  }
1de70 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
1de80 65 28 26 70 4c 65 61 66 2d 3e 74 65 72 6d 29 3b  e(&pLeaf->term);
1de90 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
1dea0 65 28 26 70 4c 65 61 66 2d 3e 62 75 66 29 3b 0a  e(&pLeaf->buf);.
1deb0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
1dec0 28 26 70 4c 65 61 66 2d 3e 70 67 69 64 78 29 3b  (&pLeaf->pgidx);
1ded0 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
1dee0 65 28 26 70 57 72 69 74 65 72 2d 3e 62 74 74 65  e(&pWriter->btte
1def0 72 6d 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  rm);..  for(i=0;
1df00 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69   i<pWriter->nDli
1df10 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  dx; i++){.    sq
1df20 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46  lite3Fts5BufferF
1df30 72 65 65 28 26 70 57 72 69 74 65 72 2d 3e 61 44  ree(&pWriter->aD
1df40 6c 69 64 78 5b 69 5d 2e 62 75 66 29 3b 0a 20 20  lidx[i].buf);.  
1df50 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
1df60 28 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78  (pWriter->aDlidx
1df70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
1df80 64 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28  d fts5WriteInit(
1df90 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1dfa0 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
1dfb0 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69  r *pWriter, .  i
1dfc0 6e 74 20 69 53 65 67 69 64 0a 29 7b 0a 20 20 63  nt iSegid.){.  c
1dfd0 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66 66 65 72  onst int nBuffer
1dfe0 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70   = p->pConfig->p
1dff0 67 73 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f  gsz + FTS5_DATA_
1e000 50 41 44 44 49 4e 47 3b 0a 0a 20 20 6d 65 6d 73  PADDING;..  mems
1e010 65 74 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73  et(pWriter, 0, s
1e020 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72 69  izeof(Fts5SegWri
1e030 74 65 72 29 29 3b 0a 20 20 70 57 72 69 74 65 72  ter));.  pWriter
1e040 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69  ->iSegid = iSegi
1e050 64 3b 0a 0a 20 20 66 74 73 35 57 72 69 74 65 44  d;..  fts5WriteD
1e060 6c 69 64 78 47 72 6f 77 28 70 2c 20 70 57 72 69  lidxGrow(p, pWri
1e070 74 65 72 2c 20 31 29 3b 0a 20 20 70 57 72 69 74  ter, 1);.  pWrit
1e080 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20  er->writer.pgno 
1e090 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  = 1;.  pWriter->
1e0a0 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
1e0b0 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d   = 1;.  pWriter-
1e0c0 3e 69 42 74 50 61 67 65 20 3d 20 31 3b 0a 0a 20  >iBtPage = 1;.. 
1e0d0 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72   assert( pWriter
1e0e0 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e 6e 3d 3d  ->writer.buf.n==
1e0f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1e100 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70  Writer->writer.p
1e110 67 69 64 78 2e 6e 3d 3d 30 20 29 3b 0a 0a 20 20  gidx.n==0 );..  
1e120 2f 2a 20 47 72 6f 77 20 74 68 65 20 74 77 6f 20  /* Grow the two 
1e130 62 75 66 66 65 72 73 20 74 6f 20 70 67 73 7a 20  buffers to pgsz 
1e140 2b 20 70 61 64 64 69 6e 67 20 62 79 74 65 73 20  + padding bytes 
1e150 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 73 71  in size. */.  sq
1e160 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
1e170 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 70 57 72  ize(&p->rc, &pWr
1e180 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69  iter->writer.pgi
1e190 64 78 2c 20 6e 42 75 66 66 65 72 29 3b 0a 20 20  dx, nBuffer);.  
1e1a0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1e1b0 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 70  rSize(&p->rc, &p
1e1c0 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62  Writer->writer.b
1e1d0 75 66 2c 20 6e 42 75 66 66 65 72 29 3b 0a 0a 20  uf, nBuffer);.. 
1e1e0 20 69 66 28 20 70 2d 3e 70 49 64 78 57 72 69 74   if( p->pIdxWrit
1e1f0 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73  er==0 ){.    Fts
1e200 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
1e210 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
1e220 20 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70     fts5IndexPrep
1e230 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70  areStmt(p, &p->p
1e240 49 64 78 57 72 69 74 65 72 2c 20 73 71 6c 69 74  IdxWriter, sqlit
1e250 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
1e260 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
1e270 54 4f 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27  TO '%q'.'%q_idx'
1e280 28 73 65 67 69 64 2c 74 65 72 6d 2c 70 67 6e 6f  (segid,term,pgno
1e290 29 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 29 22  ) VALUES(?,?,?)"
1e2a0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  , .          pCo
1e2b0 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66  nfig->zDb, pConf
1e2c0 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29  ig->zName.    ))
1e2d0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
1e2e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e2f0 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
1e300 7a 65 20 74 68 65 20 34 2d 62 79 74 65 20 6c 65  ze the 4-byte le
1e310 61 66 2d 70 61 67 65 20 68 65 61 64 65 72 20 74  af-page header t
1e320 6f 20 30 78 30 30 2e 20 2a 2f 0a 20 20 20 20 6d  o 0x00. */.    m
1e330 65 6d 73 65 74 28 70 57 72 69 74 65 72 2d 3e 77  emset(pWriter->w
1e340 72 69 74 65 72 2e 62 75 66 2e 70 2c 20 30 2c 20  riter.buf.p, 0, 
1e350 34 29 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d  4);.    pWriter-
1e360 3e 77 72 69 74 65 72 2e 62 75 66 2e 6e 20 3d 20  >writer.buf.n = 
1e370 34 3b 0a 0a 20 20 20 20 2f 2a 20 42 69 6e 64 20  4;..    /* Bind 
1e380 74 68 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70  the current outp
1e390 75 74 20 73 65 67 6d 65 6e 74 20 69 64 20 74 6f  ut segment id to
1e3a0 20 74 68 65 20 69 6e 64 65 78 2d 77 72 69 74 65   the index-write
1e3b0 72 2e 20 54 68 69 73 20 69 73 20 61 6e 0a 20 20  r. This is an.  
1e3c0 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f    ** optimizatio
1e3d0 6e 20 6f 76 65 72 20 62 69 6e 64 69 6e 67 20 74  n over binding t
1e3e0 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 6f 76  he same value ov
1e3f0 65 72 20 61 6e 64 20 6f 76 65 72 20 61 73 20 72  er and over as r
1e400 6f 77 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 69  ows are.    ** i
1e410 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 25 5f 69  nserted into %_i
1e420 64 78 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  dx by the curren
1e430 74 20 77 72 69 74 65 72 2e 20 20 2a 2f 0a 20 20  t writer.  */.  
1e440 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
1e450 6e 74 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72  nt(p->pIdxWriter
1e460 2c 20 31 2c 20 70 57 72 69 74 65 72 2d 3e 69 53  , 1, pWriter->iS
1e470 65 67 69 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  egid);.  }.}../*
1e480 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
1e490 65 72 20 77 61 73 20 75 73 65 64 20 74 6f 20 69  er was used to i
1e4a0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
1e4b0 68 65 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  he input segment
1e4c0 73 20 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e  s of on an.** in
1e4d0 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20  cremental merge 
1e4e0 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
1e4f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1e500 65 64 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d  ed if the increm
1e510 65 6e 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73  ental.** merge s
1e520 74 65 70 20 68 61 73 20 66 69 6e 69 73 68 65 64  tep has finished
1e530 20 62 75 74 20 74 68 65 20 69 6e 70 75 74 20 68   but the input h
1e540 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70  as not been comp
1e550 6c 65 74 65 6c 79 20 65 78 68 61 75 73 74 65 64  letely exhausted
1e560 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1e570 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74   fts5TrimSegment
1e580 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  s(Fts5Index *p, 
1e590 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29  Fts5Iter *pIter)
1e5a0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73  {.  int i;.  Fts
1e5b0 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d  5Buffer buf;.  m
1e5c0 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73  emset(&buf, 0, s
1e5d0 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
1e5e0 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ));.  for(i=0; i
1e5f0 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b  <pIter->nSeg; i+
1e600 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49  +){.    Fts5SegI
1e610 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
1e620 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20  er->aSeg[i];.   
1e630 20 69 66 28 20 70 53 65 67 2d 3e 70 53 65 67 3d   if( pSeg->pSeg=
1e640 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e  =0 ){.      /* n
1e650 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  o-op */.    }els
1e660 65 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61  e if( pSeg->pLea
1e670 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  f==0 ){.      /*
1e680 20 41 6c 6c 20 6b 65 79 73 20 66 72 6f 6d 20 74   All keys from t
1e690 68 69 73 20 69 6e 70 75 74 20 73 65 67 6d 65 6e  his input segmen
1e6a0 74 20 68 61 76 65 20 62 65 65 6e 20 74 72 61 6e  t have been tran
1e6b0 73 66 65 72 65 64 20 74 6f 20 74 68 65 20 6f 75  sfered to the ou
1e6c0 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2a 20 53  tput..      ** S
1e6d0 65 74 20 62 6f 74 68 20 74 68 65 20 66 69 72 73  et both the firs
1e6e0 74 20 61 6e 64 20 6c 61 73 74 20 70 61 67 65 2d  t and last page-
1e6f0 6e 75 6d 62 65 72 73 20 74 6f 20 30 20 74 6f 20  numbers to 0 to 
1e700 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
1e710 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65  e.      ** segme
1e720 6e 74 20 69 73 20 6e 6f 77 20 65 6d 70 74 79 2e  nt is now empty.
1e730 20 2a 2f 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   */.      pSeg->
1e740 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d  pSeg->pgnoLast =
1e750 20 30 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   0;.      pSeg->
1e760 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
1e770 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1e780 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d        int iOff =
1e790 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66   pSeg->iTermLeaf
1e7a0 4f 66 66 73 65 74 3b 20 20 20 20 20 2f 2a 20 4f  Offset;     /* O
1e7b0 66 66 73 65 74 20 6f 6e 20 6e 65 77 20 66 69 72  ffset on new fir
1e7c0 73 74 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a  st leaf page */.
1e7d0 20 20 20 20 20 20 69 36 34 20 69 4c 65 61 66 52        i64 iLeafR
1e7e0 6f 77 69 64 3b 0a 20 20 20 20 20 20 46 74 73 35  owid;.      Fts5
1e7f0 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20  Data *pData;.   
1e800 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53 65     int iId = pSe
1e810 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b  g->pSeg->iSegid;
1e820 0a 20 20 20 20 20 20 75 38 20 61 48 64 72 5b 34  .      u8 aHdr[4
1e830 5d 20 3d 20 7b 30 78 30 30 2c 20 30 78 30 30 2c  ] = {0x00, 0x00,
1e840 20 30 78 30 30 2c 20 30 78 30 30 7d 3b 0a 0a 20   0x00, 0x00};.. 
1e850 20 20 20 20 20 69 4c 65 61 66 52 6f 77 69 64 20       iLeafRowid 
1e860 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
1e870 4f 57 49 44 28 69 49 64 2c 20 70 53 65 67 2d 3e  OWID(iId, pSeg->
1e880 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a  iTermLeafPgno);.
1e890 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 66 74        pData = ft
1e8a0 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4c  s5DataRead(p, iL
1e8b0 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  eafRowid);.     
1e8c0 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20   if( pData ){.  
1e8d0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1e8e0 5a 65 72 6f 28 26 62 75 66 29 3b 0a 20 20 20 20  Zero(&buf);.    
1e8f0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 47 72      fts5BufferGr
1e900 6f 77 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ow(&p->rc, &buf,
1e910 20 70 44 61 74 61 2d 3e 6e 6e 29 3b 0a 20 20 20   pData->nn);.   
1e920 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1e930 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1e940 2c 20 26 62 75 66 2c 20 73 69 7a 65 6f 66 28 61  , &buf, sizeof(a
1e950 48 64 72 29 2c 20 61 48 64 72 29 3b 0a 20 20 20  Hdr), aHdr);.   
1e960 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1e970 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1e980 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e  rc, &buf, pSeg->
1e990 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 20  term.n);.       
1e9a0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1e9b0 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62  dBlob(&p->rc, &b
1e9c0 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e  uf, pSeg->term.n
1e9d0 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 29 3b  , pSeg->term.p);
1e9e0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1e9f0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1ea00 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44 61 74  ->rc, &buf, pDat
1ea10 61 2d 3e 73 7a 4c 65 61 66 2d 69 4f 66 66 2c 20  a->szLeaf-iOff, 
1ea20 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 29  &pData->p[iOff])
1ea30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
1ea40 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1ea50 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  {.          /* S
1ea60 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20 66 69  et the szLeaf fi
1ea70 65 6c 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  eld */.         
1ea80 20 66 74 73 35 50 75 74 55 31 36 28 26 62 75 66   fts5PutU16(&buf
1ea90 2e 70 5b 32 5d 2c 20 28 75 31 36 29 62 75 66 2e  .p[2], (u16)buf.
1eaa0 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  n);.        }.. 
1eab0 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 75 70         /* Set up
1eac0 20 74 68 65 20 6e 65 77 20 70 61 67 65 2d 69 6e   the new page-in
1ead0 64 65 78 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  dex array */.   
1eae0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1eaf0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1eb00 72 63 2c 20 26 62 75 66 2c 20 34 29 3b 0a 20 20  rc, &buf, 4);.  
1eb10 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e        if( pSeg->
1eb20 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 53 65 67 2d  iLeafPgno==pSeg-
1eb30 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 0a  >iTermLeafPgno .
1eb40 20 20 20 20 20 20 20 20 20 26 26 20 70 53 65 67           && pSeg
1eb50 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3c  ->iEndofDoclist<
1eb60 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 0a 20  pData->szLeaf . 
1eb70 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
1eb80 20 20 20 20 69 6e 74 20 6e 44 69 66 66 20 3d 20      int nDiff = 
1eb90 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 2d 20  pData->szLeaf - 
1eba0 70 53 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  pSeg->iEndofDocl
1ebb0 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ist;.          f
1ebc0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1ebd0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
1ebe0 75 66 2c 20 62 75 66 2e 6e 20 2d 20 31 20 2d 20  uf, buf.n - 1 - 
1ebf0 6e 44 69 66 66 20 2d 20 34 29 3b 0a 20 20 20 20  nDiff - 4);.    
1ec00 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1ec10 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1ec20 63 2c 20 26 62 75 66 2c 20 0a 20 20 20 20 20 20  c, &buf, .      
1ec30 20 20 20 20 20 20 20 20 70 44 61 74 61 2d 3e 6e          pData->n
1ec40 6e 20 2d 20 70 53 65 67 2d 3e 69 50 67 69 64 78  n - pSeg->iPgidx
1ec50 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b 70  Off, &pData->p[p
1ec60 53 65 67 2d 3e 69 50 67 69 64 78 4f 66 66 5d 0a  Seg->iPgidxOff].
1ec70 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
1ec80 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1ec90 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1eca0 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
1ecb0 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f  pSeg->pSeg->pgno
1ecc0 46 69 72 73 74 20 3d 20 70 53 65 67 2d 3e 69 54  First = pSeg->iT
1ecd0 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20  ermLeafPgno;.   
1ece0 20 20 20 20 20 66 74 73 35 44 61 74 61 44 65 6c       fts5DataDel
1ecf0 65 74 65 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ete(p, FTS5_SEGM
1ed00 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 31  ENT_ROWID(iId, 1
1ed10 29 2c 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a  ), iLeafRowid);.
1ed20 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
1ed30 57 72 69 74 65 28 70 2c 20 69 4c 65 61 66 52 6f  Write(p, iLeafRo
1ed40 77 69 64 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e  wid, buf.p, buf.
1ed50 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
1ed60 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66  }.  }.  fts5Buff
1ed70 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a  erFree(&buf);.}.
1ed80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1ed90 35 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62  5MergeChunkCallb
1eda0 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ack(.  Fts5Index
1edb0 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43   *p, .  void *pC
1edc0 74 78 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20  tx, .  const u8 
1edd0 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68  *pChunk, int nCh
1ede0 75 6e 6b 0a 29 7b 0a 20 20 46 74 73 35 53 65 67  unk.){.  Fts5Seg
1edf0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20  Writer *pWriter 
1ee00 3d 20 28 46 74 73 35 53 65 67 57 72 69 74 65 72  = (Fts5SegWriter
1ee10 2a 29 70 43 74 78 3b 0a 20 20 66 74 73 35 57 72  *)pCtx;.  fts5Wr
1ee20 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  iteAppendPoslist
1ee30 44 61 74 61 28 70 2c 20 70 57 72 69 74 65 72 2c  Data(p, pWriter,
1ee40 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29   pChunk, nChunk)
1ee50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74  ;.}../*.**.*/.st
1ee60 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
1ee70 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 0a 20  dexMergeLevel(. 
1ee80 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
1ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eea0 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
1eeb0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
1eec0 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53  5Structure **ppS
1eed0 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20  truct,       /* 
1eee0 49 4e 2f 4f 55 54 3a 20 53 74 75 63 74 75 72 65  IN/OUT: Stucture
1eef0 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   of index */.  i
1ef00 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20  nt iLvl,        
1ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ef20 2a 20 4c 65 76 65 6c 20 74 6f 20 72 65 61 64 20  * Level to read 
1ef30 69 6e 70 75 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  input from */.  
1ef40 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20 20 20 20  int *pnRem      
1ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef60 2f 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20 74  /* Write up to t
1ef70 68 69 73 20 6d 61 6e 79 20 6f 75 74 70 75 74 20  his many output 
1ef80 6c 65 61 76 65 73 20 2a 2f 0a 29 7b 0a 20 20 46  leaves */.){.  F
1ef90 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
1efa0 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
1efb0 74 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  t;.  Fts5Structu
1efc0 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
1efd0 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
1efe0 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74 73 35 53 74  [iLvl];.  Fts5St
1eff0 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
1f000 76 6c 4f 75 74 3b 0a 20 20 46 74 73 35 49 74 65  vlOut;.  Fts5Ite
1f010 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 20 20 20  r *pIter = 0;   
1f020 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
1f030 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 64 61  to read input da
1f040 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d  ta */.  int nRem
1f050 20 3d 20 70 6e 52 65 6d 20 3f 20 2a 70 6e 52 65   = pnRem ? *pnRe
1f060 6d 20 3a 20 30 3b 20 20 2f 2a 20 4f 75 74 70 75  m : 0;  /* Outpu
1f070 74 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66  t leaf pages lef
1f080 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  t to write */.  
1f090 69 6e 74 20 6e 49 6e 70 75 74 3b 20 20 20 20 20  int nInput;     
1f0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70  /* Number of inp
1f0c0 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  ut segments */. 
1f0d0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77   Fts5SegWriter w
1f0e0 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  riter;          
1f0f0 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63   /* Writer objec
1f100 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  t */.  Fts5Struc
1f110 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
1f120 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  g;     /* Output
1f130 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74   segment */.  Ft
1f140 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 0a 20  s5Buffer term;. 
1f150 20 69 6e 74 20 62 4f 6c 64 65 73 74 3b 20 20 20   int bOldest;   
1f160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f170 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
1f180 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 69  output segment i
1f190 73 20 74 68 65 20 6f 6c 64 65 73 74 20 2a 2f 0a  s the oldest */.
1f1a0 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20    int eDetail = 
1f1b0 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
1f1c0 61 69 6c 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  ail;.  const int
1f1d0 20 66 6c 61 67 73 20 3d 20 46 54 53 35 49 4e 44   flags = FTS5IND
1f1e0 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55  EX_QUERY_NOOUTPU
1f1f0 54 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  T;..  assert( iL
1f200 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
1f210 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  el );.  assert( 
1f220 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c  pLvl->nMerge<=pL
1f230 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 6d  vl->nSeg );..  m
1f240 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30  emset(&writer, 0
1f250 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67  , sizeof(Fts5Seg
1f260 57 72 69 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73  Writer));.  mems
1f270 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a  et(&term, 0, siz
1f280 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
1f290 3b 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d  ;.  if( pLvl->nM
1f2a0 65 72 67 65 20 29 7b 0a 20 20 20 20 70 4c 76 6c  erge ){.    pLvl
1f2b0 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Out = &pStruct->
1f2c0 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a  aLevel[iLvl+1];.
1f2d0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c      assert( pLvl
1f2e0 4f 75 74 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a 20  Out->nSeg>0 );. 
1f2f0 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c     nInput = pLvl
1f300 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 70 53  ->nMerge;.    pS
1f310 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61  eg = &pLvlOut->a
1f320 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65  Seg[pLvlOut->nSe
1f330 67 2d 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57  g-1];..    fts5W
1f340 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69  riteInit(p, &wri
1f350 74 65 72 2c 20 70 53 65 67 2d 3e 69 53 65 67 69  ter, pSeg->iSegi
1f360 64 29 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 77  d);.    writer.w
1f370 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20 70 53 65  riter.pgno = pSe
1f380 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b 31 3b 0a 20  g->pgnoLast+1;. 
1f390 20 20 20 77 72 69 74 65 72 2e 69 42 74 50 61 67     writer.iBtPag
1f3a0 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
1f3b0 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d      int iSegid =
1f3c0 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67   fts5AllocateSeg
1f3d0 69 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a  id(p, pStruct);.
1f3e0 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e 64 20 74  .    /* Extend t
1f3f0 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65  he Fts5Structure
1f400 20 6f 62 6a 65 63 74 20 61 73 20 72 65 71 75 69   object as requi
1f410 72 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  red to ensure th
1f420 65 20 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20  e output.    ** 
1f430 73 65 67 6d 65 6e 74 20 65 78 69 73 74 73 2e 20  segment exists. 
1f440 2a 2f 0a 20 20 20 20 69 66 28 20 69 4c 76 6c 3d  */.    if( iLvl=
1f450 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  =pStruct->nLevel
1f460 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  -1 ){.      fts5
1f470 53 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65  StructureAddLeve
1f480 6c 28 26 70 2d 3e 72 63 2c 20 70 70 53 74 72 75  l(&p->rc, ppStru
1f490 63 74 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75  ct);.      pStru
1f4a0 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
1f4b0 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74      }.    fts5St
1f4c0 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76  ructureExtendLev
1f4d0 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75  el(&p->rc, pStru
1f4e0 63 74 2c 20 69 4c 76 6c 2b 31 2c 20 31 2c 20 30  ct, iLvl+1, 1, 0
1f4f0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
1f500 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
1f510 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
1f520 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
1f530 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74    pLvlOut = &pSt
1f540 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1f550 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57  l+1];..    fts5W
1f560 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69  riteInit(p, &wri
1f570 74 65 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20  ter, iSegid);.. 
1f580 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
1f590 77 20 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 65  w segment to the
1f5a0 20 6f 75 74 70 75 74 20 6c 65 76 65 6c 20 2a 2f   output level */
1f5b0 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76  .    pSeg = &pLv
1f5c0 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f  lOut->aSeg[pLvlO
1f5d0 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20 70  ut->nSeg];.    p
1f5e0 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a  LvlOut->nSeg++;.
1f5f0 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69      pSeg->pgnoFi
1f600 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 70 53 65  rst = 1;.    pSe
1f610 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67  g->iSegid = iSeg
1f620 69 64 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d  id;.    pStruct-
1f630 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 0a 20 20  >nSegment++;..  
1f640 20 20 2f 2a 20 52 65 61 64 20 69 6e 70 75 74 20    /* Read input 
1f650 66 72 6f 6d 20 61 6c 6c 20 73 65 67 6d 65 6e 74  from all segment
1f660 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c  s in the input l
1f670 65 76 65 6c 20 2a 2f 0a 20 20 20 20 6e 49 6e 70  evel */.    nInp
1f680 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b  ut = pLvl->nSeg;
1f690 0a 20 20 7d 0a 20 20 62 4f 6c 64 65 73 74 20 3d  .  }.  bOldest =
1f6a0 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d   (pLvlOut->nSeg=
1f6b0 3d 31 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e  =1 && pStruct->n
1f6c0 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a  Level==iLvl+2);.
1f6d0 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3e  .  assert( iLvl>
1f6e0 3d 30 20 29 3b 0a 20 20 66 6f 72 28 66 74 73 35  =0 );.  for(fts5
1f6f0 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20  MultiIterNew(p, 
1f700 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73 2c 20  pStruct, flags, 
1f710 30 2c 20 30 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e  0, 0, 0, iLvl, n
1f720 49 6e 70 75 74 2c 20 26 70 49 74 65 72 29 3b 0a  Input, &pIter);.
1f730 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
1f740 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29  terEof(p, pIter)
1f750 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d  ==0;.      fts5M
1f760 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20  ultiIterNext(p, 
1f770 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29  pIter, 0, 0).  )
1f780 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
1f790 72 20 2a 70 53 65 67 49 74 65 72 20 3d 20 26 70  r *pSegIter = &p
1f7a0 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
1f7b0 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
1f7c0 72 73 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  rst ];.    int n
1f7d0 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  Pos;            
1f7e0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 6f 73 69           /* posi
1f7f0 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66  tion-list size f
1f800 69 65 6c 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20  ield value */.  
1f810 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20    int nTerm;.   
1f820 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
1f830 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
1f840 66 6f 72 20 6b 65 79 20 61 6e 6e 69 68 69 6c 61  for key annihila
1f850 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  tion. */.    if(
1f860 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 3d   pSegIter->nPos=
1f870 3d 30 20 26 26 20 28 62 4f 6c 64 65 73 74 20 7c  =0 && (bOldest |
1f880 7c 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c  | pSegIter->bDel
1f890 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ==0) ) continue;
1f8a0 0a 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 74  ..    pTerm = ft
1f8b0 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28  s5MultiIterTerm(
1f8c0 70 49 74 65 72 2c 20 26 6e 54 65 72 6d 29 3b 0a  pIter, &nTerm);.
1f8d0 20 20 20 20 69 66 28 20 6e 54 65 72 6d 21 3d 74      if( nTerm!=t
1f8e0 65 72 6d 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28  erm.n || memcmp(
1f8f0 70 54 65 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e  pTerm, term.p, n
1f900 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 69  Term) ){.      i
1f910 66 28 20 70 6e 52 65 6d 20 26 26 20 77 72 69 74  f( pnRem && writ
1f920 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e  er.nLeafWritten>
1f930 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  nRem ){.        
1f940 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
1f950 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
1f960 20 61 20 6e 65 77 20 74 65 72 6d 2e 20 41 70 70   a new term. App
1f970 65 6e 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68  end a term to th
1f980 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  e output segment
1f990 2e 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 57  . */.      fts5W
1f9a0 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 70  riteAppendTerm(p
1f9b0 2c 20 26 77 72 69 74 65 72 2c 20 6e 54 65 72 6d  , &writer, nTerm
1f9c0 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
1f9d0 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
1f9e0 2d 3e 72 63 2c 20 26 74 65 72 6d 2c 20 6e 54 65  ->rc, &term, nTe
1f9f0 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  rm, pTerm);.    
1fa00 7d 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  }..    /* Append
1fa10 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20 74 68   the rowid to th
1fa20 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  e output */.    
1fa30 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53  /* WRITEPOSLISTS
1fa40 49 5a 45 20 2a 2f 0a 20 20 20 20 66 74 73 35 57  IZE */.    fts5W
1fa50 72 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28  riteAppendRowid(
1fa60 70 2c 20 26 77 72 69 74 65 72 2c 20 66 74 73 35  p, &writer, fts5
1fa70 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70  MultiIterRowid(p
1fa80 49 74 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28  Iter));..    if(
1fa90 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44   eDetail==FTS5_D
1faa0 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
1fab0 20 20 20 20 69 66 28 20 70 53 65 67 49 74 65 72      if( pSegIter
1fac0 2d 3e 62 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ->bDel ){.      
1fad0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1fae0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1faf0 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e   &writer.writer.
1fb00 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  buf, 0);.       
1fb10 20 69 66 28 20 70 53 65 67 49 74 65 72 2d 3e 6e   if( pSegIter->n
1fb20 50 6f 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Pos>0 ){.       
1fb30 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1fb40 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1fb50 2c 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72  , &writer.writer
1fb60 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20  .buf, 0);.      
1fb70 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1fb80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
1fb90 41 70 70 65 6e 64 20 74 68 65 20 70 6f 73 69 74  Append the posit
1fba0 69 6f 6e 2d 6c 69 73 74 20 64 61 74 61 20 74 6f  ion-list data to
1fbb0 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20   the output */. 
1fbc0 20 20 20 20 20 6e 50 6f 73 20 3d 20 70 53 65 67       nPos = pSeg
1fbd0 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 20 2b 20 70  Iter->nPos*2 + p
1fbe0 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 3b 0a 20  SegIter->bDel;. 
1fbf0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1fc00 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1fc10 72 63 2c 20 26 77 72 69 74 65 72 2e 77 72 69 74  rc, &writer.writ
1fc20 65 72 2e 62 75 66 2c 20 6e 50 6f 73 29 3b 0a 20  er.buf, nPos);. 
1fc30 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74       fts5ChunkIt
1fc40 65 72 61 74 65 28 70 2c 20 70 53 65 67 49 74 65  erate(p, pSegIte
1fc50 72 2c 20 28 76 6f 69 64 2a 29 26 77 72 69 74 65  r, (void*)&write
1fc60 72 2c 20 66 74 73 35 4d 65 72 67 65 43 68 75 6e  r, fts5MergeChun
1fc70 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  kCallback);.    
1fc80 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73  }.  }..  /* Flus
1fc90 68 20 74 68 65 20 6c 61 73 74 20 6c 65 61 66 20  h the last leaf 
1fca0 70 61 67 65 20 74 6f 20 64 69 73 6b 2e 20 53 65  page to disk. Se
1fcb0 74 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  t the output seg
1fcc0 6d 65 6e 74 20 62 2d 74 72 65 65 20 68 65 69 67  ment b-tree heig
1fcd0 68 74 0a 20 20 2a 2a 20 61 6e 64 20 6c 61 73 74  ht.  ** and last
1fce0 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
1fcf0 72 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  r at the same ti
1fd00 6d 65 2e 20 20 2a 2f 0a 20 20 66 74 73 35 57 72  me.  */.  fts5Wr
1fd10 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72  iteFinish(p, &wr
1fd20 69 74 65 72 2c 20 26 70 53 65 67 2d 3e 70 67 6e  iter, &pSeg->pgn
1fd30 6f 4c 61 73 74 29 3b 0a 0a 20 20 69 66 28 20 66  oLast);..  if( f
1fd40 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
1fd50 70 2c 20 70 49 74 65 72 29 20 29 7b 0a 20 20 20  p, pIter) ){.   
1fd60 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20   int i;..    /* 
1fd70 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e  Remove the redun
1fd80 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72  dant segments fr
1fd90 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61  om the %_data ta
1fda0 62 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ble */.    for(i
1fdb0 3d 30 3b 20 69 3c 6e 49 6e 70 75 74 3b 20 69 2b  =0; i<nInput; i+
1fdc0 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61  +){.      fts5Da
1fdd0 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28  taRemoveSegment(
1fde0 70 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d  p, pLvl->aSeg[i]
1fdf0 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20 7d 0a  .iSegid);.    }.
1fe00 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  .    /* Remove t
1fe10 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67  he redundant seg
1fe20 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 69  ments from the i
1fe30 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  nput level */.  
1fe40 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67    if( pLvl->nSeg
1fe50 21 3d 6e 49 6e 70 75 74 20 29 7b 0a 20 20 20 20  !=nInput ){.    
1fe60 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 28 70    int nMove = (p
1fe70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 20 6e 49 6e 70  Lvl->nSeg - nInp
1fe80 75 74 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  ut) * sizeof(Fts
1fe90 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
1fea0 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76  t);.      memmov
1feb0 65 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 26 70  e(pLvl->aSeg, &p
1fec0 4c 76 6c 2d 3e 61 53 65 67 5b 6e 49 6e 70 75 74  Lvl->aSeg[nInput
1fed0 5d 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 7d  ], nMove);.    }
1fee0 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53  .    pStruct->nS
1fef0 65 67 6d 65 6e 74 20 2d 3d 20 6e 49 6e 70 75 74  egment -= nInput
1ff00 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67  ;.    pLvl->nSeg
1ff10 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20   -= nInput;.    
1ff20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 30  pLvl->nMerge = 0
1ff30 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e  ;.    if( pSeg->
1ff40 70 67 6e 6f 4c 61 73 74 3d 3d 30 20 29 7b 0a 20  pgnoLast==0 ){. 
1ff50 20 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53       pLvlOut->nS
1ff60 65 67 2d 2d 3b 0a 20 20 20 20 20 20 70 53 74 72  eg--;.      pStr
1ff70 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2d 2d 3b  uct->nSegment--;
1ff80 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1ff90 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 67      assert( pSeg
1ffa0 2d 3e 70 67 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a  ->pgnoLast>0 );.
1ffb0 20 20 20 20 66 74 73 35 54 72 69 6d 53 65 67 6d      fts5TrimSegm
1ffc0 65 6e 74 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  ents(p, pIter);.
1ffd0 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65      pLvl->nMerge
1ffe0 20 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a   = nInput;.  }..
1fff0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46    fts5MultiIterF
20000 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 66 74  ree(pIter);.  ft
20010 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65  s5BufferFree(&te
20020 72 6d 29 3b 0a 20 20 69 66 28 20 70 6e 52 65 6d  rm);.  if( pnRem
20030 20 29 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69   ) *pnRem -= wri
20040 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e  ter.nLeafWritten
20050 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 75 70  ;.}../*.** Do up
20060 20 74 6f 20 6e 50 67 20 70 61 67 65 73 20 6f 66   to nPg pages of
20070 20 61 75 74 6f 6d 65 72 67 65 20 77 6f 72 6b 20   automerge work 
20080 6f 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f  on the index..*/
20090 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
200a0 35 49 6e 64 65 78 4d 65 72 67 65 28 0a 20 20 46  5IndexMerge(.  F
200b0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
200d0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
200e0 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
200f0 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
20100 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e  uct,       /* IN
20110 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74  /OUT: Current st
20120 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78  ructure of index
20130 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 67 20 20 20   */.  int nPg   
20140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20150 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 6f        /* Pages o
20160 66 20 77 6f 72 6b 20 74 6f 20 64 6f 20 2a 2f 0a  f work to do */.
20170 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20  ){.  int nRem = 
20180 6e 50 67 3b 0a 20 20 46 74 73 35 53 74 72 75 63  nPg;.  Fts5Struc
20190 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
201a0 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 77 68 69  *ppStruct;.  whi
201b0 6c 65 28 20 6e 52 65 6d 3e 30 20 26 26 20 70 2d  le( nRem>0 && p-
201c0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
201d0 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20  {.    int iLvl; 
201e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201f0 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20    /* To iterate 
20200 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a  through levels *
20210 2f 0a 20 20 20 20 69 6e 74 20 69 42 65 73 74 4c  /.    int iBestL
20220 76 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  vl = 0;         
20230 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 66 65 72    /* Level offer
20240 69 6e 67 20 74 68 65 20 6d 6f 73 74 20 69 6e 70  ing the most inp
20250 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  ut segments */. 
20260 20 20 20 69 6e 74 20 6e 42 65 73 74 20 3d 20 30     int nBest = 0
20270 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
20280 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75  * Number of inpu
20290 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 62 65  t segments on be
202a0 73 74 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20 20  st level */..   
202b0 20 2f 2a 20 53 65 74 20 69 42 65 73 74 4c 76 6c   /* Set iBestLvl
202c0 20 74 6f 20 74 68 65 20 6c 65 76 65 6c 20 74 6f   to the level to
202d0 20 72 65 61 64 20 69 6e 70 75 74 20 73 65 67 6d   read input segm
202e0 65 6e 74 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20  ents from. */.  
202f0 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
20300 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20  t->nLevel>0 );. 
20310 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69     for(iLvl=0; i
20320 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
20330 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
20340 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
20350 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26  eLevel *pLvl = &
20360 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
20370 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28  iLvl];.      if(
20380 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b   pLvl->nMerge ){
20390 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76  .        if( pLv
203a0 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65 73 74 20  l->nMerge>nBest 
203b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 42 65  ){.          iBe
203c0 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20  stLvl = iLvl;.  
203d0 20 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20          nBest = 
203e0 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20  pLvl->nMerge;.  
203f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20400 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
20410 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e       if( pLvl->n
20420 53 65 67 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20  Seg>nBest ){.   
20430 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76       nBest = pLv
20440 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20 20 20 20 20  l->nSeg;.       
20450 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c   iBestLvl = iLvl
20460 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20470 0a 20 20 20 20 2f 2a 20 49 66 20 6e 42 65 73 74  .    /* If nBest
20480 20 69 73 20 73 74 69 6c 6c 20 30 2c 20 74 68 65   is still 0, the
20490 6e 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74  n the index must
204a0 20 62 65 20 65 6d 70 74 79 2e 20 2a 2f 0a 23 69   be empty. */.#i
204b0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
204c0 47 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30  G.    for(iLvl=0
204d0 3b 20 6e 42 65 73 74 3d 3d 30 20 26 26 20 69 4c  ; nBest==0 && iL
204e0 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
204f0 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
20500 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75     assert( pStru
20510 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
20520 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a 20 20 20 20  .nSeg==0 );.    
20530 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66  }.#endif..    if
20540 28 20 6e 42 65 73 74 3c 70 2d 3e 70 43 6f 6e 66  ( nBest<p->pConf
20550 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 20 0a  ig->nAutomerge .
20560 20 20 20 20 20 20 20 20 26 26 20 70 53 74 72 75          && pStru
20570 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74  ct->aLevel[iBest
20580 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 0a  Lvl].nMerge==0 .
20590 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62        ){.      b
205a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
205b0 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65  fts5IndexMergeLe
205c0 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74 2c  vel(p, &pStruct,
205d0 20 69 42 65 73 74 4c 76 6c 2c 20 26 6e 52 65 6d   iBestLvl, &nRem
205e0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
205f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
20600 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
20610 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d  BestLvl].nMerge=
20620 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  =0 ){.      fts5
20630 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
20640 28 70 2c 20 69 42 65 73 74 4c 76 6c 2b 31 2c 20  (p, iBestLvl+1, 
20650 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a  pStruct);.    }.
20660 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74 20    }.  *ppStruct 
20670 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 2f 2a  = pStruct;.}../*
20680 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 6e  .** A total of n
20690 4c 65 61 66 20 6c 65 61 66 20 70 61 67 65 73 20  Leaf leaf pages 
206a0 6f 66 20 64 61 74 61 20 68 61 73 20 6a 75 73 74  of data has just
206b0 20 62 65 65 6e 20 66 6c 75 73 68 65 64 20 74 6f   been flushed to
206c0 20 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73 65   a level-0.** se
206d0 67 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63  gment. This func
206e0 74 69 6f 6e 20 75 70 64 61 74 65 73 20 74 68 65  tion updates the
206f0 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 61   write-counter a
20700 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20  ccordingly and, 
20710 69 66 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2c  if.** necessary,
20720 20 70 65 72 66 6f 72 6d 73 20 69 6e 63 72 65 6d   performs increm
20730 65 6e 74 61 6c 20 6d 65 72 67 65 20 77 6f 72 6b  ental merge work
20740 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
20750 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
20760 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63  the Fts5Index.rc
20770 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
20780 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a  an error has .**
20790 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
207a0 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
207b0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
207c0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
207d0 49 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28 0a  IndexAutomerge(.
207e0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
207f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20800 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
20810 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
20820 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
20830 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a  Struct,       /*
20840 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74   IN/OUT: Current
20850 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e   structure of in
20860 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65  dex */.  int nLe
20870 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  af              
20880 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
20890 65 72 20 6f 66 20 6f 75 74 70 75 74 20 6c 65 61  er of output lea
208a0 76 65 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ves just written
208b0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
208c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
208d0 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75   p->pConfig->nAu
208e0 74 6f 6d 65 72 67 65 3e 30 20 29 7b 0a 20 20 20  tomerge>0 ){.   
208f0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
20900 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72  pStruct = *ppStr
20910 75 63 74 3b 0a 20 20 20 20 75 36 34 20 6e 57 72  uct;.    u64 nWr
20920 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ite;            
20930 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
20940 6c 20 76 61 6c 75 65 20 6f 66 20 77 72 69 74 65  l value of write
20950 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20  -counter */.    
20960 69 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20  int nWork;      
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20980 20 4e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 2d   Number of work-
20990 71 75 61 6e 74 61 20 74 6f 20 70 65 72 66 6f 72  quanta to perfor
209a0 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65  m */.    int nRe
209b0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
209c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
209d0 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 6c   of leaf pages l
209e0 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  eft to write */.
209f0 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
20a00 68 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72  he write-counter
20a10 2e 20 57 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f  . While doing so
20a20 2c 20 73 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f 0a  , set nWork. */.
20a30 20 20 20 20 6e 57 72 69 74 65 20 3d 20 70 53 74      nWrite = pSt
20a40 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e  ruct->nWriteCoun
20a50 74 65 72 3b 0a 20 20 20 20 6e 57 6f 72 6b 20 3d  ter;.    nWork =
20a60 20 28 69 6e 74 29 28 28 28 6e 57 72 69 74 65 20   (int)(((nWrite 
20a70 2b 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e 57  + nLeaf) / p->nW
20a80 6f 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72 69  orkUnit) - (nWri
20a90 74 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69  te / p->nWorkUni
20aa0 74 29 29 3b 0a 20 20 20 20 70 53 74 72 75 63 74  t));.    pStruct
20ab0 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20  ->nWriteCounter 
20ac0 2b 3d 20 6e 4c 65 61 66 3b 0a 20 20 20 20 6e 52  += nLeaf;.    nR
20ad0 65 6d 20 3d 20 28 69 6e 74 29 28 70 2d 3e 6e 57  em = (int)(p->nW
20ae0 6f 72 6b 55 6e 69 74 20 2a 20 6e 57 6f 72 6b 20  orkUnit * nWork 
20af0 2a 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  * pStruct->nLeve
20b00 6c 29 3b 0a 0a 20 20 20 20 66 74 73 35 49 6e 64  l);..    fts5Ind
20b10 65 78 4d 65 72 67 65 28 70 2c 20 70 70 53 74 72  exMerge(p, ppStr
20b20 75 63 74 2c 20 6e 52 65 6d 29 3b 0a 20 20 7d 0a  uct, nRem);.  }.
20b30 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
20b40 74 73 35 49 6e 64 65 78 43 72 69 73 69 73 6d 65  ts5IndexCrisisme
20b50 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rge(.  Fts5Index
20b60 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
20b70 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
20b80 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
20b90 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
20ba0 20 2a 2a 70 70 53 74 72 75 63 74 20 20 20 20 20   **ppStruct     
20bb0 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75     /* IN/OUT: Cu
20bc0 72 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20  rrent structure 
20bd0 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20  of index */.){. 
20be0 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 72 69 73   const int nCris
20bf0 69 73 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  is = p->pConfig-
20c00 3e 6e 43 72 69 73 69 73 4d 65 72 67 65 3b 0a 20  >nCrisisMerge;. 
20c10 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
20c20 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72  pStruct = *ppStr
20c30 75 63 74 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 20  uct;.  int iLvl 
20c40 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
20c50 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
20c60 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65   || pStruct->nLe
20c70 76 65 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65  vel>0 );.  while
20c80 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
20c90 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61  OK && pStruct->a
20ca0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
20cb0 3e 3d 6e 43 72 69 73 69 73 20 29 7b 0a 20 20 20  >=nCrisis ){.   
20cc0 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c   fts5IndexMergeL
20cd0 65 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74  evel(p, &pStruct
20ce0 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a 20 20 20 20  , iLvl, 0);.    
20cf0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
20d00 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 72  QLITE_OK || pStr
20d10 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 28 69 4c 76  uct->nLevel>(iLv
20d20 6c 2b 31 29 20 29 3b 0a 20 20 20 20 66 74 73 35  l+1) );.    fts5
20d30 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
20d40 28 70 2c 20 69 4c 76 6c 2b 31 2c 20 70 53 74 72  (p, iLvl+1, pStr
20d50 75 63 74 29 3b 0a 20 20 20 20 69 4c 76 6c 2b 2b  uct);.    iLvl++
20d60 3b 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63  ;.  }.  *ppStruc
20d70 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a  t = pStruct;.}..
20d80 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
20d90 6e 64 65 78 52 65 74 75 72 6e 28 46 74 73 35 49  ndexReturn(Fts5I
20da0 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20  ndex *p){.  int 
20db0 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 70 2d  rc = p->rc;.  p-
20dc0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
20dd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20de0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
20df0 46 74 73 35 46 6c 75 73 68 43 74 78 20 46 74 73  Fts5FlushCtx Fts
20e00 35 46 6c 75 73 68 43 74 78 3b 0a 73 74 72 75 63  5FlushCtx;.struc
20e10 74 20 46 74 73 35 46 6c 75 73 68 43 74 78 20 7b  t Fts5FlushCtx {
20e20 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49  .  Fts5Index *pI
20e30 64 78 3b 0a 20 20 46 74 73 35 53 65 67 57 72 69  dx;.  Fts5SegWri
20e40 74 65 72 20 77 72 69 74 65 72 3b 20 0a 7d 3b 0a  ter writer; .};.
20e50 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 61 42  ./*.** Buffer aB
20e60 75 66 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 61 20  uf[] contains a 
20e70 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2c  list of varints,
20e80 20 61 6c 6c 20 73 6d 61 6c 6c 20 65 6e 6f 75 67   all small enoug
20e90 68 20 74 6f 20 66 69 74 0a 2a 2a 20 69 6e 20 61  h to fit.** in a
20ea0 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e   32-bit integer.
20eb0 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
20ec0 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
20ed0 70 72 65 66 69 78 20 6f 66 20 74 68 69 73 20 0a  prefix of this .
20ee0 2a 2a 20 6c 69 73 74 20 6e 4d 61 78 20 62 79 74  ** list nMax byt
20ef0 65 73 20 6f 72 20 6c 65 73 73 20 69 6e 20 73 69  es or less in si
20f00 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
20f10 74 20 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65  t fts5PoslistPre
20f20 66 69 78 28 63 6f 6e 73 74 20 75 38 20 2a 61 42  fix(const u8 *aB
20f30 75 66 2c 20 69 6e 74 20 6e 4d 61 78 29 7b 0a 20  uf, int nMax){. 
20f40 20 69 6e 74 20 72 65 74 3b 0a 20 20 75 33 32 20   int ret;.  u32 
20f50 64 75 6d 6d 79 3b 0a 20 20 72 65 74 20 3d 20 66  dummy;.  ret = f
20f60 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 61  ts5GetVarint32(a
20f70 42 75 66 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 69  Buf, dummy);.  i
20f80 66 28 20 72 65 74 3c 6e 4d 61 78 20 29 7b 0a 20  f( ret<nMax ){. 
20f90 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20     while( 1 ){. 
20fa0 20 20 20 20 20 69 6e 74 20 69 20 3d 20 66 74 73       int i = fts
20fb0 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 42  5GetVarint32(&aB
20fc0 75 66 5b 72 65 74 5d 2c 20 64 75 6d 6d 79 29 3b  uf[ret], dummy);
20fd0 0a 20 20 20 20 20 20 69 66 28 20 28 72 65 74 20  .      if( (ret 
20fe0 2b 20 69 29 20 3e 20 6e 4d 61 78 20 29 20 62 72  + i) > nMax ) br
20ff0 65 61 6b 3b 0a 20 20 20 20 20 20 72 65 74 20 2b  eak;.      ret +
21000 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = i;.    }.  }. 
21010 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
21020 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20  /*.** Flush the 
21030 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 2d 6d  contents of in-m
21040 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
21050 20 69 48 61 73 68 20 74 6f 20 61 20 6e 65 77 20   iHash to a new 
21060 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20 73 65 67 6d  level-0 .** segm
21070 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 20 41 6c 73  ent on disk. Als
21080 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 6f 72  o update the cor
21090 72 65 73 70 6f 6e 64 69 6e 67 20 73 74 72 75 63  responding struc
210a0 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a  ture record..**.
210b0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
210c0 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46  ccurs, set the F
210d0 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f  ts5Index.rc erro
210e0 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72  r code. If an er
210f0 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65  ror has .** alre
21100 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
21110 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
21120 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
21130 63 20 76 6f 69 64 20 66 74 73 35 46 6c 75 73 68  c void fts5Flush
21140 4f 6e 65 48 61 73 68 28 46 74 73 35 49 6e 64 65  OneHash(Fts5Inde
21150 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 48 61 73  x *p){.  Fts5Has
21160 68 20 2a 70 48 61 73 68 20 3d 20 70 2d 3e 70 48  h *pHash = p->pH
21170 61 73 68 3b 0a 20 20 46 74 73 35 53 74 72 75 63  ash;.  Fts5Struc
21180 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20  ture *pStruct;. 
21190 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 69   int iSegid;.  i
211a0 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b  nt pgnoLast = 0;
211b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211c0 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66 20 70 61   /* Last leaf pa
211d0 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67  ge number in seg
211e0 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62  ment */..  /* Ob
211f0 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65  tain a reference
21200 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 73 74   to the index st
21210 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 6f  ructure and allo
21220 63 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65  cate a new segme
21230 6e 74 2d 69 64 0a 20 20 2a 2a 20 66 6f 72 20 74  nt-id.  ** for t
21240 68 65 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 73  he new level-0 s
21250 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20 70 53  egment.  */.  pS
21260 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
21270 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20  ctureRead(p);.  
21280 69 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c  iSegid = fts5All
21290 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20 70 53  ocateSegid(p, pS
212a0 74 72 75 63 74 29 3b 0a 0a 20 20 69 66 28 20 69  truct);..  if( i
212b0 53 65 67 69 64 20 29 7b 0a 20 20 20 20 63 6f 6e  Segid ){.    con
212c0 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 2d  st int pgsz = p-
212d0 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3b 0a  >pConfig->pgsz;.
212e0 20 20 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20      int eDetail 
212f0 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  = p->pConfig->eD
21300 65 74 61 69 6c 3b 0a 20 20 20 20 46 74 73 35 53  etail;.    Fts5S
21310 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
21320 2a 70 53 65 67 3b 20 20 20 2f 2a 20 4e 65 77 20  *pSeg;   /* New 
21330 73 65 67 6d 65 6e 74 20 77 69 74 68 69 6e 20 70  segment within p
21340 53 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 46 74  Struct */.    Ft
21350 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20  s5Buffer *pBuf; 
21360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
21370 75 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74  uffer in which t
21380 6f 20 61 73 73 65 6d 62 6c 65 20 6c 65 61 66 20  o assemble leaf 
21390 70 61 67 65 20 2a 2f 0a 20 20 20 20 46 74 73 35  page */.    Fts5
213a0 42 75 66 66 65 72 20 2a 70 50 67 69 64 78 3b 20  Buffer *pPgidx; 
213b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
213c0 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20  fer in which to 
213d0 61 73 73 65 6d 62 6c 65 20 70 67 69 64 78 20 2a  assemble pgidx *
213e0 2f 0a 0a 20 20 20 20 46 74 73 35 53 65 67 57 72  /..    Fts5SegWr
213f0 69 74 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20  iter writer;.   
21400 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 70   fts5WriteInit(p
21410 2c 20 26 77 72 69 74 65 72 2c 20 69 53 65 67 69  , &writer, iSegi
21420 64 29 3b 0a 0a 20 20 20 20 70 42 75 66 20 3d 20  d);..    pBuf = 
21430 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62  &writer.writer.b
21440 75 66 3b 0a 20 20 20 20 70 50 67 69 64 78 20 3d  uf;.    pPgidx =
21450 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e   &writer.writer.
21460 70 67 69 64 78 3b 0a 0a 20 20 20 20 2f 2a 20 66  pgidx;..    /* f
21470 74 73 35 57 72 69 74 65 49 6e 69 74 28 29 20 73  ts5WriteInit() s
21480 68 6f 75 6c 64 20 68 61 76 65 20 69 6e 69 74 69  hould have initi
21490 61 6c 69 7a 65 64 20 74 68 65 20 62 75 66 66 65  alized the buffe
214a0 72 73 20 74 6f 20 28 6d 6f 73 74 20 6c 69 6b 65  rs to (most like
214b0 6c 79 29 0a 20 20 20 20 2a 2a 20 74 68 65 20 6d  ly).    ** the m
214c0 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71  aximum space req
214d0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 61 73  uired. */.    as
214e0 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70  sert( p->rc || p
214f0 42 75 66 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 67  Buf->nSpace>=(pg
21500 73 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50  sz + FTS5_DATA_P
21510 41 44 44 49 4e 47 29 20 29 3b 0a 20 20 20 20 61  ADDING) );.    a
21520 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20  ssert( p->rc || 
21530 70 50 67 69 64 78 2d 3e 6e 53 70 61 63 65 3e 3d  pPgidx->nSpace>=
21540 28 70 67 73 7a 20 2b 20 46 54 53 35 5f 44 41 54  (pgsz + FTS5_DAT
21550 41 5f 50 41 44 44 49 4e 47 29 20 29 3b 0a 0a 20  A_PADDING) );.. 
21560 20 20 20 2f 2a 20 42 65 67 69 6e 20 73 63 61 6e     /* Begin scan
21570 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 68 61 73  ning through has
21580 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2e  h table entries.
21590 20 54 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20   This loop runs 
215a0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 0a 20 20  once for each.  
215b0 20 20 2a 2a 20 74 65 72 6d 2f 64 6f 63 6c 69 73    ** term/doclis
215c0 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  t currently stor
215d0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 68 61  ed within the ha
215e0 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  sh table. */.   
215f0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
21600 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
21610 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  ->rc = sqlite3Ft
21620 73 35 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70  s5HashScanInit(p
21630 48 61 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Hash, 0, 0);.   
21640 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d   }.    while( p-
21650 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
21660 26 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35  & 0==sqlite3Fts5
21670 48 61 73 68 53 63 61 6e 45 6f 66 28 70 48 61 73  HashScanEof(pHas
21680 68 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  h) ){.      cons
21690 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20  t char *zTerm;  
216a0 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
216b0 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72  r containing ter
216c0 6d 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  m */.      const
216d0 20 75 38 20 2a 70 44 6f 63 6c 69 73 74 3b 20 20   u8 *pDoclist;  
216e0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
216f0 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 66 6f 72  r to doclist for
21700 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20   this term */.  
21710 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74      int nDoclist
21720 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21730 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69  /* Size of docli
21740 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a  st in bytes */..
21750 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
21760 68 65 20 74 65 72 6d 20 66 6f 72 20 74 68 69 73  he term for this
21770 20 65 6e 74 72 79 20 74 6f 20 64 69 73 6b 2e 20   entry to disk. 
21780 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
21790 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72  Fts5HashScanEntr
217a0 79 28 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c  y(pHash, &zTerm,
217b0 20 26 70 44 6f 63 6c 69 73 74 2c 20 26 6e 44 6f   &pDoclist, &nDo
217c0 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 66 74  clist);.      ft
217d0 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72  s5WriteAppendTer
217e0 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20 28 69  m(p, &writer, (i
217f0 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29  nt)strlen(zTerm)
21800 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65  , (const u8*)zTe
21810 72 6d 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  rm);..      asse
21820 72 74 28 20 77 72 69 74 65 72 2e 62 46 69 72 73  rt( writer.bFirs
21830 74 52 6f 77 69 64 49 6e 50 61 67 65 3d 3d 30 20  tRowidInPage==0 
21840 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 73  );.      if( pgs
21850 7a 3e 3d 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50  z>=(pBuf->n + pP
21860 67 69 64 78 2d 3e 6e 20 2b 20 6e 44 6f 63 6c 69  gidx->n + nDocli
21870 73 74 20 2b 20 31 29 20 29 7b 0a 20 20 20 20 20  st + 1) ){.     
21880 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65     /* The entire
21890 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c 20 66 69   doclist will fi
218a0 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  t on the current
218b0 20 6c 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20   leaf. */.      
218c0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
218d0 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c  AppendBlob(pBuf,
218e0 20 70 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c   pDoclist, nDocl
218f0 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ist);.      }els
21900 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  e{.        i64 i
21910 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 20  Rowid = 0;.     
21920 20 20 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20     i64 iDelta = 
21930 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  0;.        int i
21940 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  Off = 0;..      
21950 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20    /* The entire 
21960 64 6f 63 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74  doclist will not
21970 20 66 69 74 20 6f 6e 20 74 68 69 73 20 6c 65 61   fit on this lea
21980 66 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  f. The following
21990 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f   .        ** loo
219a0 70 20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75  p iterates throu
219b0 67 68 20 74 68 65 20 70 6f 73 6c 69 73 74 73 20  gh the poslists 
219c0 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
219d0 20 63 75 72 72 65 6e 74 20 0a 20 20 20 20 20 20   current .      
219e0 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2e 20 20 2a    ** doclist.  *
219f0 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  /.        while(
21a00 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
21a10 4b 20 26 26 20 69 4f 66 66 3c 6e 44 6f 63 6c 69  K && iOff<nDocli
21a20 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
21a30 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
21a40 61 72 69 6e 74 28 26 70 44 6f 63 6c 69 73 74 5b  arint(&pDoclist[
21a50 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44  iOff], (u64*)&iD
21a60 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20  elta);.         
21a70 20 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74   iRowid += iDelt
21a80 61 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20  a;.          .  
21a90 20 20 20 20 20 20 20 20 69 66 28 20 77 72 69 74          if( writ
21aa0 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  er.bFirstRowidIn
21ab0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
21ac0 20 20 20 20 66 74 73 35 50 75 74 55 31 36 28 26      fts5PutU16(&
21ad0 70 42 75 66 2d 3e 70 5b 30 5d 2c 20 28 75 31 36  pBuf->p[0], (u16
21ae0 29 70 42 75 66 2d 3e 6e 29 3b 20 20 20 2f 2a 20  )pBuf->n);   /* 
21af0 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 70  first rowid on p
21b00 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  age */.         
21b10 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71     pBuf->n += sq
21b20 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72 69  lite3Fts5PutVari
21b30 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66  nt(&pBuf->p[pBuf
21b40 2d 3e 6e 5d 2c 20 69 52 6f 77 69 64 29 3b 0a 20  ->n], iRowid);. 
21b50 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 65             write
21b60 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  r.bFirstRowidInP
21b70 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
21b80 20 20 20 20 20 66 74 73 35 57 72 69 74 65 44 6c       fts5WriteDl
21b90 69 64 78 41 70 70 65 6e 64 28 70 2c 20 26 77 72  idxAppend(p, &wr
21ba0 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20  iter, iRowid);. 
21bb0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66              pBuf
21bd0 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
21be0 73 35 50 75 74 56 61 72 69 6e 74 28 26 70 42 75  s5PutVarint(&pBu
21bf0 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69  f->p[pBuf->n], i
21c00 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20  Delta);.        
21c10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73    }.          as
21c20 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70  sert( pBuf->n<=p
21c30 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 0a  Buf->nSpace );..
21c40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 44            if( eD
21c50 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
21c60 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  IL_NONE ){.     
21c70 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c         if( iOff<
21c80 6e 44 6f 63 6c 69 73 74 20 26 26 20 70 44 6f 63  nDoclist && pDoc
21c90 6c 69 73 74 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b  list[iOff]==0 ){
21ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
21cb0 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b  Buf->p[pBuf->n++
21cc0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
21cd0 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20       iOff++;.   
21ce0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
21cf0 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20 26 26 20  Off<nDoclist && 
21d00 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3d 3d  pDoclist[iOff]==
21d10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
21d20 20 20 20 20 20 70 42 75 66 2d 3e 70 5b 70 42 75       pBuf->p[pBu
21d30 66 2d 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20  f->n++] = 0;.   
21d40 20 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66               iOf
21d50 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  f++;.           
21d60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
21d70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
21d80 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50  f( (pBuf->n + pP
21d90 67 69 64 78 2d 3e 6e 29 3e 3d 70 67 73 7a 20 29  gidx->n)>=pgsz )
21da0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21db0 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
21dc0 61 66 28 70 2c 20 26 77 72 69 74 65 72 29 3b 0a  af(p, &writer);.
21dd0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
21de0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
21df0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62             int b
21e00 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20  Dummy;.         
21e10 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
21e20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f           int nCo
21e30 70 79 20 3d 20 66 74 73 35 47 65 74 50 6f 73 6c  py = fts5GetPosl
21e40 69 73 74 53 69 7a 65 28 26 70 44 6f 63 6c 69 73  istSize(&pDoclis
21e50 74 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20  t[iOff], &nPos, 
21e60 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20  &bDummy);.      
21e70 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 6e        nCopy += n
21e80 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pos;.           
21e90 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20   if( (pBuf->n + 
21ea0 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 43 6f 70  pPgidx->n + nCop
21eb0 79 29 20 3c 3d 20 70 67 73 7a 20 29 7b 0a 20 20  y) <= pgsz ){.  
21ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21ed0 68 65 20 65 6e 74 69 72 65 20 70 6f 73 6c 69 73  he entire poslis
21ee0 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
21ef0 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20  e current leaf. 
21f00 53 6f 20 63 6f 70 79 0a 20 20 20 20 20 20 20 20  So copy.        
21f10 20 20 20 20 20 20 2a 2a 20 69 74 20 69 6e 20 6f        ** it in o
21f20 6e 65 20 67 6f 2e 20 2a 2f 0a 20 20 20 20 20 20  ne go. */.      
21f30 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
21f40 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
21f50 28 70 42 75 66 2c 20 26 70 44 6f 63 6c 69 73 74  (pBuf, &pDoclist
21f60 5b 69 4f 66 66 5d 2c 20 6e 43 6f 70 79 29 3b 0a  [iOff], nCopy);.
21f70 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
21f80 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
21f90 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70   /* The entire p
21fa0 6f 73 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20  oslist will not 
21fb0 66 69 74 20 6f 6e 20 74 68 69 73 20 6c 65 61 66  fit on this leaf
21fc0 2e 20 53 6f 20 69 74 20 6e 65 65 64 73 0a 20 20  . So it needs.  
21fd0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
21fe0 6f 20 62 65 20 62 72 6f 6b 65 6e 20 69 6e 74 6f  o be broken into
21ff0 20 73 65 63 74 69 6f 6e 73 2e 20 54 68 65 20 6f   sections. The o
22000 6e 6c 79 20 71 75 61 6c 69 66 69 63 61 74 69 6f  nly qualificatio
22010 6e 20 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20  n being.        
22020 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 65 61        ** that ea
22030 63 68 20 76 61 72 69 6e 74 20 6d 75 73 74 20 62  ch varint must b
22040 65 20 73 74 6f 72 65 64 20 63 6f 6e 74 69 67 75  e stored contigu
22050 6f 75 73 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 20  ously.  */.     
22060 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75           const u
22070 38 20 2a 70 50 6f 73 6c 69 73 74 20 3d 20 26 70  8 *pPoslist = &p
22080 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3b 0a 20  Doclist[iOff];. 
22090 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
220a0 20 69 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20   iPos = 0;.     
220b0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
220c0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
220d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
220e0 20 20 20 20 69 6e 74 20 6e 53 70 61 63 65 20 3d      int nSpace =
220f0 20 70 67 73 7a 20 2d 20 70 42 75 66 2d 3e 6e 20   pgsz - pBuf->n 
22100 2d 20 70 50 67 69 64 78 2d 3e 6e 3b 0a 20 20 20  - pPgidx->n;.   
22110 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
22120 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   n = 0;.        
22130 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 43 6f          if( (nCo
22140 70 79 20 2d 20 69 50 6f 73 29 3c 3d 6e 53 70 61  py - iPos)<=nSpa
22150 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ce ){.          
22160 20 20 20 20 20 20 20 20 6e 20 3d 20 6e 43 6f 70          n = nCop
22170 79 20 2d 20 69 50 6f 73 3b 0a 20 20 20 20 20 20  y - iPos;.      
22180 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
22190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
221a0 20 20 20 6e 20 3d 20 66 74 73 35 50 6f 73 6c 69     n = fts5Posli
221b0 73 74 50 72 65 66 69 78 28 26 70 50 6f 73 6c 69  stPrefix(&pPosli
221c0 73 74 5b 69 50 6f 73 5d 2c 20 6e 53 70 61 63 65  st[iPos], nSpace
221d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
221e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
221f0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3e 30       assert( n>0
22200 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
22210 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
22220 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75  feAppendBlob(pBu
22230 66 2c 20 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f  f, &pPoslist[iPo
22240 73 5d 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20  s], n);.        
22250 20 20 20 20 20 20 20 20 69 50 6f 73 20 2b 3d 20          iPos += 
22260 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
22270 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20     if( (pBuf->n 
22280 2b 20 70 50 67 69 64 78 2d 3e 6e 29 3e 3d 70 67  + pPgidx->n)>=pg
22290 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  sz ){.          
222a0 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74          fts5Writ
222b0 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77  eFlushLeaf(p, &w
222c0 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  riter);.        
222d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
222e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
222f0 6f 73 3e 3d 6e 43 6f 70 79 20 29 20 62 72 65 61  os>=nCopy ) brea
22300 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
22310 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
22320 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66  .            iOf
22330 66 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  f += nCopy;.    
22340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22350 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
22360 20 2f 2a 20 54 4f 44 4f 32 3a 20 44 6f 63 6c 69   /* TODO2: Docli
22370 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 77 72  st terminator wr
22380 69 74 74 65 6e 20 68 65 72 65 2e 20 2a 2f 0a 20  itten here. */. 
22390 20 20 20 20 20 2f 2a 20 70 42 75 66 2d 3e 70 5b       /* pBuf->p[
223a0 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 27 5c 30  pBuf->n++] = '\0
223b0 27 3b 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  '; */.      asse
223c0 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75  rt( pBuf->n<=pBu
223d0 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 20 20 20  f->nSpace );.   
223e0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
223f0 73 68 53 63 61 6e 4e 65 78 74 28 70 48 61 73 68  shScanNext(pHash
22400 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
22410 69 74 65 33 46 74 73 35 48 61 73 68 43 6c 65 61  ite3Fts5HashClea
22420 72 28 70 48 61 73 68 29 3b 0a 20 20 20 20 66 74  r(pHash);.    ft
22430 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c  s5WriteFinish(p,
22440 20 26 77 72 69 74 65 72 2c 20 26 70 67 6e 6f 4c   &writer, &pgnoL
22450 61 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70  ast);..    /* Up
22460 64 61 74 65 20 74 68 65 20 46 74 73 35 53 74 72  date the Fts5Str
22470 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 77 72  ucture. It is wr
22480 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68  itten back to th
22490 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74 68  e database by th
224a0 65 0a 20 20 20 20 2a 2a 20 66 74 73 35 53 74 72  e.    ** fts5Str
224b0 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 29 20  uctureRelease() 
224c0 63 61 6c 6c 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a  call below.  */.
224d0 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74 2d      if( pStruct-
224e0 3e 6e 4c 65 76 65 6c 3d 3d 30 20 29 7b 0a 20 20  >nLevel==0 ){.  
224f0 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
22500 65 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63  eAddLevel(&p->rc
22510 2c 20 26 70 53 74 72 75 63 74 29 3b 0a 20 20 20  , &pStruct);.   
22520 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63   }.    fts5Struc
22530 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28  tureExtendLevel(
22540 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c  &p->rc, pStruct,
22550 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69   0, 1, 0);.    i
22560 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
22570 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 53 65  _OK ){.      pSe
22580 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  g = &pStruct->aL
22590 65 76 65 6c 5b 30 5d 2e 61 53 65 67 5b 20 70 53  evel[0].aSeg[ pS
225a0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d  truct->aLevel[0]
225b0 2e 6e 53 65 67 2b 2b 20 5d 3b 0a 20 20 20 20 20  .nSeg++ ];.     
225c0 20 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20   pSeg->iSegid = 
225d0 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 70 53  iSegid;.      pS
225e0 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20  eg->pgnoFirst = 
225f0 31 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70  1;.      pSeg->p
22600 67 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 4c 61  gnoLast = pgnoLa
22610 73 74 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63  st;.      pStruc
22620 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20  t->nSegment++;. 
22630 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72     }.    fts5Str
22640 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c  ucturePromote(p,
22650 20 30 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20   0, pStruct);.  
22660 7d 0a 0a 20 20 66 74 73 35 49 6e 64 65 78 41 75  }..  fts5IndexAu
22670 74 6f 6d 65 72 67 65 28 70 2c 20 26 70 53 74 72  tomerge(p, &pStr
22680 75 63 74 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a  uct, pgnoLast);.
22690 20 20 66 74 73 35 49 6e 64 65 78 43 72 69 73 69    fts5IndexCrisi
226a0 73 6d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75  smerge(p, &pStru
226b0 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63  ct);.  fts5Struc
226c0 74 75 72 65 57 72 69 74 65 28 70 2c 20 70 53 74  tureWrite(p, pSt
226d0 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72  ruct);.  fts5Str
226e0 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
226f0 74 72 75 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  truct);.}../*.**
22700 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20   Flush any data 
22710 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e  stored in the in
22720 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62  -memory hash tab
22730 6c 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  les to the datab
22740 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ase..*/.static v
22750 6f 69 64 20 66 74 73 35 49 6e 64 65 78 46 6c 75  oid fts5IndexFlu
22760 73 68 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  sh(Fts5Index *p)
22770 7b 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 74  {.  /* Unless it
22780 20 69 73 20 65 6d 70 74 79 2c 20 66 6c 75 73 68   is empty, flush
22790 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
227a0 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 66 28  to disk */.  if(
227b0 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
227c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
227d0 70 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20 20 20  p->pHash );.    
227e0 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
227f0 3d 20 30 3b 0a 20 20 20 20 66 74 73 35 46 6c 75  = 0;.    fts5Flu
22800 73 68 4f 6e 65 48 61 73 68 28 70 29 3b 0a 20 20  shOneHash(p);.  
22810 7d 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65  }.}...int sqlite
22820 33 46 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69  3Fts5IndexOptimi
22830 7a 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ze(Fts5Index *p)
22840 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
22850 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74  e *pStruct;.  Ft
22860 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 4e 65  s5Structure *pNe
22870 77 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53 65  w = 0;.  int nSe
22880 67 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  g = 0;..  assert
22890 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
228a0 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65  OK );.  fts5Inde
228b0 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 70 53 74  xFlush(p);.  pSt
228c0 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
228d0 74 75 72 65 52 65 61 64 28 70 29 3b 0a 0a 20 20  tureRead(p);..  
228e0 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20  if( pStruct ){. 
228f0 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75     assert( pStru
22900 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74  ct->nSegment==ft
22910 73 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74  s5StructureCount
22920 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74  Segments(pStruct
22930 29 20 29 3b 0a 20 20 20 20 6e 53 65 67 20 3d 20  ) );.    nSeg = 
22940 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
22950 74 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 67 3e  t;.    if( nSeg>
22960 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  1 ){.      int n
22970 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
22980 73 35 53 74 72 75 63 74 75 72 65 29 3b 0a 20 20  s5Structure);.  
22990 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 28 70 53      nByte += (pS
229a0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31 29  truct->nLevel+1)
229b0 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74   * sizeof(Fts5St
229c0 72 75 63 74 75 72 65 4c 65 76 65 6c 29 3b 0a 20  ructureLevel);. 
229d0 20 20 20 20 20 70 4e 65 77 20 3d 20 28 46 74 73       pNew = (Fts
229e0 35 53 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69  5Structure*)sqli
229f0 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
22a00 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29  o(&p->rc, nByte)
22a10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
22a20 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 46 74  ( pNew ){.    Ft
22a30 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
22a40 20 2a 70 4c 76 6c 3b 0a 20 20 20 20 69 6e 74 20   *pLvl;.    int 
22a50 6e 42 79 74 65 20 3d 20 6e 53 65 67 20 2a 20 73  nByte = nSeg * s
22a60 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
22a70 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ureSegment);.   
22a80 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 20 3d 20   pNew->nLevel = 
22a90 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b  pStruct->nLevel+
22aa0 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 52 65  1;.    pNew->nRe
22ab0 66 20 3d 20 31 3b 0a 20 20 20 20 70 4e 65 77 2d  f = 1;.    pNew-
22ac0 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20 3d  >nWriteCounter =
22ad0 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65   pStruct->nWrite
22ae0 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20 70 4c 76  Counter;.    pLv
22af0 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 65 76 65  l = &pNew->aLeve
22b00 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l[pStruct->nLeve
22b10 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 61 53  l];.    pLvl->aS
22b20 65 67 20 3d 20 28 46 74 73 35 53 74 72 75 63 74  eg = (Fts5Struct
22b30 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69  ureSegment*)sqli
22b40 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
22b50 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29  o(&p->rc, nByte)
22b60 3b 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e  ;.    if( pLvl->
22b70 61 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69 6e  aSeg ){.      in
22b80 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20  t iLvl, iSeg;.  
22b90 20 20 20 20 69 6e 74 20 69 53 65 67 4f 75 74 20      int iSegOut 
22ba0 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  = 0;.      for(i
22bb0 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72  Lvl=0; iLvl<pStr
22bc0 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
22bd0 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  l++){.        fo
22be0 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70  r(iSeg=0; iSeg<p
22bf0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
22c00 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b  Lvl].nSeg; iSeg+
22c10 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c  +){.          pL
22c20 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 4f 75 74  vl->aSeg[iSegOut
22c30 5d 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65  ] = pStruct->aLe
22c40 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69  vel[iLvl].aSeg[i
22c50 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Seg];.          
22c60 69 53 65 67 4f 75 74 2b 2b 3b 0a 20 20 20 20 20  iSegOut++;.     
22c70 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22c80 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e     pNew->nSegmen
22c90 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d  t = pLvl->nSeg =
22ca0 20 6e 53 65 67 3b 0a 20 20 20 20 7d 65 6c 73 65   nSeg;.    }else
22cb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
22cc0 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  free(pNew);.    
22cd0 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20    pNew = 0;.    
22ce0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65  }.  }..  if( pNe
22cf0 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76  w ){.    int iLv
22d00 6c 20 3d 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c  l = pNew->nLevel
22d10 2d 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  -1;.    while( p
22d20 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
22d30 26 26 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b  && pNew->aLevel[
22d40 69 4c 76 6c 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a  iLvl].nSeg>0 ){.
22d50 20 20 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d        int nRem =
22d60 20 46 54 53 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55   FTS5_OPT_WORK_U
22d70 4e 49 54 3b 0a 20 20 20 20 20 20 66 74 73 35 49  NIT;.      fts5I
22d80 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70  ndexMergeLevel(p
22d90 2c 20 26 70 4e 65 77 2c 20 69 4c 76 6c 2c 20 26  , &pNew, iLvl, &
22da0 6e 52 65 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  nRem);.    }..  
22db0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57    fts5StructureW
22dc0 72 69 74 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20  rite(p, pNew);. 
22dd0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
22de0 52 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20  Release(pNew);. 
22df0 20 7d 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74   }..  fts5Struct
22e00 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
22e10 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  ct);.  return ft
22e20 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
22e30 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  ; .}..int sqlite
22e40 33 46 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28  3Fts5IndexMerge(
22e50 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
22e60 74 20 6e 4d 65 72 67 65 29 7b 0a 20 20 46 74 73  t nMerge){.  Fts
22e70 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
22e80 75 63 74 3b 0a 0a 20 20 70 53 74 72 75 63 74 20  uct;..  pStruct 
22e90 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
22ea0 65 61 64 28 70 29 3b 0a 20 20 69 66 28 20 70 53  ead(p);.  if( pS
22eb0 74 72 75 63 74 20 26 26 20 70 53 74 72 75 63 74  truct && pStruct
22ec0 2d 3e 6e 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20  ->nLevel ){.    
22ed0 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 70  fts5IndexMerge(p
22ee0 2c 20 26 70 53 74 72 75 63 74 2c 20 6e 4d 65 72  , &pStruct, nMer
22ef0 67 65 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72  ge);.    fts5Str
22f00 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 70  uctureWrite(p, p
22f10 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 20 20 66  Struct);.  }.  f
22f20 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
22f30 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 0a 20  ase(pStruct);.. 
22f40 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
22f50 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 73  xReturn(p);.}..s
22f60 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41  tatic void fts5A
22f70 70 70 65 6e 64 52 6f 77 69 64 28 0a 20 20 46 74  ppendRowid(.  Ft
22f80 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 36  s5Index *p,.  i6
22f90 34 20 69 44 65 6c 74 61 2c 0a 20 20 46 74 73 35  4 iDelta,.  Fts5
22fa0 49 74 65 72 20 2a 70 55 6e 75 73 65 64 2c 0a 20  Iter *pUnused,. 
22fb0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
22fc0 66 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  f.){.  UNUSED_PA
22fd0 52 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20 20  RAM(pUnused);.  
22fe0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
22ff0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 70  Varint(&p->rc, p
23000 42 75 66 2c 20 69 44 65 6c 74 61 29 3b 0a 7d 0a  Buf, iDelta);.}.
23010 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
23020 35 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 28 0a  5AppendPoslist(.
23030 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a    Fts5Index *p,.
23040 20 20 69 36 34 20 69 44 65 6c 74 61 2c 0a 20 20    i64 iDelta,.  
23050 46 74 73 35 49 74 65 72 20 2a 70 4d 75 6c 74 69  Fts5Iter *pMulti
23060 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ,.  Fts5Buffer *
23070 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20 6e 44  pBuf.){.  int nD
23080 61 74 61 20 3d 20 70 4d 75 6c 74 69 2d 3e 62 61  ata = pMulti->ba
23090 73 65 2e 6e 44 61 74 61 3b 0a 20 20 61 73 73 65  se.nData;.  asse
230a0 72 74 28 20 6e 44 61 74 61 3e 30 20 29 3b 0a 20  rt( nData>0 );. 
230b0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
230c0 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 66 74 73 35  TE_OK && 0==fts5
230d0 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72  BufferGrow(&p->r
230e0 63 2c 20 70 42 75 66 2c 20 6e 44 61 74 61 2b 39  c, pBuf, nData+9
230f0 2b 39 29 20 29 7b 0a 20 20 20 20 66 74 73 35 42  +9) ){.    fts5B
23100 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
23110 61 72 69 6e 74 28 70 42 75 66 2c 20 69 44 65 6c  arint(pBuf, iDel
23120 74 61 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  ta);.    fts5Buf
23130 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
23140 69 6e 74 28 70 42 75 66 2c 20 6e 44 61 74 61 2a  int(pBuf, nData*
23150 32 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  2);.    fts5Buff
23160 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
23170 28 70 42 75 66 2c 20 70 4d 75 6c 74 69 2d 3e 62  (pBuf, pMulti->b
23180 61 73 65 2e 70 44 61 74 61 2c 20 6e 44 61 74 61  ase.pData, nData
23190 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 73 74 61 74 69  );.  }.}...stati
231a0 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69  c void fts5Docli
231b0 73 74 49 74 65 72 4e 65 78 74 28 46 74 73 35 44  stIterNext(Fts5D
231c0 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65  oclistIter *pIte
231d0 72 29 7b 0a 20 20 75 38 20 2a 70 20 3d 20 70 49  r){.  u8 *p = pI
231e0 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 2b 20  ter->aPoslist + 
231f0 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 2b 20 70  pIter->nSize + p
23200 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 3b 0a  Iter->nPoslist;.
23210 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
23220 2d 3e 61 50 6f 73 6c 69 73 74 20 29 3b 0a 20 20  ->aPoslist );.  
23230 69 66 28 20 70 3e 3d 70 49 74 65 72 2d 3e 61 45  if( p>=pIter->aE
23240 6f 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  of ){.    pIter-
23250 3e 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a 20  >aPoslist = 0;. 
23260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20   }else{.    i64 
23270 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 70 20 2b  iDelta;..    p +
23280 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
23290 70 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  p, (u64*)&iDelta
232a0 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52  );.    pIter->iR
232b0 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a  owid += iDelta;.
232c0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 70 6f 73  .    /* Read pos
232d0 69 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20  ition list size 
232e0 2a 2f 0a 20 20 20 20 69 66 28 20 70 5b 30 5d 20  */.    if( p[0] 
232f0 26 20 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20  & 0x80 ){.      
23300 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20  int nPos;.      
23310 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 66  pIter->nSize = f
23320 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 70  ts5GetVarint32(p
23330 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20 70  , nPos);.      p
23340 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d  Iter->nPoslist =
23350 20 28 6e 50 6f 73 3e 3e 31 29 3b 0a 20 20 20 20   (nPos>>1);.    
23360 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74  }else{.      pIt
23370 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d 20 28  er->nPoslist = (
23380 28 69 6e 74 29 28 70 5b 30 5d 29 29 20 3e 3e 20  (int)(p[0])) >> 
23390 31 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  1;.      pIter->
233a0 6e 53 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20 7d  nSize = 1;.    }
233b0 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50 6f  ..    pIter->aPo
233c0 73 6c 69 73 74 20 3d 20 70 3b 0a 20 20 7d 0a 7d  slist = p;.  }.}
233d0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
233e0 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69  s5DoclistIterIni
233f0 74 28 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  t(.  Fts5Buffer 
23400 2a 70 42 75 66 2c 20 0a 20 20 46 74 73 35 44 6f  *pBuf, .  Fts5Do
23410 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65 72  clistIter *pIter
23420 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74  .){.  memset(pIt
23430 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  er, 0, sizeof(*p
23440 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d  Iter));.  pIter-
23450 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70 42 75 66  >aPoslist = pBuf
23460 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e 61 45  ->p;.  pIter->aE
23470 6f 66 20 3d 20 26 70 42 75 66 2d 3e 70 5b 70 42  of = &pBuf->p[pB
23480 75 66 2d 3e 6e 5d 3b 0a 20 20 66 74 73 35 44 6f  uf->n];.  fts5Do
23490 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70 49  clistIterNext(pI
234a0 74 65 72 29 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f  ter);.}..#if 0./
234b0 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 64 6f  *.** Append a do
234c0 63 6c 69 73 74 20 74 6f 20 62 75 66 66 65 72 20  clist to buffer 
234d0 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  pBuf..**.** This
234e0 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
234f0 73 20 74 68 61 74 20 73 70 61 63 65 20 77 69 74  s that space wit
23500 68 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 68  hin the buffer h
23510 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a  as already been.
23520 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f  ** allocated..*/
23530 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
23540 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
23550 64 28 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  d(.  Fts5Buffer 
23560 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
23570 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
23580 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20  o write to */.  
23590 69 36 34 20 2a 70 69 4c 61 73 74 52 6f 77 69 64  i64 *piLastRowid
235a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
235b0 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65 76 69  /* IN/OUT: Previ
235c0 6f 75 73 20 72 6f 77 69 64 20 77 72 69 74 74 65  ous rowid writte
235d0 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20  n (if any) */.  
235e0 69 36 34 20 69 52 6f 77 69 64 20 20 20 20 20 20  i64 iRowid      
235f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23600 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61 70 70 65  /* Rowid to appe
23610 6e 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  nd */.){.  asser
23620 74 28 20 70 42 75 66 2d 3e 6e 21 3d 30 20 7c 7c  t( pBuf->n!=0 ||
23630 20 28 2a 70 69 4c 61 73 74 52 6f 77 69 64 29 3d   (*piLastRowid)=
23640 3d 30 20 29 3b 0a 20 20 66 74 73 35 42 75 66 66  =0 );.  fts5Buff
23650 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
23660 6e 74 28 70 42 75 66 2c 20 69 52 6f 77 69 64 20  nt(pBuf, iRowid 
23670 2d 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 29 3b  - *piLastRowid);
23680 0a 20 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 20  .  *piLastRowid 
23690 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 23 65 6e 64  = iRowid;.}.#end
236a0 69 66 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35  if..#define fts5
236b0 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64  MergeAppendDocid
236c0 28 70 42 75 66 2c 20 69 4c 61 73 74 52 6f 77 69  (pBuf, iLastRowi
236d0 64 2c 20 69 52 6f 77 69 64 29 20 7b 20 20 20 20  d, iRowid) {    
236e0 20 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20 28     \.  assert( (
236f0 70 42 75 66 29 2d 3e 6e 21 3d 30 20 7c 7c 20 28  pBuf)->n!=0 || (
23700 69 4c 61 73 74 52 6f 77 69 64 29 3d 3d 30 20 29  iLastRowid)==0 )
23710 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23720 20 20 20 20 5c 0a 20 20 66 74 73 35 42 75 66 66      \.  fts5Buff
23730 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
23740 6e 74 28 28 70 42 75 66 29 2c 20 28 69 52 6f 77  nt((pBuf), (iRow
23750 69 64 29 20 2d 20 28 69 4c 61 73 74 52 6f 77 69  id) - (iLastRowi
23760 64 29 29 3b 20 5c 0a 20 20 28 69 4c 61 73 74 52  d)); \.  (iLastR
23770 6f 77 69 64 29 20 3d 20 28 69 52 6f 77 69 64 29  owid) = (iRowid)
23780 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237a0 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a        \.}../*.**
237b0 20 53 77 61 70 20 74 68 65 20 63 6f 6e 74 65 6e   Swap the conten
237c0 74 73 20 6f 66 20 62 75 66 66 65 72 20 2a 70 31  ts of buffer *p1
237d0 20 77 69 74 68 20 74 68 61 74 20 6f 66 20 2a 70   with that of *p
237e0 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
237f0 64 20 66 74 73 35 42 75 66 66 65 72 53 77 61 70  d fts5BufferSwap
23800 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c  (Fts5Buffer *p1,
23810 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 32 29   Fts5Buffer *p2)
23820 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  {.  Fts5Buffer t
23830 6d 70 20 3d 20 2a 70 31 3b 0a 20 20 2a 70 31 20  mp = *p1;.  *p1 
23840 3d 20 2a 70 32 3b 0a 20 20 2a 70 32 20 3d 20 74  = *p2;.  *p2 = t
23850 6d 70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  mp;.}..static vo
23860 69 64 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64  id fts5NextRowid
23870 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75  (Fts5Buffer *pBu
23880 66 2c 20 69 6e 74 20 2a 70 69 4f 66 66 2c 20 69  f, int *piOff, i
23890 36 34 20 2a 70 69 52 6f 77 69 64 29 7b 0a 20 20  64 *piRowid){.  
238a0 69 6e 74 20 69 20 3d 20 2a 70 69 4f 66 66 3b 0a  int i = *piOff;.
238b0 20 20 69 66 28 20 69 3e 3d 70 42 75 66 2d 3e 6e    if( i>=pBuf->n
238c0 20 29 7b 0a 20 20 20 20 2a 70 69 4f 66 66 20 3d   ){.    *piOff =
238d0 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   -1;.  }else{.  
238e0 20 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20 20    u64 iVal;.    
238f0 2a 70 69 4f 66 66 20 3d 20 69 20 2b 20 73 71 6c  *piOff = i + sql
23900 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
23910 74 28 26 70 42 75 66 2d 3e 70 5b 69 5d 2c 20 26  t(&pBuf->p[i], &
23920 69 56 61 6c 29 3b 0a 20 20 20 20 2a 70 69 52 6f  iVal);.    *piRo
23930 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 7d  wid += iVal;.  }
23940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
23950 73 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  s the equivalent
23960 20 6f 66 20 66 74 73 35 4d 65 72 67 65 50 72 65   of fts5MergePre
23970 66 69 78 4c 69 73 74 73 28 29 20 66 6f 72 20 64  fixLists() for d
23980 65 74 61 69 6c 3d 6e 6f 6e 65 20 6d 6f 64 65 2e  etail=none mode.
23990 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65  .** In this case
239a0 20 74 68 65 20 62 75 66 66 65 72 73 20 63 6f 6e   the buffers con
239b0 73 69 73 74 20 6f 66 20 61 20 64 65 6c 74 61 2d  sist of a delta-
239c0 65 6e 63 6f 64 65 64 20 6c 69 73 74 20 6f 66 20  encoded list of 
239d0 72 6f 77 69 64 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  rowids only..*/.
239e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
239f0 4d 65 72 67 65 52 6f 77 69 64 4c 69 73 74 73 28  MergeRowidLists(
23a00 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
23a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
23a30 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
23a40 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20 20  ts5Buffer *p1,  
23a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23a60 2a 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f 20  * First list to 
23a70 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35 42  merge */.  Fts5B
23a80 75 66 66 65 72 20 2a 70 32 20 20 20 20 20 20 20  uffer *p2       
23a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
23aa0 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65 72  cond list to mer
23ab0 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ge */.){.  int i
23ac0 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 32 20  1 = 0;.  int i2 
23ad0 3d 20 30 3b 0a 20 20 69 36 34 20 69 52 6f 77 69  = 0;.  i64 iRowi
23ae0 64 31 20 3d 20 30 3b 0a 20 20 69 36 34 20 69 52  d1 = 0;.  i64 iR
23af0 6f 77 69 64 32 20 3d 20 30 3b 0a 20 20 69 36 34  owid2 = 0;.  i64
23b00 20 69 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 46 74   iOut = 0;..  Ft
23b10 73 35 42 75 66 66 65 72 20 6f 75 74 3b 0a 20 20  s5Buffer out;.  
23b20 6d 65 6d 73 65 74 28 26 6f 75 74 2c 20 30 2c 20  memset(&out, 0, 
23b30 73 69 7a 65 6f 66 28 6f 75 74 29 29 3b 0a 20 20  sizeof(out));.  
23b40 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
23b50 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 6f  rSize(&p->rc, &o
23b60 75 74 2c 20 70 31 2d 3e 6e 20 2b 20 70 32 2d 3e  ut, p1->n + p2->
23b70 6e 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 20  n);.  if( p->rc 
23b80 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 66 74 73  ) return;..  fts
23b90 35 4e 65 78 74 52 6f 77 69 64 28 70 31 2c 20 26  5NextRowid(p1, &
23ba0 69 31 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a 20  i1, &iRowid1);. 
23bb0 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70   fts5NextRowid(p
23bc0 32 2c 20 26 69 32 2c 20 26 69 52 6f 77 69 64 32  2, &i2, &iRowid2
23bd0 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 31 3e 3d  );.  while( i1>=
23be0 30 20 7c 7c 20 69 32 3e 3d 30 20 29 7b 0a 20 20  0 || i2>=0 ){.  
23bf0 20 20 69 66 28 20 69 31 3e 3d 30 20 26 26 20 28    if( i1>=0 && (
23c00 69 32 3c 30 20 7c 7c 20 69 52 6f 77 69 64 31 3c  i2<0 || iRowid1<
23c10 69 52 6f 77 69 64 32 29 20 29 7b 0a 20 20 20 20  iRowid2) ){.    
23c20 20 20 61 73 73 65 72 74 28 20 69 4f 75 74 3d 3d    assert( iOut==
23c30 30 20 7c 7c 20 69 52 6f 77 69 64 31 3e 69 4f 75  0 || iRowid1>iOu
23c40 74 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  t );.      fts5B
23c50 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
23c60 61 72 69 6e 74 28 26 6f 75 74 2c 20 69 52 6f 77  arint(&out, iRow
23c70 69 64 31 20 2d 20 69 4f 75 74 29 3b 0a 20 20 20  id1 - iOut);.   
23c80 20 20 20 69 4f 75 74 20 3d 20 69 52 6f 77 69 64     iOut = iRowid
23c90 31 3b 0a 20 20 20 20 20 20 66 74 73 35 4e 65 78  1;.      fts5Nex
23ca0 74 52 6f 77 69 64 28 70 31 2c 20 26 69 31 2c 20  tRowid(p1, &i1, 
23cb0 26 69 52 6f 77 69 64 31 29 3b 0a 20 20 20 20 7d  &iRowid1);.    }
23cc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
23cd0 72 74 28 20 69 4f 75 74 3d 3d 30 20 7c 7c 20 69  rt( iOut==0 || i
23ce0 52 6f 77 69 64 32 3e 69 4f 75 74 20 29 3b 0a 20  Rowid2>iOut );. 
23cf0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
23d00 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28  afeAppendVarint(
23d10 26 6f 75 74 2c 20 69 52 6f 77 69 64 32 20 2d 20  &out, iRowid2 - 
23d20 69 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 4f 75  iOut);.      iOu
23d30 74 20 3d 20 69 52 6f 77 69 64 32 3b 0a 20 20 20  t = iRowid2;.   
23d40 20 20 20 69 66 28 20 69 31 3e 3d 30 20 26 26 20     if( i1>=0 && 
23d50 69 52 6f 77 69 64 31 3d 3d 69 52 6f 77 69 64 32  iRowid1==iRowid2
23d60 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
23d70 4e 65 78 74 52 6f 77 69 64 28 70 31 2c 20 26 69  NextRowid(p1, &i
23d80 31 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a 20 20  1, &iRowid1);.  
23d90 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
23da0 4e 65 78 74 52 6f 77 69 64 28 70 32 2c 20 26 69  NextRowid(p2, &i
23db0 32 2c 20 26 69 52 6f 77 69 64 32 29 3b 0a 20 20  2, &iRowid2);.  
23dc0 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 42    }.  }..  fts5B
23dd0 75 66 66 65 72 53 77 61 70 28 26 6f 75 74 2c 20  ufferSwap(&out, 
23de0 70 31 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  p1);.  fts5Buffe
23df0 72 46 72 65 65 28 26 6f 75 74 29 3b 0a 7d 0a 0a  rFree(&out);.}..
23e00 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 73 20 70 31  /*.** Buffers p1
23e10 20 61 6e 64 20 70 32 20 63 6f 6e 74 61 69 6e 20   and p2 contain 
23e20 64 6f 63 6c 69 73 74 73 2e 20 54 68 69 73 20 66  doclists. This f
23e30 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65 73 20 74  unction merges t
23e40 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66  he content.** of
23e50 20 74 68 65 20 74 77 6f 20 64 6f 63 6c 69 73 74   the two doclist
23e60 73 20 74 6f 67 65 74 68 65 72 20 61 6e 64 20 73  s together and s
23e70 65 74 73 20 62 75 66 66 65 72 20 70 31 20 74 6f  ets buffer p1 to
23e80 20 74 68 65 20 72 65 73 75 6c 74 20 62 65 66 6f   the result befo
23e90 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e  re.** returning.
23ea0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
23eb0 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
23ec0 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74  ror code is left
23ed0 20 69 6e 20 70 2d 3e 72 63 2e 20 49 66 20 61 6e   in p->rc. If an
23ee0 20 65 72 72 6f 72 20 68 61 73 0a 2a 2a 20 61 6c   error has.** al
23ef0 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
23f00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
23f10 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
23f20 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72  tic void fts5Mer
23f30 67 65 50 72 65 66 69 78 4c 69 73 74 73 28 0a 20  gePrefixLists(. 
23f40 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
23f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f60 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
23f70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
23f80 35 42 75 66 66 65 72 20 2a 70 31 2c 20 20 20 20  5Buffer *p1,    
23f90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23fa0 46 69 72 73 74 20 6c 69 73 74 20 74 6f 20 6d 65  First list to me
23fb0 72 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  rge */.  Fts5Buf
23fc0 66 65 72 20 2a 70 32 20 20 20 20 20 20 20 20 20  fer *p2         
23fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f           /* Seco
23fe0 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65  nd list to merge
23ff0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 32 2d   */.){.  if( p2-
24000 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4c  >n ){.    i64 iL
24010 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  astRowid = 0;.  
24020 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65    Fts5DoclistIte
24030 72 20 69 31 3b 0a 20 20 20 20 46 74 73 35 44 6f  r i1;.    Fts5Do
24040 63 6c 69 73 74 49 74 65 72 20 69 32 3b 0a 20 20  clistIter i2;.  
24050 20 20 46 74 73 35 42 75 66 66 65 72 20 6f 75 74    Fts5Buffer out
24060 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 20 20   = {0, 0, 0};.  
24070 20 20 46 74 73 35 42 75 66 66 65 72 20 74 6d 70    Fts5Buffer tmp
24080 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20   = {0, 0, 0};.. 
24090 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 74     if( sqlite3Ft
240a0 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d  s5BufferSize(&p-
240b0 3e 72 63 2c 20 26 6f 75 74 2c 20 70 31 2d 3e 6e  >rc, &out, p1->n
240c0 20 2b 20 70 32 2d 3e 6e 29 20 29 20 72 65 74 75   + p2->n) ) retu
240d0 72 6e 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c  rn;.    fts5Docl
240e0 69 73 74 49 74 65 72 49 6e 69 74 28 70 31 2c 20  istIterInit(p1, 
240f0 26 69 31 29 3b 0a 20 20 20 20 66 74 73 35 44 6f  &i1);.    fts5Do
24100 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70 32  clistIterInit(p2
24110 2c 20 26 69 32 29 3b 0a 0a 20 20 20 20 77 68 69  , &i2);..    whi
24120 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69  le( 1 ){.      i
24130 66 28 20 69 31 2e 69 52 6f 77 69 64 3c 69 32 2e  f( i1.iRowid<i2.
24140 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  iRowid ){.      
24150 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20    /* Copy entry 
24160 66 72 6f 6d 20 69 31 20 2a 2f 0a 20 20 20 20 20  from i1 */.     
24170 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65     fts5MergeAppe
24180 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c  ndDocid(&out, iL
24190 61 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52 6f  astRowid, i1.iRo
241a0 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74  wid);.        ft
241b0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
241c0 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 31 2e  ndBlob(&out, i1.
241d0 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f  aPoslist, i1.nPo
241e0 73 6c 69 73 74 2b 69 31 2e 6e 53 69 7a 65 29 3b  slist+i1.nSize);
241f0 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63  .        fts5Doc
24200 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 31  listIterNext(&i1
24210 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
24220 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 29 20  1.aPoslist==0 ) 
24230 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
24240 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 69 32       else if( i2
24250 2e 69 52 6f 77 69 64 21 3d 69 31 2e 69 52 6f 77  .iRowid!=i1.iRow
24260 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  id ){.        /*
24270 20 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d   Copy entry from
24280 20 69 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 66   i2 */.        f
24290 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
242a0 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52  cid(&out, iLastR
242b0 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29  owid, i2.iRowid)
242c0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
242d0 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
242e0 6f 62 28 26 6f 75 74 2c 20 69 32 2e 61 50 6f 73  ob(&out, i2.aPos
242f0 6c 69 73 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73  list, i2.nPoslis
24300 74 2b 69 32 2e 6e 53 69 7a 65 29 3b 0a 20 20 20  t+i2.nSize);.   
24310 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74       fts5Doclist
24320 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20  IterNext(&i2);. 
24330 20 20 20 20 20 20 20 69 66 28 20 69 32 2e 61 50         if( i2.aP
24340 6f 73 6c 69 73 74 3d 3d 30 20 29 20 62 72 65 61  oslist==0 ) brea
24350 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
24360 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f   else{.        /
24370 2a 20 4d 65 72 67 65 20 74 68 65 20 74 77 6f 20  * Merge the two 
24380 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 2e 20  position lists. 
24390 2a 2f 20 0a 20 20 20 20 20 20 20 20 69 36 34 20  */ .        i64 
243a0 69 50 6f 73 31 20 3d 20 30 3b 0a 20 20 20 20 20  iPos1 = 0;.     
243b0 20 20 20 69 36 34 20 69 50 6f 73 32 20 3d 20 30     i64 iPos2 = 0
243c0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  ;.        int iO
243d0 66 66 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ff1 = 0;.       
243e0 20 69 6e 74 20 69 4f 66 66 32 20 3d 20 30 3b 0a   int iOff2 = 0;.
243f0 20 20 20 20 20 20 20 20 75 38 20 2a 61 31 20 3d          u8 *a1 =
24400 20 26 69 31 2e 61 50 6f 73 6c 69 73 74 5b 69 31   &i1.aPoslist[i1
24410 2e 6e 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20  .nSize];.       
24420 20 75 38 20 2a 61 32 20 3d 20 26 69 32 2e 61 50   u8 *a2 = &i2.aP
24430 6f 73 6c 69 73 74 5b 69 32 2e 6e 53 69 7a 65 5d  oslist[i2.nSize]
24440 3b 0a 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  ;..        i64 i
24450 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
24460 20 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69    Fts5PoslistWri
24470 74 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20 20  ter writer;.    
24480 20 20 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74      memset(&writ
24490 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 72  er, 0, sizeof(wr
244a0 69 74 65 72 29 29 3b 0a 0a 20 20 20 20 20 20 20  iter));..       
244b0 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64   fts5MergeAppend
244c0 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73  Docid(&out, iLas
244d0 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69  tRowid, i2.iRowi
244e0 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  d);.        fts5
244f0 42 75 66 66 65 72 5a 65 72 6f 28 26 74 6d 70 29  BufferZero(&tmp)
24500 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
24510 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28  3Fts5BufferSize(
24520 26 70 2d 3e 72 63 2c 20 26 74 6d 70 2c 20 69 31  &p->rc, &tmp, i1
24530 2e 6e 50 6f 73 6c 69 73 74 20 2b 20 69 32 2e 6e  .nPoslist + i2.n
24540 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  Poslist);.      
24550 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72    if( p->rc ) br
24560 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 73 71  eak;..        sq
24570 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
24580 4e 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e 50  Next64(a1, i1.nP
24590 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 20  oslist, &iOff1, 
245a0 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20  &iPos1);.       
245b0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
245c0 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69 32  istNext64(a2, i2
245d0 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66  .nPoslist, &iOff
245e0 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20 20 20  2, &iPos2);.    
245f0 20 20 20 20 61 73 73 65 72 74 28 20 69 50 6f 73      assert( iPos
24600 31 3e 3d 30 20 26 26 20 69 50 6f 73 32 3e 3d 30  1>=0 && iPos2>=0
24610 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28   );..        if(
24620 20 69 50 6f 73 31 3c 69 50 6f 73 32 20 29 7b 0a   iPos1<iPos2 ){.
24630 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24640 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65  3Fts5PoslistSafe
24650 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50  Append(&tmp, &iP
24660 72 65 76 2c 20 69 50 6f 73 31 29 3b 0a 20 20 20  rev, iPos1);.   
24670 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
24680 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28  s5PoslistNext64(
24690 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c  a1, i1.nPoslist,
246a0 20 26 69 4f 66 66 31 2c 20 26 69 50 6f 73 31 29   &iOff1, &iPos1)
246b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
246c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
246d0 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66  e3Fts5PoslistSaf
246e0 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69  eAppend(&tmp, &i
246f0 50 72 65 76 2c 20 69 50 6f 73 32 29 3b 0a 20 20  Prev, iPos2);.  
24700 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
24710 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
24720 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74  (a2, i2.nPoslist
24730 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73 32  , &iOff2, &iPos2
24740 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
24750 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 3e        if( iPos1>
24760 3d 30 20 26 26 20 69 50 6f 73 32 3e 3d 30 20 29  =0 && iPos2>=0 )
24770 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
24780 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 20 20  e( 1 ){.        
24790 20 20 20 20 69 66 28 20 69 50 6f 73 31 3c 69 50      if( iPos1<iP
247a0 6f 73 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  os2 ){.         
247b0 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 21 3d       if( iPos1!=
247c0 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  iPrev ){.       
247d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
247e0 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41  Fts5PoslistSafeA
247f0 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72  ppend(&tmp, &iPr
24800 65 76 2c 20 69 50 6f 73 31 29 3b 0a 20 20 20 20  ev, iPos1);.    
24810 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24820 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24830 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74  3Fts5PoslistNext
24840 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69  64(a1, i1.nPosli
24850 73 74 2c 20 26 69 4f 66 66 31 2c 20 26 69 50 6f  st, &iOff1, &iPo
24860 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  s1);.           
24870 20 20 20 69 66 28 20 69 50 6f 73 31 3c 30 20 29     if( iPos1<0 )
24880 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
24890 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
248a0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
248b0 20 69 50 6f 73 32 21 3d 69 50 72 65 76 20 29 3b   iPos2!=iPrev );
248c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
248d0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
248e0 74 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70  tSafeAppend(&tmp
248f0 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73 32 29  , &iPrev, iPos2)
24900 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
24910 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
24920 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69 32 2e  stNext64(a2, i2.
24930 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 32  nPoslist, &iOff2
24940 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20 20 20 20  , &iPos2);.     
24950 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f           if( iPo
24960 73 32 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  s2<0 ) break;.  
24970 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24980 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24990 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  }..        if( i
249a0 50 6f 73 31 3e 3d 30 20 29 7b 0a 20 20 20 20 20  Pos1>=0 ){.     
249b0 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 21 3d       if( iPos1!=
249c0 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  iPrev ){.       
249d0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
249e0 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e  PoslistSafeAppen
249f0 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20  d(&tmp, &iPrev, 
24a00 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20  iPos1);.        
24a10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 74    }.          ft
24a20 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
24a30 6e 64 42 6c 6f 62 28 26 74 6d 70 2c 20 26 61 31  ndBlob(&tmp, &a1
24a40 5b 69 4f 66 66 31 5d 2c 20 69 31 2e 6e 50 6f 73  [iOff1], i1.nPos
24a50 6c 69 73 74 2d 69 4f 66 66 31 29 3b 0a 20 20 20  list-iOff1);.   
24a60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24a70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 50        assert( iP
24a80 6f 73 32 3e 3d 30 20 26 26 20 69 50 6f 73 32 21  os2>=0 && iPos2!
24a90 3d 69 50 72 65 76 20 29 3b 0a 20 20 20 20 20 20  =iPrev );.      
24aa0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
24ab0 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64  oslistSafeAppend
24ac0 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69  (&tmp, &iPrev, i
24ad0 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20  Pos2);.         
24ae0 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
24af0 70 70 65 6e 64 42 6c 6f 62 28 26 74 6d 70 2c 20  ppendBlob(&tmp, 
24b00 26 61 32 5b 69 4f 66 66 32 5d 2c 20 69 32 2e 6e  &a2[iOff2], i2.n
24b10 50 6f 73 6c 69 73 74 2d 69 4f 66 66 32 29 3b 0a  Poslist-iOff2);.
24b20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
24b30 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49     /* WRITEPOSLI
24b40 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20  STSIZE */.      
24b50 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
24b60 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 6f 75  AppendVarint(&ou
24b70 74 2c 20 74 6d 70 2e 6e 20 2a 20 32 29 3b 0a 20  t, tmp.n * 2);. 
24b80 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
24b90 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
24ba0 26 6f 75 74 2c 20 74 6d 70 2e 70 2c 20 74 6d 70  &out, tmp.p, tmp
24bb0 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  .n);.        fts
24bc0 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
24bd0 28 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 66  (&i1);.        f
24be0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
24bf0 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 20  xt(&i2);.       
24c00 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73 74   if( i1.aPoslist
24c10 3d 3d 30 20 7c 7c 20 69 32 2e 61 50 6f 73 6c 69  ==0 || i2.aPosli
24c20 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  st==0 ) break;. 
24c30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
24c40 20 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73    if( i1.aPoslis
24c50 74 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d  t ){.      fts5M
24c60 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28  ergeAppendDocid(
24c70 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64  &out, iLastRowid
24c80 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20 20  , i1.iRowid);.  
24c90 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
24ca0 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75  feAppendBlob(&ou
24cb0 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20  t, i1.aPoslist, 
24cc0 69 31 2e 61 45 6f 66 20 2d 20 69 31 2e 61 50 6f  i1.aEof - i1.aPo
24cd0 73 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  slist);.    }.  
24ce0 20 20 65 6c 73 65 20 69 66 28 20 69 32 2e 61 50    else if( i2.aP
24cf0 6f 73 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  oslist ){.      
24d00 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44  fts5MergeAppendD
24d10 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74  ocid(&out, iLast
24d20 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64  Rowid, i2.iRowid
24d30 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
24d40 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
24d50 62 28 26 6f 75 74 2c 20 69 32 2e 61 50 6f 73 6c  b(&out, i2.aPosl
24d60 69 73 74 2c 20 69 32 2e 61 45 6f 66 20 2d 20 69  ist, i2.aEof - i
24d70 32 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20  2.aPoslist);.   
24d80 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66   }..    fts5Buff
24d90 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 70 31  erSet(&p->rc, p1
24da0 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70 29 3b  , out.n, out.p);
24db0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
24dc0 72 65 65 28 26 74 6d 70 29 3b 0a 20 20 20 20 66  ree(&tmp);.    f
24dd0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 6f  ts5BufferFree(&o
24de0 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ut);.  }.}..stat
24df0 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 74 75  ic void fts5Setu
24e00 70 50 72 65 66 69 78 49 74 65 72 28 0a 20 20 46  pPrefixIter(.  F
24e10 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
24e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24e30 2a 20 49 6e 64 65 78 20 74 6f 20 72 65 61 64 20  * Index to read 
24e40 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 44  from */.  int bD
24e50 65 73 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  esc,            
24e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
24e70 65 20 66 6f 72 20 22 4f 52 44 45 52 20 42 59 20  e for "ORDER BY 
24e80 72 6f 77 69 64 20 44 45 53 43 22 20 2a 2f 0a 20  rowid DESC" */. 
24e90 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 6f 6b 65   const u8 *pToke
24ea0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
24eb0 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
24ec0 69 6e 69 6e 67 20 70 72 65 66 69 78 20 74 6f 20  ining prefix to 
24ed0 6d 61 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20 6e  match */.  int n
24ee0 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20  Token,          
24ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
24f00 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 54 6f  ze of buffer pTo
24f10 6b 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ken in bytes */.
24f20 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
24f30 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  olset,          
24f40 20 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61    /* Restrict ma
24f50 74 63 68 65 73 20 74 6f 20 74 68 65 73 65 20 63  tches to these c
24f60 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 46 74 73 35  olumns */.  Fts5
24f70 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20  Iter **ppIter   
24f80 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
24f90 65 77 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 29  ew iterator */.)
24fa0 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
24fb0 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74  e *pStruct;.  Ft
24fc0 73 35 42 75 66 66 65 72 20 2a 61 42 75 66 3b 0a  s5Buffer *aBuf;.
24fd0 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66    const int nBuf
24fe0 20 3d 20 33 32 3b 0a 0a 20 20 76 6f 69 64 20 28   = 32;..  void (
24ff0 2a 78 4d 65 72 67 65 29 28 46 74 73 35 49 6e 64  *xMerge)(Fts5Ind
25000 65 78 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a  ex*, Fts5Buffer*
25010 2c 20 46 74 73 35 42 75 66 66 65 72 2a 29 3b 0a  , Fts5Buffer*);.
25020 20 20 76 6f 69 64 20 28 2a 78 41 70 70 65 6e 64    void (*xAppend
25030 29 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 69 36  )(Fts5Index*, i6
25040 34 2c 20 46 74 73 35 49 74 65 72 2a 2c 20 46 74  4, Fts5Iter*, Ft
25050 73 35 42 75 66 66 65 72 2a 29 3b 0a 20 20 69 66  s5Buffer*);.  if
25060 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  ( p->pConfig->eD
25070 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
25080 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 78  IL_NONE ){.    x
25090 4d 65 72 67 65 20 3d 20 66 74 73 35 4d 65 72 67  Merge = fts5Merg
250a0 65 52 6f 77 69 64 4c 69 73 74 73 3b 0a 20 20 20  eRowidLists;.   
250b0 20 78 41 70 70 65 6e 64 20 3d 20 66 74 73 35 41   xAppend = fts5A
250c0 70 70 65 6e 64 52 6f 77 69 64 3b 0a 20 20 7d 65  ppendRowid;.  }e
250d0 6c 73 65 7b 0a 20 20 20 20 78 4d 65 72 67 65 20  lse{.    xMerge 
250e0 3d 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69  = fts5MergePrefi
250f0 78 4c 69 73 74 73 3b 0a 20 20 20 20 78 41 70 70  xLists;.    xApp
25100 65 6e 64 20 3d 20 66 74 73 35 41 70 70 65 6e 64  end = fts5Append
25110 50 6f 73 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20  Poslist;.  }..  
25120 61 42 75 66 20 3d 20 28 46 74 73 35 42 75 66 66  aBuf = (Fts5Buff
25130 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f  er*)fts5IdxMallo
25140 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  c(p, sizeof(Fts5
25150 42 75 66 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20  Buffer)*nBuf);. 
25160 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53   pStruct = fts5S
25170 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
25180 0a 0a 20 20 69 66 28 20 61 42 75 66 20 26 26 20  ..  if( aBuf && 
25190 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 63  pStruct ){.    c
251a0 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
251b0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
251c0 5f 53 43 41 4e 20 0a 20 20 20 20 20 20 20 20 20  _SCAN .         
251d0 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 54 53             | FTS
251e0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b 49  5INDEX_QUERY_SKI
251f0 50 45 4d 50 54 59 20 0a 20 20 20 20 20 20 20 20  PEMPTY .        
25200 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 54              | FT
25210 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f  S5INDEX_QUERY_NO
25220 4f 55 54 50 55 54 3b 0a 20 20 20 20 69 6e 74 20  OUTPUT;.    int 
25230 69 3b 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74  i;.    i64 iLast
25240 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46  Rowid = 0;.    F
25250 74 73 35 49 74 65 72 20 2a 70 31 20 3d 20 30 3b  ts5Iter *p1 = 0;
25260 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
25270 20 75 73 65 64 20 74 6f 20 67 61 74 68 65 72 20   used to gather 
25280 64 61 74 61 20 66 72 6f 6d 20 69 6e 64 65 78 20  data from index 
25290 2a 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61 20  */.    Fts5Data 
252a0 2a 70 44 61 74 61 3b 0a 20 20 20 20 46 74 73 35  *pData;.    Fts5
252b0 42 75 66 66 65 72 20 64 6f 63 6c 69 73 74 3b 0a  Buffer doclist;.
252c0 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d      int bNewTerm
252d0 20 3d 20 31 3b 0a 0a 20 20 20 20 6d 65 6d 73 65   = 1;..    memse
252e0 74 28 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20 73  t(&doclist, 0, s
252f0 69 7a 65 6f 66 28 64 6f 63 6c 69 73 74 29 29 3b  izeof(doclist));
25300 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74  .    fts5MultiIt
25310 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74  erNew(p, pStruct
25320 2c 20 66 6c 61 67 73 2c 20 70 43 6f 6c 73 65 74  , flags, pColset
25330 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , pToken, nToken
25340 2c 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a 20  , -1, 0, &p1);. 
25350 20 20 20 66 74 73 35 49 74 65 72 53 65 74 4f 75     fts5IterSetOu
25360 74 70 75 74 43 62 28 26 70 2d 3e 72 63 2c 20 70  tputCb(&p->rc, p
25370 31 29 3b 0a 20 20 20 20 66 6f 72 28 20 2f 2a 20  1);.    for( /* 
25380 6e 6f 2d 6f 70 20 2a 2f 20 3b 0a 20 20 20 20 20  no-op */ ;.     
25390 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
253a0 45 6f 66 28 70 2c 20 70 31 29 3d 3d 30 3b 0a 20  Eof(p, p1)==0;. 
253b0 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
253c0 49 74 65 72 4e 65 78 74 32 28 70 2c 20 70 31 2c  IterNext2(p, p1,
253d0 20 26 62 4e 65 77 54 65 72 6d 29 0a 20 20 20 20   &bNewTerm).    
253e0 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ){.      Fts5Seg
253f0 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 31  Iter *pSeg = &p1
25400 2d 3e 61 53 65 67 5b 20 70 31 2d 3e 61 46 69 72  ->aSeg[ p1->aFir
25410 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
25420 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20        int nTerm 
25430 3d 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 3b 0a  = pSeg->term.n;.
25440 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a        const u8 *
25450 70 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e 74 65  pTerm = pSeg->te
25460 72 6d 2e 70 3b 0a 20 20 20 20 20 20 70 31 2d 3e  rm.p;.      p1->
25470 78 53 65 74 4f 75 74 70 75 74 73 28 70 31 2c 20  xSetOutputs(p1, 
25480 70 53 65 67 29 3b 0a 0a 20 20 20 20 20 20 61 73  pSeg);..      as
25490 73 65 72 74 5f 6e 63 28 20 6d 65 6d 63 6d 70 28  sert_nc( memcmp(
254a0 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 4d  pToken, pTerm, M
254b0 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d  IN(nToken, nTerm
254c0 29 29 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ))<=0 );.      i
254d0 66 28 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20  f( bNewTerm ){. 
254e0 20 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d         if( nTerm
254f0 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63 6d  <nToken || memcm
25500 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c  p(pToken, pTerm,
25510 20 6e 54 6f 6b 65 6e 29 20 29 20 62 72 65 61 6b   nToken) ) break
25520 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
25530 20 69 66 28 20 70 31 2d 3e 62 61 73 65 2e 6e 44   if( p1->base.nD
25540 61 74 61 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ata==0 ) continu
25550 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 31  e;..      if( p1
25560 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 3c 3d 69  ->base.iRowid<=i
25570 4c 61 73 74 52 6f 77 69 64 20 26 26 20 64 6f 63  LastRowid && doc
25580 6c 69 73 74 2e 6e 3e 30 20 29 7b 0a 20 20 20 20  list.n>0 ){.    
25590 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e      for(i=0; p->
255a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
255b0 20 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b 29   doclist.n; i++)
255c0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
255d0 72 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a 20 20  rt( i<nBuf );.  
255e0 20 20 20 20 20 20 20 20 69 66 28 20 61 42 75 66          if( aBuf
255f0 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  [i].n==0 ){.    
25600 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
25610 65 72 53 77 61 70 28 26 64 6f 63 6c 69 73 74 2c  erSwap(&doclist,
25620 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20   &aBuf[i]);.    
25630 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
25640 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73 74 29  erZero(&doclist)
25650 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
25660 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 78  e{.            x
25670 4d 65 72 67 65 28 70 2c 20 26 64 6f 63 6c 69 73  Merge(p, &doclis
25680 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20  t, &aBuf[i]);.  
25690 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
256a0 66 66 65 72 5a 65 72 6f 28 26 61 42 75 66 5b 69  fferZero(&aBuf[i
256b0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ]);.          }.
256c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
256d0 20 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30    iLastRowid = 0
256e0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
256f0 20 78 41 70 70 65 6e 64 28 70 2c 20 70 31 2d 3e   xAppend(p, p1->
25700 62 61 73 65 2e 69 52 6f 77 69 64 2d 69 4c 61 73  base.iRowid-iLas
25710 74 52 6f 77 69 64 2c 20 70 31 2c 20 26 64 6f 63  tRowid, p1, &doc
25720 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 4c 61  list);.      iLa
25730 73 74 52 6f 77 69 64 20 3d 20 70 31 2d 3e 62 61  stRowid = p1->ba
25740 73 65 2e 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d  se.iRowid;.    }
25750 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
25760 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nBuf; i++){.   
25770 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
25780 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25790 20 20 20 78 4d 65 72 67 65 28 70 2c 20 26 64 6f     xMerge(p, &do
257a0 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29  clist, &aBuf[i])
257b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
257c0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
257d0 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  aBuf[i]);.    }.
257e0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
257f0 72 46 72 65 65 28 70 31 29 3b 0a 0a 20 20 20 20  rFree(p1);..    
25800 70 44 61 74 61 20 3d 20 66 74 73 35 49 64 78 4d  pData = fts5IdxM
25810 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
25820 46 74 73 35 44 61 74 61 29 20 2b 20 64 6f 63 6c  Fts5Data) + docl
25830 69 73 74 2e 6e 29 3b 0a 20 20 20 20 69 66 28 20  ist.n);.    if( 
25840 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70  pData ){.      p
25850 44 61 74 61 2d 3e 70 20 3d 20 28 75 38 2a 29 26  Data->p = (u8*)&
25860 70 44 61 74 61 5b 31 5d 3b 0a 20 20 20 20 20 20  pData[1];.      
25870 70 44 61 74 61 2d 3e 6e 6e 20 3d 20 70 44 61 74  pData->nn = pDat
25880 61 2d 3e 73 7a 4c 65 61 66 20 3d 20 64 6f 63 6c  a->szLeaf = docl
25890 69 73 74 2e 6e 3b 0a 20 20 20 20 20 20 6d 65 6d  ist.n;.      mem
258a0 63 70 79 28 70 44 61 74 61 2d 3e 70 2c 20 64 6f  cpy(pData->p, do
258b0 63 6c 69 73 74 2e 70 2c 20 64 6f 63 6c 69 73 74  clist.p, doclist
258c0 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d  .n);.      fts5M
258d0 75 6c 74 69 49 74 65 72 4e 65 77 32 28 70 2c 20  ultiIterNew2(p, 
258e0 70 44 61 74 61 2c 20 62 44 65 73 63 2c 20 70 70  pData, bDesc, pp
258f0 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Iter);.    }.   
25900 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
25910 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 0a  &doclist);.  }..
25920 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
25930 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
25940 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
25950 61 42 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  aBuf);.}.../*.**
25960 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 61   Indicate that a
25970 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  ll subsequent ca
25980 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74  lls to sqlite3Ft
25990 73 35 49 6e 64 65 78 57 72 69 74 65 28 29 20 70  s5IndexWrite() p
259a0 65 72 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65  ertain.** to the
259b0 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72   document with r
259c0 6f 77 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a  owid iRowid..*/.
259d0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
259e0 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65 28 46  ndexBeginWrite(F
259f0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
25a00 20 62 44 65 6c 65 74 65 2c 20 69 36 34 20 69 52   bDelete, i64 iR
25a10 6f 77 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28  owid){.  assert(
25a20 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
25a30 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  K );..  /* Alloc
25a40 61 74 65 20 74 68 65 20 68 61 73 68 20 74 61 62  ate the hash tab
25a50 6c 65 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  le if it has not
25a60 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
25a70 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 66 28  located */.  if(
25a80 20 70 2d 3e 70 48 61 73 68 3d 3d 30 20 29 7b 0a   p->pHash==0 ){.
25a90 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
25aa0 74 65 33 46 74 73 35 48 61 73 68 4e 65 77 28 70  te3Fts5HashNew(p
25ab0 2d 3e 70 43 6f 6e 66 69 67 2c 20 26 70 2d 3e 70  ->pConfig, &p->p
25ac0 48 61 73 68 2c 20 26 70 2d 3e 6e 50 65 6e 64 69  Hash, &p->nPendi
25ad0 6e 67 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20  ngData);.  }..  
25ae0 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 68 61 73  /* Flush the has
25af0 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b 20  h table to disk 
25b00 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
25b10 20 69 66 28 20 69 52 6f 77 69 64 3c 70 2d 3e 69   if( iRowid<p->i
25b20 57 72 69 74 65 52 6f 77 69 64 20 0a 20 20 20 7c  WriteRowid .   |
25b30 7c 20 28 69 52 6f 77 69 64 3d 3d 70 2d 3e 69 57  | (iRowid==p->iW
25b40 72 69 74 65 52 6f 77 69 64 20 26 26 20 70 2d 3e  riteRowid && p->
25b50 62 44 65 6c 65 74 65 3d 3d 30 29 0a 20 20 20 7c  bDelete==0).   |
25b60 7c 20 28 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61  | (p->nPendingDa
25b70 74 61 20 3e 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  ta > p->pConfig-
25b80 3e 6e 48 61 73 68 53 69 7a 65 29 20 0a 20 20 29  >nHashSize) .  )
25b90 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 46  {.    fts5IndexF
25ba0 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a 0a 20 20  lush(p);.  }..  
25bb0 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 3d  p->iWriteRowid =
25bc0 20 69 52 6f 77 69 64 3b 0a 20 20 70 2d 3e 62 44   iRowid;.  p->bD
25bd0 65 6c 65 74 65 20 3d 20 62 44 65 6c 65 74 65 3b  elete = bDelete;
25be0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
25bf0 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
25c00 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61  ./*.** Commit da
25c10 74 61 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69  ta to disk..*/.i
25c20 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
25c30 64 65 78 53 79 6e 63 28 46 74 73 35 49 6e 64 65  dexSync(Fts5Inde
25c40 78 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  x *p, int bCommi
25c50 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  t){.  assert( p-
25c60 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
25c70 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75  ;.  fts5IndexFlu
25c80 73 68 28 70 29 3b 0a 20 20 69 66 28 20 62 43 6f  sh(p);.  if( bCo
25c90 6d 6d 69 74 20 29 20 66 74 73 35 43 6c 6f 73 65  mmit ) fts5Close
25ca0 52 65 61 64 65 72 28 70 29 3b 0a 20 20 72 65 74  Reader(p);.  ret
25cb0 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
25cc0 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn(p);.}../*.**
25cd0 20 44 69 73 63 61 72 64 20 61 6e 79 20 64 61 74   Discard any dat
25ce0 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
25cf0 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
25d00 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77 72  ables. Do not wr
25d10 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68 65  ite it.** to the
25d20 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74   database. Addit
25d30 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65 20  ionally, assume 
25d40 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
25d50 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74 61 0a  s of the %_data.
25d60 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68 61 76  ** table may hav
25d70 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64 69 73  e changed on dis
25d80 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d  k. So any in-mem
25d90 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20 25 5f  ory caches of %_
25da0 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64 73  data .** records
25db0 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c 69 64   must be invalid
25dc0 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
25dd0 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 6f 6c  ite3Fts5IndexRol
25de0 6c 62 61 63 6b 28 46 74 73 35 49 6e 64 65 78 20  lback(Fts5Index 
25df0 2a 70 29 7b 0a 20 20 66 74 73 35 43 6c 6f 73 65  *p){.  fts5Close
25e00 52 65 61 64 65 72 28 70 29 3b 0a 20 20 66 74 73  Reader(p);.  fts
25e10 35 49 6e 64 65 78 44 69 73 63 61 72 64 44 61 74  5IndexDiscardDat
25e20 61 28 70 29 3b 0a 20 20 2f 2a 20 61 73 73 65 72  a(p);.  /* asser
25e30 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
25e40 5f 4f 4b 20 29 3b 20 2a 2f 0a 20 20 72 65 74 75  _OK ); */.  retu
25e50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
25e60 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74  ./*.** The %_dat
25e70 61 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c  a table is compl
25e80 65 74 65 6c 79 20 65 6d 70 74 79 20 77 68 65 6e  etely empty when
25e90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
25ea0 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 0a 2a  s called. This.*
25eb0 2a 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c  * function popul
25ec0 61 74 65 73 20 69 74 20 77 69 74 68 20 74 68 65  ates it with the
25ed0 20 69 6e 69 74 69 61 6c 20 73 74 72 75 63 74 75   initial structu
25ee0 72 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65  re objects for e
25ef0 61 63 68 20 69 6e 64 65 78 2c 0a 2a 2a 20 61 6e  ach index,.** an
25f00 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 65  d the initial ve
25f10 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 22 61 76  rsion of the "av
25f20 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 28  erages" record (
25f30 61 20 7a 65 72 6f 2d 62 79 74 65 20 62 6c 6f 62  a zero-byte blob
25f40 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
25f50 33 46 74 73 35 49 6e 64 65 78 52 65 69 6e 69 74  3Fts5IndexReinit
25f60 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
25f70 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
25f80 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20  s;.  memset(&s, 
25f90 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74  0, sizeof(Fts5St
25fa0 72 75 63 74 75 72 65 29 29 3b 0a 20 20 66 74 73  ructure));.  fts
25fb0 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54  5DataWrite(p, FT
25fc0 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49  S5_AVERAGES_ROWI
25fd0 44 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 22  D, (const u8*)""
25fe0 2c 20 30 29 3b 0a 20 20 66 74 73 35 53 74 72 75  , 0);.  fts5Stru
25ff0 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 26 73  ctureWrite(p, &s
26000 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
26010 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
26020 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
26030 6e 65 77 20 46 74 73 35 49 6e 64 65 78 20 68 61  new Fts5Index ha
26040 6e 64 6c 65 2e 20 49 66 20 74 68 65 20 62 43 72  ndle. If the bCr
26050 65 61 74 65 20 61 72 67 75 6d 65 6e 74 20 69 73  eate argument is
26060 20 74 72 75 65 2c 20 63 72 65 61 74 65 0a 2a 2a   true, create.**
26070 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
26080 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 25  the underlying %
26090 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a  _data table..**.
260a0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
260b0 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69  , set *pp to poi
260c0 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62  nt to the new ob
260d0 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ject and return 
260e0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74  SQLITE_OK..** Ot
260f0 68 65 72 77 69 73 65 2c 20 73 65 74 20 2a 70 70  herwise, set *pp
26100 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74   to NULL and ret
26110 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
26120 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  ror code..*/.int
26130 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
26140 78 4f 70 65 6e 28 0a 20 20 46 74 73 35 43 6f 6e  xOpen(.  Fts5Con
26150 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20  fig *pConfig, . 
26160 20 69 6e 74 20 62 43 72 65 61 74 65 2c 20 0a 20   int bCreate, . 
26170 20 46 74 73 35 49 6e 64 65 78 20 2a 2a 70 70 2c   Fts5Index **pp,
26180 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a  .  char **pzErr.
26190 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
261a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 49  LITE_OK;.  Fts5I
261b0 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20  ndex *p;        
261c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
261d0 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a  w object */..  *
261e0 70 70 20 3d 20 70 20 3d 20 28 46 74 73 35 49 6e  pp = p = (Fts5In
261f0 64 65 78 2a 29 73 71 6c 69 74 65 33 46 74 73 35  dex*)sqlite3Fts5
26200 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
26210 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78  sizeof(Fts5Index
26220 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ));.  if( rc==SQ
26230 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
26240 2d 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e  ->pConfig = pCon
26250 66 69 67 3b 0a 20 20 20 20 70 2d 3e 6e 57 6f 72  fig;.    p->nWor
26260 6b 55 6e 69 74 20 3d 20 46 54 53 35 5f 57 4f 52  kUnit = FTS5_WOR
26270 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 70 2d 3e 7a  K_UNIT;.    p->z
26280 44 61 74 61 54 62 6c 20 3d 20 73 71 6c 69 74 65  DataTbl = sqlite
26290 33 46 74 73 35 4d 70 72 69 6e 74 66 28 26 72 63  3Fts5Mprintf(&rc
262a0 2c 20 22 25 73 5f 64 61 74 61 22 2c 20 70 43 6f  , "%s_data", pCo
262b0 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  nfig->zName);.  
262c0 20 20 69 66 28 20 70 2d 3e 7a 44 61 74 61 54 62    if( p->zDataTb
262d0 6c 20 26 26 20 62 43 72 65 61 74 65 20 29 7b 0a  l && bCreate ){.
262e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
262f0 65 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c  e3Fts5CreateTabl
26300 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  e(.          pCo
26310 6e 66 69 67 2c 20 22 64 61 74 61 22 2c 20 22 69  nfig, "data", "i
26320 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
26330 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f  Y KEY, block BLO
26340 42 22 2c 20 30 2c 20 70 7a 45 72 72 0a 20 20 20  B", 0, pzErr.   
26350 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
26360 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26370 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
26380 6c 69 74 65 33 46 74 73 35 43 72 65 61 74 65 54  lite3Fts5CreateT
26390 61 62 6c 65 28 70 43 6f 6e 66 69 67 2c 20 22 69  able(pConfig, "i
263a0 64 78 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  dx", .          
263b0 20 20 22 73 65 67 69 64 2c 20 74 65 72 6d 2c 20    "segid, term, 
263c0 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45  pgno, PRIMARY KE
263d0 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 22 2c  Y(segid, term)",
263e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 31 2c   .            1,
263f0 20 70 7a 45 72 72 0a 20 20 20 20 20 20 20 20 29   pzErr.        )
26400 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26410 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26420 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
26430 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
26440 65 78 52 65 69 6e 69 74 28 70 29 3b 0a 20 20 20  exReinit(p);.   
26450 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
26460 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
26470 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63  LITE_OK || p->rc
26480 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
26490 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
264a0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43  qlite3Fts5IndexC
264b0 6c 6f 73 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  lose(p);.    *pp
264c0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
264d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
264e0 43 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6f  Close a handle o
264f0 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  pened by an earl
26500 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ier call to sqli
26510 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e  te3Fts5IndexOpen
26520 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
26530 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65  e3Fts5IndexClose
26540 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
26550 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
26560 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 29 7b  E_OK;.  if( p ){
26570 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
26580 70 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20  pReader==0 );.  
26590 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
265a0 7a 65 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a  ze(p->pWriter);.
265b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
265c0 6c 69 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65 72  lize(p->pDeleter
265d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
265e0 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78 57  inalize(p->pIdxW
265f0 72 69 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69  riter);.    sqli
26600 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e  te3_finalize(p->
26610 70 49 64 78 44 65 6c 65 74 65 72 29 3b 0a 20 20  pIdxDeleter);.  
26620 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
26630 7a 65 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74  ze(p->pIdxSelect
26640 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
26650 73 35 48 61 73 68 46 72 65 65 28 70 2d 3e 70 48  s5HashFree(p->pH
26660 61 73 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ash);.    sqlite
26670 33 5f 66 72 65 65 28 70 2d 3e 7a 44 61 74 61 54  3_free(p->zDataT
26680 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  bl);.    sqlite3
26690 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20  _free(p);.  }.  
266a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
266b0 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20 70  .** Argument p p
266c0 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
266d0 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 75 74 66  r containing utf
266e0 2d 38 20 74 65 78 74 20 74 68 61 74 20 69 73 20  -8 text that is 
266f0 6e 20 62 79 74 65 73 20 69 6e 20 0a 2a 2a 20 73  n bytes in .** s
26700 69 7a 65 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ize. Return the 
26710 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
26720 69 6e 20 74 68 65 20 6e 43 68 61 72 20 63 68 61  in the nChar cha
26730 72 61 63 74 65 72 20 70 72 65 66 69 78 20 6f 66  racter prefix of
26740 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 2c 20   the.** buffer, 
26750 6f 72 20 30 20 69 66 20 74 68 65 72 65 20 61 72  or 0 if there ar
26760 65 20 6c 65 73 73 20 74 68 61 6e 20 6e 43 68 61  e less than nCha
26770 72 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  r characters in 
26780 74 6f 74 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  total..*/.int sq
26790 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 68  lite3Fts5IndexCh
267a0 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 0a  arlenToBytelen(.
267b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 2c    const char *p,
267c0 20 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 0a   .  int nByte, .
267d0 20 20 69 6e 74 20 6e 43 68 61 72 0a 29 7b 0a 20    int nChar.){. 
267e0 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69 6e   int n = 0;.  in
267f0 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
26800 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20  i<nChar; i++){. 
26810 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79 74 65 20     if( n>=nByte 
26820 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
26830 20 2f 2a 20 49 6e 70 75 74 20 63 6f 6e 74 61 69   /* Input contai
26840 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20 6e 43  ns fewer than nC
26850 68 61 72 20 63 68 61 72 73 20 2a 2f 0a 20 20 20  har chars */.   
26860 20 69 66 28 20 28 75 6e 73 69 67 6e 65 64 20 63   if( (unsigned c
26870 68 61 72 29 70 5b 6e 2b 2b 5d 3e 3d 30 78 63 30  har)p[n++]>=0xc0
26880 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ){.      while(
26890 20 28 70 5b 6e 5d 20 26 20 30 78 63 30 29 3d 3d   (p[n] & 0xc0)==
268a0 30 78 38 30 20 29 20 6e 2b 2b 3b 0a 20 20 20 20  0x80 ) n++;.    
268b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
268c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 49 6e 20 69  ;.}../*.** pIn i
268d0 73 20 61 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  s a UTF-8 encode
268e0 64 20 73 74 72 69 6e 67 2c 20 6e 49 6e 20 62 79  d string, nIn by
268f0 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 52 65 74  tes in size. Ret
26900 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
26910 66 0a 2a 2a 20 75 6e 69 63 6f 64 65 20 63 68 61  f.** unicode cha
26920 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73  racters in the s
26930 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
26940 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 43 68   int fts5IndexCh
26950 61 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  arlen(const char
26960 20 2a 70 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b   *pIn, int nIn){
26970 0a 20 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 30  .  int nChar = 0
26980 3b 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20  ;            .  
26990 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77 68 69  int i = 0;.  whi
269a0 6c 65 28 20 69 3c 6e 49 6e 20 29 7b 0a 20 20 20  le( i<nIn ){.   
269b0 20 69 66 28 20 28 75 6e 73 69 67 6e 65 64 20 63   if( (unsigned c
269c0 68 61 72 29 70 49 6e 5b 69 2b 2b 5d 3e 3d 30 78  har)pIn[i++]>=0x
269d0 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c  c0 ){.      whil
269e0 65 28 20 69 3c 6e 49 6e 20 26 26 20 28 70 49 6e  e( i<nIn && (pIn
269f0 5b 69 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38  [i] & 0xc0)==0x8
26a00 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20  0 ) i++;.    }. 
26a10 20 20 20 6e 43 68 61 72 2b 2b 3b 0a 20 20 7d 0a     nChar++;.  }.
26a20 20 20 72 65 74 75 72 6e 20 6e 43 68 61 72 3b 0a    return nChar;.
26a30 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
26a40 6f 72 20 72 65 6d 6f 76 65 20 64 61 74 61 20 74  or remove data t
26a50 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 69 6e  o or from the in
26a60 64 65 78 2e 20 45 61 63 68 20 74 69 6d 65 20 61  dex. Each time a
26a70 20 64 6f 63 75 6d 65 6e 74 20 69 73 20 0a 2a 2a   document is .**
26a80 20 61 64 64 65 64 20 74 6f 20 6f 72 20 72 65 6d   added to or rem
26a90 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e  oved from the in
26aa0 64 65 78 2c 20 74 68 69 73 20 66 75 6e 63 74 69  dex, this functi
26ab0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 65  on is called one
26ac0 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 74 69 6d 65   or more.** time
26ad0 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  s..**.** For an 
26ae0 69 6e 73 65 72 74 2c 20 69 74 20 6d 75 73 74 20  insert, it must 
26af0 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66  be called once f
26b00 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e  or each token in
26b10 20 74 68 65 20 6e 65 77 20 64 6f 63 75 6d 65 6e   the new documen
26b20 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 65  t..** If the ope
26b30 72 61 74 69 6f 6e 20 69 73 20 61 20 64 65 6c 65  ration is a dele
26b40 74 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63  te, it must be c
26b50 61 6c 6c 65 64 20 28 61 74 20 6c 65 61 73 74 29  alled (at least)
26b60 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 0a 2a   once for each.*
26b70 2a 20 75 6e 69 71 75 65 20 74 6f 6b 65 6e 20 69  * unique token i
26b80 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77  n the document w
26b90 69 74 68 20 61 6e 20 69 43 6f 6c 20 76 61 6c 75  ith an iCol valu
26ba0 65 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  e less than zero
26bb0 2e 20 54 68 65 20 69 50 6f 73 0a 2a 2a 20 61 72  . The iPos.** ar
26bc0 67 75 6d 65 6e 74 20 69 73 20 69 67 6e 6f 72 65  gument is ignore
26bd0 64 20 66 6f 72 20 61 20 64 65 6c 65 74 65 2e 0a  d for a delete..
26be0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
26bf0 73 35 49 6e 64 65 78 57 72 69 74 65 28 0a 20 20  s5IndexWrite(.  
26c00 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
26c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 72 69 74  /* Index to writ
26c30 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 43  e to */.  int iC
26c40 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
26c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
26c60 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70 65 61 72  umn token appear
26c70 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20 64 65 6c  s in (-ve -> del
26c80 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ete) */.  int iP
26c90 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  os,             
26ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
26cb0 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 77  ition of token w
26cc0 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  ithin column */.
26cd0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
26ce0 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e  oken, int nToken
26cf0 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20 61 64    /* Token to ad
26d00 64 20 6f 72 20 72 65 6d 6f 76 65 20 74 6f 20 6f  d or remove to o
26d10 72 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a  r from index */.
26d20 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
26d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d40 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
26d50 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
26d60 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74  indexes */.  int
26d70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26d80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26d90 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
26da0 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
26db0 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
26dc0 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  g;..  assert( p-
26dd0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
26de0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 43 6f  ;.  assert( (iCo
26df0 6c 3c 30 29 3d 3d 70 2d 3e 62 44 65 6c 65 74 65  l<0)==p->bDelete
26e00 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68   );..  /* Add th
26e10 65 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 6d  e entry to the m
26e20 61 69 6e 20 74 65 72 6d 73 20 69 6e 64 65 78 2e  ain terms index.
26e30 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
26e40 65 33 46 74 73 35 48 61 73 68 57 72 69 74 65 28  e3Fts5HashWrite(
26e50 0a 20 20 20 20 20 20 70 2d 3e 70 48 61 73 68 2c  .      p->pHash,
26e60 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 2c   p->iWriteRowid,
26e70 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 46 54 53   iCol, iPos, FTS
26e80 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2c 20 70  5_MAIN_PREFIX, p
26e90 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 0a 20 20  Token, nToken.  
26ea0 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  );..  for(i=0; i
26eb0 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69  <pConfig->nPrefi
26ec0 78 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  x && rc==SQLITE_
26ed0 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  OK; i++){.    co
26ee0 6e 73 74 20 69 6e 74 20 6e 43 68 61 72 20 3d 20  nst int nChar = 
26ef0 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78  pConfig->aPrefix
26f00 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79  [i];.    int nBy
26f10 74 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  te = sqlite3Fts5
26f20 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79  IndexCharlenToBy
26f30 74 65 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54  telen(pToken, nT
26f40 6f 6b 65 6e 2c 20 6e 43 68 61 72 29 3b 0a 20 20  oken, nChar);.  
26f50 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20    if( nByte ){. 
26f60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26f70 33 46 74 73 35 48 61 73 68 57 72 69 74 65 28 70  3Fts5HashWrite(p
26f80 2d 3e 70 48 61 73 68 2c 20 0a 20 20 20 20 20 20  ->pHash, .      
26f90 20 20 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77      p->iWriteRow
26fa0 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20  id, iCol, iPos, 
26fb0 28 63 68 61 72 29 28 46 54 53 35 5f 4d 41 49 4e  (char)(FTS5_MAIN
26fc0 5f 50 52 45 46 49 58 2b 69 2b 31 29 2c 20 70 54  _PREFIX+i+1), pT
26fd0 6f 6b 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  oken,.          
26fe0 6e 42 79 74 65 0a 20 20 20 20 20 20 29 3b 0a 20  nByte.      );. 
26ff0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
27000 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27010 4f 70 65 6e 20 61 20 6e 65 77 20 69 74 65 72 61  Open a new itera
27020 74 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74  tor to iterate t
27030 68 6f 75 67 68 20 61 6c 6c 20 72 6f 77 69 64 20  hough all rowid 
27040 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 0a  that match the .
27050 2a 2a 20 73 70 65 63 69 66 69 65 64 20 74 6f 6b  ** specified tok
27060 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66  en or token pref
27070 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ix..*/.int sqlit
27080 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79  e3Fts5IndexQuery
27090 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
270a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
270b0 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78      /* FTS index
270c0 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 63   to query */.  c
270d0 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65  onst char *pToke
270e0 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f  n, int nToken, /
270f0 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72 65 66  * Token (or pref
27100 69 78 29 20 74 6f 20 71 75 65 72 79 20 66 6f 72  ix) to query for
27110 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
27120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27130 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
27140 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
27150 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74  _X flags */.  Ft
27160 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65  s5Colset *pColse
27170 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
27180 20 4d 61 74 63 68 20 74 68 65 73 65 20 63 6f 6c   Match these col
27190 75 6d 6e 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 46  umns only */.  F
271a0 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 2a 70  ts5IndexIter **p
271b0 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 2f  pIter          /
271c0 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65 72 61  * OUT: New itera
271d0 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  tor object */.){
271e0 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
271f0 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
27200 66 69 67 3b 0a 20 20 46 74 73 35 49 74 65 72 20  fig;.  Fts5Iter 
27210 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 46 74 73  *pRet = 0;.  Fts
27220 35 42 75 66 66 65 72 20 62 75 66 20 3d 20 7b 30  5Buffer buf = {0
27230 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 2f 2a 20 49  , 0, 0};..  /* I
27240 66 20 74 68 65 20 51 55 45 52 59 5f 53 43 41 4e  f the QUERY_SCAN
27250 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6c   flag is set, al
27260 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 20 6d 75  l other flags mu
27270 73 74 20 62 65 20 63 6c 65 61 72 2e 20 2a 2f 0a  st be clear. */.
27280 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
27290 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
272a0 52 59 5f 53 43 41 4e 29 3d 3d 30 20 7c 7c 20 66  RY_SCAN)==0 || f
272b0 6c 61 67 73 3d 3d 46 54 53 35 49 4e 44 45 58 5f  lags==FTS5INDEX_
272c0 51 55 45 52 59 5f 53 43 41 4e 20 29 3b 0a 0a 20  QUERY_SCAN );.. 
272d0 20 69 66 28 20 73 71 6c 69 74 65 33 46 74 73 35   if( sqlite3Fts5
272e0 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72  BufferSize(&p->r
272f0 63 2c 20 26 62 75 66 2c 20 6e 54 6f 6b 65 6e 2b  c, &buf, nToken+
27300 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  1)==0 ){.    int
27310 20 69 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20   iIdx = 0;      
27320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
27330 64 65 78 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  dex to search */
27340 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 62 75 66  .    memcpy(&buf
27350 2e 70 5b 31 5d 2c 20 70 54 6f 6b 65 6e 2c 20 6e  .p[1], pToken, n
27360 54 6f 6b 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20  Token);..    /* 
27370 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
27380 20 69 6e 64 65 78 20 74 6f 20 73 65 61 72 63 68   index to search
27390 20 61 6e 64 20 73 65 74 20 69 49 64 78 20 61 63   and set iIdx ac
273a0 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 74 68  cordingly. If th
273b0 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 70  is.    ** is a p
273c0 72 65 66 69 78 20 71 75 65 72 79 20 66 6f 72 20  refix query for 
273d0 77 68 69 63 68 20 74 68 65 72 65 20 69 73 20 6e  which there is n
273e0 6f 20 70 72 65 66 69 78 20 69 6e 64 65 78 2c 20  o prefix index, 
273f0 73 65 74 20 69 49 64 78 20 74 6f 0a 20 20 20 20  set iIdx to.    
27400 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
27410 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
27420 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
27430 74 20 74 68 65 20 71 75 65 72 79 20 77 69 6c 6c  t the query will
27440 20 62 65 0a 20 20 20 20 2a 2a 20 73 61 74 69 73   be.    ** satis
27450 66 69 65 64 20 62 79 20 73 63 61 6e 6e 69 6e 67  fied by scanning
27460 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20   multiple terms 
27470 69 6e 20 74 68 65 20 6d 61 69 6e 20 69 6e 64 65  in the main inde
27480 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
27490 20 49 66 20 74 68 65 20 51 55 45 52 59 5f 54 45   If the QUERY_TE
274a0 53 54 5f 4e 4f 49 44 58 20 66 6c 61 67 20 77 61  ST_NOIDX flag wa
274b0 73 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65  s specified, the
274c0 6e 20 74 68 69 73 20 6d 75 73 74 20 62 65 20 61  n this must be a
274d0 0a 20 20 20 20 2a 2a 20 70 72 65 66 69 78 2d 71  .    ** prefix-q
274e0 75 65 72 79 2e 20 49 6e 73 74 65 61 64 20 6f 66  uery. Instead of
274f0 20 75 73 69 6e 67 20 61 20 70 72 65 66 69 78 2d   using a prefix-
27500 69 6e 64 65 78 20 28 69 66 20 6f 6e 65 20 65 78  index (if one ex
27510 69 73 74 73 29 2c 20 0a 20 20 20 20 2a 2a 20 65  ists), .    ** e
27520 76 61 6c 75 61 74 65 20 74 68 65 20 70 72 65 66  valuate the pref
27530 69 78 20 71 75 65 72 79 20 75 73 69 6e 67 20 74  ix query using t
27540 68 65 20 6d 61 69 6e 20 46 54 53 20 69 6e 64 65  he main FTS inde
27550 78 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 0a  x. This is used.
27560 20 20 20 20 2a 2a 20 66 6f 72 20 69 6e 74 65 72      ** for inter
27570 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b  nal sanity check
27580 69 6e 67 20 62 79 20 74 68 65 20 69 6e 74 65 67  ing by the integ
27590 72 69 74 79 2d 63 68 65 63 6b 20 69 6e 20 64 65  rity-check in de
275a0 62 75 67 20 0a 20 20 20 20 2a 2a 20 6d 6f 64 65  bug .    ** mode
275b0 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 23 69 66 64 65   only.  */.#ifde
275c0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
275d0 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e     if( pConfig->
275e0 62 50 72 65 66 69 78 49 6e 64 65 78 3d 3d 30 20  bPrefixIndex==0 
275f0 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35  || (flags & FTS5
27600 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54  INDEX_QUERY_TEST
27610 5f 4e 4f 49 44 58 29 20 29 7b 0a 20 20 20 20 20  _NOIDX) ){.     
27620 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 20 26   assert( flags &
27630 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
27640 5f 50 52 45 46 49 58 20 29 3b 0a 20 20 20 20 20  _PREFIX );.     
27650 20 69 49 64 78 20 3d 20 31 2b 70 43 6f 6e 66 69   iIdx = 1+pConfi
27660 67 2d 3e 6e 50 72 65 66 69 78 3b 0a 20 20 20 20  g->nPrefix;.    
27670 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
27680 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53   if( flags & FTS
27690 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45  5INDEX_QUERY_PRE
276a0 46 49 58 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  FIX ){.      int
276b0 20 6e 43 68 61 72 20 3d 20 66 74 73 35 49 6e 64   nChar = fts5Ind
276c0 65 78 43 68 61 72 6c 65 6e 28 70 54 6f 6b 65 6e  exCharlen(pToken
276d0 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  , nToken);.     
276e0 20 66 6f 72 28 69 49 64 78 3d 31 3b 20 69 49 64   for(iIdx=1; iId
276f0 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65  x<=pConfig->nPre
27700 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20  fix; iIdx++){.  
27710 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69        if( pConfi
27720 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64 78 2d  g->aPrefix[iIdx-
27730 31 5d 3d 3d 6e 43 68 61 72 20 29 20 62 72 65 61  1]==nChar ) brea
27740 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
27750 0a 0a 20 20 20 20 69 66 28 20 69 49 64 78 3c 3d  ..    if( iIdx<=
27760 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
27770 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 74 72   ){.      /* Str
27780 61 69 67 68 74 20 69 6e 64 65 78 20 6c 6f 6f 6b  aight index look
27790 75 70 20 2a 2f 0a 20 20 20 20 20 20 46 74 73 35  up */.      Fts5
277a0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
277b0 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  ct = fts5Structu
277c0 72 65 52 65 61 64 28 70 29 3b 0a 20 20 20 20 20  reRead(p);.     
277d0 20 62 75 66 2e 70 5b 30 5d 20 3d 20 28 75 38 29   buf.p[0] = (u8)
277e0 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49  (FTS5_MAIN_PREFI
277f0 58 20 2b 20 69 49 64 78 29 3b 0a 20 20 20 20 20  X + iIdx);.     
27800 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a   if( pStruct ){.
27810 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
27820 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72  iIterNew(p, pStr
27830 75 63 74 2c 20 66 6c 61 67 73 20 7c 20 46 54 53  uct, flags | FTS
27840 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b 49  5INDEX_QUERY_SKI
27850 50 45 4d 50 54 59 2c 20 0a 20 20 20 20 20 20 20  PEMPTY, .       
27860 20 20 20 20 20 70 43 6f 6c 73 65 74 2c 20 62 75       pColset, bu
27870 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20 2d  f.p, nToken+1, -
27880 31 2c 20 30 2c 20 26 70 52 65 74 0a 20 20 20 20  1, 0, &pRet.    
27890 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 66      );.        f
278a0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
278b0 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
278c0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
278d0 0a 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 6d  .      /* Scan m
278e0 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e  ultiple terms in
278f0 20 74 68 65 20 6d 61 69 6e 20 69 6e 64 65 78 20   the main index 
27900 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65  */.      int bDe
27910 73 63 20 3d 20 28 66 6c 61 67 73 20 26 20 46 54  sc = (flags & FT
27920 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
27930 53 43 29 21 3d 30 3b 0a 20 20 20 20 20 20 62 75  SC)!=0;.      bu
27940 66 2e 70 5b 30 5d 20 3d 20 46 54 53 35 5f 4d 41  f.p[0] = FTS5_MA
27950 49 4e 5f 50 52 45 46 49 58 3b 0a 20 20 20 20 20  IN_PREFIX;.     
27960 20 66 74 73 35 53 65 74 75 70 50 72 65 66 69 78   fts5SetupPrefix
27970 49 74 65 72 28 70 2c 20 62 44 65 73 63 2c 20 62  Iter(p, bDesc, b
27980 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20  uf.p, nToken+1, 
27990 70 43 6f 6c 73 65 74 2c 20 26 70 52 65 74 29 3b  pColset, &pRet);
279a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
279b0 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
279c0 7c 7c 20 70 52 65 74 2d 3e 70 43 6f 6c 73 65 74  || pRet->pColset
279d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 74 73  ==0 );.      fts
279e0 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 43 62  5IterSetOutputCb
279f0 28 26 70 2d 3e 72 63 2c 20 70 52 65 74 29 3b 0a  (&p->rc, pRet);.
27a00 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
27a10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27a20 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
27a30 72 20 2a 70 53 65 67 20 3d 20 26 70 52 65 74 2d  r *pSeg = &pRet-
27a40 3e 61 53 65 67 5b 70 52 65 74 2d 3e 61 46 69 72  >aSeg[pRet->aFir
27a50 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20  st[1].iFirst];. 
27a60 20 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d         if( pSeg-
27a70 3e 70 4c 65 61 66 20 29 20 70 52 65 74 2d 3e 78  >pLeaf ) pRet->x
27a80 53 65 74 4f 75 74 70 75 74 73 28 70 52 65 74 2c  SetOutputs(pRet,
27a90 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a   pSeg);.      }.
27aa0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
27ab0 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71  ->rc ){.      sq
27ac0 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f  lite3Fts5IterClo
27ad0 73 65 28 26 70 52 65 74 2d 3e 62 61 73 65 29 3b  se(&pRet->base);
27ae0 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b  .      pRet = 0;
27af0 0a 20 20 20 20 20 20 66 74 73 35 43 6c 6f 73 65  .      fts5Close
27b00 52 65 61 64 65 72 28 70 29 3b 0a 20 20 20 20 7d  Reader(p);.    }
27b10 0a 0a 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20  ..    *ppIter = 
27b20 26 70 52 65 74 2d 3e 62 61 73 65 3b 0a 20 20 20  &pRet->base;.   
27b30 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
27b40 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 20 20  erFree(&buf);.  
27b50 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  }.  return fts5I
27b60 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
27b70 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
27b80 72 75 65 20 69 66 20 74 68 65 20 69 74 65 72 61  rue if the itera
27b90 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
27ba0 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
27bb0 69 73 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a 2f 2a  is at EOF..*/./*
27bc0 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20  .** Move to the 
27bd0 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72 6f  next matching ro
27be0 77 69 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wid. .*/.int sql
27bf0 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74  ite3Fts5IterNext
27c00 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
27c10 70 49 6e 64 65 78 49 74 65 72 29 7b 0a 20 20 46  pIndexIter){.  F
27c20 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 20 3d  ts5Iter *pIter =
27c30 20 28 46 74 73 35 49 74 65 72 2a 29 70 49 6e 64   (Fts5Iter*)pInd
27c40 65 78 49 74 65 72 3b 0a 20 20 61 73 73 65 72 74  exIter;.  assert
27c50 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d  ( pIter->pIndex-
27c60 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
27c70 3b 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65  ;.  fts5MultiIte
27c80 72 4e 65 78 74 28 70 49 74 65 72 2d 3e 70 49 6e  rNext(pIter->pIn
27c90 64 65 78 2c 20 70 49 74 65 72 2c 20 30 2c 20 30  dex, pIter, 0, 0
27ca0 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
27cb0 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65  IndexReturn(pIte
27cc0 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f  r->pIndex);.}../
27cd0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65  *.** Move to the
27ce0 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 74   next matching t
27cf0 65 72 6d 2f 72 6f 77 69 64 2e 20 55 73 65 64 20  erm/rowid. Used 
27d00 62 79 20 74 68 65 20 66 74 73 35 76 6f 63 61 62  by the fts5vocab
27d10 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   module..*/.int 
27d20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
27d30 65 78 74 53 63 61 6e 28 46 74 73 35 49 6e 64 65  extScan(Fts5Inde
27d40 78 49 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65  xIter *pIndexIte
27d50 72 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a  r){.  Fts5Iter *
27d60 70 49 74 65 72 20 3d 20 28 46 74 73 35 49 74 65  pIter = (Fts5Ite
27d70 72 2a 29 70 49 6e 64 65 78 49 74 65 72 3b 0a 20  r*)pIndexIter;. 
27d80 20 46 74 73 35 49 6e 64 65 78 20 2a 70 20 3d 20   Fts5Index *p = 
27d90 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 0a  pIter->pIndex;..
27da0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
27db0 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c  >pIndex->rc==SQL
27dc0 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 66 74 73  ITE_OK );..  fts
27dd0 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
27de0 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29 3b 0a  , pIter, 0, 0);.
27df0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
27e00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
27e10 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
27e20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  = &pIter->aSeg[ 
27e30 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
27e40 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 69  .iFirst ];.    i
27e50 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 26  f( pSeg->pLeaf &
27e60 26 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 5b 30  & pSeg->term.p[0
27e70 5d 21 3d 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45  ]!=FTS5_MAIN_PRE
27e80 46 49 58 20 29 7b 0a 20 20 20 20 20 20 66 74 73  FIX ){.      fts
27e90 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 53 65  5DataRelease(pSe
27ea0 67 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  g->pLeaf);.     
27eb0 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 3d 20 30   pSeg->pLeaf = 0
27ec0 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62  ;.      pIter->b
27ed0 61 73 65 2e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  ase.bEof = 1;.  
27ee0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
27ef0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
27f00 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29  n(pIter->pIndex)
27f10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
27f20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63  to the next matc
27f30 68 69 6e 67 20 72 6f 77 69 64 20 74 68 61 74 20  hing rowid that 
27f40 6f 63 63 75 72 73 20 61 74 20 6f 72 20 61 66 74  occurs at or aft
27f50 65 72 20 69 4d 61 74 63 68 2e 20 54 68 65 0a 2a  er iMatch. The.*
27f60 2a 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20  * definition of 
27f70 22 61 74 20 6f 72 20 61 66 74 65 72 22 20 64 65  "at or after" de
27f80 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72  pends on whether
27f90 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20 69   this iterator i
27fa0 74 65 72 61 74 65 73 0a 2a 2a 20 69 6e 20 61 73  terates.** in as
27fb0 63 65 6e 64 69 6e 67 20 6f 72 20 64 65 73 63 65  cending or desce
27fc0 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65  nding rowid orde
27fd0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
27fe0 33 46 74 73 35 49 74 65 72 4e 65 78 74 46 72 6f  3Fts5IterNextFro
27ff0 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  m(Fts5IndexIter 
28000 2a 70 49 6e 64 65 78 49 74 65 72 2c 20 69 36 34  *pIndexIter, i64
28010 20 69 4d 61 74 63 68 29 7b 0a 20 20 46 74 73 35   iMatch){.  Fts5
28020 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 28 46  Iter *pIter = (F
28030 74 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49  ts5Iter*)pIndexI
28040 74 65 72 3b 0a 20 20 66 74 73 35 4d 75 6c 74 69  ter;.  fts5Multi
28050 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 49 74  IterNextFrom(pIt
28060 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65  er->pIndex, pIte
28070 72 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 72 65  r, iMatch);.  re
28080 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
28090 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64  turn(pIter->pInd
280a0 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ex);.}../*.** Re
280b0 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
280c0 20 74 65 72 6d 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   term..*/.const 
280d0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 46 74 73  char *sqlite3Fts
280e0 35 49 74 65 72 54 65 72 6d 28 46 74 73 35 49 6e  5IterTerm(Fts5In
280f0 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65 78 49  dexIter *pIndexI
28100 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20  ter, int *pn){. 
28110 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20   int n;.  const 
28120 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74  char *z = (const
28130 20 63 68 61 72 2a 29 66 74 73 35 4d 75 6c 74 69   char*)fts5Multi
28140 49 74 65 72 54 65 72 6d 28 28 46 74 73 35 49 74  IterTerm((Fts5It
28150 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72 2c 20  er*)pIndexIter, 
28160 26 6e 29 3b 0a 20 20 2a 70 6e 20 3d 20 6e 2d 31  &n);.  *pn = n-1
28170 3b 0a 20 20 72 65 74 75 72 6e 20 26 7a 5b 31 5d  ;.  return &z[1]
28180 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
28190 20 61 6e 20 69 74 65 72 61 74 6f 72 20 6f 70 65   an iterator ope
281a0 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
281b0 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
281c0 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28  3Fts5IndexQuery(
281d0 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
281e0 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28  e3Fts5IterClose(
281f0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
28200 49 6e 64 65 78 49 74 65 72 29 7b 0a 20 20 69 66  IndexIter){.  if
28210 28 20 70 49 6e 64 65 78 49 74 65 72 20 29 7b 0a  ( pIndexIter ){.
28220 20 20 20 20 46 74 73 35 49 74 65 72 20 2a 70 49      Fts5Iter *pI
28230 74 65 72 20 3d 20 28 46 74 73 35 49 74 65 72 2a  ter = (Fts5Iter*
28240 29 70 49 6e 64 65 78 49 74 65 72 3b 0a 20 20 20  )pIndexIter;.   
28250 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49 6e 64   Fts5Index *pInd
28260 65 78 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64  ex = pIter->pInd
28270 65 78 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74  ex;.    fts5Mult
28280 69 49 74 65 72 46 72 65 65 28 70 49 74 65 72 29  iIterFree(pIter)
28290 3b 0a 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52  ;.    fts5CloseR
282a0 65 61 64 65 72 28 70 49 6e 64 65 78 29 3b 0a 20  eader(pIndex);. 
282b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64   }.}../*.** Read
282c0 20 61 6e 64 20 64 65 63 6f 64 65 20 74 68 65 20   and decode the 
282d0 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72  "averages" recor
282e0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
282f0 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 50 61 72 61  ase. .**.** Para
28300 6d 65 74 65 72 20 61 6e 53 69 7a 65 20 6d 75 73  meter anSize mus
28310 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 72  t point to an ar
28320 72 61 79 20 6f 66 20 73 69 7a 65 20 6e 43 6f 6c  ray of size nCol
28330 2c 20 77 68 65 72 65 20 6e 43 6f 6c 20 69 73 0a  , where nCol is.
28340 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
28350 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 6f   user defined co
28360 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 46 54 53  lumns in the FTS
28370 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73   table..*/.int s
28380 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 47  qlite3Fts5IndexG
28390 65 74 41 76 65 72 61 67 65 73 28 46 74 73 35 49  etAverages(Fts5I
283a0 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 2a 70 6e  ndex *p, i64 *pn
283b0 52 6f 77 2c 20 69 36 34 20 2a 61 6e 53 69 7a 65  Row, i64 *anSize
283c0 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  ){.  int nCol = 
283d0 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c  p->pConfig->nCol
283e0 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  ;.  Fts5Data *pD
283f0 61 74 61 3b 0a 0a 20 20 2a 70 6e 52 6f 77 20 3d  ata;..  *pnRow =
28400 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 61 6e 53   0;.  memset(anS
28410 69 7a 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  ize, 0, sizeof(i
28420 36 34 29 20 2a 20 6e 43 6f 6c 29 3b 0a 20 20 70  64) * nCol);.  p
28430 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
28440 65 61 64 28 70 2c 20 46 54 53 35 5f 41 56 45 52  ead(p, FTS5_AVER
28450 41 47 45 53 5f 52 4f 57 49 44 29 3b 0a 20 20 69  AGES_ROWID);.  i
28460 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
28470 5f 4f 4b 20 26 26 20 70 44 61 74 61 2d 3e 6e 6e  _OK && pData->nn
28480 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   ){.    int i = 
28490 30 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b  0;.    int iCol;
284a0 0a 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65  .    i += fts5Ge
284b0 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e  tVarint(&pData->
284c0 70 5b 69 5d 2c 20 28 75 36 34 2a 29 70 6e 52 6f  p[i], (u64*)pnRo
284d0 77 29 3b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c  w);.    for(iCol
284e0 3d 30 3b 20 69 3c 70 44 61 74 61 2d 3e 6e 6e 20  =0; i<pData->nn 
284f0 26 26 20 69 43 6f 6c 3c 6e 43 6f 6c 3b 20 69 43  && iCol<nCol; iC
28500 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 20 2b  ol++){.      i +
28510 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
28520 26 70 44 61 74 61 2d 3e 70 5b 69 5d 2c 20 28 75  &pData->p[i], (u
28530 36 34 2a 29 26 61 6e 53 69 7a 65 5b 69 43 6f 6c  64*)&anSize[iCol
28540 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ]);.    }.  }.. 
28550 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
28560 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
28570 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
28580 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n(p);.}../*.** R
28590 65 70 6c 61 63 65 20 74 68 65 20 63 75 72 72 65  eplace the curre
285a0 6e 74 20 22 61 76 65 72 61 67 65 73 22 20 72 65  nt "averages" re
285b0 63 6f 72 64 20 77 69 74 68 20 74 68 65 20 63 6f  cord with the co
285c0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 75  ntents of the bu
285d0 66 66 65 72 20 0a 2a 2a 20 73 75 70 70 6c 69 65  ffer .** supplie
285e0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
285f0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
28600 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
28610 78 53 65 74 41 76 65 72 61 67 65 73 28 46 74 73  xSetAverages(Fts
28620 35 49 6e 64 65 78 20 2a 70 2c 20 63 6f 6e 73 74  5Index *p, const
28630 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20   u8 *pData, int 
28640 6e 44 61 74 61 29 7b 0a 20 20 61 73 73 65 72 74  nData){.  assert
28650 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
28660 4f 4b 20 29 3b 0a 20 20 66 74 73 35 44 61 74 61  OK );.  fts5Data
28670 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f 41 56  Write(p, FTS5_AV
28680 45 52 41 47 45 53 5f 52 4f 57 49 44 2c 20 70 44  ERAGES_ROWID, pD
28690 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 72  ata, nData);.  r
286a0 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
286b0 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
286c0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
286d0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 6c  tal number of bl
286e0 6f 63 6b 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  ocks this module
286f0 20 68 61 73 20 72 65 61 64 20 66 72 6f 6d 20 74   has read from t
28700 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62  he %_data.** tab
28710 6c 65 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  le since it was 
28720 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  created..*/.int 
28730 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
28740 52 65 61 64 73 28 46 74 73 35 49 6e 64 65 78 20  Reads(Fts5Index 
28750 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
28760 3e 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >nRead;.}../*.**
28770 20 53 65 74 20 74 68 65 20 33 32 2d 62 69 74 20   Set the 32-bit 
28780 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 73 74 6f  cookie value sto
28790 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  red at the start
287a0 20 6f 66 20 61 6c 6c 20 73 74 72 75 63 74 75 72   of all structur
287b0 65 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 6f  e .** records to
287c0 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   the value passe
287d0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
287e0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
287f0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
28800 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
28810 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
28820 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72  or code if an er
28830 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a  ror.** occurs..*
28840 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
28850 35 49 6e 64 65 78 53 65 74 43 6f 6f 6b 69 65 28  5IndexSetCookie(
28860 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
28870 74 20 69 4e 65 77 29 7b 0a 20 20 69 6e 74 20 72  t iNew){.  int r
28880 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
28890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288a0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
288b0 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  /.  Fts5Config *
288c0 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
288d0 6e 66 69 67 3b 20 20 20 20 2f 2a 20 43 6f 6e 66  nfig;    /* Conf
288e0 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74  iguration object
288f0 20 2a 2f 0a 20 20 75 38 20 61 43 6f 6f 6b 69 65   */.  u8 aCookie
28900 5b 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [4];            
28910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
28920 6e 61 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  nary representat
28930 69 6f 6e 20 6f 66 20 69 4e 65 77 20 2a 2f 0a 20  ion of iNew */. 
28940 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
28950 42 6c 6f 62 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Blob = 0;..  ass
28960 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
28970 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74  TE_OK );.  sqlit
28980 65 33 46 74 73 35 50 75 74 33 32 28 61 43 6f 6f  e3Fts5Put32(aCoo
28990 6b 69 65 2c 20 69 4e 65 77 29 3b 0a 0a 20 20 72  kie, iNew);..  r
289a0 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
289b0 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67 2d 3e 64  _open(pConfig->d
289c0 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c  b, pConfig->zDb,
289d0 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 0a 20   p->zDataTbl, . 
289e0 20 20 20 20 20 22 62 6c 6f 63 6b 22 2c 20 46 54       "block", FT
289f0 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57  S5_STRUCTURE_ROW
28a00 49 44 2c 20 31 2c 20 26 70 42 6c 6f 62 0a 20 20  ID, 1, &pBlob.  
28a10 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
28a20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
28a30 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65  lite3_blob_write
28a40 28 70 42 6c 6f 62 2c 20 61 43 6f 6f 6b 69 65 2c  (pBlob, aCookie,
28a50 20 34 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d   4, 0);.    rc =
28a60 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c   sqlite3_blob_cl
28a70 6f 73 65 28 70 42 6c 6f 62 29 3b 0a 20 20 7d 0a  ose(pBlob);.  }.
28a80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28a90 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
28aa0 49 6e 64 65 78 4c 6f 61 64 43 6f 6e 66 69 67 28  IndexLoadConfig(
28ab0 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
28ac0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
28ad0 70 53 74 72 75 63 74 3b 0a 20 20 70 53 74 72 75  pStruct;.  pStru
28ae0 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  ct = fts5Structu
28af0 72 65 52 65 61 64 28 70 29 3b 0a 20 20 66 74 73  reRead(p);.  fts
28b00 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
28b10 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 72 65  e(pStruct);.  re
28b20 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
28b30 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 2a  turn(p);.}.../**
28b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28b80 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
28b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28bd0 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68 69 73  **.** Below this
28be0 20 70 6f 69 6e 74 20 69 73 20 74 68 65 20 69 6d   point is the im
28bf0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
28c00 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68  the integrity-ch
28c10 65 63 6b 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  eck .** function
28c20 61 6c 69 74 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ality..*/../*.**
28c30 20 52 65 74 75 72 6e 20 61 20 73 69 6d 70 6c 65   Return a simple
28c40 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   checksum value 
28c50 62 61 73 65 64 20 6f 6e 20 74 68 65 20 61 72 67  based on the arg
28c60 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36 34 20 73  uments..*/.u64 s
28c70 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45  qlite3Fts5IndexE
28c80 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20 69 36 34  ntryCksum(.  i64
28c90 20 69 52 6f 77 69 64 2c 20 0a 20 20 69 6e 74 20   iRowid, .  int 
28ca0 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20 69 50 6f  iCol, .  int iPo
28cb0 73 2c 20 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a  s, .  int iIdx,.
28cc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
28cd0 65 72 6d 2c 0a 20 20 69 6e 74 20 6e 54 65 72 6d  erm,.  int nTerm
28ce0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  .){.  int i;.  u
28cf0 36 34 20 72 65 74 20 3d 20 69 52 6f 77 69 64 3b  64 ret = iRowid;
28d00 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c  .  ret += (ret<<
28d10 33 29 20 2b 20 69 43 6f 6c 3b 0a 20 20 72 65 74  3) + iCol;.  ret
28d20 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69   += (ret<<3) + i
28d30 50 6f 73 3b 0a 20 20 69 66 28 20 69 49 64 78 3e  Pos;.  if( iIdx>
28d40 3d 30 20 29 20 72 65 74 20 2b 3d 20 28 72 65 74  =0 ) ret += (ret
28d50 3c 3c 33 29 20 2b 20 28 46 54 53 35 5f 4d 41 49  <<3) + (FTS5_MAI
28d60 4e 5f 50 52 45 46 49 58 20 2b 20 69 49 64 78 29  N_PREFIX + iIdx)
28d70 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
28d80 54 65 72 6d 3b 20 69 2b 2b 29 20 72 65 74 20 2b  Term; i++) ret +
28d90 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 70 54 65  = (ret<<3) + pTe
28da0 72 6d 5b 69 5d 3b 0a 20 20 72 65 74 75 72 6e 20  rm[i];.  return 
28db0 72 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  ret;.}..#ifdef S
28dc0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
28dd0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
28de0 69 73 20 70 75 72 65 6c 79 20 61 6e 20 69 6e 74  is purely an int
28df0 65 72 6e 61 6c 20 74 65 73 74 2e 20 49 74 20 64  ernal test. It d
28e00 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75  oes not contribu
28e10 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53 20 66 75  te to .** FTS fu
28e20 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20 6f 72 20  nctionality, or 
28e30 65 76 65 6e 20 74 68 65 20 69 6e 74 65 67 72 69  even the integri
28e40 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20 61 6e 79  ty-check, in any
28e50 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74   way..**.** Inst
28e60 65 61 64 2c 20 69 74 20 74 65 73 74 73 20 74 68  ead, it tests th
28e70 61 74 20 74 68 65 20 73 61 6d 65 20 73 65 74 20  at the same set 
28e80 6f 66 20 70 67 6e 6f 2f 72 6f 77 69 64 20 63 6f  of pgno/rowid co
28e90 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 0a  mbinations are .
28ea0 2a 2a 20 76 69 73 69 74 65 64 20 72 65 67 61 72  ** visited regar
28eb0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
28ec0 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64   the doclist-ind
28ed0 65 78 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ex identified by
28ee0 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2a 20 69   parameters.** i
28ef0 53 65 67 69 64 2f 69 4c 65 61 66 20 69 73 20 69  Segid/iLeaf is i
28f00 74 65 72 61 74 65 64 20 69 6e 20 66 6f 72 77 61  terated in forwa
28f10 72 64 73 20 6f 72 20 72 65 76 65 72 73 65 20 6f  rds or reverse o
28f20 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
28f30 76 6f 69 64 20 66 74 73 35 54 65 73 74 44 6c 69  void fts5TestDli
28f40 64 78 52 65 76 65 72 73 65 28 0a 20 20 46 74 73  dxReverse(.  Fts
28f50 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 69 6e  5Index *p, .  in
28f60 74 20 69 53 65 67 69 64 2c 20 20 20 20 20 20 20  t iSegid,       
28f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28f80 20 53 65 67 6d 65 6e 74 20 69 64 20 74 6f 20 6c   Segment id to l
28f90 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  oad from */.  in
28fa0 74 20 69 4c 65 61 66 20 20 20 20 20 20 20 20 20  t iLeaf         
28fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28fc0 20 4c 6f 61 64 20 64 6f 63 6c 69 73 74 2d 69 6e   Load doclist-in
28fd0 64 65 78 20 66 6f 72 20 74 68 69 73 20 6c 65 61  dex for this lea
28fe0 66 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c  f */.){.  Fts5Dl
28ff0 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20  idxIter *pDlidx 
29000 3d 20 30 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d  = 0;.  u64 cksum
29010 31 20 3d 20 31 33 3b 0a 20 20 75 36 34 20 63 6b  1 = 13;.  u64 ck
29020 73 75 6d 32 20 3d 20 31 33 3b 0a 0a 20 20 66 6f  sum2 = 13;..  fo
29030 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69  r(pDlidx=fts5Dli
29040 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 30 2c  dxIterInit(p, 0,
29050 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 29 3b   iSegid, iLeaf);
29060 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
29070 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
29080 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73  x)==0;.      fts
29090 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70  5DlidxIterNext(p
290a0 2c 20 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20  , pDlidx).  ){. 
290b0 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
290c0 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77  fts5DlidxIterRow
290d0 69 64 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  id(pDlidx);.    
290e0 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73 35 44  int pgno = fts5D
290f0 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
29100 69 64 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74  idx);.    assert
29110 28 20 70 67 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a  ( pgno>iLeaf );.
29120 20 20 20 20 63 6b 73 75 6d 31 20 2b 3d 20 69 52      cksum1 += iR
29130 6f 77 69 64 20 2b 20 28 28 69 36 34 29 70 67 6e  owid + ((i64)pgn
29140 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20 20 66 74  o<<32);.  }.  ft
29150 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
29160 70 44 6c 69 64 78 29 3b 0a 20 20 70 44 6c 69 64  pDlidx);.  pDlid
29170 78 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 70 44  x = 0;..  for(pD
29180 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74  lidx=fts5DlidxIt
29190 65 72 49 6e 69 74 28 70 2c 20 31 2c 20 69 53 65  erInit(p, 1, iSe
291a0 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20  gid, iLeaf);.   
291b0 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
291c0 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d  Eof(p, pDlidx)==
291d0 30 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  0;.      fts5Dli
291e0 64 78 49 74 65 72 50 72 65 76 28 70 2c 20 70 44  dxIterPrev(p, pD
291f0 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20 20 20 69  lidx).  ){.    i
29200 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35  64 iRowid = fts5
29210 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70  DlidxIterRowid(p
29220 44 6c 69 64 78 29 3b 0a 20 20 20 20 69 6e 74 20  Dlidx);.    int 
29230 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78  pgno = fts5Dlidx
29240 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
29250 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 74  ;.    assert( ft
29260 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
29270 70 44 6c 69 64 78 29 3e 69 4c 65 61 66 20 29 3b  pDlidx)>iLeaf );
29280 0a 20 20 20 20 63 6b 73 75 6d 32 20 2b 3d 20 69  .    cksum2 += i
29290 52 6f 77 69 64 20 2b 20 28 28 69 36 34 29 70 67  Rowid + ((i64)pg
292a0 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20 20 66  no<<32);.  }.  f
292b0 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
292c0 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44 6c 69  (pDlidx);.  pDli
292d0 64 78 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  dx = 0;..  if( p
292e0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
292f0 26 26 20 63 6b 73 75 6d 31 21 3d 63 6b 73 75 6d  && cksum1!=cksum
29300 32 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  2 ) p->rc = FTS5
29310 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 0a 73 74 61  _CORRUPT;.}..sta
29320 74 69 63 20 69 6e 74 20 66 74 73 35 51 75 65 72  tic int fts5Quer
29330 79 43 6b 73 75 6d 28 0a 20 20 46 74 73 35 49 6e  yCksum(.  Fts5In
29340 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
29350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73            /* Fts
29360 35 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  5 index object *
29370 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a 20 20  /.  int iIdx,.  
29380 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 20  const char *z,  
29390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293a0 2f 2a 20 49 6e 64 65 78 20 6b 65 79 20 74 6f 20  /* Index key to 
293b0 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69  query for */.  i
293c0 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
293d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
293e0 2a 20 53 69 7a 65 20 6f 66 20 69 6e 64 65 78 20  * Size of index 
293f0 6b 65 79 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  key in bytes */.
29400 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
29410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29420 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 46    /* Flags for F
29430 74 73 35 49 6e 64 65 78 51 75 65 72 79 20 2a 2f  ts5IndexQuery */
29440 0a 20 20 75 36 34 20 2a 70 43 6b 73 75 6d 20 20  .  u64 *pCksum  
29450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29460 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 68     /* IN/OUT: Ch
29470 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 2a 2f 0a  ecksum value */.
29480 29 7b 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c  ){.  int eDetail
29490 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65   = p->pConfig->e
294a0 44 65 74 61 69 6c 3b 0a 20 20 75 36 34 20 63 6b  Detail;.  u64 ck
294b0 73 75 6d 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20  sum = *pCksum;. 
294c0 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
294d0 70 49 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74  pIter = 0;.  int
294e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
294f0 35 49 6e 64 65 78 51 75 65 72 79 28 70 2c 20 7a  5IndexQuery(p, z
29500 2c 20 6e 2c 20 66 6c 61 67 73 2c 20 30 2c 20 26  , n, flags, 0, &
29510 70 49 74 65 72 29 3b 0a 0a 20 20 77 68 69 6c 65  pIter);..  while
29520 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29530 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73  && 0==sqlite3Fts
29540 35 49 74 65 72 45 6f 66 28 70 49 74 65 72 29 20  5IterEof(pIter) 
29550 29 7b 0a 20 20 20 20 69 36 34 20 72 6f 77 69 64  ){.    i64 rowid
29560 20 3d 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64   = pIter->iRowid
29570 3b 0a 0a 20 20 20 20 69 66 28 20 65 44 65 74 61  ;..    if( eDeta
29580 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
29590 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6b  NONE ){.      ck
295a0 73 75 6d 20 5e 3d 20 73 71 6c 69 74 65 33 46 74  sum ^= sqlite3Ft
295b0 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75  s5IndexEntryCksu
295c0 6d 28 72 6f 77 69 64 2c 20 30 2c 20 30 2c 20 69  m(rowid, 0, 0, i
295d0 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  Idx, z, n);.    
295e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 74 73  }else{.      Fts
295f0 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 73  5PoslistReader s
29600 52 65 61 64 65 72 3b 0a 20 20 20 20 20 20 66 6f  Reader;.      fo
29610 72 28 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  r(sqlite3Fts5Pos
29620 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 70  listReaderInit(p
29630 49 74 65 72 2d 3e 70 44 61 74 61 2c 20 70 49 74  Iter->pData, pIt
29640 65 72 2d 3e 6e 44 61 74 61 2c 20 26 73 52 65 61  er->nData, &sRea
29650 64 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  der);.          
29660 73 52 65 61 64 65 72 2e 62 45 6f 66 3d 3d 30 3b  sReader.bEof==0;
29670 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
29680 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  e3Fts5PoslistRea
29690 64 65 72 4e 65 78 74 28 26 73 52 65 61 64 65 72  derNext(&sReader
296a0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
296b0 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54     int iCol = FT
296c0 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 73 52  S5_POS2COLUMN(sR
296d0 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20  eader.iPos);.   
296e0 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20       int iOff = 
296f0 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45 54 28  FTS5_POS2OFFSET(
29700 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a 20  sReader.iPos);. 
29710 20 20 20 20 20 20 20 63 6b 73 75 6d 20 5e 3d 20         cksum ^= 
29720 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
29730 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f 77 69 64  EntryCksum(rowid
29740 2c 20 69 43 6f 6c 2c 20 69 4f 66 66 2c 20 69 49  , iCol, iOff, iI
29750 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  dx, z, n);.     
29760 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
29770 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29780 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
29790 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74  ite3Fts5IterNext
297a0 28 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20  (pIter);.    }. 
297b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35   }.  sqlite3Fts5
297c0 49 74 65 72 43 6c 6f 73 65 28 70 49 74 65 72 29  IterClose(pIter)
297d0 3b 0a 0a 20 20 2a 70 43 6b 73 75 6d 20 3d 20 63  ;..  *pCksum = c
297e0 6b 73 75 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72  ksum;.  return r
297f0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
29800 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c  s function is al
29810 73 6f 20 70 75 72 65 6c 79 20 61 6e 20 69 6e 74  so purely an int
29820 65 72 6e 61 6c 20 74 65 73 74 2e 20 49 74 20 64  ernal test. It d
29830 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75  oes not contribu
29840 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53 20 66 75  te to .** FTS fu
29850 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20 6f 72 20  nctionality, or 
29860 65 76 65 6e 20 74 68 65 20 69 6e 74 65 67 72 69  even the integri
29870 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20 61 6e 79  ty-check, in any
29880 20 77 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   way..*/.static 
29890 76 6f 69 64 20 66 74 73 35 54 65 73 74 54 65 72  void fts5TestTer
298a0 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
298b0 70 2c 20 0a 20 20 46 74 73 35 42 75 66 66 65 72  p, .  Fts5Buffer
298c0 20 2a 70 50 72 65 76 2c 20 20 20 20 20 20 20 20   *pPrev,        
298d0 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
298e0 73 20 74 65 72 6d 20 2a 2f 0a 20 20 63 6f 6e 73  s term */.  cons
298f0 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
29900 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
29910 6f 73 73 69 62 6c 79 20 6e 65 77 20 74 65 72 6d  ossibly new term
29920 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 75 36   to test */.  u6
29930 34 20 65 78 70 65 63 74 65 64 2c 0a 20 20 75 36  4 expected,.  u6
29940 34 20 2a 70 43 6b 73 75 6d 0a 29 7b 0a 20 20 69  4 *pCksum.){.  i
29950 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20  nt rc = p->rc;. 
29960 20 69 66 28 20 70 50 72 65 76 2d 3e 6e 3d 3d 30   if( pPrev->n==0
29970 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66   ){.    fts5Buff
29980 65 72 53 65 74 28 26 72 63 2c 20 70 50 72 65 76  erSet(&rc, pPrev
29990 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29  , n, (const u8*)
299a0 7a 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66  z);.  }else.  if
299b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
299c0 26 26 20 28 70 50 72 65 76 2d 3e 6e 21 3d 6e 20  && (pPrev->n!=n 
299d0 7c 7c 20 6d 65 6d 63 6d 70 28 70 50 72 65 76 2d  || memcmp(pPrev-
299e0 3e 70 2c 20 7a 2c 20 6e 29 29 20 29 7b 0a 20 20  >p, z, n)) ){.  
299f0 20 20 75 36 34 20 63 6b 73 75 6d 33 20 3d 20 2a    u64 cksum3 = *
29a00 70 43 6b 73 75 6d 3b 0a 20 20 20 20 63 6f 6e 73  pCksum;.    cons
29a10 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20  t char *zTerm = 
29a20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 26 70 50  (const char*)&pP
29a30 72 65 76 2d 3e 70 5b 31 5d 3b 20 20 2f 2a 20 74  rev->p[1];  /* t
29a40 65 72 6d 20 73 61 6e 73 20 70 72 65 66 69 78 2d  erm sans prefix-
29a50 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  byte */.    int 
29a60 6e 54 65 72 6d 20 3d 20 70 50 72 65 76 2d 3e 6e  nTerm = pPrev->n
29a70 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  -1;            /
29a80 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20  * Size of zTerm 
29a90 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
29aa0 69 6e 74 20 69 49 64 78 20 3d 20 28 70 50 72 65  int iIdx = (pPre
29ab0 76 2d 3e 70 5b 30 5d 20 2d 20 46 54 53 35 5f 4d  v->p[0] - FTS5_M
29ac0 41 49 4e 5f 50 52 45 46 49 58 29 3b 0a 20 20 20  AIN_PREFIX);.   
29ad0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 69 49   int flags = (iI
29ae0 64 78 3d 3d 30 20 3f 20 30 20 3a 20 46 54 53 35  dx==0 ? 0 : FTS5
29af0 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46  INDEX_QUERY_PREF
29b00 49 58 29 3b 0a 20 20 20 20 75 36 34 20 63 6b 31  IX);.    u64 ck1
29b10 20 3d 20 30 3b 0a 20 20 20 20 75 36 34 20 63 6b   = 0;.    u64 ck
29b20 32 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43  2 = 0;..    /* C
29b30 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 72 65  heck that the re
29b40 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64 20 66  sults returned f
29b50 6f 72 20 41 53 43 20 61 6e 64 20 44 45 53 43 20  or ASC and DESC 
29b60 71 75 65 72 69 65 73 20 61 72 65 0a 20 20 20 20  queries are.    
29b70 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20 49 66 20  ** the same. If 
29b80 6e 6f 74 2c 20 63 61 6c 6c 20 74 68 69 73 20 63  not, call this c
29b90 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20  orruption.  */. 
29ba0 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65 72     rc = fts5Quer
29bb0 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20  yCksum(p, iIdx, 
29bc0 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c  zTerm, nTerm, fl
29bd0 61 67 73 2c 20 26 63 6b 31 29 3b 0a 20 20 20 20  ags, &ck1);.    
29be0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29bf0 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66  K ){.      int f
29c00 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44   = flags|FTS5IND
29c10 45 58 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a 20  EX_QUERY_DESC;. 
29c20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75       rc = fts5Qu
29c30 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78  eryCksum(p, iIdx
29c40 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
29c50 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 7d 0a  f, &ck2);.    }.
29c60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
29c70 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b  TE_OK && ck1!=ck
29c80 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f  2 ) rc = FTS5_CO
29c90 52 52 55 50 54 3b 0a 0a 20 20 20 20 2f 2a 20 49  RRUPT;..    /* I
29ca0 66 20 74 68 69 73 20 69 73 20 61 20 70 72 65 66  f this is a pref
29cb0 69 78 20 71 75 65 72 79 2c 20 63 68 65 63 6b 20  ix query, check 
29cc0 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 73  that the results
29cd0 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
29ce0 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  .    ** the inde
29cf0 78 20 69 73 20 64 69 73 61 62 6c 65 64 20 61 72  x is disabled ar
29d00 65 20 74 68 65 20 73 61 6d 65 2e 20 49 6e 20 62  e the same. In b
29d10 6f 74 68 20 41 53 43 20 61 6e 64 20 44 45 53 43  oth ASC and DESC
29d20 20 6f 72 64 65 72 2e 20 0a 20 20 20 20 2a 2a 0a   order. .    **.
29d30 20 20 20 20 2a 2a 20 54 68 69 73 20 63 68 65 63      ** This chec
29d40 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 70 65  k may only be pe
29d50 72 66 6f 72 6d 65 64 20 69 66 20 74 68 65 20 68  rformed if the h
29d60 61 73 68 20 74 61 62 6c 65 20 69 73 20 65 6d 70  ash table is emp
29d70 74 79 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20  ty. This.    ** 
29d80 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 68  is because the h
29d90 61 73 68 20 74 61 62 6c 65 20 6f 6e 6c 79 20 73  ash table only s
29da0 75 70 70 6f 72 74 73 20 61 20 73 69 6e 67 6c 65  upports a single
29db0 20 73 63 61 6e 20 71 75 65 72 79 20 61 74 0a 20   scan query at. 
29dc0 20 20 20 2a 2a 20 61 20 74 69 6d 65 2c 20 61 6e     ** a time, an
29dd0 64 20 74 68 65 20 6d 75 6c 74 69 2d 69 74 65 72  d the multi-iter
29de0 20 6c 6f 6f 70 20 66 72 6f 6d 20 77 68 69 63 68   loop from which
29df0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
29e00 73 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a 2a 20  s called.    ** 
29e10 69 73 20 61 6c 72 65 61 64 79 20 70 65 72 66 6f  is already perfo
29e20 72 6d 69 6e 67 20 73 75 63 68 20 61 20 73 63 61  rming such a sca
29e30 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  n. */.    if( p-
29e40 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30  >nPendingData==0
29e50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 49   ){.      if( iI
29e60 64 78 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  dx>0 && rc==SQLI
29e70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
29e80 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46   int f = flags|F
29e90 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54  TS5INDEX_QUERY_T
29ea0 45 53 54 5f 4e 4f 49 44 58 3b 0a 20 20 20 20 20  EST_NOIDX;.     
29eb0 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20     ck2 = 0;.    
29ec0 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65      rc = fts5Que
29ed0 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c  ryCksum(p, iIdx,
29ee0 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66   zTerm, nTerm, f
29ef0 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20 20  , &ck2);.       
29f00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29f10 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29  OK && ck1!=ck2 )
29f20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
29f30 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
29f40 20 20 69 66 28 20 69 49 64 78 3e 30 20 26 26 20    if( iIdx>0 && 
29f50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29f60 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d  .        int f =
29f70 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58   flags|FTS5INDEX
29f80 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44  _QUERY_TEST_NOID
29f90 58 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  X|FTS5INDEX_QUER
29fa0 59 5f 44 45 53 43 3b 0a 20 20 20 20 20 20 20 20  Y_DESC;.        
29fb0 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ck2 = 0;.       
29fc0 20 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43   rc = fts5QueryC
29fd0 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54  ksum(p, iIdx, zT
29fe0 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26  erm, nTerm, f, &
29ff0 63 6b 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ck2);.        if
2a000 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a010 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63  && ck1!=ck2 ) rc
2a020 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2a030 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2a040 20 20 20 20 63 6b 73 75 6d 33 20 5e 3d 20 63 6b      cksum3 ^= ck
2a050 31 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  1;.    fts5Buffe
2a060 72 53 65 74 28 26 72 63 2c 20 70 50 72 65 76 2c  rSet(&rc, pPrev,
2a070 20 6e 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a   n, (const u8*)z
2a080 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
2a090 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73  SQLITE_OK && cks
2a0a0 75 6d 33 21 3d 65 78 70 65 63 74 65 64 20 29 7b  um3!=expected ){
2a0b0 0a 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 35  .      rc = FTS5
2a0c0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a  _CORRUPT;.    }.
2a0d0 20 20 20 20 2a 70 43 6b 73 75 6d 20 3d 20 63 6b      *pCksum = ck
2a0e0 73 75 6d 33 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72  sum3;.  }.  p->r
2a0f0 63 20 3d 20 72 63 3b 0a 7d 0a 20 0a 23 65 6c 73  c = rc;.}. .#els
2a100 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 54  e.# define fts5T
2a110 65 73 74 44 6c 69 64 78 52 65 76 65 72 73 65 28  estDlidxReverse(
2a120 78 2c 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20  x,y,z).# define 
2a130 66 74 73 35 54 65 73 74 54 65 72 6d 28 75 2c 76  fts5TestTerm(u,v
2a140 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  ,w,x,y,z).#endif
2a150 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  ../*.** Check th
2a160 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 41  at:.**.**   1) A
2a170 6c 6c 20 6c 65 61 76 65 73 20 6f 66 20 70 53 65  ll leaves of pSe
2a180 67 20 62 65 74 77 65 65 6e 20 69 46 69 72 73 74  g between iFirst
2a190 20 61 6e 64 20 69 4c 61 73 74 20 28 69 6e 63 6c   and iLast (incl
2a1a0 75 73 69 76 65 29 20 65 78 69 73 74 20 61 6e 64  usive) exist and
2a1b0 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e  .**      contain
2a1c0 20 7a 65 72 6f 20 74 65 72 6d 73 2e 0a 2a 2a 20   zero terms..** 
2a1d0 20 20 32 29 20 41 6c 6c 20 6c 65 61 76 65 73 20    2) All leaves 
2a1e0 6f 66 20 70 53 65 67 20 62 65 74 77 65 65 6e 20  of pSeg between 
2a1f0 69 4e 6f 52 6f 77 69 64 20 61 6e 64 20 69 4c 61  iNoRowid and iLa
2a200 73 74 20 28 69 6e 63 6c 75 73 69 76 65 29 20 65  st (inclusive) e
2a210 78 69 73 74 20 61 6e 64 0a 2a 2a 20 20 20 20 20  xist and.**     
2a220 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 72 6f   contain zero ro
2a230 77 69 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wids..*/.static 
2a240 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e  void fts5IndexIn
2a250 74 65 67 72 69 74 79 43 68 65 63 6b 45 6d 70 74  tegrityCheckEmpt
2a260 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  y(.  Fts5Index *
2a270 70 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  p,.  Fts5Structu
2a280 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c  reSegment *pSeg,
2a290 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
2a2a0 74 6f 20 63 68 65 63 6b 20 69 6e 74 65 72 6e 61  to check interna
2a2b0 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f  l consistency */
2a2c0 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c 0a 20  .  int iFirst,. 
2a2d0 20 69 6e 74 20 69 4e 6f 52 6f 77 69 64 2c 0a 20   int iNoRowid,. 
2a2e0 20 69 6e 74 20 69 4c 61 73 74 0a 29 7b 0a 20 20   int iLast.){.  
2a2f0 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 4e 6f 77  int i;..  /* Now
2a300 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
2a310 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65 61 76  iter.nEmpty leav
2a320 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  es following the
2a330 20 63 75 72 72 65 6e 74 20 6c 65 61 66 0a 20 20   current leaf.  
2a340 2a 2a 20 28 61 29 20 65 78 69 73 74 20 61 6e 64  ** (a) exist and
2a350 20 28 62 29 20 63 6f 6e 74 61 69 6e 20 6e 6f 20   (b) contain no 
2a360 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 66 6f 72 28  terms. */.  for(
2a370 69 3d 69 46 69 72 73 74 3b 20 70 2d 3e 72 63 3d  i=iFirst; p->rc=
2a380 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
2a390 3d 69 4c 61 73 74 3b 20 69 2b 2b 29 7b 0a 20 20  =iLast; i++){.  
2a3a0 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
2a3b0 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  f = fts5DataRead
2a3c0 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  (p, FTS5_SEGMENT
2a3d0 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65  _ROWID(pSeg->iSe
2a3e0 67 69 64 2c 20 69 29 29 3b 0a 20 20 20 20 69 66  gid, i));.    if
2a3f0 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ( pLeaf ){.     
2a400 20 69 66 28 20 21 66 74 73 35 4c 65 61 66 49 73   if( !fts5LeafIs
2a410 54 65 72 6d 6c 65 73 73 28 70 4c 65 61 66 29 20  Termless(pLeaf) 
2a420 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43  ) p->rc = FTS5_C
2a430 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 69 66  ORRUPT;.      if
2a440 28 20 69 3e 3d 69 4e 6f 52 6f 77 69 64 20 26 26  ( i>=iNoRowid &&
2a450 20 30 21 3d 66 74 73 35 4c 65 61 66 46 69 72 73   0!=fts5LeafFirs
2a460 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29  tRowidOff(pLeaf)
2a470 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
2a480 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20  CORRUPT;.    }. 
2a490 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
2a4a0 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 7d 0a 7d  se(pLeaf);.  }.}
2a4b0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
2a4c0 73 35 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  s5IntegrityCheck
2a4d0 50 67 69 64 78 28 46 74 73 35 49 6e 64 65 78 20  Pgidx(Fts5Index 
2a4e0 2a 70 2c 20 46 74 73 35 44 61 74 61 20 2a 70 4c  *p, Fts5Data *pL
2a4f0 65 61 66 29 7b 0a 20 20 69 6e 74 20 69 54 65 72  eaf){.  int iTer
2a500 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 69 6e 74 20  mOff = 0;.  int 
2a510 69 69 3b 0a 0a 20 20 46 74 73 35 42 75 66 66 65  ii;..  Fts5Buffe
2a520 72 20 62 75 66 31 20 3d 20 7b 30 2c 30 2c 30 7d  r buf1 = {0,0,0}
2a530 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  ;.  Fts5Buffer b
2a540 75 66 32 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 0a  uf2 = {0,0,0};..
2a550 20 20 69 69 20 3d 20 70 4c 65 61 66 2d 3e 73 7a    ii = pLeaf->sz
2a560 4c 65 61 66 3b 0a 20 20 77 68 69 6c 65 28 20 69  Leaf;.  while( i
2a570 69 3c 70 4c 65 61 66 2d 3e 6e 6e 20 26 26 20 70  i<pLeaf->nn && p
2a580 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
2a590 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a  ){.    int res;.
2a5a0 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
2a5b0 20 20 69 6e 74 20 6e 49 6e 63 72 3b 0a 0a 20 20    int nIncr;..  
2a5c0 20 20 69 69 20 2b 3d 20 66 74 73 35 47 65 74 56    ii += fts5GetV
2a5d0 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e  arint32(&pLeaf->
2a5e0 70 5b 69 69 5d 2c 20 6e 49 6e 63 72 29 3b 0a 20  p[ii], nIncr);. 
2a5f0 20 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20 6e     iTermOff += n
2a600 49 6e 63 72 3b 0a 20 20 20 20 69 4f 66 66 20 3d  Incr;.    iOff =
2a610 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20 20 20 20   iTermOff;..    
2a620 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61 66 2d  if( iOff>=pLeaf-
2a630 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
2a640 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2a650 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  RRUPT;.    }else
2a660 20 69 66 28 20 69 54 65 72 6d 4f 66 66 3d 3d 6e   if( iTermOff==n
2a670 49 6e 63 72 20 29 7b 0a 20 20 20 20 20 20 69 6e  Incr ){.      in
2a680 74 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 69  t nByte;.      i
2a690 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
2a6a0 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70  rint32(&pLeaf->p
2a6b0 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a  [iOff], nByte);.
2a6c0 20 20 20 20 20 20 69 66 28 20 28 69 4f 66 66 2b        if( (iOff+
2a6d0 6e 42 79 74 65 29 3e 70 4c 65 61 66 2d 3e 73 7a  nByte)>pLeaf->sz
2a6e0 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
2a6f0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2a700 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RUPT;.      }els
2a710 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  e{.        fts5B
2a720 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
2a730 20 26 62 75 66 31 2c 20 6e 42 79 74 65 2c 20 26   &buf1, nByte, &
2a740 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b  pLeaf->p[iOff]);
2a750 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2a760 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b  se{.      int nK
2a770 65 65 70 2c 20 6e 42 79 74 65 3b 0a 20 20 20 20  eep, nByte;.    
2a780 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
2a790 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66  tVarint32(&pLeaf
2a7a0 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70  ->p[iOff], nKeep
2a7b0 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  );.      iOff +=
2a7c0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
2a7d0 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  (&pLeaf->p[iOff]
2a7e0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
2a7f0 69 66 28 20 6e 4b 65 65 70 3e 62 75 66 31 2e 6e  if( nKeep>buf1.n
2a800 20 7c 7c 20 28 69 4f 66 66 2b 6e 42 79 74 65 29   || (iOff+nByte)
2a810 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
2a820 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
2a830 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2a840 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2a850 20 20 20 20 20 62 75 66 31 2e 6e 20 3d 20 6e 4b       buf1.n = nK
2a860 65 65 70 3b 0a 20 20 20 20 20 20 20 20 66 74 73  eep;.        fts
2a870 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
2a880 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 31 2c  b(&p->rc, &buf1,
2a890 20 6e 42 79 74 65 2c 20 26 70 4c 65 61 66 2d 3e   nByte, &pLeaf->
2a8a0 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20  p[iOff]);.      
2a8b0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  }..      if( p->
2a8c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2a8d0 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 66  .        res = f
2a8e0 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65  ts5BufferCompare
2a8f0 28 26 62 75 66 31 2c 20 26 62 75 66 32 29 3b 0a  (&buf1, &buf2);.
2a900 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3c          if( res<
2a910 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  =0 ) p->rc = FTS
2a920 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
2a930 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73   }.    }.    fts
2a940 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
2a950 63 2c 20 26 62 75 66 32 2c 20 62 75 66 31 2e 6e  c, &buf2, buf1.n
2a960 2c 20 62 75 66 31 2e 70 29 3b 0a 20 20 7d 0a 0a  , buf1.p);.  }..
2a970 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
2a980 28 26 62 75 66 31 29 3b 0a 20 20 66 74 73 35 42  (&buf1);.  fts5B
2a990 75 66 66 65 72 46 72 65 65 28 26 62 75 66 32 29  ufferFree(&buf2)
2a9a0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
2a9b0 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72   fts5IndexIntegr
2a9c0 69 74 79 43 68 65 63 6b 53 65 67 6d 65 6e 74 28  ityCheckSegment(
2a9d0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
2a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9f0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
2aa00 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
2aa10 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
2aa20 65 6e 74 20 2a 70 53 65 67 20 20 20 20 20 20 2f  ent *pSeg      /
2aa30 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 63 68 65  * Segment to che
2aa40 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73  ck internal cons
2aa50 69 73 74 65 6e 63 79 20 2a 2f 0a 29 7b 0a 20 20  istency */.){.  
2aa60 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
2aa70 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
2aa80 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
2aa90 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69   *pStmt = 0;.  i
2aaa0 6e 74 20 72 63 32 3b 0a 20 20 69 6e 74 20 69 49  nt rc2;.  int iI
2aab0 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65  dxPrevLeaf = pSe
2aac0 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a  g->pgnoFirst-1;.
2aad0 20 20 69 6e 74 20 69 44 6c 69 64 78 50 72 65 76    int iDlidxPrev
2aae0 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e  Leaf = pSeg->pgn
2aaf0 6f 4c 61 73 74 3b 0a 0a 20 20 69 66 28 20 70 53  oLast;..  if( pS
2ab00 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30  eg->pgnoFirst==0
2ab10 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 66 74   ) return;..  ft
2ab20 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53 74  s5IndexPrepareSt
2ab30 6d 74 28 70 2c 20 26 70 53 74 6d 74 2c 20 73 71  mt(p, &pStmt, sq
2ab40 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
2ab50 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 65 67       "SELECT seg
2ab60 69 64 2c 20 74 65 72 6d 2c 20 28 70 67 6e 6f 3e  id, term, (pgno>
2ab70 3e 31 29 2c 20 28 70 67 6e 6f 26 31 29 20 46 52  >1), (pgno&1) FR
2ab80 4f 4d 20 25 51 2e 27 25 71 5f 69 64 78 27 20 57  OM %Q.'%q_idx' W
2ab90 48 45 52 45 20 73 65 67 69 64 3d 25 64 22 2c 0a  HERE segid=%d",.
2aba0 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a        pConfig->z
2abb0 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61  Db, pConfig->zNa
2abc0 6d 65 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64  me, pSeg->iSegid
2abd0 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 74 65  .  ));..  /* Ite
2abe0 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
2abf0 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68   b-tree hierarch
2ac00 79 2e 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  y.  */.  while( 
2ac10 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
2ac20 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
2ac30 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
2ac40 6d 74 29 20 29 7b 0a 20 20 20 20 69 36 34 20 69  mt) ){.    i64 i
2ac50 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
2ac60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2ac70 64 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20  d for this leaf 
2ac80 2a 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61 20  */.    Fts5Data 
2ac90 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  *pLeaf;         
2aca0 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
2acb0 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 0a 20   this leaf */.. 
2acc0 20 20 20 69 6e 74 20 6e 49 64 78 54 65 72 6d 20     int nIdxTerm 
2acd0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2ace0 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 31 29  _bytes(pStmt, 1)
2acf0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
2ad00 20 2a 7a 49 64 78 54 65 72 6d 20 3d 20 28 63 6f   *zIdxTerm = (co
2ad10 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
2ad20 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
2ad30 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74  tmt, 1);.    int
2ad40 20 69 49 64 78 4c 65 61 66 20 3d 20 73 71 6c 69   iIdxLeaf = sqli
2ad50 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
2ad60 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 69 6e  Stmt, 2);.    in
2ad70 74 20 62 49 64 78 44 6c 69 64 78 20 3d 20 73 71  t bIdxDlidx = sq
2ad80 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2ad90 28 70 53 74 6d 74 2c 20 33 29 3b 0a 0a 20 20 20  (pStmt, 3);..   
2ada0 20 2f 2a 20 49 66 20 74 68 65 20 6c 65 61 66 20   /* If the leaf 
2adb0 69 6e 20 71 75 65 73 74 69 6f 6e 20 68 61 73 20  in question has 
2adc0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74 72 69  already been tri
2add0 6d 6d 65 64 20 66 72 6f 6d 20 74 68 65 20 73 65  mmed from the se
2ade0 67 6d 65 6e 74 2c 20 0a 20 20 20 20 2a 2a 20 69  gment, .    ** i
2adf0 67 6e 6f 72 65 20 74 68 69 73 20 62 2d 74 72 65  gnore this b-tre
2ae00 65 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69  e entry. Otherwi
2ae10 73 65 2c 20 6c 6f 61 64 20 69 74 20 69 6e 74 6f  se, load it into
2ae20 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20 20 20   memory. */.    
2ae30 69 66 28 20 69 49 64 78 4c 65 61 66 3c 70 53 65  if( iIdxLeaf<pSe
2ae40 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 20 63  g->pgnoFirst ) c
2ae50 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 52 6f  ontinue;.    iRo
2ae60 77 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  w = FTS5_SEGMENT
2ae70 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65  _ROWID(pSeg->iSe
2ae80 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a  gid, iIdxLeaf);.
2ae90 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35      pLeaf = fts5
2aea0 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77  DataRead(p, iRow
2aeb0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  );.    if( pLeaf
2aec0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  ==0 ) break;..  
2aed0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
2aee0 74 68 65 20 6c 65 61 66 20 63 6f 6e 74 61 69 6e  the leaf contain
2aef0 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74  s at least one t
2af00 65 72 6d 2c 20 61 6e 64 20 74 68 61 74 20 69 74  erm, and that it
2af10 20 69 73 20 65 71 75 61 6c 0a 20 20 20 20 2a 2a   is equal.    **
2af20 20 74 6f 20 6f 72 20 6c 61 72 67 65 72 20 74 68   to or larger th
2af30 61 6e 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79  an the split-key
2af40 20 69 6e 20 7a 49 64 78 54 65 72 6d 2e 20 20 41   in zIdxTerm.  A
2af50 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74 20 69  lso check that i
2af60 66 20 74 68 65 72 65 0a 20 20 20 20 2a 2a 20 69  f there.    ** i
2af70 73 20 61 6c 73 6f 20 61 20 72 6f 77 69 64 20 70  s also a rowid p
2af80 6f 69 6e 74 65 72 20 77 69 74 68 69 6e 20 74 68  ointer within th
2af90 65 20 6c 65 61 66 20 70 61 67 65 20 68 65 61 64  e leaf page head
2afa0 65 72 2c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  er, it points to
2afb0 20 61 0a 20 20 20 20 2a 2a 20 6c 6f 63 61 74 69   a.    ** locati
2afc0 6f 6e 20 62 65 66 6f 72 65 20 74 68 65 20 74 65  on before the te
2afd0 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  rm.  */.    if( 
2afe0 70 4c 65 61 66 2d 3e 6e 6e 3c 3d 70 4c 65 61 66  pLeaf->nn<=pLeaf
2aff0 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
2b000 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
2b010 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73  ORRUPT;.    }els
2b020 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66  e{.      int iOf
2b030 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
2b040 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
2b050 66 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  f first term on 
2b060 6c 65 61 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e  leaf */.      in
2b070 74 20 69 52 6f 77 69 64 4f 66 66 3b 20 20 20 20  t iRowidOff;    
2b080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
2b090 73 65 74 20 6f 66 20 66 69 72 73 74 20 72 6f 77  set of first row
2b0a0 69 64 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20  id on leaf */.  
2b0b0 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20      int nTerm;  
2b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0d0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20  /* Size of term 
2b0e0 6f 6e 20 6c 65 61 66 20 69 6e 20 62 79 74 65 73  on leaf in bytes
2b0f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
2b100 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
2b110 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69        /* Compari
2b120 73 6f 6e 20 6f 66 20 74 65 72 6d 20 61 6e 64 20  son of term and 
2b130 73 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a 0a 20 20  split-key */..  
2b140 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 4c      iOff = fts5L
2b150 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28  eafFirstTermOff(
2b160 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69 52  pLeaf);.      iR
2b170 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c 65  owidOff = fts5Le
2b180 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28  afFirstRowidOff(
2b190 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69 66  pLeaf);.      if
2b1a0 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d 69 4f 66  ( iRowidOff>=iOf
2b1b0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  f ){.        p->
2b1c0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2b1d0 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
2b1e0 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
2b1f0 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
2b200 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
2b210 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20   nTerm);.       
2b220 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 70   res = memcmp(&p
2b230 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 7a  Leaf->p[iOff], z
2b240 49 64 78 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 65  IdxTerm, MIN(nTe
2b250 72 6d 2c 20 6e 49 64 78 54 65 72 6d 29 29 3b 0a  rm, nIdxTerm));.
2b260 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3d          if( res=
2b270 3d 30 20 29 20 72 65 73 20 3d 20 6e 54 65 72 6d  =0 ) res = nTerm
2b280 20 2d 20 6e 49 64 78 54 65 72 6d 3b 0a 20 20 20   - nIdxTerm;.   
2b290 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29       if( res<0 )
2b2a0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2b2b0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 0a  RRUPT;.      }..
2b2c0 20 20 20 20 20 20 66 74 73 35 49 6e 74 65 67 72        fts5Integr
2b2d0 69 74 79 43 68 65 63 6b 50 67 69 64 78 28 70 2c  ityCheckPgidx(p,
2b2e0 20 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a 20   pLeaf);.    }. 
2b2f0 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
2b300 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 69  se(pLeaf);.    i
2b310 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b  f( p->rc ) break
2b320 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 63 68  ;..    /* Now ch
2b330 65 63 6b 20 74 68 61 74 20 74 68 65 20 69 74 65  eck that the ite
2b340 72 2e 6e 45 6d 70 74 79 20 6c 65 61 76 65 73 20  r.nEmpty leaves 
2b350 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 75  following the cu
2b360 72 72 65 6e 74 20 6c 65 61 66 0a 20 20 20 20 2a  rrent leaf.    *
2b370 2a 20 28 61 29 20 65 78 69 73 74 20 61 6e 64 20  * (a) exist and 
2b380 28 62 29 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74  (b) contain no t
2b390 65 72 6d 73 2e 20 2a 2f 0a 20 20 20 20 66 74 73  erms. */.    fts
2b3a0 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43  5IndexIntegrityC
2b3b0 68 65 63 6b 45 6d 70 74 79 28 0a 20 20 20 20 20  heckEmpty(.     
2b3c0 20 20 20 70 2c 20 70 53 65 67 2c 20 69 49 64 78     p, pSeg, iIdx
2b3d0 50 72 65 76 4c 65 61 66 2b 31 2c 20 69 44 6c 69  PrevLeaf+1, iDli
2b3e0 64 78 50 72 65 76 4c 65 61 66 2b 31 2c 20 69 49  dxPrevLeaf+1, iI
2b3f0 64 78 4c 65 61 66 2d 31 0a 20 20 20 20 29 3b 0a  dxLeaf-1.    );.
2b400 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20      if( p->rc ) 
2b410 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 49  break;..    /* I
2b420 66 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63  f there is a doc
2b430 6c 69 73 74 2d 69 6e 64 65 78 2c 20 63 68 65 63  list-index, chec
2b440 6b 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20  k that it looks 
2b450 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69 66  right. */.    if
2b460 28 20 62 49 64 78 44 6c 69 64 78 20 29 7b 0a 20  ( bIdxDlidx ){. 
2b470 20 20 20 20 20 46 74 73 35 44 6c 69 64 78 49 74       Fts5DlidxIt
2b480 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b 20  er *pDlidx = 0; 
2b490 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e   /* For iteratin
2b4a0 67 20 74 68 72 6f 75 67 68 20 64 6f 63 6c 69 73  g through doclis
2b4b0 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  t index */.     
2b4c0 20 69 6e 74 20 69 50 72 65 76 4c 65 61 66 20 3d   int iPrevLeaf =
2b4d0 20 69 49 64 78 4c 65 61 66 3b 0a 20 20 20 20 20   iIdxLeaf;.     
2b4e0 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 70 53   int iSegid = pS
2b4f0 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20  eg->iSegid;.    
2b500 20 20 69 6e 74 20 69 50 67 20 3d 20 30 3b 0a 20    int iPg = 0;. 
2b510 20 20 20 20 20 69 36 34 20 69 4b 65 79 3b 0a 0a       i64 iKey;..
2b520 20 20 20 20 20 20 66 6f 72 28 70 44 6c 69 64 78        for(pDlidx
2b530 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e  =fts5DlidxIterIn
2b540 69 74 28 70 2c 20 30 2c 20 69 53 65 67 69 64 2c  it(p, 0, iSegid,
2b550 20 69 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20   iIdxLeaf);.    
2b560 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
2b570 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78  terEof(p, pDlidx
2b580 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  )==0;.          
2b590 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
2b5a0 74 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 20  t(p, pDlidx).   
2b5b0 20 20 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f     ){..        /
2b5c0 2a 20 43 68 65 63 6b 20 61 6e 79 20 72 6f 77 69  * Check any rowi
2b5d0 64 2d 6c 65 73 73 20 70 61 67 65 73 20 74 68 61  d-less pages tha
2b5e0 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74  t occur before t
2b5f0 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e  he current leaf.
2b600 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
2b610 69 50 67 3d 69 50 72 65 76 4c 65 61 66 2b 31 3b  iPg=iPrevLeaf+1;
2b620 20 69 50 67 3c 66 74 73 35 44 6c 69 64 78 49 74   iPg<fts5DlidxIt
2b630 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 20  erPgno(pDlidx); 
2b640 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  iPg++){.        
2b650 20 20 69 4b 65 79 20 3d 20 46 54 53 35 5f 53 45    iKey = FTS5_SE
2b660 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67  GMENT_ROWID(iSeg
2b670 69 64 2c 20 69 50 67 29 3b 0a 20 20 20 20 20 20  id, iPg);.      
2b680 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35      pLeaf = fts5
2b690 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79  DataRead(p, iKey
2b6a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2b6b0 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20   pLeaf ){.      
2b6c0 20 20 20 20 20 20 69 66 28 20 66 74 73 35 4c 65        if( fts5Le
2b6d0 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28  afFirstRowidOff(
2b6e0 70 4c 65 61 66 29 21 3d 30 20 29 20 70 2d 3e 72  pLeaf)!=0 ) p->r
2b6f0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2b700 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  ;.            ft
2b710 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
2b720 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eaf);.          
2b730 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2b740 20 20 20 20 69 50 72 65 76 4c 65 61 66 20 3d 20      iPrevLeaf = 
2b750 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
2b760 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20 20 20 20  o(pDlidx);..    
2b770 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
2b780 74 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  t the leaf page 
2b790 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
2b7a0 20 69 74 65 72 61 74 6f 72 20 72 65 61 6c 6c 79   iterator really
2b7b0 20 64 6f 65 73 0a 20 20 20 20 20 20 20 20 2a 2a   does.        **
2b7c0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 6f 77   contain the row
2b7d0 69 64 20 73 75 67 67 65 73 74 65 64 20 62 79 20  id suggested by 
2b7e0 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20  the same. */.   
2b7f0 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53 35       iKey = FTS5
2b800 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
2b810 53 65 67 69 64 2c 20 69 50 72 65 76 4c 65 61 66  Segid, iPrevLeaf
2b820 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 61 66  );.        pLeaf
2b830 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
2b840 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 20 20  p, iKey);.      
2b850 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20    if( pLeaf ){. 
2b860 20 20 20 20 20 20 20 20 20 69 36 34 20 69 52 6f           i64 iRo
2b870 77 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 69  wid;.          i
2b880 6e 74 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66  nt iRowidOff = f
2b890 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69  ts5LeafFirstRowi
2b8a0 64 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20  dOff(pLeaf);.   
2b8b0 20 20 20 20 20 20 20 41 53 53 45 52 54 5f 53 5a         ASSERT_SZ
2b8c0 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a  LEAF_OK(pLeaf);.
2b8d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52            if( iR
2b8e0 6f 77 69 64 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e  owidOff>=pLeaf->
2b8f0 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
2b900 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
2b910 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2b920 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b930 20 20 20 20 20 20 20 20 20 66 74 73 35 47 65 74           fts5Get
2b940 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70  Varint(&pLeaf->p
2b950 5b 69 52 6f 77 69 64 4f 66 66 5d 2c 20 28 75 36  [iRowidOff], (u6
2b960 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 20  4*)&iRowid);.   
2b970 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f           if( iRo
2b980 77 69 64 21 3d 66 74 73 35 44 6c 69 64 78 49 74  wid!=fts5DlidxIt
2b990 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20  erRowid(pDlidx) 
2b9a0 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43  ) p->rc = FTS5_C
2b9b0 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
2b9c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 74    }.          ft
2b9d0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
2b9e0 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  eaf);.        }.
2b9f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
2ba00 44 6c 69 64 78 50 72 65 76 4c 65 61 66 20 3d 20  DlidxPrevLeaf = 
2ba10 69 50 67 3b 0a 20 20 20 20 20 20 66 74 73 35 44  iPg;.      fts5D
2ba20 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 44 6c  lidxIterFree(pDl
2ba30 69 64 78 29 3b 0a 20 20 20 20 20 20 66 74 73 35  idx);.      fts5
2ba40 54 65 73 74 44 6c 69 64 78 52 65 76 65 72 73 65  TestDlidxReverse
2ba50 28 70 2c 20 69 53 65 67 69 64 2c 20 69 49 64 78  (p, iSegid, iIdx
2ba60 4c 65 61 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Leaf);.    }else
2ba70 7b 0a 20 20 20 20 20 20 69 44 6c 69 64 78 50 72  {.      iDlidxPr
2ba80 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70  evLeaf = pSeg->p
2ba90 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 20 20 2f  gnoLast;.      /
2baa0 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68  * TODO: Check th
2bab0 65 72 65 20 69 73 20 6e 6f 20 64 6f 63 6c 69 73  ere is no doclis
2bac0 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7d  t index */.    }
2bad0 0a 0a 20 20 20 20 69 49 64 78 50 72 65 76 4c 65  ..    iIdxPrevLe
2bae0 61 66 20 3d 20 69 49 64 78 4c 65 61 66 3b 0a 20  af = iIdxLeaf;. 
2baf0 20 7d 0a 0a 20 20 72 63 32 20 3d 20 73 71 6c 69   }..  rc2 = sqli
2bb00 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
2bb10 6d 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  mt);.  if( p->rc
2bb20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d  ==SQLITE_OK ) p-
2bb30 3e 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20 2f 2a  >rc = rc2;..  /*
2bb40 20 50 61 67 65 20 69 74 65 72 2e 69 4c 65 61 66   Page iter.iLeaf
2bb50 20 6d 75 73 74 20 6e 6f 77 20 62 65 20 74 68 65   must now be the
2bb60 20 72 69 67 68 74 6d 6f 73 74 20 6c 65 61 66 2d   rightmost leaf-
2bb70 70 61 67 65 20 69 6e 20 74 68 65 20 73 65 67 6d  page in the segm
2bb80 65 6e 74 20 2a 2f 0a 23 69 66 20 30 0a 20 20 69  ent */.#if 0.  i
2bb90 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
2bba0 5f 4f 4b 20 26 26 20 69 74 65 72 2e 69 4c 65 61  _OK && iter.iLea
2bbb0 66 21 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  f!=pSeg->pgnoLas
2bbc0 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  t ){.    p->rc =
2bbd0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2bbe0 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a   }.#endif.}.../*
2bbf0 0a 2a 2a 20 52 75 6e 20 69 6e 74 65 72 6e 61 6c  .** Run internal
2bc00 20 63 68 65 63 6b 73 20 74 6f 20 65 6e 73 75 72   checks to ensur
2bc10 65 20 74 68 61 74 20 74 68 65 20 46 54 53 20 69  e that the FTS i
2bc20 6e 64 65 78 20 28 61 29 20 69 73 20 69 6e 74 65  ndex (a) is inte
2bc30 72 6e 61 6c 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69  rnally .** consi
2bc40 73 74 65 6e 74 20 61 6e 64 20 28 62 29 20 63 6f  stent and (b) co
2bc50 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66  ntains entries f
2bc60 6f 72 20 77 68 69 63 68 20 74 68 65 20 58 4f 52  or which the XOR
2bc70 20 6f 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   of the checksum
2bc80 73 0a 2a 2a 20 61 73 20 63 61 6c 63 75 6c 61 74  s.** as calculat
2bc90 65 64 20 62 79 20 73 71 6c 69 74 65 33 46 74 73  ed by sqlite3Fts
2bca0 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d  5IndexEntryCksum
2bcb0 28 29 20 69 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a  () is cksum..**.
2bcc0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
2bcd0 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20  _CORRUPT if any 
2bce0 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  of the internal 
2bcf0 63 68 65 63 6b 73 20 66 61 69 6c 2c 20 6f 72 20  checks fail, or 
2bd00 69 66 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73  if the.** checks
2bd10 75 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  um does not matc
2bd20 68 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  h. Return SQLITE
2bd30 5f 4f 4b 20 69 66 20 61 6c 6c 20 63 68 65 63 6b  _OK if all check
2bd40 73 20 70 61 73 73 20 77 69 74 68 6f 75 74 0a 2a  s pass without.*
2bd50 2a 20 65 72 72 6f 72 2c 20 6f 72 20 73 6f 6d 65  * error, or some
2bd60 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20 65 72   other SQLite er
2bd70 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 6f 74  ror code if anot
2bd80 68 65 72 20 65 72 72 6f 72 20 28 65 2e 67 2e 20  her error (e.g. 
2bd90 4f 4f 4d 29 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a  OOM).** occurs..
2bda0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
2bdb0 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79  s5IndexIntegrity
2bdc0 43 68 65 63 6b 28 46 74 73 35 49 6e 64 65 78 20  Check(Fts5Index 
2bdd0 2a 70 2c 20 75 36 34 20 63 6b 73 75 6d 29 7b 0a  *p, u64 cksum){.
2bde0 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20    int eDetail = 
2bdf0 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
2be00 61 69 6c 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d  ail;.  u64 cksum
2be10 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  2 = 0;          
2be20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
2be30 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74  um based on cont
2be40 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20  ents of indexes 
2be50 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
2be60 70 6f 73 6c 69 73 74 20 3d 20 7b 30 2c 30 2c 30  poslist = {0,0,0
2be70 7d 3b 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75  };   /* Buffer u
2be80 73 65 64 20 74 6f 20 68 6f 6c 64 20 61 20 70 6f  sed to hold a po
2be90 73 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 49  slist */.  Fts5I
2bea0 74 65 72 20 2a 70 49 74 65 72 3b 20 20 20 20 20  ter *pIter;     
2beb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
2bec0 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
2bed0 72 6f 75 67 68 20 65 6e 74 69 72 65 20 69 6e 64  rough entire ind
2bee0 65 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ex */.  Fts5Stru
2bef0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 20  cture *pStruct; 
2bf00 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2bf10 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 0a 23   structure */..#
2bf20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2bf30 55 47 0a 20 20 2f 2a 20 55 73 65 64 20 62 79 20  UG.  /* Used by 
2bf40 65 78 74 72 61 20 69 6e 74 65 72 6e 61 6c 20 74  extra internal t
2bf50 65 73 74 73 20 6f 6e 6c 79 20 72 75 6e 20 69 66  ests only run if
2bf60 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64   NDEBUG is not d
2bf70 65 66 69 6e 65 64 20 2a 2f 0a 20 20 75 36 34 20  efined */.  u64 
2bf80 63 6b 73 75 6d 33 20 3d 20 30 3b 20 20 20 20 20  cksum3 = 0;     
2bf90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2bfa0 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
2bfb0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64   contents of ind
2bfc0 65 78 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75  exes */.  Fts5Bu
2bfd0 66 66 65 72 20 74 65 72 6d 20 3d 20 7b 30 2c 30  ffer term = {0,0
2bfe0 2c 30 7d 3b 20 20 20 20 20 20 2f 2a 20 42 75 66  ,0};      /* Buf
2bff0 66 65 72 20 75 73 65 64 20 74 6f 20 68 6f 6c 64  fer used to hold
2c000 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 74 65 72   most recent ter
2c010 6d 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 6f  m */.#endif.  co
2c020 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
2c030 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
2c040 4e 4f 4f 55 54 50 55 54 3b 0a 20 20 0a 20 20 2f  NOOUTPUT;.  .  /
2c050 2a 20 4c 6f 61 64 20 74 68 65 20 46 54 53 20 69  * Load the FTS i
2c060 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a  ndex structure *
2c070 2f 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74  /.  pStruct = ft
2c080 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
2c090 70 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  p);..  /* Check 
2c0a0 74 68 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61  that the interna
2c0b0 6c 20 6e 6f 64 65 73 20 6f 66 20 65 61 63 68 20  l nodes of each 
2c0c0 73 65 67 6d 65 6e 74 20 6d 61 74 63 68 20 74 68  segment match th
2c0d0 65 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 69 66  e leaves */.  if
2c0e0 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20  ( pStruct ){.   
2c0f0 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b   int iLvl, iSeg;
2c100 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
2c110 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
2c120 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
2c130 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30        for(iSeg=0
2c140 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e  ; iSeg<pStruct->
2c150 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
2c160 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20  g; iSeg++){.    
2c170 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
2c180 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
2c190 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
2c1a0 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65  l[iLvl].aSeg[iSe
2c1b0 67 5d 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  g];.        fts5
2c1c0 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
2c1d0 65 63 6b 53 65 67 6d 65 6e 74 28 70 2c 20 70 53  eckSegment(p, pS
2c1e0 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eg);.      }.   
2c1f0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
2c200 20 63 6b 73 75 6d 20 61 72 67 75 6d 65 6e 74 20   cksum argument 
2c210 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
2c220 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 68 65  unction is a che
2c230 63 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64  cksum calculated
2c240 0a 20 20 2a 2a 20 62 61 73 65 64 20 6f 6e 20 61  .  ** based on a
2c250 6c 6c 20 65 78 70 65 63 74 65 64 20 65 6e 74 72  ll expected entr
2c260 69 65 73 20 69 6e 20 74 68 65 20 46 54 53 20 69  ies in the FTS i
2c270 6e 64 65 78 20 28 69 6e 63 6c 75 64 69 6e 67 20  ndex (including 
2c280 70 72 65 66 69 78 20 69 6e 64 65 78 0a 20 20 2a  prefix index.  *
2c290 2a 20 65 6e 74 72 69 65 73 29 2e 20 54 68 69 73  * entries). This
2c2a0 20 62 6c 6f 63 6b 20 63 68 65 63 6b 73 20 74 68   block checks th
2c2b0 61 74 20 61 20 63 68 65 63 6b 73 75 6d 20 63 61  at a checksum ca
2c2c0 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f  lculated based o
2c2d0 6e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61  n the.  ** actua
2c2e0 6c 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 46 54  l contents of FT
2c2f0 53 20 69 6e 64 65 78 20 69 73 20 69 64 65 6e 74  S index is ident
2c300 69 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ical..  **.  ** 
2c310 54 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  Two versions of 
2c320 74 68 65 20 73 61 6d 65 20 63 68 65 63 6b 73 75  the same checksu
2c330 6d 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64  m are calculated
2c340 2e 20 54 68 65 20 66 69 72 73 74 20 28 73 74 61  . The first (sta
2c350 63 6b 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  ck.  ** variable
2c360 20 63 6b 73 75 6d 32 29 20 62 61 73 65 64 20 6f   cksum2) based o
2c370 6e 20 65 6e 74 72 69 65 73 20 65 78 74 72 61 63  n entries extrac
2c380 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 75 6c  ted from the ful
2c390 6c 2d 74 65 78 74 20 69 6e 64 65 78 0a 20 20 2a  l-text index.  *
2c3a0 2a 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 61 20  * while doing a 
2c3b0 6c 69 6e 65 61 72 20 73 63 61 6e 20 6f 66 20 65  linear scan of e
2c3c0 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 69  ach individual i
2c3d0 6e 64 65 78 20 69 6e 20 74 75 72 6e 2e 20 0a 20  ndex in turn. . 
2c3e0 20 2a 2a 0a 20 20 2a 2a 20 41 73 20 65 61 63 68   **.  ** As each
2c3f0 20 74 65 72 6d 20 76 69 73 69 74 65 64 20 62 79   term visited by
2c400 20 74 68 65 20 6c 69 6e 65 61 72 20 73 63 61 6e   the linear scan
2c410 73 2c 20 61 20 73 65 70 61 72 61 74 65 20 71 75  s, a separate qu
2c420 65 72 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  ery for the.  **
2c430 20 73 61 6d 65 20 74 65 72 6d 20 69 73 20 70 65   same term is pe
2c440 72 66 6f 72 6d 65 64 2e 20 63 6b 73 75 6d 33 20  rformed. cksum3 
2c450 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61  is calculated ba
2c460 73 65 64 20 6f 6e 20 74 68 65 20 65 6e 74 72 69  sed on the entri
2c470 65 73 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65  es.  ** extracte
2c480 64 20 62 79 20 74 68 65 73 65 20 71 75 65 72 69  d by these queri
2c490 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 66  es..  */.  for(f
2c4a0 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28  ts5MultiIterNew(
2c4b0 70 2c 20 70 53 74 72 75 63 74 2c 20 66 6c 61 67  p, pStruct, flag
2c4c0 73 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20  s, 0, 0, 0, -1, 
2c4d0 30 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20  0, &pIter);.    
2c4e0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45    fts5MultiIterE
2c4f0 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b  of(p, pIter)==0;
2c500 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
2c510 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
2c520 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20  r, 0, 0).  ){.  
2c530 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
2c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c550 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e   Size of term in
2c560 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 36   bytes */.    i6
2c570 34 20 69 50 6f 73 20 3d 20 30 3b 20 20 20 20 20  4 iPos = 0;     
2c580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
2c590 69 74 69 6f 6e 20 72 65 61 64 20 66 72 6f 6d 20  ition read from 
2c5a0 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69  poslist */.    i
2c5b0 6e 74 20 69 4f 66 66 20 3d 20 30 3b 20 20 20 20  nt iOff = 0;    
2c5c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
2c5d0 66 73 65 74 20 77 69 74 68 69 6e 20 70 6f 73 6c  fset within posl
2c5e0 69 73 74 20 2a 2f 0a 20 20 20 20 69 36 34 20 69  ist */.    i64 i
2c5f0 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74  Rowid = fts5Mult
2c600 69 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72  iIterRowid(pIter
2c610 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  );.    char *z =
2c620 20 28 63 68 61 72 2a 29 66 74 73 35 4d 75 6c 74   (char*)fts5Mult
2c630 69 49 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c  iIterTerm(pIter,
2c640 20 26 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66   &n);..    /* If
2c650 20 74 68 69 73 20 69 73 20 61 20 6e 65 77 20 74   this is a new t
2c660 65 72 6d 2c 20 71 75 65 72 79 20 66 6f 72 20 69  erm, query for i
2c670 74 2e 20 55 70 64 61 74 65 20 63 6b 73 75 6d 33  t. Update cksum3
2c680 20 77 69 74 68 20 74 68 65 20 72 65 73 75 6c 74   with the result
2c690 73 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 54 65  s. */.    fts5Te
2c6a0 73 74 54 65 72 6d 28 70 2c 20 26 74 65 72 6d 2c  stTerm(p, &term,
2c6b0 20 7a 2c 20 6e 2c 20 63 6b 73 75 6d 32 2c 20 26   z, n, cksum2, &
2c6c0 63 6b 73 75 6d 33 29 3b 0a 0a 20 20 20 20 69 66  cksum3);..    if
2c6d0 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ( eDetail==FTS5_
2c6e0 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
2c6f0 20 20 20 20 20 69 66 28 20 30 3d 3d 66 74 73 35       if( 0==fts5
2c700 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79  MultiIterIsEmpty
2c710 28 70 2c 20 70 49 74 65 72 29 20 29 7b 0a 20 20  (p, pIter) ){.  
2c720 20 20 20 20 20 20 63 6b 73 75 6d 32 20 5e 3d 20        cksum2 ^= 
2c730 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
2c740 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69  EntryCksum(iRowi
2c750 64 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 7a 2c 20  d, 0, 0, -1, z, 
2c760 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
2c770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 6f 73  }else{.      pos
2c780 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  list.n = 0;.    
2c790 20 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73    fts5SegiterPos
2c7a0 6c 69 73 74 28 70 2c 20 26 70 49 74 65 72 2d 3e  list(p, &pIter->
2c7b0 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72  aSeg[pIter->aFir
2c7c0 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 2c 20 30  st[1].iFirst], 0
2c7d0 2c 20 26 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  , &poslist);.   
2c7e0 20 20 20 77 68 69 6c 65 28 20 30 3d 3d 73 71 6c     while( 0==sql
2c7f0 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e  ite3Fts5PoslistN
2c800 65 78 74 36 34 28 70 6f 73 6c 69 73 74 2e 70 2c  ext64(poslist.p,
2c810 20 70 6f 73 6c 69 73 74 2e 6e 2c 20 26 69 4f 66   poslist.n, &iOf
2c820 66 2c 20 26 69 50 6f 73 29 20 29 7b 0a 20 20 20  f, &iPos) ){.   
2c830 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
2c840 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28  FTS5_POS2COLUMN(
2c850 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 69  iPos);.        i
2c860 6e 74 20 69 54 6f 6b 4f 66 66 20 3d 20 46 54 53  nt iTokOff = FTS
2c870 35 5f 50 4f 53 32 4f 46 46 53 45 54 28 69 50 6f  5_POS2OFFSET(iPo
2c880 73 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75  s);.        cksu
2c890 6d 32 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73  m2 ^= sqlite3Fts
2c8a0 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d  5IndexEntryCksum
2c8b0 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69  (iRowid, iCol, i
2c8c0 54 6f 6b 4f 66 66 2c 20 2d 31 2c 20 7a 2c 20 6e  TokOff, -1, z, n
2c8d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2c8e0 0a 20 20 7d 0a 20 20 66 74 73 35 54 65 73 74 54  .  }.  fts5TestT
2c8f0 65 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20 30 2c  erm(p, &term, 0,
2c900 20 30 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73   0, cksum2, &cks
2c910 75 6d 33 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c  um3);..  fts5Mul
2c920 74 69 49 74 65 72 46 72 65 65 28 70 49 74 65 72  tiIterFree(pIter
2c930 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
2c940 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73  SQLITE_OK && cks
2c950 75 6d 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e  um!=cksum2 ) p->
2c960 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2c970 54 3b 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74  T;..  fts5Struct
2c980 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
2c990 63 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ct);.#ifdef SQLI
2c9a0 54 45 5f 44 45 42 55 47 0a 20 20 66 74 73 35 42  TE_DEBUG.  fts5B
2c9b0 75 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29  ufferFree(&term)
2c9c0 3b 0a 23 65 6e 64 69 66 0a 20 20 66 74 73 35 42  ;.#endif.  fts5B
2c9d0 75 66 66 65 72 46 72 65 65 28 26 70 6f 73 6c 69  ufferFree(&posli
2c9e0 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  st);.  return ft
2c9f0 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
2ca00 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
2ca10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2ca50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65  **********.** Be
2caa0 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 20 69  low this point i
2cab0 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
2cac0 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 74 73 35  tion of the fts5
2cad0 5f 64 65 63 6f 64 65 28 29 20 73 63 61 6c 61 72  _decode() scalar
2cae0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c  .** function onl
2caf0 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  y..*/../*.** Dec
2cb00 6f 64 65 20 61 20 73 65 67 6d 65 6e 74 2d 64 61  ode a segment-da
2cb10 74 61 20 72 6f 77 69 64 20 66 72 6f 6d 20 74 68  ta rowid from th
2cb20 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20  e %_data table. 
2cb30 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2cb40 0a 2a 2a 20 74 68 65 20 6f 70 70 6f 73 69 74 65  .** the opposite
2cb50 20 6f 66 20 6d 61 63 72 6f 20 46 54 53 35 5f 53   of macro FTS5_S
2cb60 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 2e 0a  EGMENT_ROWID()..
2cb70 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2cb80 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 0a  ts5DecodeRowid(.
2cb90 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20    i64 iRowid,   
2cba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cbb0 20 20 2f 2a 20 52 6f 77 69 64 20 66 72 6f 6d 20    /* Rowid from 
2cbc0 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a  %_data table */.
2cbd0 20 20 69 6e 74 20 2a 70 69 53 65 67 69 64 2c 20    int *piSegid, 
2cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cbf0 20 20 2f 2a 20 4f 55 54 3a 20 53 65 67 6d 65 6e    /* OUT: Segmen
2cc00 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  t id */.  int *p
2cc10 62 44 6c 69 64 78 2c 20 20 20 20 20 20 20 20 20  bDlidx,         
2cc20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2cc30 3a 20 44 6c 69 64 78 20 66 6c 61 67 20 2a 2f 0a  : Dlidx flag */.
2cc40 20 20 69 6e 74 20 2a 70 69 48 65 69 67 68 74 2c    int *piHeight,
2cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc60 20 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67 68 74    /* OUT: Height
2cc70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 50 67 6e   */.  int *piPgn
2cc80 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o               
2cc90 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 61        /* OUT: Pa
2cca0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  ge number */.){.
2ccb0 20 20 2a 70 69 50 67 6e 6f 20 3d 20 28 69 6e 74    *piPgno = (int
2ccc0 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36  )(iRowid & (((i6
2ccd0 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41  4)1 << FTS5_DATA
2cce0 5f 50 41 47 45 5f 42 29 20 2d 20 31 29 29 3b 0a  _PAGE_B) - 1));.
2ccf0 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53    iRowid >>= FTS
2cd00 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 3b 0a 0a  5_DATA_PAGE_B;..
2cd10 20 20 2a 70 69 48 65 69 67 68 74 20 3d 20 28 69    *piHeight = (i
2cd20 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28  nt)(iRowid & (((
2cd30 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41  i64)1 << FTS5_DA
2cd40 54 41 5f 48 45 49 47 48 54 5f 42 29 20 2d 20 31  TA_HEIGHT_B) - 1
2cd50 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d  ));.  iRowid >>=
2cd60 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48   FTS5_DATA_HEIGH
2cd70 54 5f 42 3b 0a 0a 20 20 2a 70 62 44 6c 69 64 78  T_B;..  *pbDlidx
2cd80 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20   = (int)(iRowid 
2cd90 26 20 30 78 30 30 30 31 29 3b 0a 20 20 69 52 6f  & 0x0001);.  iRo
2cda0 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54  wid >>= FTS5_DAT
2cdb0 41 5f 44 4c 49 5f 42 3b 0a 0a 20 20 2a 70 69 53  A_DLI_B;..  *piS
2cdc0 65 67 69 64 20 3d 20 28 69 6e 74 29 28 69 52 6f  egid = (int)(iRo
2cdd0 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c  wid & (((i64)1 <
2cde0 3c 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42  < FTS5_DATA_ID_B
2cdf0 29 20 2d 20 31 29 29 3b 0a 7d 0a 0a 73 74 61 74  ) - 1));.}..stat
2ce00 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75  ic void fts5Debu
2ce10 67 52 6f 77 69 64 28 69 6e 74 20 2a 70 52 63 2c  gRowid(int *pRc,
2ce20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
2ce30 66 2c 20 69 36 34 20 69 4b 65 79 29 7b 0a 20 20  f, i64 iKey){.  
2ce40 69 6e 74 20 69 53 65 67 69 64 2c 20 69 48 65 69  int iSegid, iHei
2ce50 67 68 74 2c 20 69 50 67 6e 6f 2c 20 62 44 6c 69  ght, iPgno, bDli
2ce60 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  dx;       /* Row
2ce70 69 64 20 63 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f  id compenents */
2ce80 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77  .  fts5DecodeRow
2ce90 69 64 28 69 4b 65 79 2c 20 26 69 53 65 67 69 64  id(iKey, &iSegid
2cea0 2c 20 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69  , &bDlidx, &iHei
2ceb0 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20  ght, &iPgno);.. 
2cec0 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29   if( iSegid==0 )
2ced0 7b 0a 20 20 20 20 69 66 28 20 69 4b 65 79 3d 3d  {.    if( iKey==
2cee0 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f  FTS5_AVERAGES_RO
2cef0 57 49 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  WID ){.      sql
2cf00 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2cf10 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
2cf20 70 42 75 66 2c 20 22 7b 61 76 65 72 61 67 65 73  pBuf, "{averages
2cf30 7d 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  } ");.    }else{
2cf40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
2cf50 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2cf60 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2cf70 22 7b 73 74 72 75 63 74 75 72 65 7d 22 29 3b 0a  "{structure}");.
2cf80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65      }.  }.  else
2cf90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
2cfa0 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2cfb0 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
2cfc0 7b 25 73 73 65 67 69 64 3d 25 64 20 68 3d 25 64  {%ssegid=%d h=%d
2cfd0 20 70 67 6e 6f 3d 25 64 7d 22 2c 0a 20 20 20 20   pgno=%d}",.    
2cfe0 20 20 20 20 62 44 6c 69 64 78 20 3f 20 22 64 6c      bDlidx ? "dl
2cff0 69 64 78 20 22 20 3a 20 22 22 2c 20 69 53 65 67  idx " : "", iSeg
2d000 69 64 2c 20 69 48 65 69 67 68 74 2c 20 69 50 67  id, iHeight, iPg
2d010 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  no.    );.  }.}.
2d020 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
2d030 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28  5DebugStructure(
2d040 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20  .  int *pRc,    
2d050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d060 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72     /* IN/OUT: er
2d070 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  ror code */.  Ft
2d080 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a  s5Buffer *pBuf,.
2d090 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
2d0a0 2a 70 0a 29 7b 0a 20 20 69 6e 74 20 69 4c 76 6c  *p.){.  int iLvl
2d0b0 2c 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20  , iSeg;         
2d0c0 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
2d0d0 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c  te through level
2d0e0 73 2c 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a  s, segments */..
2d0f0 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
2d100 76 6c 3c 70 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  vl<p->nLevel; iL
2d110 76 6c 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53  vl++){.    Fts5S
2d120 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
2d130 4c 76 6c 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c  Lvl = &p->aLevel
2d140 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 73 71 6c 69  [iLvl];.    sqli
2d150 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2d160 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2d170 42 75 66 2c 20 0a 20 20 20 20 20 20 20 20 22 20  Buf, .        " 
2d180 7b 6c 76 6c 3d 25 64 20 6e 4d 65 72 67 65 3d 25  {lvl=%d nMerge=%
2d190 64 20 6e 53 65 67 3d 25 64 22 2c 20 69 4c 76 6c  d nSeg=%d", iLvl
2d1a0 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 2c 20  , pLvl->nMerge, 
2d1b0 70 4c 76 6c 2d 3e 6e 53 65 67 0a 20 20 20 20 29  pLvl->nSeg.    )
2d1c0 3b 0a 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30  ;.    for(iSeg=0
2d1d0 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65  ; iSeg<pLvl->nSe
2d1e0 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20  g; iSeg++){.    
2d1f0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
2d200 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26  egment *pSeg = &
2d210 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
2d220 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
2d230 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2d240 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2d250 20 22 20 7b 69 64 3d 25 64 20 6c 65 61 76 65 73   " {id=%d leaves
2d260 3d 25 64 2e 2e 25 64 7d 22 2c 20 0a 20 20 20 20  =%d..%d}", .    
2d270 20 20 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67        pSeg->iSeg
2d280 69 64 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69  id, pSeg->pgnoFi
2d290 72 73 74 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  rst, pSeg->pgnoL
2d2a0 61 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ast.      );.   
2d2b0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74   }.    sqlite3Ft
2d2c0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2d2d0 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2d2e0 22 7d 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  "}");.  }.}../*.
2d2f0 2a 2a 20 54 68 69 73 20 69 73 20 70 61 72 74 20  ** This is part 
2d300 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f  of the fts5_deco
2d310 64 65 28 29 20 64 65 62 75 67 67 69 6e 67 20 61  de() debugging a
2d320 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  id..**.** Argume
2d330 6e 74 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20  nts pBlob/nBlob 
2d340 63 6f 6e 74 61 69 6e 20 61 20 73 65 72 69 61 6c  contain a serial
2d350 69 7a 65 64 20 46 74 73 35 53 74 72 75 63 74 75  ized Fts5Structu
2d360 72 65 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 0a  re object. This.
2d370 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65  ** function appe
2d380 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64  nds a human-read
2d390 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74  able representat
2d3a0 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ion of the same 
2d3b0 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 74 68 65  object.** to the
2d3c0 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 61   buffer passed a
2d3d0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
2d3e0 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69  ument. .*/.stati
2d3f0 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64  c void fts5Decod
2d400 65 53 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e  eStructure(.  in
2d410 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
2d420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d430 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63   IN/OUT: error c
2d440 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ode */.  Fts5Buf
2d450 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e  fer *pBuf,.  con
2d460 73 74 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e  st u8 *pBlob, in
2d470 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74  t nBlob.){.  int
2d480 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2d490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d4a0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2d4b0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
2d4c0 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
2d4d0 20 2f 2a 20 44 65 63 6f 64 65 64 20 73 74 72 75   /* Decoded stru
2d4e0 63 74 75 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  cture object */.
2d4f0 0a 20 20 72 63 20 3d 20 66 74 73 35 53 74 72 75  .  rc = fts5Stru
2d500 63 74 75 72 65 44 65 63 6f 64 65 28 70 42 6c 6f  ctureDecode(pBlo
2d510 62 2c 20 6e 42 6c 6f 62 2c 20 30 2c 20 26 70 29  b, nBlob, 0, &p)
2d520 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2d530 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
2d540 63 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  c = rc;.    retu
2d550 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44  rn;.  }..  fts5D
2d560 65 62 75 67 53 74 72 75 63 74 75 72 65 28 70 52  ebugStructure(pR
2d570 63 2c 20 70 42 75 66 2c 20 70 29 3b 0a 20 20 66  c, pBuf, p);.  f
2d580 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
2d590 61 73 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ase(p);.}../*.**
2d5a0 20 54 68 69 73 20 69 73 20 70 61 72 74 20 6f 66   This is part of
2d5b0 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65   the fts5_decode
2d5c0 28 29 20 64 65 62 75 67 67 69 6e 67 20 61 69 64  () debugging aid
2d5d0 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
2d5e0 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f  s pBlob/nBlob co
2d5f0 6e 74 61 69 6e 20 61 6e 20 22 61 76 65 72 61 67  ntain an "averag
2d600 65 73 22 20 72 65 63 6f 72 64 2e 20 54 68 69 73  es" record. This
2d610 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 70   function .** ap
2d620 70 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72 65  pends a human-re
2d630 61 64 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74  adable represent
2d640 61 74 69 6f 6e 20 6f 66 20 72 65 63 6f 72 64 20  ation of record 
2d650 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 61  to the buffer pa
2d660 73 73 65 64 20 0a 2a 2a 20 61 73 20 74 68 65 20  ssed .** as the 
2d670 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
2d680 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
2d690 20 66 74 73 35 44 65 63 6f 64 65 41 76 65 72 61   fts5DecodeAvera
2d6a0 67 65 73 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c  ges(.  int *pRc,
2d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d6c0 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
2d6d0 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : error code */.
2d6e0 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
2d6f0 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  uf,.  const u8 *
2d700 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62  pBlob, int nBlob
2d710 0a 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b  .){.  int i = 0;
2d720 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2d730 53 70 61 63 65 20 3d 20 22 22 3b 0a 0a 20 20 77  Space = "";..  w
2d740 68 69 6c 65 28 20 69 3c 6e 42 6c 6f 62 20 29 7b  hile( i<nBlob ){
2d750 0a 20 20 20 20 75 36 34 20 69 56 61 6c 3b 0a 20  .    u64 iVal;. 
2d760 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46     i += sqlite3F
2d770 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 42  ts5GetVarint(&pB
2d780 6c 6f 62 5b 69 5d 2c 20 26 69 56 61 6c 29 3b 0a  lob[i], &iVal);.
2d790 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2d7a0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2d7b0 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 25 73  f(pRc, pBuf, "%s
2d7c0 25 64 22 2c 20 7a 53 70 61 63 65 2c 20 28 69 6e  %d", zSpace, (in
2d7d0 74 29 69 56 61 6c 29 3b 0a 20 20 20 20 7a 53 70  t)iVal);.    zSp
2d7e0 61 63 65 20 3d 20 22 20 22 3b 0a 20 20 7d 0a 7d  ace = " ";.  }.}
2d7f0 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28  ../*.** Buffer (
2d800 61 2f 6e 29 20 69 73 20 61 73 73 75 6d 65 64 20  a/n) is assumed 
2d810 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 6c 69 73  to contain a lis
2d820 74 20 6f 66 20 73 65 72 69 61 6c 69 7a 65 64 20  t of serialized 
2d830 76 61 72 69 6e 74 73 2e 20 52 65 61 64 0a 2a 2a  varints. Read.**
2d840 20 65 61 63 68 20 76 61 72 69 6e 74 20 61 6e 64   each varint and
2d850 20 61 70 70 65 6e 64 20 69 74 73 20 73 74 72 69   append its stri
2d860 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
2d870 6e 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66  n to buffer pBuf
2d880 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 66 74 65  . Return.** afte
2d890 72 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 70  r either the inp
2d8a0 75 74 20 62 75 66 66 65 72 20 69 73 20 65 78 68  ut buffer is exh
2d8b0 61 75 73 74 65 64 20 6f 72 20 61 20 30 20 76 61  austed or a 0 va
2d8c0 6c 75 65 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a  lue is read..**.
2d8d0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
2d8e0 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  lue is the numbe
2d8f0 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 20  r of bytes read 
2d900 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62  from the input b
2d910 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  uffer..*/.static
2d920 20 69 6e 74 20 66 74 73 35 44 65 63 6f 64 65 50   int fts5DecodeP
2d930 6f 73 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c  oslist(int *pRc,
2d940 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
2d950 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20  f, const u8 *a, 
2d960 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 4f  int n){.  int iO
2d970 66 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  ff = 0;.  while(
2d980 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69   iOff<n ){.    i
2d990 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 69 4f 66  nt iVal;.    iOf
2d9a0 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
2d9b0 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 69  nt32(&a[iOff], i
2d9c0 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
2d9d0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2d9e0 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2d9f0 66 2c 20 22 20 25 64 22 2c 20 69 56 61 6c 29 3b  f, " %d", iVal);
2da00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 4f  .  }.  return iO
2da10 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ff;.}../*.** The
2da20 20 73 74 61 72 74 20 6f 66 20 62 75 66 66 65 72   start of buffer
2da30 20 28 61 2f 6e 29 20 63 6f 6e 74 61 69 6e 73 20   (a/n) contains 
2da40 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 64  the start of a d
2da50 6f 63 6c 69 73 74 2e 20 54 68 65 20 64 6f 63 6c  oclist. The docl
2da60 69 73 74 0a 2a 2a 20 6d 61 79 20 6f 72 20 6d 61  ist.** may or ma
2da70 79 20 6e 6f 74 20 66 69 6e 69 73 68 20 77 69 74  y not finish wit
2da80 68 69 6e 20 74 68 65 20 62 75 66 66 65 72 2e 20  hin the buffer. 
2da90 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70  This function ap
2daa0 70 65 6e 64 73 20 61 20 74 65 78 74 0a 2a 2a 20  pends a text.** 
2dab0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
2dac0 66 20 74 68 65 20 70 61 72 74 20 6f 66 20 74 68  f the part of th
2dad0 65 20 64 6f 63 6c 69 73 74 20 74 68 61 74 20 69  e doclist that i
2dae0 73 20 70 72 65 73 65 6e 74 20 74 6f 20 62 75 66  s present to buf
2daf0 66 65 72 0a 2a 2a 20 70 42 75 66 2e 20 0a 2a 2a  fer.** pBuf. .**
2db00 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
2db10 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62  alue is the numb
2db20 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
2db30 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20   from the input 
2db40 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  buffer..*/.stati
2db50 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f 64 65  c int fts5Decode
2db60 44 6f 63 6c 69 73 74 28 69 6e 74 20 2a 70 52 63  Doclist(int *pRc
2db70 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42  , Fts5Buffer *pB
2db80 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c  uf, const u8 *a,
2db90 20 69 6e 74 20 6e 29 7b 0a 20 20 69 36 34 20 69   int n){.  i64 i
2dba0 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20 69 6e 74  Docid = 0;.  int
2dbb0 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66   iOff = 0;..  if
2dbc0 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 69 4f 66  ( n>0 ){.    iOf
2dbd0 66 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47  f = sqlite3Fts5G
2dbe0 65 74 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34  etVarint(a, (u64
2dbf0 2a 29 26 69 44 6f 63 69 64 29 3b 0a 20 20 20 20  *)&iDocid);.    
2dc00 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2dc10 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
2dc20 63 2c 20 70 42 75 66 2c 20 22 20 69 64 3d 25 6c  c, pBuf, " id=%l
2dc30 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20  ld", iDocid);.  
2dc40 7d 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c  }.  while( iOff<
2dc50 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50 6f  n ){.    int nPo
2dc60 73 3b 0a 20 20 20 20 69 6e 74 20 62 44 65 6c 3b  s;.    int bDel;
2dc70 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73  .    iOff += fts
2dc80 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28  5GetPoslistSize(
2dc90 26 61 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c  &a[iOff], &nPos,
2dca0 20 26 62 44 65 6c 29 3b 0a 20 20 20 20 73 71 6c   &bDel);.    sql
2dcb0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2dcc0 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
2dcd0 70 42 75 66 2c 20 22 20 6e 50 6f 73 3d 25 64 25  pBuf, " nPos=%d%
2dce0 73 22 2c 20 6e 50 6f 73 2c 20 62 44 65 6c 3f 22  s", nPos, bDel?"
2dcf0 2a 22 3a 22 22 29 3b 0a 20 20 20 20 69 4f 66 66  *":"");.    iOff
2dd00 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 50 6f   += fts5DecodePo
2dd10 73 6c 69 73 74 28 70 52 63 2c 20 70 42 75 66 2c  slist(pRc, pBuf,
2dd20 20 26 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e   &a[iOff], MIN(n
2dd30 2d 69 4f 66 66 2c 20 6e 50 6f 73 29 29 3b 0a 20  -iOff, nPos));. 
2dd40 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b     if( iOff<n ){
2dd50 0a 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74  .      i64 iDelt
2dd60 61 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  a;.      iOff +=
2dd70 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
2dd80 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20  arint(&a[iOff], 
2dd90 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a  (u64*)&iDelta);.
2dda0 20 20 20 20 20 20 69 44 6f 63 69 64 20 2b 3d 20        iDocid += 
2ddb0 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 73 71  iDelta;.      sq
2ddc0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2ddd0 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
2dde0 20 70 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64   pBuf, " id=%lld
2ddf0 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 20 20  ", iDocid);.    
2de00 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
2de10 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  iOff;.}../*.** T
2de20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2de30 70 61 72 74 20 6f 66 20 74 68 65 20 66 74 73 35  part of the fts5
2de40 5f 64 65 63 6f 64 65 28 29 20 64 65 62 75 67 67  _decode() debugg
2de50 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74  ing function. It
2de60 20 69 73 20 0a 2a 2a 20 6f 6e 6c 79 20 65 76 65   is .** only eve
2de70 72 20 75 73 65 64 20 77 69 74 68 20 64 65 74 61  r used with deta
2de80 69 6c 3d 6e 6f 6e 65 20 74 61 62 6c 65 73 2e 0a  il=none tables..
2de90 2a 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28 70 44  **.** Buffer (pD
2dea0 61 74 61 2f 6e 44 61 74 61 29 20 63 6f 6e 74 61  ata/nData) conta
2deb0 69 6e 73 20 61 20 64 6f 63 6c 69 73 74 20 69 6e  ins a doclist in
2dec0 20 74 68 65 20 66 6f 72 6d 61 74 20 75 73 65 64   the format used
2ded0 20 62 79 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 0a   by detail=none.
2dee0 2a 2a 20 74 61 62 6c 65 73 2e 20 54 68 69 73 20  ** tables. This 
2def0 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
2df00 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
2df10 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 61  e version of tha
2df20 74 20 6c 69 73 74 20 74 6f 0a 2a 2a 20 62 75 66  t list to.** buf
2df30 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
2df40 49 66 20 2a 70 52 63 20 69 73 20 6f 74 68 65 72  If *pRc is other
2df50 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
2df60 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
2df70 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
2df80 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20   is a.** no-op. 
2df90 49 66 20 61 6e 20 4f 4f 4d 20 6f 72 20 6f 74 68  If an OOM or oth
2dfa0 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  er error occurs 
2dfb0 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
2dfc0 74 69 6f 6e 2c 20 2a 70 52 63 20 69 73 0a 2a 2a  tion, *pRc is.**
2dfd0 20 73 65 74 20 74 6f 20 61 6e 20 53 51 4c 69 74   set to an SQLit
2dfe0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 62 65 66  e error code bef
2dff0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 54  ore returning. T
2e000 68 65 20 66 69 6e 61 6c 20 73 74 61 74 65 20 6f  he final state o
2e010 66 20 62 75 66 66 65 72 0a 2a 2a 20 70 42 75 66  f buffer.** pBuf
2e020 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e   is undefined in
2e030 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73   this case..*/.s
2e040 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
2e050 65 63 6f 64 65 52 6f 77 69 64 4c 69 73 74 28 0a  ecodeRowidList(.
2e060 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
2e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e080 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72    /* IN/OUT: Err
2e090 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  or code */.  Fts
2e0a0 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 20  5Buffer *pBuf,  
2e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e0c0 42 75 66 66 65 72 20 74 6f 20 61 70 70 65 6e 64  Buffer to append
2e0d0 20 74 65 78 74 20 74 6f 20 2a 2f 0a 20 20 63 6f   text to */.  co
2e0e0 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69  nst u8 *pData, i
2e0f0 6e 74 20 6e 44 61 74 61 20 20 20 20 20 20 2f 2a  nt nData      /*
2e100 20 44 61 74 61 20 74 6f 20 64 65 63 6f 64 65 20   Data to decode 
2e110 6c 69 73 74 2d 6f 66 2d 72 6f 77 69 64 73 20 66  list-of-rowids f
2e120 72 6f 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  rom */.){.  int 
2e130 69 20 3d 20 30 3b 0a 20 20 69 36 34 20 69 52 6f  i = 0;.  i64 iRo
2e140 77 69 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c  wid = 0;..  whil
2e150 65 28 20 69 3c 6e 44 61 74 61 20 29 7b 0a 20 20  e( i<nData ){.  
2e160 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
2e170 70 70 20 3d 20 22 22 3b 0a 20 20 20 20 75 36 34  pp = "";.    u64
2e180 20 69 56 61 6c 3b 0a 20 20 20 20 69 20 2b 3d 20   iVal;.    i += 
2e190 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
2e1a0 72 69 6e 74 28 26 70 44 61 74 61 5b 69 5d 2c 20  rint(&pData[i], 
2e1b0 26 69 56 61 6c 29 3b 0a 20 20 20 20 69 52 6f 77  &iVal);.    iRow
2e1c0 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 0a 20 20 20  id += iVal;..   
2e1d0 20 69 66 28 20 69 3c 6e 44 61 74 61 20 26 26 20   if( i<nData && 
2e1e0 70 44 61 74 61 5b 69 5d 3d 3d 30 78 30 30 20 29  pData[i]==0x00 )
2e1f0 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  {.      i++;.   
2e200 20 20 20 69 66 28 20 69 3c 6e 44 61 74 61 20 26     if( i<nData &
2e210 26 20 70 44 61 74 61 5b 69 5d 3d 3d 30 78 30 30  & pData[i]==0x00
2e220 20 29 7b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b   ){.        i++;
2e230 0a 20 20 20 20 20 20 20 20 7a 41 70 70 20 3d 20  .        zApp = 
2e240 22 2b 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  "+";.      }else
2e250 7b 0a 20 20 20 20 20 20 20 20 7a 41 70 70 20 3d  {.        zApp =
2e260 20 22 2a 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20   "*";.      }.  
2e270 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33    }..    sqlite3
2e280 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2e290 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2e2a0 2c 20 22 20 25 6c 6c 64 25 73 22 2c 20 69 52 6f  , " %lld%s", iRo
2e2b0 77 69 64 2c 20 7a 41 70 70 29 3b 0a 20 20 7d 0a  wid, zApp);.  }.
2e2c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  }../*.** The imp
2e2d0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75  lementation of u
2e2e0 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c  ser-defined scal
2e2f0 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35  ar function fts5
2e300 5f 64 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74  _decode()..*/.st
2e310 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
2e320 63 6f 64 65 46 75 6e 63 74 69 6f 6e 28 0a 20 20  codeFunction(.  
2e330 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2e340 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
2e350 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  /* Function call
2e360 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
2e370 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20  t nArg,         
2e380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e390 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20   Number of args 
2e3a0 28 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20  (always 2) */.  
2e3b0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2e3c0 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20  apVal           
2e3d0 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75  /* Function argu
2e3e0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 36  ments */.){.  i6
2e3f0 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20  4 iRowid;       
2e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e410 20 52 6f 77 69 64 20 66 6f 72 20 72 65 63 6f 72   Rowid for recor
2e420 64 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20  d being decoded 
2e430 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c  */.  int iSegid,
2e440 69 48 65 69 67 68 74 2c 69 50 67 6e 6f 2c 62 44  iHeight,iPgno,bD
2e450 6c 69 64 78 3b 2f 2a 20 52 6f 77 69 64 20 63 6f  lidx;/* Rowid co
2e460 6d 70 6f 6e 65 6e 74 73 20 2a 2f 0a 20 20 63 6f  mponents */.  co
2e470 6e 73 74 20 75 38 20 2a 61 42 6c 6f 62 3b 20 69  nst u8 *aBlob; i
2e480 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  nt n;         /*
2e490 20 52 65 63 6f 72 64 20 74 6f 20 64 65 63 6f 64   Record to decod
2e4a0 65 20 2a 2f 0a 20 20 75 38 20 2a 61 20 3d 20 30  e */.  u8 *a = 0
2e4b0 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 73  ;.  Fts5Buffer s
2e4c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e4d0 20 20 20 20 2f 2a 20 42 75 69 6c 64 20 75 70 20      /* Build up 
2e4e0 74 65 78 74 20 74 6f 20 72 65 74 75 72 6e 20 68  text to return h
2e4f0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ere */.  int rc 
2e500 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2e510 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2e520 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2e530 20 6e 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 69   nSpace = 0;.  i
2e540 6e 74 20 65 44 65 74 61 69 6c 4e 6f 6e 65 20 3d  nt eDetailNone =
2e550 20 28 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64   (sqlite3_user_d
2e560 61 74 61 28 70 43 74 78 29 21 3d 30 29 3b 0a 0a  ata(pCtx)!=0);..
2e570 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
2e580 32 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  2 );.  UNUSED_PA
2e590 52 41 4d 28 6e 41 72 67 29 3b 0a 20 20 6d 65 6d  RAM(nArg);.  mem
2e5a0 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f  set(&s, 0, sizeo
2e5b0 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a  f(Fts5Buffer));.
2e5c0 20 20 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74    iRowid = sqlit
2e5d0 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
2e5e0 70 56 61 6c 5b 30 5d 29 3b 0a 0a 20 20 2f 2a 20  pVal[0]);..  /* 
2e5f0 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  Make a copy of t
2e600 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2e610 6e 74 20 28 61 20 62 6c 6f 62 29 20 69 6e 20 61  nt (a blob) in a
2e620 42 6c 6f 62 5b 5d 2e 20 54 68 65 20 61 42 6c 6f  Blob[]. The aBlo
2e630 62 5b 5d 0a 20 20 2a 2a 20 63 6f 70 79 20 69 73  b[].  ** copy is
2e640 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 46 54 53   followed by FTS
2e650 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44  5_DATA_ZERO_PADD
2e660 49 4e 47 20 30 78 30 30 20 62 79 74 65 73 2c 20  ING 0x00 bytes, 
2e670 77 68 69 63 68 20 70 72 65 76 65 6e 74 73 0a 20  which prevents. 
2e680 20 2a 2a 20 62 75 66 66 65 72 20 6f 76 65 72 72   ** buffer overr
2e690 65 61 64 73 20 65 76 65 6e 20 69 66 20 74 68 65  eads even if the
2e6a0 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75   record is corru
2e6b0 70 74 2e 20 20 2a 2f 0a 20 20 6e 20 3d 20 73 71  pt.  */.  n = sq
2e6c0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
2e6d0 73 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 61  s(apVal[1]);.  a
2e6e0 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76  Blob = sqlite3_v
2e6f0 61 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b  alue_blob(apVal[
2e700 31 5d 29 3b 0a 20 20 6e 53 70 61 63 65 20 3d 20  1]);.  nSpace = 
2e710 6e 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 5a 45  n + FTS5_DATA_ZE
2e720 52 4f 5f 50 41 44 44 49 4e 47 3b 0a 20 20 61 20  RO_PADDING;.  a 
2e730 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33 46 74  = (u8*)sqlite3Ft
2e740 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
2e750 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28  , nSpace);.  if(
2e760 20 61 3d 3d 30 20 29 20 67 6f 74 6f 20 64 65 63   a==0 ) goto dec
2e770 6f 64 65 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63 70  ode_out;.  memcp
2e780 79 28 61 2c 20 61 42 6c 6f 62 2c 20 6e 29 3b 0a  y(a, aBlob, n);.
2e790 0a 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f  ..  fts5DecodeRo
2e7a0 77 69 64 28 69 52 6f 77 69 64 2c 20 26 69 53 65  wid(iRowid, &iSe
2e7b0 67 69 64 2c 20 26 62 44 6c 69 64 78 2c 20 26 69  gid, &bDlidx, &i
2e7c0 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b  Height, &iPgno);
2e7d0 0a 0a 20 20 66 74 73 35 44 65 62 75 67 52 6f 77  ..  fts5DebugRow
2e7e0 69 64 28 26 72 63 2c 20 26 73 2c 20 69 52 6f 77  id(&rc, &s, iRow
2e7f0 69 64 29 3b 0a 20 20 69 66 28 20 62 44 6c 69 64  id);.  if( bDlid
2e800 78 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74  x ){.    Fts5Dat
2e810 61 20 64 6c 69 64 78 3b 0a 20 20 20 20 46 74 73  a dlidx;.    Fts
2e820 35 44 6c 69 64 78 4c 76 6c 20 6c 76 6c 3b 0a 0a  5DlidxLvl lvl;..
2e830 20 20 20 20 64 6c 69 64 78 2e 70 20 3d 20 61 3b      dlidx.p = a;
2e840 0a 20 20 20 20 64 6c 69 64 78 2e 6e 6e 20 3d 20  .    dlidx.nn = 
2e850 6e 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  n;..    memset(&
2e860 6c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  lvl, 0, sizeof(F
2e870 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20  ts5DlidxLvl));. 
2e880 20 20 20 6c 76 6c 2e 70 44 61 74 61 20 3d 20 26     lvl.pData = &
2e890 64 6c 69 64 78 3b 0a 20 20 20 20 6c 76 6c 2e 69  dlidx;.    lvl.i
2e8a0 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 6e 6f  LeafPgno = iPgno
2e8b0 3b 0a 0a 20 20 20 20 66 6f 72 28 66 74 73 35 44  ;..    for(fts5D
2e8c0 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c 76 6c  lidxLvlNext(&lvl
2e8d0 29 3b 20 6c 76 6c 2e 62 45 6f 66 3d 3d 30 3b 20  ); lvl.bEof==0; 
2e8e0 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74  fts5DlidxLvlNext
2e8f0 28 26 6c 76 6c 29 29 7b 0a 20 20 20 20 20 20 73  (&lvl)){.      s
2e900 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2e910 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63  AppendPrintf(&rc
2e920 2c 20 26 73 2c 20 0a 20 20 20 20 20 20 20 20 20  , &s, .         
2e930 20 22 20 25 64 28 25 6c 6c 64 29 22 2c 20 6c 76   " %d(%lld)", lv
2e940 6c 2e 69 4c 65 61 66 50 67 6e 6f 2c 20 6c 76 6c  l.iLeafPgno, lvl
2e950 2e 69 52 6f 77 69 64 0a 20 20 20 20 20 20 29 3b  .iRowid.      );
2e960 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
2e970 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a  f( iSegid==0 ){.
2e980 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 3d 3d      if( iRowid==
2e990 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f  FTS5_AVERAGES_RO
2e9a0 57 49 44 20 29 7b 0a 20 20 20 20 20 20 66 74 73  WID ){.      fts
2e9b0 35 44 65 63 6f 64 65 41 76 65 72 61 67 65 73 28  5DecodeAverages(
2e9c0 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a  &rc, &s, a, n);.
2e9d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e9e0 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75 63   fts5DecodeStruc
2e9f0 74 75 72 65 28 26 72 63 2c 20 26 73 2c 20 61 2c  ture(&rc, &s, a,
2ea00 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   n);.    }.  }el
2ea10 73 65 20 69 66 28 20 65 44 65 74 61 69 6c 4e 6f  se if( eDetailNo
2ea20 6e 65 20 29 7b 0a 20 20 20 20 46 74 73 35 42 75  ne ){.    Fts5Bu
2ea30 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20  ffer term;      
2ea40 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
2ea50 6e 74 20 74 65 72 6d 20 72 65 61 64 20 66 72 6f  nt term read fro
2ea60 6d 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  m page */.    in
2ea70 74 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 69 6e  t szLeaf;.    in
2ea80 74 20 69 50 67 69 64 78 4f 66 66 20 3d 20 73 7a  t iPgidxOff = sz
2ea90 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74 55 31  Leaf = fts5GetU1
2eaa0 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20 69 6e  6(&a[2]);.    in
2eab0 74 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20  t iTermOff;.    
2eac0 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20  int nKeep = 0;. 
2ead0 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20     int iOff;..  
2eae0 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20    memset(&term, 
2eaf0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  0, sizeof(Fts5Bu
2eb00 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  ffer));..    /* 
2eb10 44 65 63 6f 64 65 20 61 6e 79 20 65 6e 74 72 69  Decode any entri
2eb20 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 62 65  es that occur be
2eb30 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 74  fore the first t
2eb40 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  erm. */.    if( 
2eb50 73 7a 4c 65 61 66 3c 6e 20 29 7b 0a 20 20 20 20  szLeaf<n ){.    
2eb60 20 20 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66    iPgidxOff += f
2eb70 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
2eb80 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 69 54  a[iPgidxOff], iT
2eb90 65 72 6d 4f 66 66 29 3b 0a 20 20 20 20 7d 65 6c  ermOff);.    }el
2eba0 73 65 7b 0a 20 20 20 20 20 20 69 54 65 72 6d 4f  se{.      iTermO
2ebb0 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20  ff = szLeaf;.   
2ebc0 20 7d 0a 20 20 20 20 66 74 73 35 44 65 63 6f 64   }.    fts5Decod
2ebd0 65 52 6f 77 69 64 4c 69 73 74 28 26 72 63 2c 20  eRowidList(&rc, 
2ebe0 26 73 2c 20 26 61 5b 34 5d 2c 20 69 54 65 72 6d  &s, &a[4], iTerm
2ebf0 4f 66 66 2d 34 29 3b 0a 0a 20 20 20 20 69 4f 66  Off-4);..    iOf
2ec00 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20  f = iTermOff;.  
2ec10 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 73 7a    while( iOff<sz
2ec20 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 6e  Leaf ){.      in
2ec30 74 20 6e 41 70 70 65 6e 64 3b 0a 0a 20 20 20 20  t nAppend;..    
2ec40 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 74 65    /* Read the te
2ec50 72 6d 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  rm data for the 
2ec60 6e 65 78 74 20 74 65 72 6d 2a 2f 0a 20 20 20 20  next term*/.    
2ec70 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
2ec80 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
2ec90 66 5d 2c 20 6e 41 70 70 65 6e 64 29 3b 0a 20 20  f], nAppend);.  
2eca0 20 20 20 20 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65      term.n = nKe
2ecb0 65 70 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  ep;.      fts5Bu
2ecc0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
2ecd0 72 63 2c 20 26 74 65 72 6d 2c 20 6e 41 70 70 65  rc, &term, nAppe
2ece0 6e 64 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20  nd, &a[iOff]);. 
2ecf0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
2ed00 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2ed10 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 26 72  tf(.          &r
2ed20 63 2c 20 26 73 2c 20 22 20 74 65 72 6d 3d 25 2e  c, &s, " term=%.
2ed30 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c 20 28 63 6f  *s", term.n, (co
2ed40 6e 73 74 20 63 68 61 72 2a 29 74 65 72 6d 2e 70  nst char*)term.p
2ed50 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
2ed60 69 4f 66 66 20 2b 3d 20 6e 41 70 70 65 6e 64 3b  iOff += nAppend;
2ed70 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72  ..      /* Figur
2ed80 65 20 6f 75 74 20 77 68 65 72 65 20 74 68 65 20  e out where the 
2ed90 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 69 73  doclist for this
2eda0 20 74 65 72 6d 20 65 6e 64 73 20 2a 2f 0a 20 20   term ends */.  
2edb0 20 20 20 20 69 66 28 20 69 50 67 69 64 78 4f 66      if( iPgidxOf
2edc0 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69  f<n ){.        i
2edd0 6e 74 20 6e 49 6e 63 72 3b 0a 20 20 20 20 20 20  nt nIncr;.      
2ede0 20 20 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66    iPgidxOff += f
2edf0 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
2ee00 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 49  a[iPgidxOff], nI
2ee10 6e 63 72 29 3b 0a 20 20 20 20 20 20 20 20 69 54  ncr);.        iT
2ee20 65 72 6d 4f 66 66 20 2b 3d 20 6e 49 6e 63 72 3b  ermOff += nIncr;
2ee30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2ee40 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20 3d        iTermOff =
2ee50 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20 7d   szLeaf;.      }
2ee60 0a 0a 20 20 20 20 20 20 66 74 73 35 44 65 63 6f  ..      fts5Deco
2ee70 64 65 52 6f 77 69 64 4c 69 73 74 28 26 72 63 2c  deRowidList(&rc,
2ee80 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 69   &s, &a[iOff], i
2ee90 54 65 72 6d 4f 66 66 2d 69 4f 66 66 29 3b 0a 20  TermOff-iOff);. 
2eea0 20 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72       iOff = iTer
2eeb0 6d 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20  mOff;.      if( 
2eec0 69 4f 66 66 3c 73 7a 4c 65 61 66 20 29 7b 0a 20  iOff<szLeaf ){. 
2eed0 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
2eee0 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
2eef0 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b  a[iOff], nKeep);
2ef00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2ef10 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
2ef20 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 7d 65 6c  ee(&term);.  }el
2ef30 73 65 7b 0a 20 20 20 20 46 74 73 35 42 75 66 66  se{.    Fts5Buff
2ef40 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20  er term;        
2ef50 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
2ef60 20 74 65 72 6d 20 72 65 61 64 20 66 72 6f 6d 20   term read from 
2ef70 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  page */.    int 
2ef80 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  szLeaf;         
2ef90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
2efa0 73 65 74 20 6f 66 20 70 67 69 64 78 20 69 6e 20  set of pgidx in 
2efb0 61 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  a[] */.    int i
2efc0 50 67 69 64 78 4f 66 66 3b 0a 20 20 20 20 69 6e  PgidxOff;.    in
2efd0 74 20 69 50 67 69 64 78 50 72 65 76 20 3d 20 30  t iPgidxPrev = 0
2efe0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
2eff0 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20 72 65  revious value re
2f000 61 64 20 66 72 6f 6d 20 70 67 69 64 78 20 2a 2f  ad from pgidx */
2f010 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d 4f 66  .    int iTermOf
2f020 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  f = 0;.    int i
2f030 52 6f 77 69 64 4f 66 66 20 3d 20 30 3b 0a 20 20  RowidOff = 0;.  
2f040 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
2f050 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20  int nDoclist;.. 
2f060 20 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c     memset(&term,
2f070 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42   0, sizeof(Fts5B
2f080 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 69 66  uffer));..    if
2f090 28 20 6e 3c 34 20 29 7b 0a 20 20 20 20 20 20 73  ( n<4 ){.      s
2f0a0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2f0b0 53 65 74 28 26 72 63 2c 20 26 73 2c 20 37 2c 20  Set(&rc, &s, 7, 
2f0c0 28 63 6f 6e 73 74 20 75 38 2a 29 22 63 6f 72 72  (const u8*)"corr
2f0d0 75 70 74 22 29 3b 0a 20 20 20 20 20 20 67 6f 74  upt");.      got
2f0e0 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20  o decode_out;.  
2f0f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
2f100 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 47  RowidOff = fts5G
2f110 65 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20  etU16(&a[0]);.  
2f120 20 20 20 20 69 50 67 69 64 78 4f 66 66 20 3d 20      iPgidxOff = 
2f130 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74  szLeaf = fts5Get
2f140 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20  U16(&a[2]);.    
2f150 20 20 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c    if( iPgidxOff<
2f160 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  n ){.        fts
2f170 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
2f180 69 50 67 69 64 78 4f 66 66 5d 2c 20 69 54 65 72  iPgidxOff], iTer
2f190 6d 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20  mOff);.      }. 
2f1a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
2f1b0 6f 64 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ode the position
2f1c0 20 6c 69 73 74 20 74 61 69 6c 20 61 74 20 74 68   list tail at th
2f1d0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 70  e start of the p
2f1e0 61 67 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  age */.    if( i
2f1f0 52 6f 77 69 64 4f 66 66 21 3d 30 20 29 7b 0a 20  RowidOff!=0 ){. 
2f200 20 20 20 20 20 69 4f 66 66 20 3d 20 69 52 6f 77       iOff = iRow
2f210 69 64 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65  idOff;.    }else
2f220 20 69 66 28 20 69 54 65 72 6d 4f 66 66 21 3d 30   if( iTermOff!=0
2f230 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d   ){.      iOff =
2f240 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 7d   iTermOff;.    }
2f250 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4f 66 66  else{.      iOff
2f260 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 7d   = szLeaf;.    }
2f270 0a 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 50  .    fts5DecodeP
2f280 6f 73 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20  oslist(&rc, &s, 
2f290 26 61 5b 34 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a  &a[4], iOff-4);.
2f2a0 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 61  .    /* Decode a
2f2b0 6e 79 20 6d 6f 72 65 20 64 6f 63 6c 69 73 74 20  ny more doclist 
2f2c0 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72  data that appear
2f2d0 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 62 65  s on the page be
2f2e0 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  fore the.    ** 
2f2f0 66 69 72 73 74 20 74 65 72 6d 2e 20 2a 2f 0a 20  first term. */. 
2f300 20 20 20 6e 44 6f 63 6c 69 73 74 20 3d 20 28 69     nDoclist = (i
2f310 54 65 72 6d 4f 66 66 20 3f 20 69 54 65 72 6d 4f  TermOff ? iTermO
2f320 66 66 20 3a 20 73 7a 4c 65 61 66 29 20 2d 20 69  ff : szLeaf) - i
2f330 4f 66 66 3b 0a 20 20 20 20 66 74 73 35 44 65 63  Off;.    fts5Dec
2f340 6f 64 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20  odeDoclist(&rc, 
2f350 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 44  &s, &a[iOff], nD
2f360 6f 63 6c 69 73 74 29 3b 0a 0a 20 20 20 20 77 68  oclist);..    wh
2f370 69 6c 65 28 20 69 50 67 69 64 78 4f 66 66 3c 6e  ile( iPgidxOff<n
2f380 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 46   ){.      int bF
2f390 69 72 73 74 20 3d 20 28 69 50 67 69 64 78 4f 66  irst = (iPgidxOf
2f3a0 66 3d 3d 73 7a 4c 65 61 66 29 3b 20 20 20 20 20  f==szLeaf);     
2f3b0 2f 2a 20 54 72 75 65 20 66 6f 72 20 66 69 72 73  /* True for firs
2f3c0 74 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a  t term on page *
2f3d0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  /.      int nByt
2f3e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2f3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f400 20 42 79 74 65 73 20 6f 66 20 64 61 74 61 20 2a   Bytes of data *
2f410 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 45 6e 64  /.      int iEnd
2f420 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69  ;.      .      i
2f430 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35  PgidxOff += fts5
2f440 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
2f450 50 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74 65  PgidxOff], nByte
2f460 29 3b 0a 20 20 20 20 20 20 69 50 67 69 64 78 50  );.      iPgidxP
2f470 72 65 76 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  rev += nByte;.  
2f480 20 20 20 20 69 4f 66 66 20 3d 20 69 50 67 69 64      iOff = iPgid
2f490 78 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 69 66  xPrev;..      if
2f4a0 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b  ( iPgidxOff<n ){
2f4b0 0a 20 20 20 20 20 20 20 20 66 74 73 35 47 65 74  .        fts5Get
2f4c0 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69  Varint32(&a[iPgi
2f4d0 64 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a  dxOff], nByte);.
2f4e0 20 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69          iEnd = i
2f4f0 50 67 69 64 78 50 72 65 76 20 2b 20 6e 42 79 74  PgidxPrev + nByt
2f500 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
2f510 20 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20 73          iEnd = s
2f520 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20 7d 0a 0a  zLeaf;.      }..
2f530 20 20 20 20 20 20 69 66 28 20 62 46 69 72 73 74        if( bFirst
2f540 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
2f550 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
2f560 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c  rint32(&a[iOff],
2f570 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
2f580 20 74 65 72 6d 2e 6e 20 3d 20 6e 42 79 74 65 3b   term.n = nByte;
2f590 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2f5a0 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
2f5b0 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c  rint32(&a[iOff],
2f5c0 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 66   nByte);.      f
2f5d0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
2f5e0 6c 6f 62 28 26 72 63 2c 20 26 74 65 72 6d 2c 20  lob(&rc, &term, 
2f5f0 6e 42 79 74 65 2c 20 26 61 5b 69 4f 66 66 5d 29  nByte, &a[iOff])
2f600 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
2f610 6e 42 79 74 65 3b 0a 0a 20 20 20 20 20 20 73 71  nByte;..      sq
2f620 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2f630 70 70 65 6e 64 50 72 69 6e 74 66 28 0a 20 20 20  ppendPrintf(.   
2f640 20 20 20 20 20 20 20 26 72 63 2c 20 26 73 2c 20         &rc, &s, 
2f650 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65  " term=%.*s", te
2f660 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61  rm.n, (const cha
2f670 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20 20 20  r*)term.p.      
2f680 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  );.      iOff +=
2f690 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69   fts5DecodeDocli
2f6a0 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69  st(&rc, &s, &a[i
2f6b0 4f 66 66 5d 2c 20 69 45 6e 64 2d 69 4f 66 66 29  Off], iEnd-iOff)
2f6c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73  ;.    }..    fts
2f6d0 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72  5BufferFree(&ter
2f6e0 6d 29 3b 0a 20 20 7d 0a 20 20 0a 20 64 65 63 6f  m);.  }.  . deco
2f6f0 64 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  de_out:.  sqlite
2f700 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 69 66 28  3_free(a);.  if(
2f710 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f720 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
2f730 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
2f740 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 2e 70  (const char*)s.p
2f750 2c 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f 54 52  , s.n, SQLITE_TR
2f760 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73  ANSIENT);.  }els
2f770 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  e{.    sqlite3_r
2f780 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65  esult_error_code
2f790 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a  (pCtx, rc);.  }.
2f7a0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
2f7b0 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  (&s);.}../*.** T
2f7c0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
2f7d0 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65  n of user-define
2f7e0 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  d scalar functio
2f7f0 6e 20 66 74 73 35 5f 72 6f 77 69 64 28 29 2e 0a  n fts5_rowid()..
2f800 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2f810 74 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e  ts5RowidFunction
2f820 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
2f830 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20  ext *pCtx,      
2f840 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
2f850 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  call context */.
2f860 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20    int nArg,     
2f870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f880 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2f890 72 67 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a  rgs (always 2) *
2f8a0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
2f8b0 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20  e **apVal       
2f8c0 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
2f8d0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
2f8e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
2f8f0 72 67 3b 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d  rg;.  if( nArg==
2f900 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2f910 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
2f920 74 78 2c 20 22 73 68 6f 75 6c 64 20 62 65 3a 20  tx, "should be: 
2f930 66 74 73 35 5f 72 6f 77 69 64 28 73 75 62 6a 65  fts5_rowid(subje
2f940 63 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b  ct, ....)", -1);
2f950 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41  .  }else{.    zA
2f960 72 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  rg = (const char
2f970 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
2f980 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a  text(apVal[0]);.
2f990 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
2f9a0 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c  e3_stricmp(zArg,
2f9b0 20 22 73 65 67 6d 65 6e 74 22 29 20 29 7b 0a 20   "segment") ){. 
2f9c0 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b       i64 iRowid;
2f9d0 0a 20 20 20 20 20 20 69 6e 74 20 73 65 67 69 64  .      int segid
2f9e0 2c 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 69 66  , pgno;.      if
2f9f0 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20 20  ( nArg!=3 ){.   
2fa00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
2fa10 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20  ult_error(pCtx, 
2fa20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73 68  .            "sh
2fa30 6f 75 6c 64 20 62 65 3a 20 66 74 73 35 5f 72 6f  ould be: fts5_ro
2fa40 77 69 64 28 27 73 65 67 6d 65 6e 74 27 2c 20 73  wid('segment', s
2fa50 65 67 69 64 2c 20 70 67 6e 6f 29 29 22 2c 20 2d  egid, pgno))", -
2fa60 31 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  1.        );.   
2fa70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fa80 20 20 73 65 67 69 64 20 3d 20 73 71 6c 69 74 65    segid = sqlite
2fa90 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61  3_value_int(apVa
2faa0 6c 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  l[1]);.        p
2fab0 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  gno = sqlite3_va
2fac0 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 32 5d  lue_int(apVal[2]
2fad0 29 3b 0a 20 20 20 20 20 20 20 20 69 52 6f 77 69  );.        iRowi
2fae0 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  d = FTS5_SEGMENT
2faf0 5f 52 4f 57 49 44 28 73 65 67 69 64 2c 20 70 67  _ROWID(segid, pg
2fb00 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  no);.        sql
2fb10 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
2fb20 34 28 70 43 74 78 2c 20 69 52 6f 77 69 64 29 3b  4(pCtx, iRowid);
2fb30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2fb40 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
2fb50 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70  3_result_error(p
2fb60 43 74 78 2c 20 0a 20 20 20 20 20 20 20 20 22 66  Ctx, .        "f
2fb70 69 72 73 74 20 61 72 67 20 74 6f 20 66 74 73 35  irst arg to fts5
2fb80 5f 72 6f 77 69 64 28 29 20 6d 75 73 74 20 62 65  _rowid() must be
2fb90 20 27 73 65 67 6d 65 6e 74 27 22 20 2c 20 2d 31   'segment'" , -1
2fba0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
2fbb0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
2fbc0 73 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70  s is called as p
2fbd0 61 72 74 20 6f 66 20 72 65 67 69 73 74 65 72 69  art of registeri
2fbe0 6e 67 20 74 68 65 20 46 54 53 35 20 6d 6f 64 75  ng the FTS5 modu
2fbf0 6c 65 20 77 69 74 68 20 64 61 74 61 62 61 73 65  le with database
2fc00 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  .** connection d
2fc10 62 2e 20 49 74 20 72 65 67 69 73 74 65 72 73 20  b. It registers 
2fc20 73 65 76 65 72 61 6c 20 75 73 65 72 2d 64 65 66  several user-def
2fc30 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63  ined scalar func
2fc40 74 69 6f 6e 73 20 75 73 65 66 75 6c 0a 2a 2a 20  tions useful.** 
2fc50 77 69 74 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a  with FTS5..**.**
2fc60 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2fc70 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2fc80 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
2fc90 6f 72 20 6f 63 63 75 72 73 2c 20 73 6f 6d 65 20  or occurs, some 
2fca0 6f 74 68 65 72 0a 2a 2a 20 53 51 4c 69 74 65 20  other.** SQLite 
2fcb0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2fcc0 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a  turned instead..
2fcd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
2fce0 73 35 49 6e 64 65 78 49 6e 69 74 28 73 71 6c 69  s5IndexInit(sqli
2fcf0 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
2fd00 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
2fd10 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
2fd20 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f 64 65      db, "fts5_de
2fd30 63 6f 64 65 22 2c 20 32 2c 20 53 51 4c 49 54 45  code", 2, SQLITE
2fd40 5f 55 54 46 38 2c 20 30 2c 20 66 74 73 35 44 65  _UTF8, 0, fts5De
2fd50 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c  codeFunction, 0,
2fd60 20 30 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72   0.  );..  if( r
2fd70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2fd80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2fd90 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
2fda0 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22 66  (.        db, "f
2fdb0 74 73 35 5f 64 65 63 6f 64 65 5f 6e 6f 6e 65 22  ts5_decode_none"
2fdc0 2c 20 32 2c 20 0a 20 20 20 20 20 20 20 20 53 51  , 2, .        SQ
2fdd0 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64  LITE_UTF8, (void
2fde0 2a 29 64 62 2c 20 66 74 73 35 44 65 63 6f 64 65  *)db, fts5Decode
2fdf0 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20  Function, 0, 0. 
2fe00 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28     );.  }..  if(
2fe10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2fe20 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2fe30 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
2fe40 6f 6e 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20  on(.        db, 
2fe50 22 66 74 73 35 5f 72 6f 77 69 64 22 2c 20 2d 31  "fts5_rowid", -1
2fe60 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
2fe70 2c 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63 74  , fts5RowidFunct
2fe80 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b  ion, 0, 0.    );
2fe90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2fea0 3b 0a 7d 0a                                      ;.}.