/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 317040cb17cdad05e973376b39239b29c75f90b5:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 6f 77 20  *****.**.** Low 
0180: 6c 65 76 65 6c 20 61 63 63 65 73 73 20 74 6f 20  level access to 
0190: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
01a0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
01b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 0a  base file. The .
01c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
01d0: 68 69 73 20 66 69 6c 65 20 66 69 6c 65 20 69 6d  his file file im
01e0: 70 6c 65 6d 65 6e 74 20 61 6c 6c 20 72 65 61 64  plement all read
01f0: 20 61 6e 64 20 77 72 69 74 65 20 61 63 63 65 73   and write acces
0200: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 25 5f 64 61  s to the.** %_da
0210: 74 61 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 20  ta table. Other 
0220: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 79 73  parts of the sys
0230: 74 65 6d 20 61 63 63 65 73 73 20 74 68 69 73 20  tem access this 
0240: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 76 69  functionality vi
0250: 61 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 66 61  a.** the interfa
0260: 63 65 20 64 65 66 69 6e 65 64 20 69 6e 20 66 74  ce defined in ft
0270: 73 35 49 6e 74 2e 68 2e 0a 2a 2f 0a 0a 0a 23 69  s5Int.h..*/...#i
0280: 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e  nclude "fts5Int.
0290: 68 22 0a 0a 2f 2a 0a 2a 2a 20 4f 76 65 72 76 69  h"../*.** Overvi
02a0: 65 77 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f  ew:.**.** The %_
02b0: 64 61 74 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  data table conta
02c0: 69 6e 73 20 61 6c 6c 20 74 68 65 20 46 54 53 20  ins all the FTS 
02d0: 69 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 20 46  indexes for an F
02e0: 54 53 35 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS5 virtual tabl
02f0: 65 2e 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73  e..** As well as
0300: 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 20 69   the main term i
0310: 6e 64 65 78 2c 20 74 68 65 72 65 20 6d 61 79 20  ndex, there may 
0320: 62 65 20 75 70 20 74 6f 20 33 31 20 70 72 65 66  be up to 31 pref
0330: 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 54  ix indexes..** T
0340: 68 65 20 66 6f 72 6d 61 74 20 69 73 20 73 69 6d  he format is sim
0350: 69 6c 61 72 20 74 6f 20 46 54 53 33 2f 34 2c 20  ilar to FTS3/4, 
0360: 65 78 63 65 70 74 20 74 68 61 74 3a 0a 2a 2a 0a  except that:.**.
0370: 2a 2a 20 20 20 2a 20 61 6c 6c 20 73 65 67 6d 65  **   * all segme
0380: 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 64  nt b-tree leaf d
0390: 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ata is stored in
03a0: 20 66 69 78 65 64 20 73 69 7a 65 20 70 61 67 65   fixed size page
03b0: 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 20 20 20   records .**    
03c0: 20 28 65 2e 67 2e 20 31 30 30 30 20 62 79 74 65   (e.g. 1000 byte
03d0: 73 29 2e 20 41 20 73 69 6e 67 6c 65 20 64 6f 63  s). A single doc
03e0: 6c 69 73 74 20 6d 61 79 20 73 70 61 6e 20 6d 75  list may span mu
03f0: 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 20 43 61  ltiple pages. Ca
0400: 72 65 20 69 73 20 0a 2a 2a 20 20 20 20 20 74 61  re is .**     ta
0410: 6b 65 6e 20 74 6f 20 65 6e 73 75 72 65 20 69 74  ken to ensure it
0420: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
0430: 69 74 65 72 61 74 65 20 69 6e 20 65 69 74 68 65  iterate in eithe
0440: 72 20 64 69 72 65 63 74 69 6f 6e 20 74 68 72 6f  r direction thro
0450: 75 67 68 20 0a 2a 2a 20 20 20 20 20 74 68 65 20  ugh .**     the 
0460: 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64 6f 63  entries in a doc
0470: 6c 69 73 74 2c 20 6f 72 20 74 6f 20 73 65 65 6b  list, or to seek
0480: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 65   to a specific e
0490: 6e 74 72 79 20 77 69 74 68 69 6e 20 61 20 0a 2a  ntry within a .*
04a0: 2a 20 20 20 20 20 64 6f 63 6c 69 73 74 2c 20 77  *     doclist, w
04b0: 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 69  ithout loading i
04c0: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  t into memory..*
04d0: 2a 0a 2a 2a 20 20 20 2a 20 6c 61 72 67 65 20 64  *.**   * large d
04e0: 6f 63 6c 69 73 74 73 20 74 68 61 74 20 73 70 61  oclists that spa
04f0: 6e 20 6d 61 6e 79 20 70 61 67 65 73 20 68 61 76  n many pages hav
0500: 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 64 6f  e associated "do
0510: 63 6c 69 73 74 20 69 6e 64 65 78 22 0a 2a 2a 20  clist index".** 
0520: 20 20 20 20 72 65 63 6f 72 64 73 20 74 68 61 74      records that
0530: 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 70 79 20   contain a copy 
0540: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
0550: 69 64 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  id on each page 
0560: 73 70 61 6e 6e 65 64 20 62 79 0a 2a 2a 20 20 20  spanned by.**   
0570: 20 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 54    the doclist. T
0580: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
0590: 70 65 65 64 20 75 70 20 73 65 65 6b 20 6f 70 65  peed up seek ope
05a0: 72 61 74 69 6f 6e 73 2c 20 61 6e 64 20 6d 65 72  rations, and mer
05b0: 67 65 73 20 6f 66 0a 2a 2a 20 20 20 20 20 6c 61  ges of.**     la
05c0: 72 67 65 20 64 6f 63 6c 69 73 74 73 20 77 69 74  rge doclists wit
05d0: 68 20 76 65 72 79 20 73 6d 61 6c 6c 20 64 6f 63  h very small doc
05e0: 6c 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  lists..**.**   *
05f0: 20 65 78 74 72 61 20 66 69 65 6c 64 73 20 69 6e   extra fields in
0600: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 20   the "structure 
0610: 72 65 63 6f 72 64 22 20 72 65 63 6f 72 64 20 74  record" record t
0620: 68 65 20 73 74 61 74 65 20 6f 66 20 6f 6e 67 6f  he state of ongo
0630: 69 6e 67 0a 2a 2a 20 20 20 20 20 69 6e 63 72 65  ing.**     incre
0640: 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65  mental merge ope
0650: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2f 0a 0a  rations..**.*/..
0660: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4f 50  .#define FTS5_OP
0670: 54 5f 57 4f 52 4b 5f 55 4e 49 54 20 20 31 30 30  T_WORK_UNIT  100
0680: 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  0  /* Number of 
0690: 6c 65 61 66 20 70 61 67 65 73 20 70 65 72 20 6f  leaf pages per o
06a0: 70 74 69 6d 69 7a 65 20 73 74 65 70 20 2a 2f 0a  ptimize step */.
06b0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 57 4f 52  #define FTS5_WOR
06c0: 4b 5f 55 4e 49 54 20 20 20 20 20 20 36 34 20 20  K_UNIT      64  
06d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
06e0: 65 61 66 20 70 61 67 65 73 20 69 6e 20 75 6e 69  eaf pages in uni
06f0: 74 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 23 64  t of work */..#d
0700: 65 66 69 6e 65 20 46 54 53 35 5f 4d 49 4e 5f 44  efine FTS5_MIN_D
0710: 4c 49 44 58 5f 53 49 5a 45 20 34 20 20 20 20 20  LIDX_SIZE 4     
0720: 2f 2a 20 41 64 64 20 64 6c 69 64 78 20 69 66 20  /* Add dlidx if 
0730: 74 68 69 73 20 6d 61 6e 79 20 65 6d 70 74 79 20  this many empty 
0740: 70 61 67 65 73 20 2a 2f 0a 0a 23 64 65 66 69 6e  pages */..#defin
0750: 65 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  e FTS5_MAIN_PREF
0760: 49 58 20 27 30 27 0a 0a 23 69 66 20 46 54 53 35  IX '0'..#if FTS5
0770: 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45  _MAX_PREFIX_INDE
0780: 58 45 53 20 3e 20 33 31 0a 23 20 65 72 72 6f 72  XES > 31.# error
0790: 20 22 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49   "FTS5_MAX_PREFI
07a0: 58 5f 49 4e 44 45 58 45 53 20 69 73 20 74 6f 6f  X_INDEXES is too
07b0: 20 6c 61 72 67 65 22 0a 23 65 6e 64 69 66 0a 0a   large".#endif..
07c0: 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 3a 0a 2a  /*.** Details:.*
07d0: 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
07e0: 74 61 62 6c 65 20 6d 61 6e 61 67 65 64 20 62 79  table managed by
07f0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2c 0a 2a 2a   this module,.**
0800: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
0810: 41 42 4c 45 20 25 5f 64 61 74 61 28 69 64 20 49  ABLE %_data(id I
0820: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0830: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b  EY, block BLOB);
0840: 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e 74 61 69 6e  .**.** , contain
0850: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
0860: 35 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72  5 types of recor
0870: 64 73 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ds. See the comm
0880: 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ents surrounding
0890: 0a 2a 2a 20 74 68 65 20 46 54 53 35 5f 2a 5f 52  .** the FTS5_*_R
08a0: 4f 57 49 44 20 6d 61 63 72 6f 73 20 62 65 6c 6f  OWID macros belo
08b0: 77 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  w for a descript
08c0: 69 6f 6e 20 6f 66 20 68 6f 77 20 25 5f 64 61 74  ion of how %_dat
08d0: 61 20 72 6f 77 69 64 73 20 61 72 65 20 0a 2a 2a  a rowids are .**
08e0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63   assigned to eac
08f0: 68 20 66 6f 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  h fo them..**.**
0900: 20 31 2e 20 53 74 72 75 63 74 75 72 65 20 52 65   1. Structure Re
0910: 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  cords:.**.**   T
0920: 68 65 20 73 65 74 20 6f 66 20 73 65 67 6d 65 6e  he set of segmen
0930: 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
0940: 61 6e 20 69 6e 64 65 78 20 2d 20 74 68 65 20 69  an index - the i
0950: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2d  ndex structure -
0960: 20 61 72 65 0a 2a 2a 20 20 20 72 65 63 6f 72 64   are.**   record
0970: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 72  ed in a single r
0980: 65 63 6f 72 64 20 77 69 74 68 69 6e 20 74 68 65  ecord within the
0990: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
09a0: 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73  he record consis
09b0: 74 73 0a 2a 2a 20 20 20 6f 66 20 61 20 73 69 6e  ts.**   of a sin
09c0: 67 6c 65 20 33 32 2d 62 69 74 20 63 6f 6e 66 69  gle 32-bit confi
09d0: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
09e0: 76 61 6c 75 65 20 66 6f 6c 6c 6f 77 65 64 20 62  value followed b
09f0: 79 20 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20  y a list of .** 
0a00: 20 20 53 51 4c 69 74 65 20 76 61 72 69 6e 74 73    SQLite varints
0a10: 2e 20 49 66 20 74 68 65 20 46 54 53 20 74 61 62  . If the FTS tab
0a20: 6c 65 20 66 65 61 74 75 72 65 73 20 6d 6f 72 65  le features more
0a30: 20 74 68 61 6e 20 6f 6e 65 20 69 6e 64 65 78 20   than one index 
0a40: 28 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 74 68  (because.**   th
0a50: 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
0a60: 6f 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78  ore prefix index
0a70: 65 73 29 2c 20 69 74 20 69 73 20 67 75 61 72 61  es), it is guara
0a80: 6e 74 65 65 64 20 74 68 61 74 20 61 6c 6c 20 73  nteed that all s
0a90: 68 61 72 65 0a 2a 2a 20 20 20 74 68 65 20 73 61  hare.**   the sa
0aa0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 2e  me cookie value.
0ab0: 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d 65 64 69 61  .**.**   Immedia
0ac0: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
0ad0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
0ae0: 20 63 6f 6f 6b 69 65 2c 20 74 68 65 20 72 65 63   cookie, the rec
0af0: 6f 72 64 20 62 65 67 69 6e 73 20 77 69 74 68 0a  ord begins with.
0b00: 2a 2a 20 20 20 74 68 72 65 65 20 76 61 72 69 6e  **   three varin
0b10: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20  ts:.**.**     + 
0b20: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
0b30: 2c 0a 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c  ,.**     + total
0b40: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0b50: 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c 65 76 65 6c  nts on all level
0b60: 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 76 61 6c 75  s,.**     + valu
0b70: 65 20 6f 66 20 77 72 69 74 65 20 63 6f 75 6e 74  e of write count
0b80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 6e  er..**.**   Then
0b90: 2c 20 66 6f 72 20 65 61 63 68 20 6c 65 76 65 6c  , for each level
0ba0: 20 66 72 6f 6d 20 30 20 74 6f 20 6e 4d 61 78 3a   from 0 to nMax:
0bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 6e 75 6d  .**.**     + num
0bc0: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
0bd0: 6d 65 6e 74 73 20 69 6e 20 6f 6e 67 6f 69 6e 67  ments in ongoing
0be0: 20 6d 65 72 67 65 2e 0a 2a 2a 20 20 20 20 20 2b   merge..**     +
0bf0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
0c00: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76   segments in lev
0c10: 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b 20 66 6f 72  el..**     + for
0c20: 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 66 72   each segment fr
0c30: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
0c40: 65 73 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  est:.**         
0c50: 2b 20 73 65 67 6d 65 6e 74 20 69 64 20 28 61 6c  + segment id (al
0c60: 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20  ways > 0).**    
0c70: 20 20 20 20 20 2b 20 66 69 72 73 74 20 6c 65 61       + first lea
0c80: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  f page number (o
0c90: 66 74 65 6e 20 31 2c 20 61 6c 77 61 79 73 20 67  ften 1, always g
0ca0: 72 65 61 74 65 72 20 74 68 61 6e 20 30 29 0a 2a  reater than 0).*
0cb0: 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e 61  *         + fina
0cc0: 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  l leaf page numb
0cd0: 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65 20  er.**.** 2. The 
0ce0: 41 76 65 72 61 67 65 73 20 52 65 63 6f 72 64 3a  Averages Record:
0cf0: 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67 6c  .**.**   A singl
0d00: 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20  e record within 
0d10: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
0d20: 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 61 20  . The data is a 
0d30: 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e  list of varints.
0d40: 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74 20  .**   The first 
0d50: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
0d60: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
0d70: 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c 20  he index. Then, 
0d80: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
0d90: 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74  **   from left t
0da0: 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f 74  o right, the tot
0db0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  al number of tok
0dc0: 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ens in the colum
0dd0: 6e 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 20 20 72  n for all.**   r
0de0: 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ows of the table
0df0: 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67 6d 65  ..**.** 3. Segme
0e00: 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a 2a 2a  nt leaves:.**.**
0e10: 20 20 20 54 45 52 4d 2f 44 4f 43 4c 49 53 54 20     TERM/DOCLIST 
0e20: 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 20 20  FORMAT:.**.**   
0e30: 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68 20 73    Most of each s
0e40: 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73 20 74  egment leaf is t
0e50: 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72 6d 2f  aken up by term/
0e60: 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20 54 68  doclist data. Th
0e70: 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65 72 61  e .**     genera
0e80: 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 65 72 6d  l format of term
0e90: 2f 64 6f 63 6c 69 73 74 2c 20 73 74 61 72 74 69  /doclist, starti
0ea0: 6e 67 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ng with the firs
0eb0: 74 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 6f 6e  t term.**     on
0ec0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2c 20   the leaf page, 
0ed0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
0ee0: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
0ef0: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
0f00: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20           blob:  
0f10: 20 20 66 69 72 73 74 20 74 65 72 6d 20 64 61 74    first term dat
0f20: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 6f 63  a.**         doc
0f30: 6c 69 73 74 3a 20 66 69 72 73 74 20 64 6f 63 6c  list: first docl
0f40: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  ist.**         z
0f50: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
0f60: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
0f70: 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  t:  number of by
0f80: 74 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69  tes in common wi
0f90: 74 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  th previous term
0fa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
0fb0: 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66  rint:  number of
0fc0: 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65   bytes of new te
0fd0: 72 6d 20 64 61 74 61 20 28 6e 4e 65 77 29 0a 2a  rm data (nNew).*
0fe0: 2a 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  *           blob
0ff0: 3a 20 20 20 20 6e 4e 65 77 20 62 79 74 65 73 20  :    nNew bytes 
1000: 6f 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61  of new term data
1010: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 64 6f  .**           do
1020: 63 6c 69 73 74 3a 20 6e 65 78 74 20 64 6f 63 6c  clist: next docl
1030: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ist.**         }
1040: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 6f 63 6c 69  .**.**     docli
1050: 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a  st format:.**.**
1060: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
1070: 20 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a    first rowid.**
1080: 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73 74           poslist
1090: 3a 20 66 69 72 73 74 20 70 6f 73 6c 69 73 74 0a  : first poslist.
10a0: 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d  **         zero-
10b0: 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20  or-more {.**    
10c0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20         varint:  
10d0: 72 6f 77 69 64 20 64 65 6c 74 61 20 28 61 6c 77  rowid delta (alw
10e0: 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20 20  ays > 0).**     
10f0: 20 20 20 20 20 20 70 6f 73 6c 69 73 74 3a 20 6e        poslist: n
1100: 65 78 74 20 70 6f 73 6c 69 73 74 0a 2a 2a 20 20  ext poslist.**  
1110: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1120: 20 20 20 70 6f 73 6c 69 73 74 20 66 6f 72 6d 61     poslist forma
1130: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
1140: 20 76 61 72 69 6e 74 3a 20 73 69 7a 65 20 6f 66   varint: size of
1150: 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65   poslist in byte
1160: 73 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20  s multiplied by 
1170: 32 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  2, not including
1180: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1190: 20 20 20 20 74 68 69 73 20 66 69 65 6c 64 2e 20      this field. 
11a0: 50 6c 75 73 20 31 20 69 66 20 74 68 69 73 20 65  Plus 1 if this e
11b0: 6e 74 72 79 20 63 61 72 72 69 65 73 20 74 68 65  ntry carries the
11c0: 20 22 64 65 6c 65 74 65 22 20 66 6c 61 67 2e 0a   "delete" flag..
11d0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 6c 69  **         colli
11e0: 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20  st: collist for 
11f0: 63 6f 6c 75 6d 6e 20 30 0a 2a 2a 20 20 20 20 20  column 0.**     
1200: 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65      zero-or-more
1210: 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   {.**           
1220: 30 78 30 31 20 62 79 74 65 0a 2a 2a 20 20 20 20  0x01 byte.**    
1230: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 63         varint: c
1240: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 28 49 29  olumn number (I)
1250: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f  .**           co
1260: 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66  llist: collist f
1270: 6f 72 20 63 6f 6c 75 6d 6e 20 49 0a 2a 2a 20 20  or column I.**  
1280: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1290: 20 20 20 63 6f 6c 6c 69 73 74 20 66 6f 72 6d 61     collist forma
12a0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
12b0: 20 76 61 72 69 6e 74 3a 20 66 69 72 73 74 20 6f   varint: first o
12c0: 66 66 73 65 74 20 2b 20 32 0a 2a 2a 20 20 20 20  ffset + 2.**    
12d0: 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72       zero-or-mor
12e0: 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  e {.**          
12f0: 20 76 61 72 69 6e 74 3a 20 6f 66 66 73 65 74 20   varint: offset 
1300: 64 65 6c 74 61 20 2b 20 32 0a 2a 2a 20 20 20 20  delta + 2.**    
1310: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 50       }.**.**   P
1320: 41 47 45 20 46 4f 52 4d 41 54 0a 2a 2a 0a 2a 2a  AGE FORMAT.**.**
1330: 20 20 20 20 20 45 61 63 68 20 6c 65 61 66 20 70       Each leaf p
1340: 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  age begins with 
1350: 61 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  a 4-byte header 
1360: 63 6f 6e 74 61 69 6e 69 6e 67 20 32 20 31 36 2d  containing 2 16-
1370: 62 69 74 20 0a 2a 2a 20 20 20 20 20 75 6e 73 69  bit .**     unsi
1380: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 69 65  gned integer fie
1390: 6c 64 73 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  lds in big-endia
13a0: 6e 20 66 6f 72 6d 61 74 2e 20 54 68 65 79 20 61  n format. They a
13b0: 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
13c0: 2a 20 54 68 65 20 62 79 74 65 20 6f 66 66 73 65  * The byte offse
13d0: 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  t of the first r
13e0: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
13f0: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 2a  , if it exists.*
1400: 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 6f 63  *         and oc
1410: 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 65 20  curs before the 
1420: 66 69 72 73 74 20 74 65 72 6d 20 28 6f 74 68 65  first term (othe
1430: 72 77 69 73 65 20 30 29 2e 0a 2a 2a 0a 2a 2a 20  rwise 0)..**.** 
1440: 20 20 20 20 20 20 2a 20 54 68 65 20 62 79 74 65        * The byte
1450: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
1460: 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  tart of the page
1470: 20 66 6f 6f 74 65 72 2e 20 49 66 20 74 68 65 20   footer. If the 
1480: 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  page.**         
1490: 66 6f 6f 74 65 72 20 69 73 20 30 20 62 79 74 65  footer is 0 byte
14a0: 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
14b0: 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 74 68  this field is th
14c0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
14d0: 20 20 20 20 20 20 20 20 20 73 69 7a 65 20 6f 66           size of
14e0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69   the leaf page i
14f0: 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  n bytes..**.**  
1500: 20 20 20 54 68 65 20 70 61 67 65 20 66 6f 6f 74     The page foot
1510: 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  er consists of a
1520: 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 66   single varint f
1530: 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6c 6f 63  or each term loc
1540: 61 74 65 64 0a 2a 2a 20 20 20 20 20 6f 6e 20 74  ated.**     on t
1550: 68 65 20 70 61 67 65 2e 20 45 61 63 68 20 76 61  he page. Each va
1560: 72 69 6e 74 20 69 73 20 74 68 65 20 62 79 74 65  rint is the byte
1570: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 63   offset of the c
1580: 75 72 72 65 6e 74 20 74 65 72 6d 0a 2a 2a 20 20  urrent term.**  
1590: 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 61     within the pa
15a0: 67 65 2c 20 64 65 6c 74 61 2d 63 6f 6d 70 72 65  ge, delta-compre
15b0: 73 73 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ssed against the
15c0: 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e   previous value.
15d0: 20 49 6e 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72   In.**     other
15e0: 20 77 6f 72 64 73 2c 20 74 68 65 20 66 69 72 73   words, the firs
15f0: 74 20 76 61 72 69 6e 74 20 69 6e 20 74 68 65 20  t varint in the 
1600: 66 6f 6f 74 65 72 20 69 73 20 74 68 65 20 62 79  footer is the by
1610: 74 65 20 6f 66 66 73 65 74 20 6f 66 0a 2a 2a 20  te offset of.** 
1620: 20 20 20 20 74 68 65 20 66 69 72 73 74 20 74 65      the first te
1630: 72 6d 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  rm, the second i
1640: 73 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  s the byte offse
1650: 74 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  t of the second 
1660: 6c 65 73 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  less that.**    
1670: 20 6f 66 20 74 68 65 20 66 69 72 73 74 2c 20 61   of the first, a
1680: 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nd so on..**.** 
1690: 20 20 20 20 54 68 65 20 74 65 72 6d 2f 64 6f 63      The term/doc
16a0: 6c 69 73 74 20 66 6f 72 6d 61 74 20 64 65 73 63  list format desc
16b0: 72 69 62 65 64 20 61 62 6f 76 65 20 69 73 20 61  ribed above is a
16c0: 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20 65  ccurate if the e
16d0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 74 65 72  ntire.**     ter
16e0: 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 20 66  m/doclist data f
16f0: 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  its on a single 
1700: 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74 68  leaf page. If th
1710: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
1720: 73 65 2c 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  se,.**     the f
1730: 6f 72 6d 61 74 20 69 73 20 63 68 61 6e 67 65 64  ormat is changed
1740: 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a   in two ways:.**
1750: 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20 74  .**       + if t
1760: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
1770: 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73 20  n a page occurs 
1780: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
1790: 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20 20   term, it.**    
17a0: 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20 61       is stored a
17b0: 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
17c0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
17d0: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66 69       varint:  fi
17e0: 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  rst rowid.**.** 
17f0: 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72 73        + the firs
1800: 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20 70  t term on each p
1810: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1820: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
1830: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
1840: 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d 20  very first term 
1850: 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a 0a  of the segment:.
1860: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1870: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
1880: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
18a0: 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d  b:    first term
18b0: 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 35 2e 20 53   data.**.** 5. S
18c0: 65 67 6d 65 6e 74 20 64 6f 63 6c 69 73 74 20 69  egment doclist i
18d0: 6e 64 65 78 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ndexes:.**.**   
18e0: 44 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 20  Doclist indexes 
18f0: 61 72 65 20 74 68 65 6d 73 65 6c 76 65 73 20 62  are themselves b
1900: 2d 74 72 65 65 73 2c 20 68 6f 77 65 76 65 72 20  -trees, however 
1910: 74 68 65 79 20 75 73 75 61 6c 6c 79 20 63 6f 6e  they usually con
1920: 73 69 73 74 20 6f 66 0a 2a 2a 20 20 20 61 20 73  sist of.**   a s
1930: 69 6e 67 6c 65 20 6c 65 61 66 20 72 65 63 6f 72  ingle leaf recor
1940: 64 20 6f 6e 6c 79 2e 20 54 68 65 20 66 6f 72 6d  d only. The form
1950: 61 74 20 6f 66 20 65 61 63 68 20 64 6f 63 6c 69  at of each docli
1960: 73 74 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  st index leaf pa
1970: 67 65 20 0a 2a 2a 20 20 20 69 73 3a 0a 2a 2a 0a  ge .**   is:.**.
1980: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1990: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
19a0: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
19b0: 43 6c 65 61 72 20 69 66 20 6c 65 61 66 20 69 73  Clear if leaf is
19c0: 20 61 6c 73 6f 20 74 68 65 20 72 6f 6f 74 20 70   also the root p
19d0: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
19e0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
19f0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1a00: 74 73 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  ts index leaf pa
1a10: 67 65 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e  ge. As a varint.
1a20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 69 72  .**.**     * Fir
1a30: 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65  st rowid on page
1a40: 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 70 72   indicated by pr
1a50: 65 76 69 6f 75 73 20 66 69 65 6c 64 2e 20 41 73  evious field. As
1a60: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
1a70: 20 20 20 20 20 2a 20 41 20 6c 69 73 74 20 6f 66       * A list of
1a80: 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65 20 66 6f   varints, one fo
1a90: 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  r each subsequen
1aa0: 74 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65 2e  t termless page.
1ab0: 20 41 20 0a 2a 2a 20 20 20 20 20 20 20 70 6f 73   A .**       pos
1ac0: 69 74 69 76 65 20 64 65 6c 74 61 20 69 66 20 74  itive delta if t
1ad0: 68 65 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65  he termless page
1ae0: 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
1af0: 73 74 20 6f 6e 65 20 72 6f 77 69 64 2c 20 0a 2a  st one rowid, .*
1b00: 2a 20 20 20 20 20 20 20 6f 72 20 61 6e 20 30 78  *       or an 0x
1b10: 30 30 20 62 79 74 65 20 6f 74 68 65 72 77 69 73  00 byte otherwis
1b20: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 74 65 72  e..**.**   Inter
1b30: 6e 61 6c 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  nal doclist inde
1b40: 78 20 6e 6f 64 65 73 20 61 72 65 3a 0a 2a 2a 0a  x nodes are:.**.
1b50: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1b60: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
1b70: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
1b80: 43 6c 65 61 72 20 66 6f 72 20 72 6f 6f 74 20 70  Clear for root p
1b90: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
1ba0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
1bb0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1bc0: 69 72 73 74 20 63 68 69 6c 64 20 70 61 67 65 2e  irst child page.
1bd0: 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   As a varint..**
1be0: 0a 2a 2a 20 20 20 20 20 2a 20 43 6f 70 79 20 6f  .**     * Copy o
1bf0: 66 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  f first rowid on
1c00: 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20   page indicated 
1c10: 62 79 20 70 72 65 76 69 6f 75 73 20 66 69 65 6c  by previous fiel
1c20: 64 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a  d. As a varint..
1c30: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 41 20 6c 69  **.**     * A li
1c40: 73 74 20 6f 66 20 64 65 6c 74 61 2d 65 6e 63 6f  st of delta-enco
1c50: 64 65 64 20 76 61 72 69 6e 74 73 20 2d 20 74 68  ded varints - th
1c60: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
1c70: 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
1c80: 0a 2a 2a 20 20 20 20 20 20 20 63 68 69 6c 64 20  .**       child 
1c90: 70 61 67 65 2e 20 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a  page. .**.*/../*
1ca0: 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72 20 74  .** Rowids for t
1cb0: 68 65 20 61 76 65 72 61 67 65 73 20 61 6e 64 20  he averages and 
1cc0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
1cd0: 73 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20  s in the %_data 
1ce0: 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  table..*/.#defin
1cf0: 65 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  e FTS5_AVERAGES_
1d00: 52 4f 57 49 44 20 20 20 20 20 31 20 20 20 20 2f  ROWID     1    /
1d10: 2a 20 52 6f 77 69 64 20 75 73 65 64 20 66 6f 72  * Rowid used for
1d20: 20 74 68 65 20 61 76 65 72 61 67 65 73 20 72 65   the averages re
1d30: 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  cord */.#define 
1d40: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
1d50: 4f 57 49 44 20 20 20 31 30 20 20 20 20 2f 2a 20  OWID   10    /* 
1d60: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  The structure re
1d70: 63 6f 72 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  cord */../*.** M
1d80: 61 63 72 6f 73 20 64 65 74 65 72 6d 69 6e 69 6e  acros determinin
1d90: 67 20 74 68 65 20 72 6f 77 69 64 73 20 75 73 65  g the rowids use
1da0: 64 20 62 79 20 73 65 67 6d 65 6e 74 20 6c 65 61  d by segment lea
1db0: 76 65 73 20 61 6e 64 20 64 6c 69 64 78 20 6c 65  ves and dlidx le
1dc0: 61 76 65 73 0a 2a 2a 20 61 6e 64 20 6e 6f 64 65  aves.** and node
1dd0: 73 2e 20 41 6c 6c 20 6e 6f 64 65 73 20 61 6e 64  s. All nodes and
1de0: 20 6c 65 61 76 65 73 20 61 72 65 20 73 74 6f 72   leaves are stor
1df0: 65 64 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61  ed in the %_data
1e00: 20 74 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67   table with larg
1e10: 65 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 72 6f  e.** positive ro
1e20: 77 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  wids..**.** Each
1e30: 20 73 65 67 6d 65 6e 74 20 68 61 73 20 61 20 75   segment has a u
1e40: 6e 69 71 75 65 20 6e 6f 6e 2d 7a 65 72 6f 20 31  nique non-zero 1
1e50: 36 2d 62 69 74 20 69 64 2e 0a 2a 2a 0a 2a 2a 20  6-bit id..**.** 
1e60: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 65 61  The rowid for ea
1e70: 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61 66 20  ch segment leaf 
1e80: 69 73 20 66 6f 75 6e 64 20 62 79 20 70 61 73 73  is found by pass
1e90: 69 6e 67 20 74 68 65 20 73 65 67 6d 65 6e 74 20  ing the segment 
1ea0: 69 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6c  id and .** the l
1eb0: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
1ec0: 74 6f 20 74 68 65 20 46 54 53 35 5f 53 45 47 4d  to the FTS5_SEGM
1ed0: 45 4e 54 5f 52 4f 57 49 44 20 6d 61 63 72 6f 2e  ENT_ROWID macro.
1ee0: 20 4c 65 61 76 65 73 20 61 72 65 20 6e 75 6d 62   Leaves are numb
1ef0: 65 72 65 64 0a 2a 2a 20 73 65 71 75 65 6e 74 69  ered.** sequenti
1f00: 61 6c 6c 79 20 73 74 61 72 74 69 6e 67 20 66 72  ally starting fr
1f10: 6f 6d 20 31 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  om 1..*/.#define
1f20: 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20   FTS5_DATA_ID_B 
1f30: 20 20 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61      16     /* Ma
1f40: 78 20 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20  x seg id number 
1f50: 36 35 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65  65535 */.#define
1f60: 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42   FTS5_DATA_DLI_B
1f70: 20 20 20 20 20 31 20 20 20 20 20 2f 2a 20 44 6f       1     /* Do
1f80: 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6c 61 67  clist-index flag
1f90: 20 28 31 20 62 69 74 29 20 2a 2f 0a 23 64 65 66   (1 bit) */.#def
1fa0: 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 48 45  ine FTS5_DATA_HE
1fb0: 49 47 48 54 5f 42 20 20 35 20 20 20 20 20 2f 2a  IGHT_B  5     /*
1fc0: 20 4d 61 78 20 64 6c 69 64 78 20 74 72 65 65 20   Max dlidx tree 
1fd0: 68 65 69 67 68 74 20 6f 66 20 33 32 20 2a 2f 0a  height of 32 */.
1fe0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
1ff0: 41 5f 50 41 47 45 5f 42 20 20 20 33 31 20 20 20  A_PAGE_B   31   
2000: 20 20 2f 2a 20 4d 61 78 20 70 61 67 65 20 6e 75    /* Max page nu
2010: 6d 62 65 72 20 6f 66 20 32 31 34 37 34 38 33 36  mber of 21474836
2020: 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 66  48 */..#define f
2030: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 64  ts5_dri(segid, d
2040: 6c 69 64 78 2c 20 68 65 69 67 68 74 2c 20 70 67  lidx, height, pg
2050: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34 29 28        \. ((i64)(
2080: 73 65 67 69 64 29 20 20 3c 3c 20 28 46 54 53 35  segid)  << (FTS5
2090: 5f 44 41 54 41 5f 50 41 47 45 5f 42 2b 46 54 53  _DATA_PAGE_B+FTS
20a0: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 2b  5_DATA_HEIGHT_B+
20b0: 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 29  FTS5_DATA_DLI_B)
20c0: 29 20 2b 20 20 20 20 5c 0a 20 28 28 69 36 34 29  ) +    \. ((i64)
20d0: 28 64 6c 69 64 78 29 20 20 3c 3c 20 28 46 54 53  (dlidx)  << (FTS
20e0: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 2b 20  5_DATA_PAGE_B + 
20f0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2100: 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  _B)) +          
2110: 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34          \. ((i64
2120: 29 28 68 65 69 67 68 74 29 20 3c 3c 20 28 46 54  )(height) << (FT
2130: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 29  S5_DATA_PAGE_B))
2140: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
2170: 34 29 28 70 67 6e 6f 29 29 20 20 20 20 20 20 20  4)(pgno))       
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 23            \.)..#
21c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
21d0: 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
21e0: 20 70 67 6e 6f 29 20 20 20 20 20 20 20 66 74 73   pgno)       fts
21f0: 35 5f 64 72 69 28 73 65 67 69 64 2c 20 30 2c 20  5_dri(segid, 0, 
2200: 30 2c 20 70 67 6e 6f 29 0a 23 64 65 66 69 6e 65  0, pgno).#define
2210: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
2220: 44 28 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c  D(segid, height,
2230: 20 70 67 6e 6f 29 20 66 74 73 35 5f 64 72 69 28   pgno) fts5_dri(
2240: 73 65 67 69 64 2c 20 31 2c 20 68 65 69 67 68 74  segid, 1, height
2250: 2c 20 70 67 6e 6f 29 0a 0a 2f 2a 0a 2a 2a 20 4d  , pgno)../*.** M
2260: 61 78 69 6d 75 6d 20 73 65 67 6d 65 6e 74 73 20  aximum segments 
2270: 70 65 72 6d 69 74 74 65 64 20 69 6e 20 61 20 73  permitted in a s
2280: 69 6e 67 6c 65 20 69 6e 64 65 78 20 0a 2a 2f 0a  ingle index .*/.
2290: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d 41 58  #define FTS5_MAX
22a0: 5f 53 45 47 4d 45 4e 54 20 32 30 30 30 0a 0a 23  _SEGMENT 2000..#
22b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22c0: 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  UG.int sqlite3Ft
22d0: 73 35 43 6f 72 72 75 70 74 28 29 20 7b 20 72 65  s5Corrupt() { re
22e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22f0: 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23 65 6e 64  UPT_VTAB; }.#end
2300: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  if.../*.** Each 
2310: 74 69 6d 65 20 61 20 62 6c 6f 62 20 69 73 20 72  time a blob is r
2320: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
2330: 61 74 61 20 74 61 62 6c 65 2c 20 69 74 20 69 73  ata table, it is
2340: 20 70 61 64 64 65 64 20 77 69 74 68 20 74 68 69   padded with thi
2350: 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65 72 6f 20 62  s.** many zero b
2360: 79 74 65 73 2e 20 54 68 69 73 20 6d 61 6b 65 73  ytes. This makes
2370: 20 69 74 20 65 61 73 69 65 72 20 74 6f 20 64 65   it easier to de
2380: 63 6f 64 65 20 74 68 65 20 76 61 72 69 6f 75 73  code the various
2390: 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 73 0a   record formats.
23a0: 2a 2a 20 77 69 74 68 6f 75 74 20 6f 76 65 72 72  ** without overr
23b0: 65 61 64 69 6e 67 20 69 66 20 74 68 65 20 72 65  eading if the re
23c0: 63 6f 72 64 73 20 61 72 65 20 63 6f 72 72 75 70  cords are corrup
23d0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  t..*/.#define FT
23e0: 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
23f0: 44 49 4e 47 20 38 0a 23 64 65 66 69 6e 65 20 46  DING 8.#define F
2400: 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
2410: 20 32 30 0a 0a 74 79 70 65 64 65 66 20 73 74 72   20..typedef str
2420: 75 63 74 20 46 74 73 35 44 61 74 61 20 46 74 73  uct Fts5Data Fts
2430: 35 44 61 74 61 3b 0a 74 79 70 65 64 65 66 20 73  5Data;.typedef s
2440: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
2450: 74 65 72 20 46 74 73 35 44 6c 69 64 78 49 74 65  ter Fts5DlidxIte
2460: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2470: 74 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 46  t Fts5DlidxLvl F
2480: 74 73 35 44 6c 69 64 78 4c 76 6c 3b 0a 74 79 70  ts5DlidxLvl;.typ
2490: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24a0: 44 6c 69 64 78 57 72 69 74 65 72 20 46 74 73 35  DlidxWriter Fts5
24b0: 44 6c 69 64 78 57 72 69 74 65 72 3b 0a 74 79 70  DlidxWriter;.typ
24c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24d0: 49 74 65 72 20 46 74 73 35 49 74 65 72 3b 0a 74  Iter Fts5Iter;.t
24e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
24f0: 73 35 50 61 67 65 57 72 69 74 65 72 20 46 74 73  s5PageWriter Fts
2500: 35 50 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70  5PageWriter;.typ
2510: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2520: 53 65 67 49 74 65 72 20 46 74 73 35 53 65 67 49  SegIter Fts5SegI
2530: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2540: 75 63 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49  uct Fts5DoclistI
2550: 74 65 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49  ter Fts5DoclistI
2560: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2570: 75 63 74 20 46 74 73 35 53 65 67 57 72 69 74 65  uct Fts5SegWrite
2580: 72 20 46 74 73 35 53 65 67 57 72 69 74 65 72 3b  r Fts5SegWriter;
2590: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
25a0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 46 74  Fts5Structure Ft
25b0: 73 35 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70  s5Structure;.typ
25c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
25d0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46  StructureLevel F
25e0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
25f0: 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  l;.typedef struc
2600: 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53  t Fts5StructureS
2610: 65 67 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63  egment Fts5Struc
2620: 74 75 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74  tureSegment;..st
2630: 72 75 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a  ruct Fts5Data {.
2640: 20 20 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20    u8 *p;        
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2670: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
2680: 67 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  g record */.  in
2690: 74 20 6e 6e 3b 20 20 20 20 20 20 20 20 20 20 20  t nn;           
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26b0: 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20   Size of record 
26c0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
26d0: 74 20 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20  t szLeaf;       
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26f0: 20 53 69 7a 65 20 6f 66 20 6c 65 61 66 20 77 69   Size of leaf wi
2700: 74 68 6f 75 74 20 70 61 67 65 2d 69 6e 64 65 78  thout page-index
2710: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e   */.};../*.** On
2720: 65 20 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64  e object per %_d
2730: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ata table..*/.st
2740: 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b  ruct Fts5Index {
2750: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
2760: 43 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20  Config;         
2770: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
2780: 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ble configuratio
2790: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61  n */.  char *zDa
27a0: 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20  taTbl;          
27b0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
27c0: 66 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  f %_data table *
27d0: 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69  /.  int nWorkUni
27e0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
27f0: 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65      /* Leaf page
2800: 73 20 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66  s in a "unit" of
2810: 20 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20   work */..  /*. 
2820: 20 2a 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65   ** Variables re
2830: 6c 61 74 65 64 20 74 6f 20 74 68 65 20 61 63 63  lated to the acc
2840: 75 6d 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b  umulation of tok
2850: 65 6e 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73  ens and doclists
2860: 20 77 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a   within the.  **
2870: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
2880: 74 61 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68  tables before th
2890: 65 79 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  ey are flushed t
28a0: 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46  o disk..  */.  F
28b0: 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20  ts5Hash *pHash; 
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28d0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
28e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20   in-memory data 
28f0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e  */.  int nPendin
2900: 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  gData;          
2910: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2920: 62 79 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67  bytes of pending
2930: 20 64 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69   data */.  i64 i
2940: 57 72 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20  WriteRowid;     
2950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2960: 77 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20  wid for current 
2970: 64 6f 63 20 62 65 69 6e 67 20 77 72 69 74 74 65  doc being writte
2980: 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 65  n */.  int bDele
2990: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
29a0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
29b0: 74 20 77 72 69 74 65 20 69 73 20 61 20 64 65 6c  t write is a del
29c0: 65 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72  ete */..  /* Err
29d0: 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
29e0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a00: 2a 20 43 75 72 72 65 6e 74 20 65 72 72 6f 72 20  * Current error 
2a10: 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74  code */..  /* St
2a20: 61 74 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ate used by the 
2a30: 66 74 73 35 44 61 74 61 58 58 58 28 29 20 66 75  fts5DataXXX() fu
2a40: 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71  nctions. */.  sq
2a50: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61  lite3_blob *pRea
2a60: 64 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  der;          /*
2a70: 20 52 4f 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70   RO incr-blob op
2a80: 65 6e 20 6f 6e 20 25 5f 64 61 74 61 20 74 61 62  en on %_data tab
2a90: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
2aa0: 73 74 6d 74 20 2a 70 57 72 69 74 65 72 3b 20 20  stmt *pWriter;  
2ab0: 20 20 20 20 20 20 20 20 2f 2a 20 22 49 4e 53 45          /* "INSE
2ac0: 52 54 20 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41  RT ... %_data VA
2ad0: 4c 55 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20  LUES(?,?)" */.  
2ae0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44  sqlite3_stmt *pD
2af0: 65 6c 65 74 65 72 3b 20 20 20 20 20 20 20 20 20  eleter;         
2b00: 2f 2a 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  /* "DELETE FROM 
2b10: 25 5f 64 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f  %_data ... id>=?
2b20: 20 41 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20   AND id<=?" */. 
2b30: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2b40: 49 64 78 57 72 69 74 65 72 3b 20 20 20 20 20 20  IdxWriter;      
2b50: 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20   /* "INSERT ... 
2b60: 25 5f 69 64 78 20 56 41 4c 55 45 53 28 3f 2c 3f  %_idx VALUES(?,?
2b70: 2c 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69  ,?,?)" */.  sqli
2b80: 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 44 65  te3_stmt *pIdxDe
2b90: 6c 65 74 65 72 3b 20 20 20 20 20 20 2f 2a 20 22  leter;      /* "
2ba0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 69 64  DELETE FROM %_id
2bb0: 78 20 57 48 45 52 45 20 73 65 67 69 64 3d 3f 20  x WHERE segid=? 
2bc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
2bd0: 74 20 2a 70 49 64 78 53 65 6c 65 63 74 3b 0a 20  t *pIdxSelect;. 
2be0: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2c10: 20 6f 66 20 62 6c 6f 63 6b 73 20 72 65 61 64 20   of blocks read 
2c20: 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  */..  sqlite3_st
2c30: 6d 74 20 2a 70 44 61 74 61 56 65 72 73 69 6f 6e  mt *pDataVersion
2c40: 3b 0a 20 20 69 36 34 20 69 53 74 72 75 63 74 56  ;.  i64 iStructV
2c50: 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ersion;         
2c60: 20 20 20 20 2f 2a 20 64 61 74 61 5f 76 65 72 73      /* data_vers
2c70: 69 6f 6e 20 77 68 65 6e 20 70 53 74 72 75 63 74  ion when pStruct
2c80: 20 72 65 61 64 20 2a 2f 0a 20 20 46 74 73 35 53   read */.  Fts5S
2c90: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
2ca0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  t;         /* Cu
2cb0: 72 72 65 6e 74 20 64 62 20 73 74 72 75 63 74 75  rrent db structu
2cc0: 72 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  re (or NULL) */.
2cd0: 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44  };..struct Fts5D
2ce0: 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20 75  oclistIter {.  u
2cf0: 38 20 2a 61 45 6f 66 3b 20 20 20 20 20 20 20 20  8 *aEof;        
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d10: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62  * Pointer to 1 b
2d20: 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20  yte past end of 
2d30: 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f 2a  doclist */..  /*
2d40: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
2d50: 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20 61  s. aPoslist==0 a
2d60: 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69  t EOF */.  i64 i
2d70: 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50 6f  Rowid;.  u8 *aPo
2d80: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50 6f  slist;.  int nPo
2d90: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 53 69  slist;.  int nSi
2da0: 7a 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  ze;.};../*.** Th
2db0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2dc0: 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65  e "structure" re
2dd0: 63 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e  cord for each in
2de0: 64 65 78 20 61 72 65 20 72 65 70 72 65 73 65 6e  dex are represen
2df0: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20  ted.** using an 
2e00: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 72 65  Fts5Structure re
2e10: 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  cord in memory. 
2e20: 57 68 69 63 68 20 75 73 65 73 20 69 6e 73 74 61  Which uses insta
2e30: 6e 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  nces of the .** 
2e40: 6f 74 68 65 72 20 46 74 73 35 53 74 72 75 63 74  other Fts5Struct
2e50: 75 72 65 58 58 58 20 74 79 70 65 73 20 61 73 20  ureXXX types as 
2e60: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73  components..*/.s
2e70: 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74  truct Fts5Struct
2e80: 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69  ureSegment {.  i
2e90: 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20  nt iSegid;      
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2eb0: 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a  * Segment id */.
2ec0: 20 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b    int pgnoFirst;
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20    /* First leaf 
2ef0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73  page number in s
2f00: 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
2f10: 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20 20  pgnoLast;       
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2f30: 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ast leaf page nu
2f40: 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20  mber in segment 
2f50: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
2f60: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
2f70: 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20  {.  int nMerge; 
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2fa0: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63   segments in inc
2fb0: 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74  r-merge */.  int
2fc0: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fe0: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2ff0: 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65  segments on leve
3000: 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  l */.  Fts5Struc
3010: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53 65  tureSegment *aSe
3020: 67 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  g;     /* Array 
3030: 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53 65  of segments. aSe
3040: 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20  g[0] is oldest. 
3050: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
3060: 35 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20 69  5Structure {.  i
3070: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3090: 2a 20 4f 62 6a 65 63 74 20 72 65 66 65 72 65 6e  * Object referen
30a0: 63 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75 36  ce count */.  u6
30b0: 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b  4 nWriteCounter;
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30d0: 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77 72   Total leaves wr
30e0: 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30  itten to level 0
30f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65   */.  int nSegme
3100: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
3110: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
3120: 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20  egments in this 
3130: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
3140: 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20  nt nLevel;      
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3160: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  * Number of leve
3170: 6c 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78  ls in this index
3180: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
3190: 75 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c 5b  ureLevel aLevel[
31a0: 31 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  1];   /* Array o
31b0: 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20 6f  f nLevel level o
31c0: 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  bjects */.};../*
31d0: 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66  .** An object of
31e0: 20 74 79 70 65 20 46 74 73 35 53 65 67 57 72 69   type Fts5SegWri
31f0: 74 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 77  ter is used to w
3200: 72 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74 73  rite to segments
3210: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
3220: 50 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20 69  PageWriter {.  i
3230: 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  nt pgno;        
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3250: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
3260: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
3270: 20 69 6e 74 20 69 50 72 65 76 50 67 69 64 78 3b   int iPrevPgidx;
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c   /* Previous val
32a0: 75 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ue written into 
32b0: 70 67 69 64 78 20 2a 2f 0a 20 20 46 74 73 35 42  pgidx */.  Fts5B
32c0: 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20  uffer buf;      
32d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
32e0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
32f0: 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 46  leaf data */.  F
3300: 74 73 35 42 75 66 66 65 72 20 70 67 69 64 78 3b  ts5Buffer pgidx;
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3320: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
3330: 69 6e 67 20 70 61 67 65 2d 69 6e 64 65 78 20 2a  ing page-index *
3340: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
3350: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
3360: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
3370: 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75  ntaining previou
3380: 73 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a  s term on page *
3390: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
33a0: 44 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20 20  DlidxWriter {.  
33b0: 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  int pgno;       
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
33e0: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
33f0: 20 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69 64    int bPrevValid
3400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3410: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50 72    /* True if iPr
3420: 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  ev is valid */. 
3430: 20 69 36 34 20 69 50 72 65 76 3b 20 20 20 20 20   i64 iPrev;     
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77   /* Previous row
3460: 69 64 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e  id value written
3470: 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46 74   to page */.  Ft
3480: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34a0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
34b0: 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ng page data */.
34c0: 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 65  };.struct Fts5Se
34d0: 67 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20  gWriter {.  int 
34e0: 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20 20  iSegid;         
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
3500: 65 67 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f  egid to write to
3510: 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72   */.  Fts5PageWr
3520: 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20  iter writer;    
3530: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 57 72 69        /* PageWri
3540: 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
3550: 69 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b 20  i64 iPrevRowid; 
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69  /* Previous rowi
3580: 64 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75 72  d written to cur
3590: 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75  rent leaf */.  u
35a0: 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  8 bFirstRowidInD
35b0: 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 2f  oclist;        /
35c0: 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72  * True if next r
35d0: 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e  owid is first in
35e0: 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38   doclist */.  u8
35f0: 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61   bFirstRowidInPa
3600: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
3610: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f   True if next ro
3620: 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20  wid is first in 
3630: 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20 54 4f 44  page */.  /* TOD
3640: 4f 31 3a 20 43 61 6e 20 75 73 65 20 28 77 72 69  O1: Can use (wri
3650: 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 29 20  ter.pgidx.n==0) 
3660: 69 6e 73 74 65 61 64 20 6f 66 20 62 46 69 72 73  instead of bFirs
3670: 74 54 65 72 6d 49 6e 50 61 67 65 20 2a 2f 0a 20  tTermInPage */. 
3680: 20 75 38 20 62 46 69 72 73 74 54 65 72 6d 49 6e   u8 bFirstTermIn
3690: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
36a0: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74   /* True if next
36b0: 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 66 69   term will be fi
36c0: 72 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f 0a 20  rst in leaf */. 
36d0: 20 69 6e 74 20 6e 4c 65 61 66 57 72 69 74 74 65   int nLeafWritte
36e0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
36f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
3700: 61 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  af pages written
3710: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79   */.  int nEmpty
3720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3730: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3740: 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 74 65  of contiguous te
3750: 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a 2f  rm-less nodes */
3760: 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78 3b 20  ..  int nDlidx; 
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3780: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
3790: 20 73 69 7a 65 20 6f 66 20 61 44 6c 69 64 78 5b   size of aDlidx[
37a0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73  ] array */.  Fts
37b0: 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44  5DlidxWriter *aD
37c0: 6c 69 64 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  lidx;        /* 
37d0: 41 72 72 61 79 20 6f 66 20 46 74 73 35 44 6c 69  Array of Fts5Dli
37e0: 64 78 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73  dxWriter objects
37f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c 75 65 73   */..  /* Values
3800: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
3810: 74 68 65 20 25 5f 69 64 78 20 74 61 62 6c 65 20  the %_idx table 
3820: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
3830: 62 74 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  btterm;         
3840: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 65 72       /* Next ter
3850: 6d 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  m to insert into
3860: 20 25 5f 69 64 78 20 74 61 62 6c 65 20 2a 2f 0a   %_idx table */.
3870: 20 20 69 6e 74 20 69 42 74 50 61 67 65 3b 20 20    int iBtPage;  
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
38a0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
38b0: 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d 3b 0a 0a  o btterm */.};..
38c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
38d0: 74 73 35 43 52 65 73 75 6c 74 20 46 74 73 35 43  ts5CResult Fts5C
38e0: 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20 46  Result;.struct F
38f0: 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20 75  ts5CResult {.  u
3900: 31 36 20 69 46 69 72 73 74 3b 20 20 20 20 20 20  16 iFirst;      
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3920: 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20 6f  * aSeg[] index o
3930: 66 20 66 69 72 73 74 65 73 74 20 69 74 65 72 61  f firstest itera
3940: 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65 72  tor */.  u8 bTer
3950: 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  mEq;            
3960: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3970: 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 61 72   if the terms ar
3980: 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  e equal */.};../
3990: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20  *.** Object for 
39a0: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
39b0: 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65  h a single segme
39c0: 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63  nt, visiting eac
39d0: 68 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a 20  h term/rowid.** 
39e0: 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d  pair in the segm
39f0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a  ent..**.** pSeg:
3a00: 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e  .**   The segmen
3a10: 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  t to iterate thr
3a20: 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ough..**.** iLea
3a30: 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72  fPgno:.**   Curr
3a40: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ent leaf page nu
3a50: 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d  mber within segm
3a60: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66  ent..**.** iLeaf
3a70: 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74  Offset:.**   Byt
3a80: 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  e offset within 
3a90: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
3aa0: 20 74 68 61 74 20 69 73 20 74 68 65 20 66 69 72   that is the fir
3ab0: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a  st byte of the .
3ac0: 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69  **   position li
3ad0: 73 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79 74  st data (one byt
3ae0: 65 20 70 61 73 73 65 64 20 74 68 65 20 70 6f 73  e passed the pos
3af0: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
3b00: 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f 77  field)..**   row
3b10: 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  id field of the 
3b20: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55  current entry. U
3b30: 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74  sually this is t
3b40: 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  he size field of
3b50: 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69   the.**   positi
3b60: 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68  on list data. Th
3b70: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69  e exception is i
3b80: 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20  f the rowid for 
3b90: 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
3ba0: 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c  y .**   is the l
3bb0: 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65  ast thing on the
3bc0: 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a   leaf page..**.*
3bd0: 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75  * pLeaf:.**   Bu
3be0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
3bf0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
3c00: 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e  e data. Set to N
3c10: 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a  ULL at EOF..**.*
3c20: 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c  * iTermLeafPgno,
3c30: 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74   iTermLeafOffset
3c40: 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65  :.**   Leaf page
3c50: 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69   number containi
3c60: 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d  ng the last term
3c70: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
3c80: 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20  egment. And.**  
3c90: 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65   the offset imme
3ca0: 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
3cb0: 67 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e  g the term data.
3cc0: 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a  .**.** flags:.**
3cd0: 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f     Mask of FTS5_
3ce0: 53 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75  SEGITER_XXX valu
3cf0: 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20  es. Interpreted 
3d00: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
3d10: 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52  *   FTS5_SEGITER
3d20: 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20  _ONETERM:.**    
3d30: 20 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65   If set, set the
3d40: 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69   iterator to poi
3d50: 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20  nt to EOF after 
3d60: 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
3d70: 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20  ist .**     has 
3d80: 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20  been exhausted. 
3d90: 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74  Do not proceed t
3da0: 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20  o the next term 
3db0: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a  in the segment..
3dc0: 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47  **.**   FTS5_SEG
3dd0: 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a  ITER_REVERSE:.**
3de0: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69       This flag i
3df0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20  s only ever set 
3e00: 69 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  if FTS5_SEGITER_
3e10: 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20  ONETERM is also 
3e20: 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69  set. If.**     i
3e30: 74 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74  t is set, iterat
3e40: 65 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64 20  e through rowid 
3e50: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72  in descending or
3e60: 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74  der instead of t
3e70: 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c  he.**     defaul
3e80: 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  t ascending orde
3e90: 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f  r..**.** iRowidO
3ea0: 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73  ffset/nRowidOffs
3eb0: 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a  et/aRowidOffset:
3ec0: 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72  .**     These ar
3ed0: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54  e used if the FT
3ee0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
3ef0: 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
3f00: 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65 61  **.**     For ea
3f10: 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  ch rowid on the 
3f20: 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  page correspondi
3f30: 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
3f40: 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20 20  t term, the.**  
3f50: 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67     corresponding
3f60: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
3f70: 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f 20  entry is set to 
3f80: 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20  the byte offset 
3f90: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73 74  of the.**     st
3fa0: 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73 69  art of the "posi
3fb0: 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22 20  tion-list-size" 
3fc0: 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65  field within the
3fd0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 69 54 65   page..**.** iTe
3fe0: 72 6d 49 64 78 3a 0a 2a 2a 20 20 20 20 20 49 6e  rmIdx:.**     In
3ff0: 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 74  dex of current t
4000: 65 72 6d 20 6f 6e 20 69 54 65 72 6d 4c 65 61 66  erm on iTermLeaf
4010: 50 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  Pgno..*/.struct 
4020: 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20 20  Fts5SegIter {.  
4030: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
4040: 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20  ment *pSeg;     
4050: 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69 74  /* Segment to it
4060: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f  erate through */
4070: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20  .  int flags;   
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f     /* Mask of co
40a0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61 67  nfiguration flag
40b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  s */.  int iLeaf
40c0: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
40d0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
40e0: 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
40f0: 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  er */.  Fts5Data
4100: 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20   *pLeaf;        
4110: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4120: 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  nt leaf data */.
4130: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 78    Fts5Data *pNex
4140: 74 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  tLeaf;          
4150: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 28    /* Leaf page (
4160: 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f 0a  iLeafPgno+1) */.
4170: 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73 65    int iLeafOffse
4180: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4190: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
41a0: 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20   within current 
41b0: 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 4e 65  leaf */..  /* Ne
41c0: 78 74 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 76  xt method */.  v
41d0: 6f 69 64 20 28 2a 78 4e 65 78 74 29 28 46 74 73  oid (*xNext)(Fts
41e0: 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67  5Index*, Fts5Seg
41f0: 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 20  Iter*, int*);.. 
4200: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 61 6e 64   /* The page and
4210: 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 77 68 69   offset from whi
4220: 63 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ch the current t
4230: 65 72 6d 20 77 61 73 20 72 65 61 64 2e 20 54 68  erm was read. Th
4240: 65 20 6f 66 66 73 65 74 20 0a 20 20 2a 2a 20 69  e offset .  ** i
4250: 73 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  s the offset of 
4260: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
4270: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  in the current d
4280: 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 69 6e  oclist.  */.  in
4290: 74 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b  t iTermLeafPgno;
42a0: 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c 65 61 66  .  int iTermLeaf
42b0: 4f 66 66 73 65 74 3b 0a 0a 20 20 69 6e 74 20 69  Offset;..  int i
42c0: 50 67 69 64 78 4f 66 66 3b 20 20 20 20 20 20 20  PgidxOff;       
42d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
42e0: 78 74 20 6f 66 66 73 65 74 20 69 6e 20 70 67 69  xt offset in pgi
42f0: 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  dx */.  int iEnd
4300: 6f 66 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f 2a  ofDoclist;..  /*
4310: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
4320: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20  re only used if 
4330: 74 68 65 20 46 54 53 35 5f 53 45 47 49 54 45 52  the FTS5_SEGITER
4340: 5f 52 45 56 45 52 53 45 20 66 6c 61 67 20 69 73  _REVERSE flag is
4350: 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   set. */.  int i
4360: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4380: 72 72 65 6e 74 20 65 6e 74 72 79 20 69 6e 20 61  rrent entry in a
4390: 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 2a 2f  RowidOffset[] */
43a0: 0a 20 20 69 6e 74 20 6e 52 6f 77 69 64 4f 66 66  .  int nRowidOff
43b0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
43c0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
43d0: 73 69 7a 65 20 6f 66 20 61 52 6f 77 69 64 4f 66  size of aRowidOf
43e0: 66 73 65 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  fset[] array */.
43f0: 20 20 69 6e 74 20 2a 61 52 6f 77 69 64 4f 66 66    int *aRowidOff
4400: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
4410: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 66    /* Array of of
4420: 66 73 65 74 20 74 6f 20 72 6f 77 69 64 20 66 69  fset to rowid fi
4430: 65 6c 64 73 20 2a 2f 0a 0a 20 20 46 74 73 35 44  elds */..  Fts5D
4440: 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
4450: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;          /* If
4460: 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c   there is a docl
4470: 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20 20  ist-index */..  
4480: 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 70 6f 70  /* Variables pop
4490: 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20  ulated based on 
44a0: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 2a  current entry. *
44b0: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
44c0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
44d0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74      /* Current t
44e0: 65 72 6d 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  erm */.  i64 iRo
44f0: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
4500: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4510: 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69  ent rowid */.  i
4520: 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20 20  nt nPos;        
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4540: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
4550: 73 20 69 6e 20 63 75 72 72 65 6e 74 20 70 6f 73  s in current pos
4560: 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20  ition list */.  
4570: 75 38 20 62 44 65 6c 3b 20 20 20 20 20 20 20 20  u8 bDel;        
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4590: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 64  /* True if the d
45a0: 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73 65  elete flag is se
45b0: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
45c0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
45d0: 6e 74 65 72 20 74 6f 20 61 6e 20 46 74 73 35 44  nter to an Fts5D
45e0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 74 68  ata structure th
45f0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 0a 2a  at contains a .*
4600: 2a 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2f 0a  * leaf page..*/.
4610: 23 64 65 66 69 6e 65 20 41 53 53 45 52 54 5f 53  #define ASSERT_S
4620: 5a 4c 45 41 46 5f 4f 4b 28 78 29 20 61 73 73 65  ZLEAF_OK(x) asse
4630: 72 74 28 20 5c 0a 20 20 20 20 28 78 29 2d 3e 73  rt( \.    (x)->s
4640: 7a 4c 65 61 66 3d 3d 28 78 29 2d 3e 6e 6e 20 7c  zLeaf==(x)->nn |
4650: 7c 20 28 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d 66  | (x)->szLeaf==f
4660: 74 73 35 47 65 74 55 31 36 28 26 28 78 29 2d 3e  ts5GetU16(&(x)->
4670: 70 5b 32 5d 29 20 5c 0a 29 0a 0a 23 64 65 66 69  p[2]) \.)..#defi
4680: 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  ne FTS5_SEGITER_
4690: 4f 4e 45 54 45 52 4d 20 30 78 30 31 0a 23 64 65  ONETERM 0x01.#de
46a0: 66 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45  fine FTS5_SEGITE
46b0: 52 5f 52 45 56 45 52 53 45 20 30 78 30 32 0a 0a  R_REVERSE 0x02..
46c0: 2f 2a 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  /* .** Argument 
46d0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
46e0: 61 6e 20 46 74 73 35 44 61 74 61 20 73 74 72 75  an Fts5Data stru
46f0: 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
4700: 69 6e 73 20 61 20 6c 65 61 66 0a 2a 2a 20 70 61  ins a leaf.** pa
4710: 67 65 2e 20 54 68 69 73 20 6d 61 63 72 6f 20 65  ge. This macro e
4720: 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75 65  valuates to true
4730: 20 69 66 20 74 68 65 20 6c 65 61 66 20 63 6f 6e   if the leaf con
4740: 74 61 69 6e 73 20 6e 6f 20 74 65 72 6d 73 2c 20  tains no terms, 
4750: 6f 72 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  or.** false if i
4760: 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  t contains at le
4770: 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 0a 2a 2f  ast one term..*/
4780: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c 65 61  .#define fts5Lea
4790: 66 49 73 54 65 72 6d 6c 65 73 73 28 78 29 20 28  fIsTermless(x) (
47a0: 28 78 29 2d 3e 73 7a 4c 65 61 66 20 3e 3d 20 28  (x)->szLeaf >= (
47b0: 78 29 2d 3e 6e 6e 29 0a 0a 23 64 65 66 69 6e 65  x)->nn)..#define
47c0: 20 66 74 73 35 4c 65 61 66 54 65 72 6d 4f 66 66   fts5LeafTermOff
47d0: 28 78 2c 20 69 29 20 28 66 74 73 35 47 65 74 55  (x, i) (fts5GetU
47e0: 31 36 28 26 28 78 29 2d 3e 70 5b 28 78 29 2d 3e  16(&(x)->p[(x)->
47f0: 73 7a 4c 65 61 66 20 2b 20 28 69 29 2a 32 5d 29  szLeaf + (i)*2])
4800: 29 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c  )..#define fts5L
4810: 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
4820: 28 78 29 20 28 66 74 73 35 47 65 74 55 31 36 28  (x) (fts5GetU16(
4830: 28 78 29 2d 3e 70 29 29 0a 0a 2f 2a 0a 2a 2a 20  (x)->p))../*.** 
4840: 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72 61  Object for itera
4850: 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65  ting through the
4860: 20 6d 65 72 67 65 64 20 72 65 73 75 6c 74 73 20   merged results 
4870: 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  of one or more s
4880: 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20 76 69 73 69  egments,.** visi
4890: 74 69 6e 67 20 65 61 63 68 20 74 65 72 6d 2f 72  ting each term/r
48a0: 6f 77 69 64 20 70 61 69 72 20 69 6e 20 74 68 65  owid pair in the
48b0: 20 6d 65 72 67 65 64 20 64 61 74 61 2e 0a 2a 2a   merged data..**
48c0: 0a 2a 2a 20 6e 53 65 67 20 69 73 20 61 6c 77 61  .** nSeg is alwa
48d0: 79 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  ys a power of tw
48e0: 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  o greater than o
48f0: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e  r equal to the n
4900: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 65 67 6d  umber of.** segm
4910: 65 6e 74 73 20 74 68 61 74 20 74 68 69 73 20 6f  ents that this o
4920: 62 6a 65 63 74 20 69 73 20 6d 65 72 67 69 6e 67  bject is merging
4930: 20 64 61 74 61 20 66 72 6f 6d 2e 20 42 6f 74 68   data from. Both
4940: 20 74 68 65 20 61 53 65 67 5b 5d 20 61 6e 64 0a   the aSeg[] and.
4950: 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  ** aFirst[] arra
4960: 79 73 20 61 72 65 20 73 69 7a 65 64 20 61 74 20  ys are sized at 
4970: 6e 53 65 67 20 65 6e 74 72 69 65 73 2e 20 54 68  nSeg entries. Th
4980: 65 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20 69  e aSeg[] array i
4990: 73 20 70 61 64 64 65 64 0a 2a 2a 20 77 69 74 68  s padded.** with
49a0: 20 7a 65 72 6f 65 64 20 6f 62 6a 65 63 74 73 20   zeroed objects 
49b0: 2d 20 74 68 65 73 65 20 61 72 65 20 68 61 6e 64  - these are hand
49c0: 6c 65 64 20 61 73 20 69 66 20 74 68 65 79 20 77  led as if they w
49d0: 65 72 65 20 69 74 65 72 61 74 6f 72 73 20 6f 70  ere iterators op
49e0: 65 6e 65 64 0a 2a 2a 20 6f 6e 20 65 6d 70 74 79  ened.** on empty
49f0: 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a   segments..**.**
4a00: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
4a10: 63 6f 6d 70 61 72 69 6e 67 20 73 65 67 6d 65 6e  comparing segmen
4a20: 74 73 20 61 53 65 67 5b 4e 5d 20 61 6e 64 20 61  ts aSeg[N] and a
4a30: 53 65 67 5b 4e 2b 31 5d 2c 20 77 68 65 72 65 20  Seg[N+1], where 
4a40: 4e 20 69 73 20 61 6e 0a 2a 2a 20 65 76 65 6e 20  N is an.** even 
4a50: 6e 75 6d 62 65 72 2c 20 69 73 20 73 74 6f 72 65  number, is store
4a60: 64 20 69 6e 20 61 46 69 72 73 74 5b 28 6e 53 65  d in aFirst[(nSe
4a70: 67 2b 4e 29 2f 32 5d 2e 20 54 68 65 20 22 72 65  g+N)/2]. The "re
4a80: 73 75 6c 74 22 20 6f 66 20 74 68 65 20 0a 2a 2a  sult" of the .**
4a90: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 74   comparison in t
4aa0: 68 69 73 20 63 6f 6e 74 65 78 74 20 69 73 20 74  his context is t
4ab0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
4ac0: 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 63 75  iterator that cu
4ad0: 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
4ae0: 73 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 72  s to the smaller
4af0: 20 74 65 72 6d 2f 72 6f 77 69 64 20 63 6f 6d 62   term/rowid comb
4b00: 69 6e 61 74 69 6f 6e 2e 20 49 74 65 72 61 74 6f  ination. Iterato
4b10: 72 73 20 61 74 20 45 4f 46 20 61 72 65 0a 2a 2a  rs at EOF are.**
4b20: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
4b30: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  e greater than a
4b40: 6c 6c 20 6f 74 68 65 72 20 69 74 65 72 61 74 6f  ll other iterato
4b50: 72 73 2e 0a 2a 2a 0a 2a 2a 20 61 46 69 72 73 74  rs..**.** aFirst
4b60: 5b 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  [1] contains the
4b70: 20 69 6e 64 65 78 20 69 6e 20 61 53 65 67 5b 5d   index in aSeg[]
4b80: 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   of the iterator
4b90: 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 0a   that points to.
4ba0: 2a 2a 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  ** the smallest 
4bb0: 6b 65 79 20 6f 76 65 72 61 6c 6c 2e 20 61 46 69  key overall. aFi
4bc0: 72 73 74 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  rst[0] is unused
4bd0: 2e 20 0a 2a 2a 0a 2a 2a 20 70 6f 73 6c 69 73 74  . .**.** poslist
4be0: 3a 0a 2a 2a 20 20 20 55 73 65 64 20 62 79 20 73  :.**   Used by s
4bf0: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f  qlite3Fts5IterPo
4c00: 73 6c 69 73 74 28 29 20 77 68 65 6e 20 74 68 65  slist() when the
4c10: 20 70 6f 73 6c 69 73 74 20 6e 65 65 64 73 20 74   poslist needs t
4c20: 6f 20 62 65 20 62 75 66 66 65 72 65 64 2e 0a 2a  o be buffered..*
4c30: 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  *   There is no 
4c40: 77 61 79 20 74 6f 20 74 65 6c 6c 20 69 66 20 74  way to tell if t
4c50: 68 69 73 20 69 73 20 70 6f 70 75 6c 61 74 65 64  his is populated
4c60: 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 72 75   or not..*/.stru
4c70: 63 74 20 46 74 73 35 49 74 65 72 20 7b 0a 20 20  ct Fts5Iter {.  
4c80: 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 62 61  Fts5IndexIter ba
4c90: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
4ca0: 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20 63 6f  /* Base class co
4cb0: 6e 74 61 69 6e 69 6e 67 20 6f 75 74 70 75 74 20  ntaining output 
4cc0: 76 61 72 73 20 2a 2f 0a 0a 20 20 46 74 73 35 49  vars */..  Fts5I
4cd0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
4ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
4cf0: 64 65 78 20 74 68 61 74 20 6f 77 6e 73 20 74 68  dex that owns th
4d00: 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  is iterator */. 
4d10: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
4d20: 70 53 74 72 75 63 74 3b 20 20 20 20 20 20 20 20  pStruct;        
4d30: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 74 72   /* Database str
4d40: 75 63 74 75 72 65 20 66 6f 72 20 74 68 69 73 20  ucture for this 
4d50: 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 46 74  iterator */.  Ft
4d60: 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69 73 74  s5Buffer poslist
4d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4d80: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
4d90: 6e 67 20 63 75 72 72 65 6e 74 20 70 6f 73 6c 69  ng current posli
4da0: 73 74 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73  st */.  Fts5Cols
4db0: 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20  et *pColset;    
4dc0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
4dd0: 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74  ict matches to t
4de0: 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  hese columns */.
4df0: 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 64 20 74 6f  .  /* Invoked to
4e00: 20 73 65 74 20 6f 75 74 70 75 74 20 76 61 72 69   set output vari
4e10: 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 76 6f 69 64  ables. */.  void
4e20: 20 28 2a 78 53 65 74 4f 75 74 70 75 74 73 29 28   (*xSetOutputs)(
4e30: 46 74 73 35 49 74 65 72 2a 2c 20 46 74 73 35 53  Fts5Iter*, Fts5S
4e40: 65 67 49 74 65 72 2a 29 3b 0a 0a 20 20 69 6e 74  egIter*);..  int
4e50: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e70: 53 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d 20 61  Size of aSeg[] a
4e80: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  rray */.  int bR
4e90: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
4ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4eb0: 65 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e 20  e to iterate in 
4ec0: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
4ed0: 0a 20 20 75 38 20 62 53 6b 69 70 45 6d 70 74 79  .  u8 bSkipEmpty
4ee0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4ef0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 6b     /* True to sk
4f00: 69 70 20 64 65 6c 65 74 65 64 20 65 6e 74 72 69  ip deleted entri
4f10: 65 73 20 2a 2f 0a 0a 20 20 69 36 34 20 69 53 77  es */..  i64 iSw
4f20: 69 74 63 68 52 6f 77 69 64 3b 20 20 20 20 20 20  itchRowid;      
4f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
4f40: 74 65 73 74 20 72 6f 77 69 64 20 6f 66 20 6f 74  test rowid of ot
4f50: 68 65 72 20 74 68 61 6e 20 61 46 69 72 73 74 5b  her than aFirst[
4f60: 31 5d 20 2a 2f 0a 20 20 46 74 73 35 43 52 65 73  1] */.  Fts5CRes
4f70: 75 6c 74 20 2a 61 46 69 72 73 74 3b 20 20 20 20  ult *aFirst;    
4f80: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4f90: 6e 74 20 6d 65 72 67 65 20 73 74 61 74 65 20 28  nt merge state (
4fa0: 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a 20 20  see above) */.  
4fb0: 46 74 73 35 53 65 67 49 74 65 72 20 61 53 65 67  Fts5SegIter aSeg
4fc0: 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [1];            
4fd0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65 67 6d  /* Array of segm
4fe0: 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 2a 2f  ent iterators */
4ff0: 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  .};.../*.** An i
5000: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
5010: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69 73  ollowing type is
5020: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
5030: 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e   through the con
5040: 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20 64 6f  tents.** of a do
5050: 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f  clist-index reco
5060: 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74 61 3a  rd..**.** pData:
5070: 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20 63 6f 6e  .**   Record con
5080: 74 61 69 6e 69 6e 67 20 74 68 65 20 64 6f 63 6c  taining the docl
5090: 69 73 74 2d 69 6e 64 65 78 20 64 61 74 61 2e 0a  ist-index data..
50a0: 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a 20 20  **.** bEof:.**  
50b0: 20 53 65 74 20 74 6f 20 74 72 75 65 20 6f 6e 63   Set to true onc
50c0: 65 20 69 74 65 72 61 74 6f 72 20 68 61 73 20 72  e iterator has r
50d0: 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a 0a 2a  eached EOF..**.*
50e0: 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53 65 74  * iOff:.**   Set
50f0: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
5100: 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 72 65  offset within re
5110: 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f 0a 73  cord pData..*/.s
5120: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 4c  truct Fts5DlidxL
5130: 76 6c 20 7b 0a 20 20 46 74 73 35 44 61 74 61 20  vl {.  Fts5Data 
5140: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
5150: 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
5160: 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 6f 66   current page of
5170: 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20   this level */. 
5180: 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20   int iOff;      
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51a0: 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74  * Current offset
51b0: 20 69 6e 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20   into pData */. 
51c0: 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20   int bEof;      
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51e0: 2a 20 41 74 20 45 4f 46 20 61 6c 72 65 61 64 79  * At EOF already
51f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
5200: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
5210: 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 72      /* Used by r
5220: 65 76 65 72 73 65 20 69 74 65 72 61 74 6f 72 73  everse iterators
5230: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74   */..  /* Output
5240: 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20   variables */.  
5250: 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 3b 20 20  int iLeafPgno;  
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5270: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
5280: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
5290: 65 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69  e */.  i64 iRowi
52a0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
52b0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 6f       /* First ro
52c0: 77 69 64 20 6f 6e 20 6c 65 61 66 20 69 4c 65 61  wid on leaf iLea
52d0: 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73 74 72 75  fPgno */.};.stru
52e0: 63 74 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  ct Fts5DlidxIter
52f0: 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c 3b 0a 20   {.  int nLvl;. 
5300: 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 46   int iSegid;.  F
5310: 74 73 35 44 6c 69 64 78 4c 76 6c 20 61 4c 76 6c  ts5DlidxLvl aLvl
5320: 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  [1];.};..static 
5330: 76 6f 69 64 20 66 74 73 35 50 75 74 55 31 36 28  void fts5PutU16(
5340: 75 38 20 2a 61 4f 75 74 2c 20 75 31 36 20 69 56  u8 *aOut, u16 iV
5350: 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30 5d 20 3d  al){.  aOut[0] =
5360: 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20 20 61 4f   (iVal>>8);.  aO
5370: 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c 26 30 78  ut[1] = (iVal&0x
5380: 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75  FF);.}..static u
5390: 31 36 20 66 74 73 35 47 65 74 55 31 36 28 63 6f  16 fts5GetU16(co
53a0: 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b 0a 20 20  nst u8 *aIn){.  
53b0: 72 65 74 75 72 6e 20 28 28 75 31 36 29 61 49 6e  return ((u16)aIn
53c0: 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61 49 6e 5b  [0] << 8) + aIn[
53d0: 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a 2a 2a 20 41 6c  1];.} ../*.** Al
53e0: 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
53f0: 6e 20 61 20 62 75 66 66 65 72 20 61 74 20 6c 65  n a buffer at le
5400: 61 73 74 20 6e 42 79 74 65 20 62 79 74 65 73 20  ast nByte bytes 
5410: 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
5420: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69  f an OOM error i
5430: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 72  s encountered, r
5440: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 73  eturn NULL and s
5450: 65 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  et the error cod
5460: 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 74 73 35  e in.** the Fts5
5470: 49 6e 64 65 78 20 68 61 6e 64 6c 65 20 70 61 73  Index handle pas
5480: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
5490: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
54a0: 61 74 69 63 20 76 6f 69 64 20 2a 66 74 73 35 49  atic void *fts5I
54b0: 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35 49 6e 64  dxMalloc(Fts5Ind
54c0: 65 78 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65  ex *p, int nByte
54d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
54e0: 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
54f0: 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29  o(&p->rc, nByte)
5500: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
5510: 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
5520: 6f 66 20 74 68 65 20 70 4c 65 66 74 20 62 75 66  of the pLeft buf
5530: 66 65 72 20 77 69 74 68 20 74 68 65 20 70 52 69  fer with the pRi
5540: 67 68 74 2f 6e 52 69 67 68 74 20 62 6c 6f 62 2e  ght/nRight blob.
5550: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76  .**.** Return -v
5560: 65 20 69 66 20 70 4c 65 66 74 20 69 73 20 73 6d  e if pLeft is sm
5570: 61 6c 6c 65 72 20 74 68 61 6e 20 70 52 69 67 68  aller than pRigh
5580: 74 2c 20 30 20 69 66 20 74 68 65 79 20 61 72 65  t, 0 if they are
5590: 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65   equal or.** +ve
55a0: 20 69 66 20 70 52 69 67 68 74 20 69 73 20 73 6d   if pRight is sm
55b0: 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65 66 74  aller than pLeft
55c0: 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
55d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65 73 20  :.**.**     res 
55e0: 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52 69 67  = *pLeft - *pRig
55f0: 68 74 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ht.*/.#ifdef SQL
5600: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
5610: 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72 43   int fts5BufferC
5620: 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20 46 74  ompareBlob(.  Ft
5630: 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66 74 2c  s5Buffer *pLeft,
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5650: 20 4c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20   Left hand side 
5660: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f  of comparison */
5670: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 52 69  .  const u8 *pRi
5680: 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68 74 20  ght, int nRight 
5690: 20 20 20 2f 2a 20 52 69 67 68 74 20 68 61 6e 64     /* Right hand
56a0: 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69   side of compari
56b0: 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  son */.){.  int 
56c0: 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74  nCmp = MIN(pLeft
56d0: 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20  ->n, nRight);.  
56e0: 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70  int res = memcmp
56f0: 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67 68  (pLeft->p, pRigh
5700: 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75  t, nCmp);.  retu
5710: 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c  rn (res==0 ? (pL
5720: 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67 68 74 29  eft->n - nRight)
5730: 20 3a 20 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69   : res);.}.#endi
5740: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  f../*.** Compare
5750: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
5760: 20 74 68 65 20 74 77 6f 20 62 75 66 66 65 72 73   the two buffers
5770: 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e   using memcmp().
5780: 20 49 66 20 6f 6e 65 20 62 75 66 66 65 72 0a 2a   If one buffer.*
5790: 2a 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  * is a prefix of
57a0: 20 74 68 65 20 6f 74 68 65 72 2c 20 69 74 20 69   the other, it i
57b0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 68 65  s considered the
57c0: 20 6c 65 73 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52   lesser..**.** R
57d0: 65 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65  eturn -ve if pLe
57e0: 66 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ft is smaller th
57f0: 61 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66 20  an pRight, 0 if 
5800: 74 68 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f  they are equal o
5810: 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67  r.** +ve if pRig
5820: 68 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ht is smaller th
5830: 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68  an pLeft. In oth
5840: 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20  er words:.**.** 
5850: 20 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74      res = *pLeft
5860: 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74   - *pRight.*/.st
5870: 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66  atic int fts5Buf
5880: 66 65 72 43 6f 6d 70 61 72 65 28 46 74 73 35 42  ferCompare(Fts5B
5890: 75 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 46 74  uffer *pLeft, Ft
58a0: 73 35 42 75 66 66 65 72 20 2a 70 52 69 67 68 74  s5Buffer *pRight
58b0: 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20  ){.  int nCmp = 
58c0: 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20 70 52  MIN(pLeft->n, pR
58d0: 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20  ight->n);.  int 
58e0: 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65  res = memcmp(pLe
58f0: 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2d 3e 70  ft->p, pRight->p
5900: 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72  , nCmp);.  retur
5910: 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65  n (res==0 ? (pLe
5920: 66 74 2d 3e 6e 20 2d 20 70 52 69 67 68 74 2d 3e  ft->n - pRight->
5930: 6e 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 73 74  n) : res);.}..st
5940: 61 74 69 63 20 69 6e 74 20 66 74 73 35 4c 65 61  atic int fts5Lea
5950: 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 46 74  fFirstTermOff(Ft
5960: 73 35 44 61 74 61 20 2a 70 4c 65 61 66 29 7b 0a  s5Data *pLeaf){.
5970: 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 66 74 73    int ret;.  fts
5980: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
5990: 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a  eaf->p[pLeaf->sz
59a0: 4c 65 61 66 5d 2c 20 72 65 74 29 3b 0a 20 20 72  Leaf], ret);.  r
59b0: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
59c0: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 72 65  .** Close the re
59d0: 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e  ad-only blob han
59e0: 64 6c 65 2c 20 69 66 20 69 74 20 69 73 20 6f 70  dle, if it is op
59f0: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  en..*/.static vo
5a00: 69 64 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64  id fts5CloseRead
5a10: 65 72 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  er(Fts5Index *p)
5a20: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64  {.  if( p->pRead
5a30: 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
5a40: 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 20  3_blob *pReader 
5a50: 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20  = p->pReader;.  
5a60: 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30    p->pReader = 0
5a70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c  ;.    sqlite3_bl
5a80: 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72  ob_close(pReader
5a90: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
5aa0: 20 52 65 74 72 69 65 76 65 20 61 20 72 65 63 6f   Retrieve a reco
5ab0: 72 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  rd from the %_da
5ac0: 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ta table..**.** 
5ad0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
5ae0: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
5af0: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
5b00: 72 20 6c 65 66 74 20 69 6e 20 74 68 65 20 0a 2a  r left in the .*
5b10: 2a 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65  * Fts5Index obje
5b20: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74  ct..*/.static Ft
5b30: 73 35 44 61 74 61 20 2a 66 74 73 35 44 61 74 61  s5Data *fts5Data
5b40: 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a  Read(Fts5Index *
5b50: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  p, i64 iRowid){.
5b60: 20 20 46 74 73 35 44 61 74 61 20 2a 70 52 65 74    Fts5Data *pRet
5b70: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72   = 0;.  if( p->r
5b80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5b90: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
5ba0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20 69 66 28  ITE_OK;..    if(
5bb0: 20 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20   p->pReader ){. 
5bc0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c       /* This cal
5bd0: 6c 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  l may return SQL
5be0: 49 54 45 5f 41 42 4f 52 54 20 69 66 20 74 68 65  ITE_ABORT if the
5bf0: 72 65 20 68 61 73 20 62 65 65 6e 20 61 20 73 61  re has been a sa
5c00: 76 65 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a  vepoint.      **
5c10: 20 72 6f 6c 6c 62 61 63 6b 20 73 69 6e 63 65 20   rollback since 
5c20: 69 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  it was last used
5c30: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
5c40: 20 6e 65 77 20 62 6c 6f 62 20 68 61 6e 64 6c 65   new blob handle
5c50: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71  .      ** is req
5c60: 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20  uired.  */.     
5c70: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
5c80: 42 6c 6f 62 20 3d 20 70 2d 3e 70 52 65 61 64 65  Blob = p->pReade
5c90: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 61  r;.      p->pRea
5ca0: 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  der = 0;.      r
5cb0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
5cc0: 5f 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69  _reopen(pBlob, i
5cd0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 61 73  Rowid);.      as
5ce0: 73 65 72 74 28 20 70 2d 3e 70 52 65 61 64 65 72  sert( p->pReader
5cf0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==0 );.      p->
5d00: 70 52 65 61 64 65 72 20 3d 20 70 42 6c 6f 62 3b  pReader = pBlob;
5d10: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
5d20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5d30: 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61      fts5CloseRea
5d40: 64 65 72 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  der(p);.      }.
5d50: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
5d60: 4c 49 54 45 5f 41 42 4f 52 54 20 29 20 72 63 20  LITE_ABORT ) rc 
5d70: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
5d80: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
5d90: 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73  e blob handle is
5da0: 20 6e 6f 74 20 6f 70 65 6e 20 61 74 20 74 68 69   not open at thi
5db0: 73 20 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 69 74  s point, open it
5dc0: 20 61 6e 64 20 73 65 65 6b 20 0a 20 20 20 20 2a   and seek .    *
5dd0: 2a 20 74 6f 20 74 68 65 20 72 65 71 75 65 73 74  * to the request
5de0: 65 64 20 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20  ed entry.  */.  
5df0: 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72    if( p->pReader
5e00: 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ==0 && rc==SQLIT
5e10: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46 74  E_OK ){.      Ft
5e20: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
5e30: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
5e40: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
5e50: 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f  e3_blob_open(pCo
5e60: 6e 66 69 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20  nfig->db, .     
5e70: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
5e80: 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  b, p->zDataTbl, 
5e90: 22 62 6c 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c  "block", iRowid,
5ea0: 20 30 2c 20 26 70 2d 3e 70 52 65 61 64 65 72 0a   0, &p->pReader.
5eb0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
5ec0: 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72      /* If either
5ed0: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
5ee0: 62 6c 6f 62 5f 6f 70 65 6e 28 29 20 6f 72 20 73  blob_open() or s
5ef0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70  qlite3_blob_reop
5f00: 65 6e 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a  en() calls.    *
5f10: 2a 20 61 62 6f 76 65 20 72 65 74 75 72 6e 65 64  * above returned
5f20: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 72   SQLITE_ERROR, r
5f30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
5f40: 52 55 50 54 5f 56 54 41 42 20 69 6e 73 74 65 61  RUPT_VTAB instea
5f50: 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 6c 20 74 68  d..    ** All th
5f60: 65 20 72 65 61 73 6f 6e 73 20 74 68 6f 73 65 20  e reasons those 
5f70: 66 75 6e 63 74 69 6f 6e 73 20 6d 69 67 68 74 20  functions might 
5f80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
5f90: 52 4f 52 20 2d 20 6d 69 73 73 69 6e 67 0a 20 20  ROR - missing.  
5fa0: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 6d 69 73 73    ** table, miss
5fb0: 69 6e 67 20 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f  ing row, non-blo
5fc0: 62 2f 74 65 78 74 20 69 6e 20 62 6c 6f 63 6b 20  b/text in block 
5fd0: 63 6f 6c 75 6d 6e 20 2d 20 69 6e 64 69 63 61 74  column - indicat
5fe0: 65 20 0a 20 20 20 20 2a 2a 20 62 61 63 6b 69 6e  e .    ** backin
5ff0: 67 20 73 74 6f 72 65 20 63 6f 72 72 75 70 74 69  g store corrupti
6000: 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  on.  */.    if( 
6010: 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52  rc==SQLITE_ERROR
6020: 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52   ) rc = FTS5_COR
6030: 52 55 50 54 3b 0a 0a 20 20 20 20 69 66 28 20 72  RUPT;..    if( r
6040: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6050: 20 20 20 20 20 20 75 38 20 2a 61 4f 75 74 20 3d        u8 *aOut =
6060: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
6070: 20 20 2f 2a 20 52 65 61 64 20 62 6c 6f 62 20 64    /* Read blob d
6080: 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 62 75  ata into this bu
6090: 66 66 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ffer */.      in
60a0: 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65  t nByte = sqlite
60b0: 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e  3_blob_bytes(p->
60c0: 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20  pReader);.      
60d0: 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 73 69 7a  int nAlloc = siz
60e0: 65 6f 66 28 46 74 73 35 44 61 74 61 29 20 2b 20  eof(Fts5Data) + 
60f0: 6e 42 79 74 65 20 2b 20 46 54 53 35 5f 44 41 54  nByte + FTS5_DAT
6100: 41 5f 50 41 44 44 49 4e 47 3b 0a 20 20 20 20 20  A_PADDING;.     
6110: 20 70 52 65 74 20 3d 20 28 46 74 73 35 44 61 74   pRet = (Fts5Dat
6120: 61 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  a*)sqlite3_mallo
6130: 63 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  c(nAlloc);.     
6140: 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
6150: 20 20 20 20 20 70 52 65 74 2d 3e 6e 6e 20 3d 20       pRet->nn = 
6160: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 61  nByte;.        a
6170: 4f 75 74 20 3d 20 70 52 65 74 2d 3e 70 20 3d 20  Out = pRet->p = 
6180: 28 75 38 2a 29 26 70 52 65 74 5b 31 5d 3b 0a 20  (u8*)&pRet[1];. 
6190: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
61a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
61b0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 0a  NOMEM;.      }..
61c0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
61d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
61e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
61f0: 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 52 65  blob_read(p->pRe
6200: 61 64 65 72 2c 20 61 4f 75 74 2c 20 6e 42 79 74  ader, aOut, nByt
6210: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
6220: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
6230: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6240: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6250: 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 70 52  Ret);.        pR
6260: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  et = 0;.      }e
6270: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
6280: 54 4f 44 4f 31 3a 20 46 69 78 20 74 68 69 73 20  TODO1: Fix this 
6290: 2a 2f 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  */.        pRet-
62a0: 3e 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65  >szLeaf = fts5Ge
62b0: 74 55 31 36 28 26 70 52 65 74 2d 3e 70 5b 32 5d  tU16(&pRet->p[2]
62c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
62d0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b  .    p->rc = rc;
62e0: 0a 20 20 20 20 70 2d 3e 6e 52 65 61 64 2b 2b 3b  .    p->nRead++;
62f0: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
6300: 28 70 52 65 74 3d 3d 30 29 3d 3d 28 70 2d 3e 72  (pRet==0)==(p->r
6310: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b  c!=SQLITE_OK) );
6320: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
6330: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  }.../*.** Releas
6340: 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
6350: 20 64 61 74 61 20 72 65 63 6f 72 64 20 72 65 74   data record ret
6360: 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  urned by an earl
6370: 69 65 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 66  ier call to.** f
6380: 74 73 35 44 61 74 61 52 65 61 64 28 29 2e 0a 2a  ts5DataRead()..*
6390: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
63a0: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 46 74  s5DataRelease(Ft
63b0: 73 35 44 61 74 61 20 2a 70 44 61 74 61 29 7b 0a  s5Data *pData){.
63c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
63d0: 44 61 74 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  Data);.}..static
63e0: 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 50 72   int fts5IndexPr
63f0: 65 70 61 72 65 53 74 6d 74 28 0a 20 20 46 74 73  epareStmt(.  Fts
6400: 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 73 71 6c  5Index *p,.  sql
6410: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
6420: 6d 74 2c 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  mt,.  char *zSql
6430: 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  .){.  if( p->rc=
6440: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6450: 20 20 69 66 28 20 7a 53 71 6c 20 29 7b 0a 20 20    if( zSql ){.  
6460: 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
6470: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
6480: 2d 3e 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a  ->pConfig->db, z
6490: 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c  Sql, -1, ppStmt,
64a0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
64b0: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
64c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
64d0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
64e0: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 72 65  free(zSql);.  re
64f0: 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 0a  turn p->rc;.}...
6500: 2f 2a 0a 2a 2a 20 49 4e 53 45 52 54 20 4f 52 20  /*.** INSERT OR 
6510: 52 45 50 4c 41 43 45 20 61 20 72 65 63 6f 72 64  REPLACE a record
6520: 20 69 6e 74 6f 20 74 68 65 20 25 5f 64 61 74 61   into the %_data
6530: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
6540: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 57  c void fts5DataW
6550: 72 69 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a  rite(Fts5Index *
6560: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 2c 20 63  p, i64 iRowid, c
6570: 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20  onst u8 *pData, 
6580: 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 69 66  int nData){.  if
6590: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
65a0: 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  OK ) return;..  
65b0: 69 66 28 20 70 2d 3e 70 57 72 69 74 65 72 3d 3d  if( p->pWriter==
65c0: 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e  0 ){.    Fts5Con
65d0: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
65e0: 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66  ->pConfig;.    f
65f0: 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53  ts5IndexPrepareS
6600: 74 6d 74 28 70 2c 20 26 70 2d 3e 70 57 72 69 74  tmt(p, &p->pWrit
6610: 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  er, sqlite3_mpri
6620: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
6630: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27 25 71  REPLACE INTO '%q
6640: 27 2e 27 25 71 5f 64 61 74 61 27 28 69 64 2c 20  '.'%q_data'(id, 
6650: 62 6c 6f 63 6b 29 20 56 41 4c 55 45 53 28 3f 2c  block) VALUES(?,
6660: 3f 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ?)", .          
6670: 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43  pConfig->zDb, pC
6680: 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20  onfig->zName.   
6690: 20 29 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   ));.    if( p->
66a0: 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d  rc ) return;.  }
66b0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ..  sqlite3_bind
66c0: 5f 69 6e 74 36 34 28 70 2d 3e 70 57 72 69 74 65  _int64(p->pWrite
66d0: 72 2c 20 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20  r, 1, iRowid);. 
66e0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
66f0: 6f 62 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 32  ob(p->pWriter, 2
6700: 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20  , pData, nData, 
6710: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
6720: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
6730: 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 70 2d  ->pWriter);.  p-
6740: 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
6750: 73 65 74 28 70 2d 3e 70 57 72 69 74 65 72 29 3b  set(p->pWriter);
6760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
6770: 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
6780: 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44  SQL:.**.**     D
6790: 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64 61 74  ELETE FROM %_dat
67a0: 61 20 57 48 45 52 45 20 69 64 20 42 45 54 57 45  a WHERE id BETWE
67b0: 45 4e 20 24 69 46 69 72 73 74 20 41 4e 44 20 24  EN $iFirst AND $
67c0: 69 4c 61 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20  iLast.*/.static 
67d0: 76 6f 69 64 20 66 74 73 35 44 61 74 61 44 65 6c  void fts5DataDel
67e0: 65 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ete(Fts5Index *p
67f0: 2c 20 69 36 34 20 69 46 69 72 73 74 2c 20 69 36  , i64 iFirst, i6
6800: 34 20 69 4c 61 73 74 29 7b 0a 20 20 69 66 28 20  4 iLast){.  if( 
6810: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
6820: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
6830: 28 20 70 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30  ( p->pDeleter==0
6840: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
6850: 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a      Fts5Config *
6860: 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
6870: 6e 66 69 67 3b 0a 20 20 20 20 63 68 61 72 20 2a  nfig;.    char *
6880: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
6890: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
68a0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71  "DELETE FROM '%q
68b0: 27 2e 27 25 71 5f 64 61 74 61 27 20 57 48 45 52  '.'%q_data' WHER
68c0: 45 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64 3c 3d  E id>=? AND id<=
68d0: 3f 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  ?", .          p
68e0: 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f  Config->zDb, pCo
68f0: 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  nfig->zName.    
6900: 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  );.    if( zSql=
6910: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
6920: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
6930: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6940: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
6950: 70 61 72 65 5f 76 32 28 70 43 6f 6e 66 69 67 2d  pare_v2(pConfig-
6960: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
6970: 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 30 29 3b  p->pDeleter, 0);
6980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
6990: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ree(zSql);.    }
69a0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
69b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
69c0: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
69d0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
69e0: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62    }..  sqlite3_b
69f0: 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65  ind_int64(p->pDe
6a00: 6c 65 74 65 72 2c 20 31 2c 20 69 46 69 72 73 74  leter, 1, iFirst
6a10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
6a20: 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65 6c 65  d_int64(p->pDele
6a30: 74 65 72 2c 20 32 2c 20 69 4c 61 73 74 29 3b 0a  ter, 2, iLast);.
6a40: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
6a50: 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20 20 70  ->pDeleter);.  p
6a60: 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  ->rc = sqlite3_r
6a70: 65 73 65 74 28 70 2d 3e 70 44 65 6c 65 74 65 72  eset(p->pDeleter
6a80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  );.}../*.** Remo
6a90: 76 65 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 61  ve all records a
6aa0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73  ssociated with s
6ab0: 65 67 6d 65 6e 74 20 69 53 65 67 69 64 2e 0a 2a  egment iSegid..*
6ac0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
6ad0: 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65 67 6d  s5DataRemoveSegm
6ae0: 65 6e 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ent(Fts5Index *p
6af0: 2c 20 69 6e 74 20 69 53 65 67 69 64 29 7b 0a 20  , int iSegid){. 
6b00: 20 69 36 34 20 69 46 69 72 73 74 20 3d 20 46 54   i64 iFirst = FT
6b10: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
6b20: 28 69 53 65 67 69 64 2c 20 30 29 3b 0a 20 20 69  (iSegid, 0);.  i
6b30: 36 34 20 69 4c 61 73 74 20 3d 20 46 54 53 35 5f  64 iLast = FTS5_
6b40: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53  SEGMENT_ROWID(iS
6b50: 65 67 69 64 2b 31 2c 20 30 29 2d 31 3b 0a 20 20  egid+1, 0)-1;.  
6b60: 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28 70  fts5DataDelete(p
6b70: 2c 20 69 46 69 72 73 74 2c 20 69 4c 61 73 74 29  , iFirst, iLast)
6b80: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 78 44  ;.  if( p->pIdxD
6b90: 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20  eleter==0 ){.   
6ba0: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
6bb0: 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
6bc0: 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  g;.    fts5Index
6bd0: 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26  PrepareStmt(p, &
6be0: 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 2c 20  p->pIdxDeleter, 
6bf0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
6c00: 0a 20 20 20 20 20 20 20 20 20 20 22 44 45 4c 45  .          "DELE
6c10: 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71  TE FROM '%q'.'%q
6c20: 5f 69 64 78 27 20 57 48 45 52 45 20 73 65 67 69  _idx' WHERE segi
6c30: 64 3d 3f 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d=?",.          
6c40: 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43  pConfig->zDb, pC
6c50: 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20  onfig->zName.   
6c60: 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   ));.  }.  if( p
6c70: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
6c80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
6c90: 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 44  ind_int(p->pIdxD
6ca0: 65 6c 65 74 65 72 2c 20 31 2c 20 69 53 65 67 69  eleter, 1, iSegi
6cb0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
6cc0: 73 74 65 70 28 70 2d 3e 70 49 64 78 44 65 6c 65  step(p->pIdxDele
6cd0: 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20  ter);.    p->rc 
6ce0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
6cf0: 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 29 3b  p->pIdxDeleter);
6d00: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
6d10: 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63  lease a referenc
6d20: 65 20 74 6f 20 61 6e 20 46 74 73 35 53 74 72 75  e to an Fts5Stru
6d30: 63 74 75 72 65 20 6f 62 6a 65 63 74 20 72 65 74  cture object ret
6d40: 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  urned by an earl
6d50: 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  ier .** call to 
6d60: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
6d70: 64 28 29 20 6f 72 20 66 74 73 35 53 74 72 75 63  d() or fts5Struc
6d80: 74 75 72 65 44 65 63 6f 64 65 28 29 2e 0a 2a 2f  tureDecode()..*/
6d90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
6da0: 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
6db0: 65 28 46 74 73 35 53 74 72 75 63 74 75 72 65 20  e(Fts5Structure 
6dc0: 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28  *pStruct){.  if(
6dd0: 20 70 53 74 72 75 63 74 20 26 26 20 30 3e 3d 28   pStruct && 0>=(
6de0: 2d 2d 70 53 74 72 75 63 74 2d 3e 6e 52 65 66 29  --pStruct->nRef)
6df0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
6e00: 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75     assert( pStru
6e10: 63 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20  ct->nRef==0 );. 
6e20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
6e30: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
6e40: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
6e50: 65 33 5f 66 72 65 65 28 70 53 74 72 75 63 74 2d  e3_free(pStruct-
6e60: 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65 67 29  >aLevel[i].aSeg)
6e70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
6e80: 74 65 33 5f 66 72 65 65 28 70 53 74 72 75 63 74  te3_free(pStruct
6e90: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
6ea0: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
6eb0: 75 72 65 52 65 66 28 46 74 73 35 53 74 72 75 63  ureRef(Fts5Struc
6ec0: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
6ed0: 20 20 70 53 74 72 75 63 74 2d 3e 6e 52 65 66 2b    pStruct->nRef+
6ee0: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65  +;.}../*.** Dese
6ef0: 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75  rialize and retu
6f00: 72 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  rn the structure
6f10: 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e 74 6c   record currentl
6f20: 79 20 73 74 6f 72 65 64 20 69 6e 20 73 65 72 69  y stored in seri
6f30: 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72 6d 20 77  alized.** form w
6f40: 69 74 68 69 6e 20 62 75 66 66 65 72 20 70 44 61  ithin buffer pDa
6f50: 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a 2a 2a 20  ta/nData..**.** 
6f60: 54 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72  The Fts5Structur
6f70: 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65  e.aLevel[] and e
6f80: 61 63 68 20 46 74 73 35 53 74 72 75 63 74 75 72  ach Fts5Structur
6f90: 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72  eLevel.aSeg[] ar
6fa0: 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d  ray.** are over-
6fb0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 6f 6e 65  allocated by one
6fc0: 20 73 6c 6f 74 2e 20 54 68 69 73 20 61 6c 6c 6f   slot. This allo
6fd0: 77 73 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ws the structure
6fe0: 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 74 6f 20   contents.** to 
6ff0: 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79 20 65  be more easily e
7000: 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  dited..**.** If 
7010: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
7020: 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20 74   *ppOut is set t
7030: 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20 53 51  o NULL and an SQ
7040: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 0a  Lite error code.
7050: 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  ** returned. Oth
7060: 65 72 77 69 73 65 2c 20 2a 70 70 4f 75 74 20 69  erwise, *ppOut i
7070: 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
7080: 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  o the new object
7090: 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
70a0: 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
70b0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 74  tatic int fts5St
70c0: 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 0a 20  ructureDecode(. 
70d0: 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61   const u8 *pData
70e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
70f0: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
7100: 69 6e 69 6e 67 20 73 65 72 69 61 6c 69 7a 65 64  ining serialized
7110: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
7120: 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20  int nData,      
7130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7140: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
7150: 72 20 70 44 61 74 61 20 69 6e 20 62 79 74 65 73  r pData in bytes
7160: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6f   */.  int *piCoo
7170: 6b 69 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  kie,            
7180: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75        /* Configu
7190: 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 76 61  ration cookie va
71a0: 6c 75 65 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  lue */.  Fts5Str
71b0: 75 63 74 75 72 65 20 2a 2a 70 70 4f 75 74 20 20  ucture **ppOut  
71c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
71d0: 20 44 65 73 65 72 69 61 6c 69 7a 65 64 20 6f 62   Deserialized ob
71e0: 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ject */.){.  int
71f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7200: 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
7210: 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 69 6e 74 20  int iLvl;.  int 
7220: 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20 69 6e  nLevel = 0;.  in
7230: 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a  t nSegment = 0;.
7240: 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7260: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
7270: 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ace to allocate 
7280: 61 74 20 70 52 65 74 20 2a 2f 0a 20 20 46 74 73  at pRet */.  Fts
7290: 35 53 74 72 75 63 74 75 72 65 20 2a 70 52 65 74  5Structure *pRet
72a0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
72b0: 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  Structure object
72c0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20   to return */.. 
72d0: 20 2f 2a 20 47 72 61 62 20 74 68 65 20 63 6f 6f   /* Grab the coo
72e0: 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  kie value */.  i
72f0: 66 28 20 70 69 43 6f 6f 6b 69 65 20 29 20 2a 70  f( piCookie ) *p
7300: 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c 69 74 65  iCookie = sqlite
7310: 33 46 74 73 35 47 65 74 33 32 28 70 44 61 74 61  3Fts5Get32(pData
7320: 29 3b 0a 20 20 69 20 3d 20 34 3b 0a 0a 20 20 2f  );.  i = 4;..  /
7330: 2a 20 52 65 61 64 20 74 68 65 20 74 6f 74 61 6c  * Read the total
7340: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c   number of level
7350: 73 20 61 6e 64 20 73 65 67 6d 65 6e 74 73 20 66  s and segments f
7360: 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66  rom the start of
7370: 20 74 68 65 0a 20 20 2a 2a 20 73 74 72 75 63 74   the.  ** struct
7380: 75 72 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a  ure record.  */.
7390: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
73a0: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
73b0: 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20 20 69 20 2b  , nLevel);.  i +
73c0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
73d0: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 53 65  2(&pData[i], nSe
73e0: 67 6d 65 6e 74 29 3b 0a 20 20 6e 42 79 74 65 20  gment);.  nByte 
73f0: 3d 20 28 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  = (.      sizeof
7400: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29 20  (Fts5Structure) 
7410: 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
7420: 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72       /* Main str
7430: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20  ucture */.      
7440: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
7450: 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c  tureLevel) * (nL
7460: 65 76 65 6c 2d 31 29 20 20 20 20 2f 2a 20 61 4c  evel-1)    /* aL
7470: 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  evel[] array */.
7480: 20 20 29 3b 0a 20 20 70 52 65 74 20 3d 20 28 46    );.  pRet = (F
7490: 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 73 71  ts5Structure*)sq
74a0: 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
74b0: 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65 29 3b  ero(&rc, nByte);
74c0: 0a 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a  ..  if( pRet ){.
74d0: 20 20 20 20 70 52 65 74 2d 3e 6e 52 65 66 20 3d      pRet->nRef =
74e0: 20 31 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 4c   1;.    pRet->nL
74f0: 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b 0a 20  evel = nLevel;. 
7500: 20 20 20 70 52 65 74 2d 3e 6e 53 65 67 6d 65 6e     pRet->nSegmen
7510: 74 20 3d 20 6e 53 65 67 6d 65 6e 74 3b 0a 20 20  t = nSegment;.  
7520: 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74    i += sqlite3Ft
7530: 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61  s5GetVarint(&pDa
7540: 74 61 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e 57  ta[i], &pRet->nW
7550: 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20  riteCounter);.. 
7560: 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 72     for(iLvl=0; r
7570: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
7580: 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69 4c 76  iLvl<nLevel; iLv
7590: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  l++){.      Fts5
75a0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
75b0: 70 4c 76 6c 20 3d 20 26 70 52 65 74 2d 3e 61 4c  pLvl = &pRet->aL
75c0: 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
75d0: 20 20 69 6e 74 20 6e 54 6f 74 61 6c 20 3d 20 30    int nTotal = 0
75e0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67  ;.      int iSeg
75f0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d  ;..      if( i>=
7600: 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  nData ){.       
7610: 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
7620: 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
7630: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74  .        i += ft
7640: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
7650: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e  Data[i], pLvl->n
7660: 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 20 20  Merge);.        
7670: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
7680: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
7690: 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 20  nTotal);.       
76a0: 20 61 73 73 65 72 74 28 20 6e 54 6f 74 61 6c 3e   assert( nTotal>
76b0: 3d 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 3b  =pLvl->nMerge );
76c0: 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61  .        pLvl->a
76d0: 53 65 67 20 3d 20 28 46 74 73 35 53 74 72 75 63  Seg = (Fts5Struc
76e0: 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c  tureSegment*)sql
76f0: 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
7700: 72 6f 28 26 72 63 2c 20 0a 20 20 20 20 20 20 20  ro(&rc, .       
7710: 20 20 20 20 20 6e 54 6f 74 61 6c 20 2a 20 73 69       nTotal * si
7720: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7730: 72 65 53 65 67 6d 65 6e 74 29 0a 20 20 20 20 20  reSegment).     
7740: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20     );.      }.. 
7750: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
7760: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7770: 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e    pLvl->nSeg = n
7780: 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 66  Total;.        f
7790: 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
77a0: 6e 54 6f 74 61 6c 3b 20 69 53 65 67 2b 2b 29 7b  nTotal; iSeg++){
77b0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
77c0: 3e 3d 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20  >=nData ){.     
77d0: 20 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 35         rc = FTS5
77e0: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
77f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7800: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7810: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
7820: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
7830: 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  ], pLvl->aSeg[iS
7840: 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20  eg].iSegid);.   
7850: 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35         i += fts5
7860: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
7870: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65  ta[i], pLvl->aSe
7880: 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73  g[iSeg].pgnoFirs
7890: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  t);.          i 
78a0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
78b0: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c  32(&pData[i], pL
78c0: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70  vl->aSeg[iSeg].p
78d0: 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20  gnoLast);.      
78e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
78f0: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
7900: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
7910: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
7920: 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20  lease(pRet);.   
7930: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
7940: 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74   }.  }..  *ppOut
7950: 20 3d 20 70 52 65 74 3b 0a 20 20 72 65 74 75 72   = pRet;.  retur
7960: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  n rc;.}../*.**.*
7970: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
7980: 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65  s5StructureAddLe
7990: 76 65 6c 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  vel(int *pRc, Ft
79a0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
79b0: 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20 2a  Struct){.  if( *
79c0: 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
79d0: 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
79e0: 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a  ure *pStruct = *
79f0: 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20 69 6e  ppStruct;.    in
7a00: 74 20 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75  t nLevel = pStru
7a10: 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 20 20  ct->nLevel;.    
7a20: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 0a 20 20  int nByte = (.  
7a30: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
7a40: 35 53 74 72 75 63 74 75 72 65 29 20 2b 20 20 20  5Structure) +   
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7a60: 2a 20 4d 61 69 6e 20 73 74 72 75 63 74 75 72 65  * Main structure
7a70: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 69 7a 65   */.        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 20 2a 20 28 6e 4c 65 76 65 6c  Level) * (nLevel
7aa0: 2b 31 29 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d  +1)  /* aLevel[]
7ab0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 29 3b   array */.    );
7ac0: 0a 0a 20 20 20 20 70 53 74 72 75 63 74 20 3d 20  ..    pStruct = 
7ad0: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
7ae0: 70 53 74 72 75 63 74 2c 20 6e 42 79 74 65 29 3b  pStruct, nByte);
7af0: 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74  .    if( pStruct
7b00: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
7b10: 28 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  (&pStruct->aLeve
7b20: 6c 5b 6e 4c 65 76 65 6c 5d 2c 20 30 2c 20 73 69  l[nLevel], 0, si
7b30: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7b40: 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 20 20 20  reLevel));.     
7b50: 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
7b60: 2b 2b 3b 0a 20 20 20 20 20 20 2a 70 70 53 74 72  ++;.      *ppStr
7b70: 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 20  uct = pStruct;. 
7b80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7b90: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
7ba0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  MEM;.    }.  }.}
7bb0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 65 6e 64 20 6c  ../*.** Extend l
7bc0: 65 76 65 6c 20 69 4c 76 6c 20 73 6f 20 74 68 61  evel iLvl so tha
7bd0: 74 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20  t there is room 
7be0: 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 45 78  for at least nEx
7bf0: 74 72 61 20 6d 6f 72 65 0a 2a 2a 20 73 65 67 6d  tra more.** segm
7c00: 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ents..*/.static 
7c10: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
7c20: 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 0a 20  reExtendLevel(. 
7c30: 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 46 74   int *pRc, .  Ft
7c40: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
7c50: 72 75 63 74 2c 20 0a 20 20 69 6e 74 20 69 4c 76  ruct, .  int iLv
7c60: 6c 2c 20 0a 20 20 69 6e 74 20 6e 45 78 74 72 61  l, .  int nExtra
7c70: 2c 20 0a 20 20 69 6e 74 20 62 49 6e 73 65 72 74  , .  int bInsert
7c80: 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  .){.  if( *pRc==
7c90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7ca0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
7cb0: 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
7cc0: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
7cd0: 6c 5d 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75  l];.    Fts5Stru
7ce0: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 4e  ctureSegment *aN
7cf0: 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74  ew;.    int nByt
7d00: 65 3b 0a 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  e;..    nByte = 
7d10: 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2b 20 6e 45  (pLvl->nSeg + nE
7d20: 78 74 72 61 29 20 2a 20 73 69 7a 65 6f 66 28 46  xtra) * sizeof(F
7d30: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7d40: 65 6e 74 29 3b 0a 20 20 20 20 61 4e 65 77 20 3d  ent);.    aNew =
7d50: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
7d60: 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 6e 42 79  (pLvl->aSeg, nBy
7d70: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  te);.    if( aNe
7d80: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  w ){.      if( b
7d90: 49 6e 73 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20  Insert==0 ){.   
7da0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65       memset(&aNe
7db0: 77 5b 70 4c 76 6c 2d 3e 6e 53 65 67 5d 2c 20 30  w[pLvl->nSeg], 0
7dc0: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
7dd0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20 2a  uctureSegment) *
7de0: 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20   nExtra);.      
7df0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
7e00: 6e 74 20 6e 4d 6f 76 65 20 3d 20 70 4c 76 6c 2d  nt nMove = pLvl-
7e10: 3e 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46  >nSeg * sizeof(F
7e20: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7e30: 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ent);.        me
7e40: 6d 6d 6f 76 65 28 26 61 4e 65 77 5b 6e 45 78 74  mmove(&aNew[nExt
7e50: 72 61 5d 2c 20 61 4e 65 77 2c 20 6e 4d 6f 76 65  ra], aNew, nMove
7e60: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
7e70: 74 28 61 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(aNew, 0, sizeo
7e80: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
7e90: 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61  egment) * nExtra
7ea0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7eb0: 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 61 4e   pLvl->aSeg = aN
7ec0: 65 77 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ew;.    }else{. 
7ed0: 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
7ee0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
7ef0: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74    }.}..static Ft
7f00: 73 35 53 74 72 75 63 74 75 72 65 20 2a 66 74 73  s5Structure *fts
7f10: 35 53 74 72 75 63 74 75 72 65 52 65 61 64 55 6e  5StructureReadUn
7f20: 63 61 63 68 65 64 28 46 74 73 35 49 6e 64 65 78  cached(Fts5Index
7f30: 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75   *p){.  Fts5Stru
7f40: 63 74 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b  cture *pRet = 0;
7f50: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
7f60: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
7f70: 66 69 67 3b 0a 20 20 69 6e 74 20 69 43 6f 6f 6b  fig;.  int iCook
7f80: 69 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ie;             
7f90: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67         /* Config
7fa0: 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a  uration cookie *
7fb0: 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  /.  Fts5Data *pD
7fc0: 61 74 61 3b 0a 0a 20 20 70 44 61 74 61 20 3d 20  ata;..  pData = 
7fd0: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
7fe0: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
7ff0: 4f 57 49 44 29 3b 0a 20 20 69 66 28 20 70 2d 3e  OWID);.  if( p->
8000: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8010: 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 44 6f  .    /* TODO: Do
8020: 20 77 65 20 6e 65 65 64 20 74 68 69 73 20 69 66   we need this if
8030: 20 74 68 65 20 6c 65 61 66 2d 69 6e 64 65 78 20   the leaf-index 
8040: 69 73 20 61 70 70 65 6e 64 65 64 3f 20 50 72 6f  is appended? Pro
8050: 62 61 62 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20  bably... */.    
8060: 6d 65 6d 73 65 74 28 26 70 44 61 74 61 2d 3e 70  memset(&pData->p
8070: 5b 70 44 61 74 61 2d 3e 6e 6e 5d 2c 20 30 2c 20  [pData->nn], 0, 
8080: 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e  FTS5_DATA_PADDIN
8090: 47 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  G);.    p->rc = 
80a0: 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63  fts5StructureDec
80b0: 6f 64 65 28 70 44 61 74 61 2d 3e 70 2c 20 70 44  ode(pData->p, pD
80c0: 61 74 61 2d 3e 6e 6e 2c 20 26 69 43 6f 6f 6b 69  ata->nn, &iCooki
80d0: 65 2c 20 26 70 52 65 74 29 3b 0a 20 20 20 20 69  e, &pRet);.    i
80e0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
80f0: 5f 4f 4b 20 26 26 20 70 43 6f 6e 66 69 67 2d 3e  _OK && pConfig->
8100: 69 43 6f 6f 6b 69 65 21 3d 69 43 6f 6f 6b 69 65  iCookie!=iCookie
8110: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
8120: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e  = sqlite3Fts5Con
8130: 66 69 67 4c 6f 61 64 28 70 43 6f 6e 66 69 67 2c  figLoad(pConfig,
8140: 20 69 43 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 7d   iCookie);.    }
8150: 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
8160: 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20  ease(pData);.   
8170: 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
8180: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66  TE_OK ){.      f
8190: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
81a0: 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20  ase(pRet);.     
81b0: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d   pRet = 0;.    }
81c0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
81d0: 52 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  Ret;.}..static i
81e0: 36 34 20 66 74 73 35 49 6e 64 65 78 44 61 74 61  64 fts5IndexData
81f0: 56 65 72 73 69 6f 6e 28 46 74 73 35 49 6e 64 65  Version(Fts5Inde
8200: 78 20 2a 70 29 7b 0a 20 20 69 36 34 20 69 56 65  x *p){.  i64 iVe
8210: 72 73 69 6f 6e 20 3d 20 30 3b 0a 0a 20 20 69 66  rsion = 0;..  if
8220: 28 20 70 2d 3e 70 44 61 74 61 56 65 72 73 69 6f  ( p->pDataVersio
8230: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 72  n==0 ){.    p->r
8240: 63 20 3d 20 66 74 73 35 49 6e 64 65 78 50 72 65  c = fts5IndexPre
8250: 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e  pareStmt(p, &p->
8260: 70 44 61 74 61 56 65 72 73 69 6f 6e 2c 20 0a 20  pDataVersion, . 
8270: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
8280: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 25  printf("PRAGMA %
8290: 51 2e 64 61 74 61 5f 76 65 72 73 69 6f 6e 22 2c  Q.data_version",
82a0: 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 7a 44 62   p->pConfig->zDb
82b0: 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
82c0: 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 20   p->rc ) return 
82d0: 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 53 51  0;.  }..  if( SQ
82e0: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
82f0: 33 5f 73 74 65 70 28 70 2d 3e 70 44 61 74 61 56  3_step(p->pDataV
8300: 65 72 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20 69  ersion) ){.    i
8310: 56 65 72 73 69 6f 6e 20 3d 20 73 71 6c 69 74 65  Version = sqlite
8320: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
8330: 2d 3e 70 44 61 74 61 56 65 72 73 69 6f 6e 2c 20  ->pDataVersion, 
8340: 30 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63 20  0);.  }.  p->rc 
8350: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
8360: 70 2d 3e 70 44 61 74 61 56 65 72 73 69 6f 6e 29  p->pDataVersion)
8370: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 69 56 65 72  ;..  return iVer
8380: 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  sion;.}../*.** R
8390: 65 61 64 2c 20 64 65 73 65 72 69 61 6c 69 7a 65  ead, deserialize
83a0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
83b0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
83c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35  ..**.** The Fts5
83d0: 53 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c  Structure.aLevel
83e0: 5b 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73 35  [] and each Fts5
83f0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61  StructureLevel.a
8400: 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61  Seg[] array.** a
8410: 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65  re over-allocate
8420: 64 20 61 73 20 64 65 73 63 72 69 62 65 64 20 66  d as described f
8430: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35  or function fts5
8440: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
8450: 29 20 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a  ) .** above..**.
8460: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
8470: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
8480: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
8490: 72 72 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69  rror code left i
84a0: 6e 20 74 68 65 0a 2a 2a 20 46 74 73 35 49 6e 64  n the.** Fts5Ind
84b0: 65 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 61 6e  ex handle. If an
84c0: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
84d0: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
84e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
84f0: 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  * is called, it 
8500: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
8510: 74 61 74 69 63 20 46 74 73 35 53 74 72 75 63 74  tatic Fts5Struct
8520: 75 72 65 20 2a 66 74 73 35 53 74 72 75 63 74 75  ure *fts5Structu
8530: 72 65 52 65 61 64 28 46 74 73 35 49 6e 64 65 78  reRead(Fts5Index
8540: 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75   *p){.  Fts5Stru
8550: 63 74 75 72 65 20 2a 70 52 65 74 3b 20 20 20 20  cture *pRet;    
8560: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
8570: 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  t to return */..
8580: 20 20 69 66 28 20 70 2d 3e 70 53 74 72 75 63 74    if( p->pStruct
8590: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 70   ){.    pRet = p
85a0: 2d 3e 70 53 74 72 75 63 74 3b 0a 23 69 66 64 65  ->pStruct;.#ifde
85b0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
85c0: 20 20 20 7b 0a 20 20 20 20 20 20 46 74 73 35 53     {.      Fts5S
85d0: 74 72 75 63 74 75 72 65 20 2a 70 54 65 73 74 20  tructure *pTest 
85e0: 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
85f0: 65 61 64 55 6e 63 61 63 68 65 64 28 70 29 3b 0a  eadUncached(p);.
8600: 20 20 20 20 20 20 69 66 28 20 70 54 65 73 74 20        if( pTest 
8610: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
8620: 2c 20 6a 3b 0a 20 20 20 20 20 20 20 20 61 73 73  , j;.        ass
8630: 65 72 74 5f 6e 63 28 20 70 52 65 74 2d 3e 6e 53  ert_nc( pRet->nS
8640: 65 67 6d 65 6e 74 3d 3d 70 54 65 73 74 2d 3e 6e  egment==pTest->n
8650: 53 65 67 6d 65 6e 74 20 29 3b 0a 20 20 20 20 20  Segment );.     
8660: 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 52     assert_nc( pR
8670: 65 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54 65 73  et->nLevel==pTes
8680: 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20 20 20  t->nLevel );.   
8690: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
86a0: 70 54 65 73 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  pTest->nLevel; i
86b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ++){.          a
86c0: 73 73 65 72 74 5f 6e 63 28 20 70 52 65 74 2d 3e  ssert_nc( pRet->
86d0: 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65  aLevel[i].nMerge
86e0: 3d 3d 70 54 65 73 74 2d 3e 61 4c 65 76 65 6c 5b  ==pTest->aLevel[
86f0: 69 5d 2e 6e 4d 65 72 67 65 20 29 3b 0a 20 20 20  i].nMerge );.   
8700: 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63         assert_nc
8710: 28 20 70 52 65 74 2d 3e 61 4c 65 76 65 6c 5b 69  ( pRet->aLevel[i
8720: 5d 2e 6e 53 65 67 3d 3d 70 54 65 73 74 2d 3e 61  ].nSeg==pTest->a
8730: 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65 67 20 29 3b  Level[i].nSeg );
8740: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
8750: 3d 30 3b 20 6a 3c 70 54 65 73 74 2d 3e 61 4c 65  =0; j<pTest->aLe
8760: 76 65 6c 5b 69 5d 2e 6e 53 65 67 3b 20 6a 2b 2b  vel[i].nSeg; j++
8770: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 46  ){.            F
8780: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
8790: 65 6e 74 20 2a 70 31 20 3d 20 26 70 54 65 73 74  ent *p1 = &pTest
87a0: 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65 67  ->aLevel[i].aSeg
87b0: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [j];.           
87c0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
87d0: 67 6d 65 6e 74 20 2a 70 32 20 3d 20 26 70 52 65  gment *p2 = &pRe
87e0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65  t->aLevel[i].aSe
87f0: 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  g[j];.          
8800: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 31 2d    assert_nc( p1-
8810: 3e 69 53 65 67 69 64 3d 3d 70 32 2d 3e 69 53 65  >iSegid==p2->iSe
8820: 67 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  gid );.         
8830: 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 31     assert_nc( p1
8840: 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 70 32 2d  ->pgnoFirst==p2-
8850: 3e 70 67 6e 6f 46 69 72 73 74 20 29 3b 0a 20 20  >pgnoFirst );.  
8860: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
8870: 5f 6e 63 28 20 70 31 2d 3e 70 67 6e 6f 4c 61 73  _nc( p1->pgnoLas
8880: 74 3d 3d 70 32 2d 3e 70 67 6e 6f 4c 61 73 74 20  t==p2->pgnoLast 
8890: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
88a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
88b0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
88c0: 6c 65 61 73 65 28 70 54 65 73 74 29 3b 0a 20 20  lease(pTest);.  
88d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
88e0: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
88f0: 70 52 65 74 20 3d 20 66 74 73 35 53 74 72 75 63  pRet = fts5Struc
8900: 74 75 72 65 52 65 61 64 55 6e 63 61 63 68 65 64  tureReadUncached
8910: 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  (p);.  }..  if( 
8920: 70 52 65 74 20 29 7b 0a 20 20 20 20 66 74 73 35  pRet ){.    fts5
8930: 53 74 72 75 63 74 75 72 65 52 65 66 28 70 52 65  StructureRef(pRe
8940: 74 29 3b 0a 20 20 20 20 70 2d 3e 70 53 74 72 75  t);.    p->pStru
8950: 63 74 20 3d 20 70 52 65 74 3b 0a 20 20 20 20 70  ct = pRet;.    p
8960: 2d 3e 69 53 74 72 75 63 74 56 65 72 73 69 6f 6e  ->iStructVersion
8970: 20 3d 20 66 74 73 35 49 6e 64 65 78 44 61 74 61   = fts5IndexData
8980: 56 65 72 73 69 6f 6e 28 70 29 3b 0a 20 20 7d 0a  Version(p);.  }.
8990: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
89a0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
89b0: 73 35 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c  s5StructureInval
89c0: 69 64 61 74 65 28 46 74 73 35 49 6e 64 65 78 20  idate(Fts5Index 
89d0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 53  *p){.  if( p->pS
89e0: 74 72 75 63 74 20 29 7b 0a 20 20 20 20 66 74 73  truct ){.    fts
89f0: 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
8a00: 65 28 70 2d 3e 70 53 74 72 75 63 74 29 3b 0a 20  e(p->pStruct);. 
8a10: 20 20 20 70 2d 3e 70 53 74 72 75 63 74 20 3d 20     p->pStruct = 
8a20: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
8a30: 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
8a40: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
8a50: 6e 74 73 20 69 6e 20 69 6e 64 65 78 20 73 74 72  nts in index str
8a60: 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 20  ucture pStruct. 
8a70: 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
8a80: 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73   is only ever us
8a90: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
8aa0: 73 65 72 74 28 29 20 63 6f 6e 64 69 74 69 6f 6e  sert() condition
8ab0: 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  s..*/.#ifdef SQL
8ac0: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
8ad0: 20 69 6e 74 20 66 74 73 35 53 74 72 75 63 74 75   int fts5Structu
8ae0: 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
8af0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
8b00: 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 6e  Struct){.  int n
8b10: 53 65 67 6d 65 6e 74 20 3d 20 30 3b 20 20 20 20  Segment = 0;    
8b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
8b30: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  tal number of se
8b40: 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20  gments */.  if( 
8b50: 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69  pStruct ){.    i
8b60: 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20  nt iLvl;        
8b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8b80: 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
8b90: 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a  through levels *
8ba0: 2f 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30  /.    for(iLvl=0
8bb0: 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ; iLvl<pStruct->
8bc0: 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
8bd0: 0a 20 20 20 20 20 20 6e 53 65 67 6d 65 6e 74 20  .      nSegment 
8be0: 2b 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  += pStruct->aLev
8bf0: 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 20  el[iLvl].nSeg;. 
8c00: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
8c10: 72 6e 20 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a 23  rn nSegment;.}.#
8c20: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 66  endif..#define f
8c30: 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
8c40: 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70 42  endBlob(pBuf, pB
8c50: 6c 6f 62 2c 20 6e 42 6c 6f 62 29 20 7b 20 20 20  lob, nBlob) {   
8c60: 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20 28 70    \.  assert( (p
8c70: 42 75 66 29 2d 3e 6e 53 70 61 63 65 3e 3d 28 28  Buf)->nSpace>=((
8c80: 70 42 75 66 29 2d 3e 6e 2b 6e 42 6c 6f 62 29 20  pBuf)->n+nBlob) 
8c90: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  );             \
8ca0: 0a 20 20 6d 65 6d 63 70 79 28 26 28 70 42 75 66  .  memcpy(&(pBuf
8cb0: 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e 5d 2c  )->p[(pBuf)->n],
8cc0: 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 20   pBlob, nBlob); 
8cd0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
8ce0: 28 70 42 75 66 29 2d 3e 6e 20 2b 3d 20 6e 42 6c  (pBuf)->n += nBl
8cf0: 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ob;             
8d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d10: 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 64           \.}..#d
8d20: 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72  efine fts5Buffer
8d30: 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
8d40: 28 70 42 75 66 2c 20 69 56 61 6c 29 20 7b 20 20  (pBuf, iVal) {  
8d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
8d60: 20 20 28 70 42 75 66 29 2d 3e 6e 20 2b 3d 20 73    (pBuf)->n += s
8d70: 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72  qlite3Fts5PutVar
8d80: 69 6e 74 28 26 28 70 42 75 66 29 2d 3e 70 5b 28  int(&(pBuf)->p[(
8d90: 70 42 75 66 29 2d 3e 6e 5d 2c 20 28 69 56 61 6c  pBuf)->n], (iVal
8da0: 29 29 3b 20 20 5c 0a 20 20 61 73 73 65 72 74 28  ));  \.  assert(
8db0: 20 28 70 42 75 66 29 2d 3e 6e 53 70 61 63 65 3e   (pBuf)->nSpace>
8dc0: 3d 28 70 42 75 66 29 2d 3e 6e 20 29 3b 20 20 20  =(pBuf)->n );   
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8de0: 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f 2a 0a         \.}.../*.
8df0: 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 61 6e 64  ** Serialize and
8e00: 20 73 74 6f 72 65 20 74 68 65 20 22 73 74 72 75   store the "stru
8e10: 63 74 75 72 65 22 20 72 65 63 6f 72 64 2e 0a 2a  cture" record..*
8e20: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
8e30: 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
8e40: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20  n error code in 
8e50: 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f 62  the Fts5Index ob
8e60: 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20 65  ject. If an.** e
8e70: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
8e80: 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
8e90: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
8ea0: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
8eb0: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
8ec0: 65 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78  eWrite(Fts5Index
8ed0: 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74 75   *p, Fts5Structu
8ee0: 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20  re *pStruct){.  
8ef0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
8f00: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35  E_OK ){.    Fts5
8f10: 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20  Buffer buf;     
8f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
8f30: 66 65 72 20 74 6f 20 73 65 72 69 61 6c 69 7a 65  fer to serialize
8f40: 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a 2f 0a   record into */.
8f50: 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20      int iLvl;   
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f70: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
8f80: 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76  rate through lev
8f90: 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  els */.    int i
8fa0: 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20  Cookie;         
8fb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f 6b           /* Cook
8fc0: 69 65 20 76 61 6c 75 65 20 74 6f 20 73 74 6f 72  ie value to stor
8fd0: 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  e */..    assert
8fe0: 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ( pStruct->nSegm
8ff0: 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75  ent==fts5Structu
9000: 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
9010: 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20  pStruct) );.    
9020: 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20  memset(&buf, 0, 
9030: 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
9040: 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70  r));..    /* App
9050: 65 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  end the current 
9060: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f  configuration co
9070: 6f 6b 69 65 20 2a 2f 0a 20 20 20 20 69 43 6f 6f  okie */.    iCoo
9080: 6b 69 65 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  kie = p->pConfig
9090: 2d 3e 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 69  ->iCookie;.    i
90a0: 66 28 20 69 43 6f 6f 6b 69 65 3c 30 20 29 20 69  f( iCookie<0 ) i
90b0: 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 0a 20 20 20  Cookie = 0;..   
90c0: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 46   if( 0==sqlite3F
90d0: 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70  ts5BufferSize(&p
90e0: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 34 2b 39 2b  ->rc, &buf, 4+9+
90f0: 39 2b 39 29 20 29 7b 0a 20 20 20 20 20 20 73 71  9+9) ){.      sq
9100: 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28 62  lite3Fts5Put32(b
9110: 75 66 2e 70 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a  uf.p, iCookie);.
9120: 20 20 20 20 20 20 62 75 66 2e 6e 20 3d 20 34 3b        buf.n = 4;
9130: 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
9140: 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
9150: 74 28 26 62 75 66 2c 20 70 53 74 72 75 63 74 2d  t(&buf, pStruct-
9160: 3e 6e 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20  >nLevel);.      
9170: 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
9180: 70 65 6e 64 56 61 72 69 6e 74 28 26 62 75 66 2c  pendVarint(&buf,
9190: 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
91a0: 6e 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  nt);.      fts5B
91b0: 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
91c0: 61 72 69 6e 74 28 26 62 75 66 2c 20 28 69 36 34  arint(&buf, (i64
91d0: 29 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65  )pStruct->nWrite
91e0: 43 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20 7d 0a  Counter);.    }.
91f0: 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
9200: 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
9210: 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
9220: 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 3b 20        int iSeg; 
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9240: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
9250: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 73  terate through s
9260: 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  egments */.     
9270: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
9280: 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
9290: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
92a0: 6c 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  l];.      fts5Bu
92b0: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
92c0: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
92d0: 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20 20  Lvl->nMerge);.  
92e0: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
92f0: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
9300: 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e  c, &buf, pLvl->n
9310: 53 65 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Seg);.      asse
9320: 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  rt( pLvl->nMerge
9330: 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a  <=pLvl->nSeg );.
9340: 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d  .      for(iSeg=
9350: 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53  0; iSeg<pLvl->nS
9360: 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  eg; iSeg++){.   
9370: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
9380: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
9390: 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e  rc, &buf, pLvl->
93a0: 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69  aSeg[iSeg].iSegi
93b0: 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  d);.        fts5
93c0: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
93d0: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
93e0: 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67   pLvl->aSeg[iSeg
93f0: 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20  ].pgnoFirst);.  
9400: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
9410: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
9420: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
9430: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f  >aSeg[iSeg].pgno
9440: 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Last);.      }. 
9450: 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 44 61     }..    fts5Da
9460: 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f  taWrite(p, FTS5_
9470: 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 2c  STRUCTURE_ROWID,
9480: 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a   buf.p, buf.n);.
9490: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
94a0: 65 65 28 26 62 75 66 29 3b 0a 20 20 7d 0a 7d 0a  ee(&buf);.  }.}.
94b0: 0a 23 69 66 20 30 0a 73 74 61 74 69 63 20 76 6f  .#if 0.static vo
94c0: 69 64 20 66 74 73 35 44 65 62 75 67 53 74 72 75  id fts5DebugStru
94d0: 63 74 75 72 65 28 69 6e 74 2a 2c 46 74 73 35 42  cture(int*,Fts5B
94e0: 75 66 66 65 72 2a 2c 46 74 73 35 53 74 72 75 63  uffer*,Fts5Struc
94f0: 74 75 72 65 2a 29 3b 0a 73 74 61 74 69 63 20 76  ture*);.static v
9500: 6f 69 64 20 66 74 73 35 50 72 69 6e 74 53 74 72  oid fts5PrintStr
9510: 75 63 74 75 72 65 28 63 6f 6e 73 74 20 63 68 61  ucture(const cha
9520: 72 20 2a 7a 43 61 70 74 69 6f 6e 2c 20 46 74 73  r *zCaption, Fts
9530: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
9540: 75 63 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  uct){.  int rc =
9550: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74   SQLITE_OK;.  Ft
9560: 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20 20  s5Buffer buf;.  
9570: 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20  memset(&buf, 0, 
9580: 73 69 7a 65 6f 66 28 62 75 66 29 29 3b 0a 20 20  sizeof(buf));.  
9590: 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75  fts5DebugStructu
95a0: 72 65 28 26 72 63 2c 20 26 62 75 66 2c 20 70 53  re(&rc, &buf, pS
95b0: 74 72 75 63 74 29 3b 0a 20 20 66 70 72 69 6e 74  truct);.  fprint
95c0: 66 28 73 74 64 6f 75 74 2c 20 22 25 73 3a 20 25  f(stdout, "%s: %
95d0: 73 5c 6e 22 2c 20 7a 43 61 70 74 69 6f 6e 2c 20  s\n", zCaption, 
95e0: 62 75 66 2e 70 29 3b 0a 20 20 66 66 6c 75 73 68  buf.p);.  fflush
95f0: 28 73 74 64 6f 75 74 29 3b 0a 20 20 66 74 73 35  (stdout);.  fts5
9600: 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29  BufferFree(&buf)
9610: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
9620: 6e 65 20 66 74 73 35 50 72 69 6e 74 53 74 72 75  ne fts5PrintStru
9630: 63 74 75 72 65 28 78 2c 79 29 0a 23 65 6e 64 69  cture(x,y).#endi
9640: 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  f..static int ft
9650: 73 35 53 65 67 6d 65 6e 74 53 69 7a 65 28 46 74  s5SegmentSize(Ft
9660: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
9670: 6e 74 20 2a 70 53 65 67 29 7b 0a 20 20 72 65 74  nt *pSeg){.  ret
9680: 75 72 6e 20 31 20 2b 20 70 53 65 67 2d 3e 70 67  urn 1 + pSeg->pg
9690: 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e 70  noLast - pSeg->p
96a0: 67 6e 6f 46 69 72 73 74 3b 0a 7d 0a 0a 2f 2a 0a  gnoFirst;.}../*.
96b0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 63 6f 70 79  ** Return a copy
96c0: 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75 63 74   of index struct
96d0: 75 72 65 20 70 53 74 72 75 63 74 2e 20 45 78 63  ure pStruct. Exc
96e0: 65 70 74 2c 20 70 72 6f 6d 6f 74 65 20 61 73 20  ept, promote as 
96f0: 6d 61 6e 79 20 0a 2a 2a 20 73 65 67 6d 65 6e 74  many .** segment
9700: 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  s as possible to
9710: 20 6c 65 76 65 6c 20 69 50 72 6f 6d 6f 74 65 2e   level iPromote.
9720: 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72   If an OOM occur
9730: 73 2c 20 4e 55 4c 4c 20 69 73 20 0a 2a 2a 20 72  s, NULL is .** r
9740: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
9750: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
9760: 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 0a  cturePromoteTo(.
9770: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a    Fts5Index *p,.
9780: 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 2c 0a    int iPromote,.
9790: 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 2c    int szPromote,
97a0: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
97b0: 20 2a 70 53 74 72 75 63 74 0a 29 7b 0a 20 20 69   *pStruct.){.  i
97c0: 6e 74 20 69 6c 2c 20 69 73 3b 0a 20 20 46 74 73  nt il, is;.  Fts
97d0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
97e0: 2a 70 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74  *pOut = &pStruct
97f0: 2d 3e 61 4c 65 76 65 6c 5b 69 50 72 6f 6d 6f 74  ->aLevel[iPromot
9800: 65 5d 3b 0a 0a 20 20 69 66 28 20 70 4f 75 74 2d  e];..  if( pOut-
9810: 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20  >nMerge==0 ){.  
9820: 20 20 66 6f 72 28 69 6c 3d 69 50 72 6f 6d 6f 74    for(il=iPromot
9830: 65 2b 31 3b 20 69 6c 3c 70 53 74 72 75 63 74 2d  e+1; il<pStruct-
9840: 3e 6e 4c 65 76 65 6c 3b 20 69 6c 2b 2b 29 7b 0a  >nLevel; il++){.
9850: 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
9860: 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
9870: 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
9880: 6c 5b 69 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28  l[il];.      if(
9890: 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 20   pLvl->nMerge ) 
98a0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 66 6f  return;.      fo
98b0: 72 28 69 73 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d  r(is=pLvl->nSeg-
98c0: 31 3b 20 69 73 3e 3d 30 3b 20 69 73 2d 2d 29 7b  1; is>=0; is--){
98d0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20  .        int sz 
98e0: 3d 20 66 74 73 35 53 65 67 6d 65 6e 74 53 69 7a  = fts5SegmentSiz
98f0: 65 28 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73  e(&pLvl->aSeg[is
9900: 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
9910: 73 7a 3e 73 7a 50 72 6f 6d 6f 74 65 20 29 20 72  sz>szPromote ) r
9920: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 66  eturn;.        f
9930: 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65  ts5StructureExte
9940: 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20  ndLevel(&p->rc, 
9950: 70 53 74 72 75 63 74 2c 20 69 50 72 6f 6d 6f 74  pStruct, iPromot
9960: 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  e, 1, 1);.      
9970: 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
9980: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 6d 65  turn;.        me
9990: 6d 63 70 79 28 70 4f 75 74 2d 3e 61 53 65 67 2c  mcpy(pOut->aSeg,
99a0: 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d   &pLvl->aSeg[is]
99b0: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
99c0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 29 3b  uctureSegment));
99d0: 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 6e  .        pOut->n
99e0: 53 65 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  Seg++;.        p
99f0: 4c 76 6c 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20  Lvl->nSeg--;.   
9a00: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
9a10: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 65 77 20 73 65  ../*.** A new se
9a20: 67 6d 65 6e 74 20 68 61 73 20 6a 75 73 74 20 62  gment has just b
9a30: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6c  een written to l
9a40: 65 76 65 6c 20 69 4c 76 6c 20 6f 66 20 69 6e 64  evel iLvl of ind
9a50: 65 78 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ex structure.** 
9a60: 70 53 74 72 75 63 74 2e 20 54 68 69 73 20 66 75  pStruct. This fu
9a70: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
9a80: 73 20 69 66 20 61 6e 79 20 73 65 67 6d 65 6e 74  s if any segment
9a90: 73 20 73 68 6f 75 6c 64 20 62 65 20 70 72 6f 6d  s should be prom
9aa0: 6f 74 65 64 0a 2a 2a 20 61 73 20 61 20 72 65 73  oted.** as a res
9ab0: 75 6c 74 2e 20 53 65 67 6d 65 6e 74 73 20 61 72  ult. Segments ar
9ac0: 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e 20 74 77  e promoted in tw
9ad0: 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a  o scenarios:.**.
9ae0: 2a 2a 20 20 20 61 29 20 49 66 20 74 68 65 20 73  **   a) If the s
9af0: 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74  egment just writ
9b00: 74 65 6e 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ten is smaller t
9b10: 68 61 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  han one or more 
9b20: 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20  segments.**     
9b30: 20 77 69 74 68 69 6e 20 74 68 65 20 70 72 65 76   within the prev
9b40: 69 6f 75 73 20 70 6f 70 75 6c 61 74 65 64 20 6c  ious populated l
9b50: 65 76 65 6c 2c 20 69 74 20 69 73 20 70 72 6f 6d  evel, it is prom
9b60: 6f 74 65 64 20 74 6f 20 74 68 65 20 70 72 65 76  oted to the prev
9b70: 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20 70 6f 70  ious.**      pop
9b80: 75 6c 61 74 65 64 20 6c 65 76 65 6c 2e 0a 2a 2a  ulated level..**
9b90: 0a 2a 2a 20 20 20 62 29 20 49 66 20 74 68 65 20  .**   b) If the 
9ba0: 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69  segment just wri
9bb0: 74 74 65 6e 20 69 73 20 6c 61 72 67 65 72 20 74  tten is larger t
9bc0: 68 61 6e 20 74 68 65 20 6e 65 77 65 73 74 20 73  han the newest s
9bd0: 65 67 6d 65 6e 74 20 6f 6e 0a 2a 2a 20 20 20 20  egment on.**    
9be0: 20 20 74 68 65 20 6e 65 78 74 20 70 6f 70 75 6c    the next popul
9bf0: 61 74 65 64 20 6c 65 76 65 6c 2c 20 74 68 65 6e  ated level, then
9c00: 20 74 68 61 74 20 73 65 67 6d 65 6e 74 2c 20 61   that segment, a
9c10: 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 61 64 6a  nd any other adj
9c20: 61 63 65 6e 74 0a 2a 2a 20 20 20 20 20 20 73 65  acent.**      se
9c30: 67 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65 20  gments that are 
9c40: 61 6c 73 6f 20 73 6d 61 6c 6c 65 72 20 74 68 61  also smaller tha
9c50: 6e 20 74 68 65 20 6f 6e 65 20 6a 75 73 74 20 77  n the one just w
9c60: 72 69 74 74 65 6e 2c 20 61 72 65 20 0a 2a 2a 20  ritten, are .** 
9c70: 20 20 20 20 20 70 72 6f 6d 6f 74 65 64 2e 20 0a       promoted. .
9c80: 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 6f 72 20  **.** If one or 
9c90: 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 20 61 72  more segments ar
9ca0: 65 20 70 72 6f 6d 6f 74 65 64 2c 20 74 68 65 20  e promoted, the 
9cb0: 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  structure object
9cc0: 20 69 73 20 75 70 64 61 74 65 64 0a 2a 2a 20 74   is updated.** t
9cd0: 6f 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a  o reflect this..
9ce0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
9cf0: 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d  ts5StructureProm
9d00: 6f 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ote(.  Fts5Index
9d10: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
9d20: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
9d30: 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
9d40: 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20  .  int iLvl,    
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d60: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6c 65 76 65     /* Index leve
9d70: 6c 20 6a 75 73 74 20 75 70 64 61 74 65 64 20 2a  l just updated *
9d80: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
9d90: 65 20 2a 70 53 74 72 75 63 74 20 20 20 20 20 20  e *pStruct      
9da0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72      /* Index str
9db0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  ucture */.){.  i
9dc0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
9dd0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  _OK ){.    int i
9de0: 54 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 50 72  Tst;.    int iPr
9df0: 6f 6d 6f 74 65 20 3d 20 2d 31 3b 0a 20 20 20 20  omote = -1;.    
9e00: 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20  int szPromote = 
9e10: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
9e20: 20 50 72 6f 6d 6f 74 65 20 61 6e 79 74 68 69 6e   Promote anythin
9e30: 67 20 74 68 69 73 20 73 69 7a 65 20 6f 72 20 73  g this size or s
9e40: 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 46 74  maller */.    Ft
9e50: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
9e60: 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a 20 53  nt *pSeg;   /* S
9e70: 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74  egment just writ
9e80: 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ten */.    int s
9e90: 7a 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  zSeg;           
9ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
9eb0: 20 6f 66 20 73 65 67 6d 65 6e 74 20 6a 75 73 74   of segment just
9ec0: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20   written */.    
9ed0: 69 6e 74 20 6e 53 65 67 20 3d 20 70 53 74 72 75  int nSeg = pStru
9ee0: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
9ef0: 2e 6e 53 65 67 3b 0a 0a 20 20 20 20 69 66 28 20  .nSeg;..    if( 
9f00: 6e 53 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  nSeg==0 ) return
9f10: 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 53  ;.    pSeg = &pS
9f20: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
9f30: 76 6c 5d 2e 61 53 65 67 5b 70 53 74 72 75 63 74  vl].aSeg[pStruct
9f40: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
9f50: 53 65 67 2d 31 5d 3b 0a 20 20 20 20 73 7a 53 65  Seg-1];.    szSe
9f60: 67 20 3d 20 28 31 20 2b 20 70 53 65 67 2d 3e 70  g = (1 + pSeg->p
9f70: 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e  gnoLast - pSeg->
9f80: 70 67 6e 6f 46 69 72 73 74 29 3b 0a 0a 20 20 20  pgnoFirst);..   
9f90: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f   /* Check for co
9fa0: 6e 64 69 74 69 6f 6e 20 28 61 29 20 2a 2f 0a 20  ndition (a) */. 
9fb0: 20 20 20 66 6f 72 28 69 54 73 74 3d 69 4c 76 6c     for(iTst=iLvl
9fc0: 2d 31 3b 20 69 54 73 74 3e 3d 30 20 26 26 20 70  -1; iTst>=0 && p
9fd0: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
9fe0: 54 73 74 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69 54  Tst].nSeg==0; iT
9ff0: 73 74 2d 2d 29 3b 0a 20 20 20 20 69 66 28 20 69  st--);.    if( i
a000: 54 73 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tst>=0 ){.      
a010: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74  int i;.      int
a020: 20 73 7a 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20   szMax = 0;.    
a030: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
a040: 65 76 65 6c 20 2a 70 54 73 74 20 3d 20 26 70 53  evel *pTst = &pS
a050: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54  truct->aLevel[iT
a060: 73 74 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  st];.      asser
a070: 74 28 20 70 54 73 74 2d 3e 6e 4d 65 72 67 65 3d  t( pTst->nMerge=
a080: 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  =0 );.      for(
a090: 69 3d 30 3b 20 69 3c 70 54 73 74 2d 3e 6e 53 65  i=0; i<pTst->nSe
a0a0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
a0b0: 20 69 6e 74 20 73 7a 20 3d 20 70 54 73 74 2d 3e   int sz = pTst->
a0c0: 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 4c 61 73 74  aSeg[i].pgnoLast
a0d0: 20 2d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d   - pTst->aSeg[i]
a0e0: 2e 70 67 6e 6f 46 69 72 73 74 20 2b 20 31 3b 0a  .pgnoFirst + 1;.
a0f0: 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e 73          if( sz>s
a100: 7a 4d 61 78 20 29 20 73 7a 4d 61 78 20 3d 20 73  zMax ) szMax = s
a110: 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  z;.      }.     
a120: 20 69 66 28 20 73 7a 4d 61 78 3e 3d 73 7a 53 65   if( szMax>=szSe
a130: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  g ){.        /* 
a140: 43 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69 73  Condition (a) is
a150: 20 74 72 75 65 2e 20 50 72 6f 6d 6f 74 65 20 74   true. Promote t
a160: 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65 6e  he newest segmen
a170: 74 20 6f 6e 20 6c 65 76 65 6c 20 0a 20 20 20 20  t on level .    
a180: 20 20 20 20 2a 2a 20 69 4c 76 6c 20 74 6f 20 6c      ** iLvl to l
a190: 65 76 65 6c 20 69 54 73 74 2e 20 20 2a 2f 0a 20  evel iTst.  */. 
a1a0: 20 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20         iPromote 
a1b0: 3d 20 69 54 73 74 3b 0a 20 20 20 20 20 20 20 20  = iTst;.        
a1c0: 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 4d 61  szPromote = szMa
a1d0: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
a1e0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6e 64  ..    /* If cond
a1f0: 69 74 69 6f 6e 20 28 61 29 20 69 73 20 6e 6f 74  ition (a) is not
a200: 20 6d 65 74 2c 20 61 73 73 75 6d 65 20 28 62 29   met, assume (b)
a210: 20 69 73 20 74 72 75 65 2e 20 53 74 72 75 63 74   is true. Struct
a220: 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 29 0a 20  urePromoteTo(). 
a230: 20 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70     ** is a no-op
a240: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20 20   if it is not.  
a250: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 72 6f 6d  */.    if( iProm
a260: 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  ote<0 ){.      i
a270: 50 72 6f 6d 6f 74 65 20 3d 20 69 4c 76 6c 3b 0a  Promote = iLvl;.
a280: 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20        szPromote 
a290: 3d 20 73 7a 53 65 67 3b 0a 20 20 20 20 7d 0a 20  = szSeg;.    }. 
a2a0: 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
a2b0: 50 72 6f 6d 6f 74 65 54 6f 28 70 2c 20 69 50 72  PromoteTo(p, iPr
a2c0: 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f 6d 6f 74 65  omote, szPromote
a2d0: 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a  , pStruct);.  }.
a2e0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  }.../*.** Advanc
a2f0: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  e the iterator p
a300: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
a310: 79 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 74  y argument. If t
a320: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 2a  he end of the .*
a330: 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  * doclist-index 
a340: 70 61 67 65 20 69 73 20 72 65 61 63 68 65 64 2c  page is reached,
a350: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
a360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a370: 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74  fts5DlidxLvlNext
a380: 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70  (Fts5DlidxLvl *p
a390: 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 61 74 61  Lvl){.  Fts5Data
a3a0: 20 2a 70 44 61 74 61 20 3d 20 70 4c 76 6c 2d 3e   *pData = pLvl->
a3b0: 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 70 4c  pData;..  if( pL
a3c0: 76 6c 2d 3e 69 4f 66 66 3d 3d 30 20 29 7b 0a 20  vl->iOff==0 ){. 
a3d0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d     assert( pLvl-
a3e0: 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 20 20  >bEof==0 );.    
a3f0: 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 31 3b 0a  pLvl->iOff = 1;.
a400: 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b      pLvl->iOff +
a410: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
a420: 32 28 26 70 44 61 74 61 2d 3e 70 5b 31 5d 2c 20  2(&pData->p[1], 
a430: 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29  pLvl->iLeafPgno)
a440: 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66  ;.    pLvl->iOff
a450: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
a460: 74 28 26 70 44 61 74 61 2d 3e 70 5b 70 4c 76 6c  t(&pData->p[pLvl
a470: 2d 3e 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  ->iOff], (u64*)&
a480: 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  pLvl->iRowid);. 
a490: 20 20 20 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f     pLvl->iFirstO
a4a0: 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b  ff = pLvl->iOff;
a4b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
a4c0: 74 20 69 4f 66 66 3b 0a 20 20 20 20 66 6f 72 28  t iOff;.    for(
a4d0: 69 4f 66 66 3d 70 4c 76 6c 2d 3e 69 4f 66 66 3b  iOff=pLvl->iOff;
a4e0: 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 6e 3b   iOff<pData->nn;
a4f0: 20 69 4f 66 66 2b 2b 29 7b 0a 20 20 20 20 20 20   iOff++){.      
a500: 69 66 28 20 70 44 61 74 61 2d 3e 70 5b 69 4f 66  if( pData->p[iOf
a510: 66 5d 20 29 20 62 72 65 61 6b 3b 20 0a 20 20 20  f] ) break; .   
a520: 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66   }..    if( iOff
a530: 3c 70 44 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20 20  <pData->nn ){.  
a540: 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20      i64 iVal;.  
a550: 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50      pLvl->iLeafP
a560: 67 6e 6f 20 2b 3d 20 28 69 4f 66 66 20 2d 20 70  gno += (iOff - p
a570: 4c 76 6c 2d 3e 69 4f 66 66 29 20 2b 20 31 3b 0a  Lvl->iOff) + 1;.
a580: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
a590: 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61  s5GetVarint(&pDa
a5a0: 74 61 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  ta->p[iOff], (u6
a5b0: 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 20  4*)&iVal);.     
a5c0: 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20 2b 3d   pLvl->iRowid +=
a5d0: 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76   iVal;.      pLv
a5e0: 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66 3b 0a  l->iOff = iOff;.
a5f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a600: 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b   pLvl->bEof = 1;
a610: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
a620: 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b  turn pLvl->bEof;
a630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
a640: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  e the iterator p
a650: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
a660: 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  y argument..*/.s
a670: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
a680: 69 64 78 49 74 65 72 4e 65 78 74 52 28 46 74 73  idxIterNextR(Fts
a690: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44  5Index *p, Fts5D
a6a0: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 2c  lidxIter *pIter,
a6b0: 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20 20 46 74   int iLvl){.  Ft
a6c0: 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c  s5DlidxLvl *pLvl
a6d0: 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b   = &pIter->aLvl[
a6e0: 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74  iLvl];..  assert
a6f0: 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c  ( iLvl<pIter->nL
a700: 76 6c 20 29 3b 0a 20 20 69 66 28 20 66 74 73 35  vl );.  if( fts5
a710: 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76  DlidxLvlNext(pLv
a720: 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 69  l) ){.    if( (i
a730: 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65 72 2d 3e  Lvl+1) < pIter->
a740: 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20 20 66 74  nLvl ){.      ft
a750: 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52  s5DlidxIterNextR
a760: 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 76 6c 2b  (p, pIter, iLvl+
a770: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  1);.      if( pL
a780: 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b  vl[1].bEof==0 ){
a790: 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
a7a0: 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70  aRelease(pLvl->p
a7b0: 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 6d  Data);.        m
a7c0: 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73  emset(pLvl, 0, s
a7d0: 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c  izeof(Fts5DlidxL
a7e0: 76 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  vl));.        pL
a7f0: 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35  vl->pData = fts5
a800: 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20  DataRead(p, .   
a810: 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c           FTS5_DL
a820: 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65 72 2d  IDX_ROWID(pIter-
a830: 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c 2c 20 70  >iSegid, iLvl, p
a840: 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50 67 6e 6f  Lvl[1].iLeafPgno
a850: 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
a860: 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70       if( pLvl->p
a870: 44 61 74 61 20 29 20 66 74 73 35 44 6c 69 64 78  Data ) fts5Dlidx
a880: 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3b 0a 20  LvlNext(pLvl);. 
a890: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a8a0: 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  ..  return pIter
a8b0: 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a  ->aLvl[0].bEof;.
a8c0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  }.static int fts
a8d0: 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 46  5DlidxIterNext(F
a8e0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
a8f0: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
a900: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  r){.  return fts
a910: 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52 28  5DlidxIterNextR(
a920: 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 7d 0a  p, pIter, 0);.}.
a930: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61  ./*.** The itera
a940: 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
a950: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
a960: 20 68 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69   has the followi
a970: 6e 67 20 66 69 65 6c 64 73 20 73 65 74 0a 2a 2a  ng fields set.**
a980: 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20 54 68 69   as follows. Thi
a990: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
a9a0: 75 70 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  up the rest of t
a9b0: 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74  he iterator so t
a9c0: 68 61 74 20 69 74 0a 2a 2a 20 70 6f 69 6e 74 73  hat it.** points
a9d0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f   to the first ro
a9e0: 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69  wid in the docli
a9f0: 73 74 2d 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  st-index..**.** 
aa00: 20 20 70 44 61 74 61 3a 0a 2a 2a 20 20 20 20 20    pData:.**     
aa10: 70 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69  pointer to docli
aa20: 73 74 2d 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  st-index record,
aa30: 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69   .**.** When thi
aa40: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
aa50: 6c 6c 65 64 20 70 49 74 65 72 2d 3e 69 4c 65 61  lled pIter->iLea
aa60: 66 50 67 6e 6f 20 69 73 20 74 68 65 20 70 61 67  fPgno is the pag
aa70: 65 20 6e 75 6d 62 65 72 20 74 68 65 0a 2a 2a 20  e number the.** 
aa80: 64 6f 63 6c 69 73 74 20 69 73 20 61 73 73 6f 63  doclist is assoc
aa90: 69 61 74 65 64 20 77 69 74 68 20 28 74 68 65 20  iated with (the 
aaa0: 6f 6e 65 20 66 65 61 74 75 72 69 6e 67 20 74 68  one featuring th
aab0: 65 20 74 65 72 6d 29 2e 0a 2a 2f 0a 73 74 61 74  e term)..*/.stat
aac0: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
aad0: 49 74 65 72 46 69 72 73 74 28 46 74 73 35 44 6c  IterFirst(Fts5Dl
aae0: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
aaf0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
ab00: 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c  i=0; i<pIter->nL
ab10: 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 74  vl; i++){.    ft
ab20: 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26  s5DlidxLvlNext(&
ab30: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 29 3b  pIter->aLvl[i]);
ab40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
ab50: 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f  ter->aLvl[0].bEo
ab60: 66 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69 6e  f;.}...static in
ab70: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45  t fts5DlidxIterE
ab80: 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  of(Fts5Index *p,
ab90: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
aba0: 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
abb0: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
abc0: 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 61 4c 76 6c  K || pIter->aLvl
abd0: 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61  [0].bEof;.}..sta
abe0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69  tic void fts5Dli
abf0: 64 78 49 74 65 72 4c 61 73 74 28 46 74 73 35 49  dxIterLast(Fts5I
ac00: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69  ndex *p, Fts5Dli
ac10: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
ac20: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41    int i;..  /* A
ac30: 64 76 61 6e 63 65 20 65 61 63 68 20 6c 65 76 65  dvance each leve
ac40: 6c 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  l to the last en
ac50: 74 72 79 20 6f 6e 20 74 68 65 20 6c 61 73 74 20  try on the last 
ac60: 70 61 67 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  page */.  for(i=
ac70: 70 49 74 65 72 2d 3e 6e 4c 76 6c 2d 31 3b 20 70  pIter->nLvl-1; p
ac80: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
ac90: 26 26 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  && i>=0; i--){. 
aca0: 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20     Fts5DlidxLvl 
acb0: 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e  *pLvl = &pIter->
acc0: 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 77 68 69  aLvl[i];.    whi
acd0: 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  le( fts5DlidxLvl
ace0: 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20 29 3b  Next(pLvl)==0 );
acf0: 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20  .    pLvl->bEof 
ad00: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 3e  = 0;..    if( i>
ad10: 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 44  0 ){.      Fts5D
ad20: 6c 69 64 78 4c 76 6c 20 2a 70 43 68 69 6c 64 20  lidxLvl *pChild 
ad30: 3d 20 26 70 4c 76 6c 5b 2d 31 5d 3b 0a 20 20 20  = &pLvl[-1];.   
ad40: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
ad50: 73 65 28 70 43 68 69 6c 64 2d 3e 70 44 61 74 61  se(pChild->pData
ad60: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
ad70: 70 43 68 69 6c 64 2c 20 30 2c 20 73 69 7a 65 6f  pChild, 0, sizeo
ad80: 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29  f(Fts5DlidxLvl))
ad90: 3b 0a 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e  ;.      pChild->
ada0: 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61  pData = fts5Data
adb0: 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20  Read(p, .       
adc0: 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f     FTS5_DLIDX_RO
add0: 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67 69  WID(pIter->iSegi
ade0: 64 2c 20 69 2d 31 2c 20 70 4c 76 6c 2d 3e 69 4c  d, i-1, pLvl->iL
adf0: 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20 29  eafPgno).      )
ae00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
ae10: 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74  *.** Move the it
ae20: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
ae30: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
ae40: 6e 74 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  nt to the previo
ae50: 75 73 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61  us entry..*/.sta
ae60: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
ae70: 78 4c 76 6c 50 72 65 76 28 46 74 73 35 44 6c 69  xLvlPrev(Fts5Dli
ae80: 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20  dxLvl *pLvl){.  
ae90: 69 6e 74 20 69 4f 66 66 20 3d 20 70 4c 76 6c 2d  int iOff = pLvl-
aea0: 3e 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72 74  >iOff;..  assert
aeb0: 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20  ( pLvl->bEof==0 
aec0: 29 3b 0a 20 20 69 66 28 20 69 4f 66 66 3c 3d 70  );.  if( iOff<=p
aed0: 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 29  Lvl->iFirstOff )
aee0: 7b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66  {.    pLvl->bEof
aef0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
af00: 20 20 20 75 38 20 2a 61 20 3d 20 70 4c 76 6c 2d     u8 *a = pLvl-
af10: 3e 70 44 61 74 61 2d 3e 70 3b 0a 20 20 20 20 69  >pData->p;.    i
af20: 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 6e 74  64 iVal;.    int
af30: 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 6e 74   iLimit;.    int
af40: 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 5a 65   ii;.    int nZe
af50: 72 6f 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  ro = 0;..    /* 
af60: 43 75 72 72 65 6e 74 6c 79 20 69 4f 66 66 20 70  Currently iOff p
af70: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
af80: 73 74 20 62 79 74 65 20 6f 66 20 61 20 76 61 72  st byte of a var
af90: 69 6e 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  int. This block 
afa0: 0a 20 20 20 20 2a 2a 20 64 65 63 72 65 6d 65 6e  .    ** decremen
afb0: 74 73 20 69 4f 66 66 20 75 6e 74 69 6c 20 69 74  ts iOff until it
afc0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
afd0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
afe0: 20 70 72 65 76 69 6f 75 73 20 0a 20 20 20 20 2a   previous .    *
aff0: 2a 20 76 61 72 69 6e 74 2e 20 54 61 6b 69 6e 67  * varint. Taking
b000: 20 63 61 72 65 20 6e 6f 74 20 74 6f 20 72 65 61   care not to rea
b010: 64 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6c 6f 63  d any memory loc
b020: 61 74 69 6f 6e 73 20 74 68 61 74 20 6f 63 63 75  ations that occu
b030: 72 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  r.    ** before 
b040: 74 68 65 20 62 75 66 66 65 72 20 69 6e 20 6d 65  the buffer in me
b050: 6d 6f 72 79 2e 20 20 2a 2f 0a 20 20 20 20 69 4c  mory.  */.    iL
b060: 69 6d 69 74 20 3d 20 28 69 4f 66 66 3e 39 20 3f  imit = (iOff>9 ?
b070: 20 69 4f 66 66 2d 39 20 3a 20 30 29 3b 0a 20 20   iOff-9 : 0);.  
b080: 20 20 66 6f 72 28 69 4f 66 66 2d 2d 3b 20 69 4f    for(iOff--; iO
b090: 66 66 3e 69 4c 69 6d 69 74 3b 20 69 4f 66 66 2d  ff>iLimit; iOff-
b0a0: 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61  -){.      if( (a
b0b0: 5b 69 4f 66 66 2d 31 5d 20 26 20 30 78 38 30 29  [iOff-1] & 0x80)
b0c0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
b0d0: 20 7d 0a 0a 20 20 20 20 66 74 73 35 47 65 74 56   }..    fts5GetV
b0e0: 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20  arint(&a[iOff], 
b0f0: 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20  (u64*)&iVal);.  
b100: 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20 2d    pLvl->iRowid -
b110: 3d 20 69 56 61 6c 3b 0a 20 20 20 20 70 4c 76 6c  = iVal;.    pLvl
b120: 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a  ->iLeafPgno--;..
b130: 20 20 20 20 2f 2a 20 53 6b 69 70 20 62 61 63 6b      /* Skip back
b140: 77 61 72 64 73 20 70 61 73 74 20 61 6e 79 20 30  wards past any 0
b150: 78 30 30 20 76 61 72 69 6e 74 73 2e 20 2a 2f 0a  x00 varints. */.
b160: 20 20 20 20 66 6f 72 28 69 69 3d 69 4f 66 66 2d      for(ii=iOff-
b170: 31 3b 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69  1; ii>=pLvl->iFi
b180: 72 73 74 4f 66 66 20 26 26 20 61 5b 69 69 5d 3d  rstOff && a[ii]=
b190: 3d 30 78 30 30 3b 20 69 69 2d 2d 29 7b 0a 20 20  =0x00; ii--){.  
b1a0: 20 20 20 20 6e 5a 65 72 6f 2b 2b 3b 0a 20 20 20      nZero++;.   
b1b0: 20 7d 0a 20 20 20 20 69 66 28 20 69 69 3e 3d 70   }.    if( ii>=p
b1c0: 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 26  Lvl->iFirstOff &
b1d0: 26 20 28 61 5b 69 69 5d 20 26 20 30 78 38 30 29  & (a[ii] & 0x80)
b1e0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
b1f0: 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65 6c   byte immediatel
b200: 79 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61 73  y before the las
b210: 74 20 30 78 30 30 20 62 79 74 65 20 68 61 73 20  t 0x00 byte has 
b220: 74 68 65 20 30 78 38 30 20 62 69 74 0a 20 20 20  the 0x80 bit.   
b230: 20 20 20 2a 2a 20 73 65 74 2e 20 53 6f 20 74 68     ** set. So th
b240: 65 20 6c 61 73 74 20 30 78 30 30 20 69 73 20 6f  e last 0x00 is o
b250: 6e 6c 79 20 61 20 76 61 72 69 6e 74 20 30 20 69  nly a varint 0 i
b260: 66 20 74 68 65 72 65 20 61 72 65 20 38 20 6d 6f  f there are 8 mo
b270: 72 65 20 30 78 38 30 0a 20 20 20 20 20 20 2a 2a  re 0x80.      **
b280: 20 62 79 74 65 73 20 62 65 66 6f 72 65 20 61 5b   bytes before a[
b290: 69 69 5d 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ii]. */.      in
b2a0: 74 20 62 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20  t bZero = 0;    
b2b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
b2c0: 65 20 69 66 20 6c 61 73 74 20 30 78 30 30 20 63  e if last 0x00 c
b2d0: 6f 75 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ounts */.      i
b2e0: 66 28 20 28 69 69 2d 38 29 3e 3d 70 4c 76 6c 2d  f( (ii-8)>=pLvl-
b2f0: 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20 20  >iFirstOff ){.  
b300: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
b310: 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c       for(j=1; j<
b320: 3d 38 20 26 26 20 28 61 5b 69 69 2d 6a 5d 20 26  =8 && (a[ii-j] &
b330: 20 30 78 38 30 29 3b 20 6a 2b 2b 29 3b 0a 20 20   0x80); j++);.  
b340: 20 20 20 20 20 20 62 5a 65 72 6f 20 3d 20 28 6a        bZero = (j
b350: 3e 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >8);.      }.   
b360: 20 20 20 69 66 28 20 62 5a 65 72 6f 3d 3d 30 20     if( bZero==0 
b370: 29 20 6e 5a 65 72 6f 2d 2d 3b 0a 20 20 20 20 7d  ) nZero--;.    }
b380: 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66  .    pLvl->iLeaf
b390: 50 67 6e 6f 20 2d 3d 20 6e 5a 65 72 6f 3b 0a 20  Pgno -= nZero;. 
b3a0: 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20     pLvl->iOff = 
b3b0: 69 4f 66 66 20 2d 20 6e 5a 65 72 6f 3b 0a 20 20  iOff - nZero;.  
b3c0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 76 6c  }..  return pLvl
b3d0: 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69  ->bEof;.}..stati
b3e0: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49  c int fts5DlidxI
b3f0: 74 65 72 50 72 65 76 52 28 46 74 73 35 49 6e 64  terPrevR(Fts5Ind
b400: 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78  ex *p, Fts5Dlidx
b410: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
b420: 20 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 6c   iLvl){.  Fts5Dl
b430: 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26  idxLvl *pLvl = &
b440: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c  pIter->aLvl[iLvl
b450: 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  ];..  assert( iL
b460: 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29  vl<pIter->nLvl )
b470: 3b 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69 64  ;.  if( fts5Dlid
b480: 78 4c 76 6c 50 72 65 76 28 70 4c 76 6c 29 20 29  xLvlPrev(pLvl) )
b490: 7b 0a 20 20 20 20 69 66 28 20 28 69 4c 76 6c 2b  {.    if( (iLvl+
b4a0: 31 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76 6c  1) < pIter->nLvl
b4b0: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c   ){.      fts5Dl
b4c0: 69 64 78 49 74 65 72 50 72 65 76 52 28 70 2c 20  idxIterPrevR(p, 
b4d0: 70 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a  pIter, iLvl+1);.
b4e0: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 5b 31        if( pLvl[1
b4f0: 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20  ].bEof==0 ){.   
b500: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
b510: 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61  ease(pLvl->pData
b520: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
b530: 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pLvl, 0, sizeo
b540: 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29  f(Fts5DlidxLvl))
b550: 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e  ;.        pLvl->
b560: 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61  pData = fts5Data
b570: 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20  Read(p, .       
b580: 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f       FTS5_DLIDX_
b590: 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65  ROWID(pIter->iSe
b5a0: 67 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b  gid, iLvl, pLvl[
b5b0: 31 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20  1].iLeafPgno).  
b5c0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
b5d0: 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61   if( pLvl->pData
b5e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
b5f0: 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c 76  ile( fts5DlidxLv
b600: 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20 29  lNext(pLvl)==0 )
b610: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76 6c  ;.          pLvl
b620: 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20 20  ->bEof = 0;.    
b630: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
b640: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
b650: 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  n pIter->aLvl[0]
b660: 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63 20  .bEof;.}.static 
b670: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65  int fts5DlidxIte
b680: 72 50 72 65 76 28 46 74 73 35 49 6e 64 65 78 20  rPrev(Fts5Index 
b690: 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65  *p, Fts5DlidxIte
b6a0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74  r *pIter){.  ret
b6b0: 75 72 6e 20 66 74 73 35 44 6c 69 64 78 49 74 65  urn fts5DlidxIte
b6c0: 72 50 72 65 76 52 28 70 2c 20 70 49 74 65 72 2c  rPrevR(p, pIter,
b6d0: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   0);.}../*.** Fr
b6e0: 65 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  ee a doclist-ind
b6f0: 65 78 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  ex iterator obje
b700: 63 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ct allocated by 
b710: 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
b720: 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  t()..*/.static v
b730: 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74 65  oid fts5DlidxIte
b740: 72 46 72 65 65 28 46 74 73 35 44 6c 69 64 78 49  rFree(Fts5DlidxI
b750: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
b760: 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20  f( pIter ){.    
b770: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
b780: 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76  =0; i<pIter->nLv
b790: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  l; i++){.      f
b7a0: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
b7b0: 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44  Iter->aLvl[i].pD
b7c0: 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ata);.    }.    
b7d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74  sqlite3_free(pIt
b7e0: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  er);.  }.}..stat
b7f0: 69 63 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  ic Fts5DlidxIter
b800: 20 2a 66 74 73 35 44 6c 69 64 78 49 74 65 72 49   *fts5DlidxIterI
b810: 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  nit(.  Fts5Index
b820: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
b830: 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20 42         /* Fts5 B
b840: 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74  ackend to iterat
b850: 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e  e within */.  in
b860: 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20  t bRev,         
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b880: 20 54 72 75 65 20 66 6f 72 20 4f 52 44 45 52 20   True for ORDER 
b890: 42 59 20 41 53 43 20 2a 2f 0a 20 20 69 6e 74 20  BY ASC */.  int 
b8a0: 69 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20  iSegid,         
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b8c0: 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69  egment id */.  i
b8d0: 6e 74 20 69 4c 65 61 66 50 67 20 20 20 20 20 20  nt iLeafPg      
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b8f0: 2a 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  * Leaf page numb
b900: 65 72 20 74 6f 20 6c 6f 61 64 20 64 6c 69 64 78  er to load dlidx
b910: 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73   for */.){.  Fts
b920: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
b930: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  r = 0;.  int i;.
b940: 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b    int bDone = 0;
b950: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e  ..  for(i=0; p->
b960: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
b970: 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b   bDone==0; i++){
b980: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
b990: 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
b9a0: 78 49 74 65 72 29 20 2b 20 69 20 2a 20 73 69 7a  xIter) + i * siz
b9b0: 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c  eof(Fts5DlidxLvl
b9c0: 29 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78  );.    Fts5Dlidx
b9d0: 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 20  Iter *pNew;..   
b9e0: 20 70 4e 65 77 20 3d 20 28 46 74 73 35 44 6c 69   pNew = (Fts5Dli
b9f0: 64 78 49 74 65 72 2a 29 73 71 6c 69 74 65 33 5f  dxIter*)sqlite3_
ba00: 72 65 61 6c 6c 6f 63 28 70 49 74 65 72 2c 20 6e  realloc(pIter, n
ba10: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
ba20: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
ba30: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
ba40: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
ba50: 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69  .      i64 iRowi
ba60: 64 20 3d 20 46 54 53 35 5f 44 4c 49 44 58 5f 52  d = FTS5_DLIDX_R
ba70: 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69 2c 20  OWID(iSegid, i, 
ba80: 69 4c 65 61 66 50 67 29 3b 0a 20 20 20 20 20 20  iLeafPg);.      
ba90: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c  Fts5DlidxLvl *pL
baa0: 76 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 76 6c  vl = &pNew->aLvl
bab0: 5b 69 5d 3b 0a 20 20 20 20 20 20 70 49 74 65 72  [i];.      pIter
bac0: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6d   = pNew;.      m
bad0: 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73  emset(pLvl, 0, s
bae0: 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c  izeof(Fts5DlidxL
baf0: 76 6c 29 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c  vl));.      pLvl
bb00: 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61  ->pData = fts5Da
bb10: 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77 69 64  taRead(p, iRowid
bb20: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76  );.      if( pLv
bb30: 6c 2d 3e 70 44 61 74 61 20 26 26 20 28 70 4c 76  l->pData && (pLv
bb40: 6c 2d 3e 70 44 61 74 61 2d 3e 70 5b 30 5d 20 26  l->pData->p[0] &
bb50: 20 30 78 30 30 30 31 29 3d 3d 30 20 29 7b 0a 20   0x0001)==0 ){. 
bb60: 20 20 20 20 20 20 20 62 44 6f 6e 65 20 3d 20 31         bDone = 1
bb70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bb80: 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 3d 20 69 2b  pIter->nLvl = i+
bb90: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
bba0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
bbb0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65  E_OK ){.    pIte
bbc0: 72 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67  r->iSegid = iSeg
bbd0: 69 64 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76  id;.    if( bRev
bbe0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ==0 ){.      fts
bbf0: 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28  5DlidxIterFirst(
bc00: 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73  pIter);.    }els
bc10: 65 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  e{.      fts5Dli
bc20: 64 78 49 74 65 72 4c 61 73 74 28 70 2c 20 70 49  dxIterLast(p, pI
bc30: 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ter);.    }.  }.
bc40: 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51  .  if( p->rc!=SQ
bc50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66  LITE_OK ){.    f
bc60: 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
bc70: 28 70 49 74 65 72 29 3b 0a 20 20 20 20 70 49 74  (pIter);.    pIt
bc80: 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72  er = 0;.  }..  r
bc90: 65 74 75 72 6e 20 70 49 74 65 72 3b 0a 7d 0a 0a  eturn pIter;.}..
bca0: 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35 44  static i64 fts5D
bcb0: 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 46 74  lidxIterRowid(Ft
bcc0: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
bcd0: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 49  er){.  return pI
bce0: 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 52 6f  ter->aLvl[0].iRo
bcf0: 77 69 64 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  wid;.}.static in
bd00: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  t fts5DlidxIterP
bd10: 67 6e 6f 28 46 74 73 35 44 6c 69 64 78 49 74 65  gno(Fts5DlidxIte
bd20: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74  r *pIter){.  ret
bd30: 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  urn pIter->aLvl[
bd40: 30 5d 2e 69 4c 65 61 66 50 67 6e 6f 3b 0a 7d 0a  0].iLeafPgno;.}.
bd50: 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20  ./*.** Load the 
bd60: 6e 65 78 74 20 6c 65 61 66 20 70 61 67 65 20 69  next leaf page i
bd70: 6e 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20  nto the segment 
bd80: 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  iterator..*/.sta
bd90: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
bda0: 49 74 65 72 4e 65 78 74 50 61 67 65 28 0a 20 20  IterNextPage(.  
bdb0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdd0: 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
bde0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
bdf0: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20  SegIter *pIter  
be00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
be10: 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
be20: 63 65 20 74 6f 20 6e 65 78 74 20 70 61 67 65 20  ce to next page 
be30: 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 61 74 61  */.){.  Fts5Data
be40: 20 2a 70 4c 65 61 66 3b 0a 20 20 46 74 73 35 53   *pLeaf;.  Fts5S
be50: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
be60: 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70  *pSeg = pIter->p
be70: 53 65 67 3b 0a 20 20 66 74 73 35 44 61 74 61 52  Seg;.  fts5DataR
be80: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
be90: 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69  eaf);.  pIter->i
bea0: 4c 65 61 66 50 67 6e 6f 2b 2b 3b 0a 20 20 69 66  LeafPgno++;.  if
beb0: 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65  ( pIter->pNextLe
bec0: 61 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  af ){.    pIter-
bed0: 3e 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e  >pLeaf = pIter->
bee0: 70 4e 65 78 74 4c 65 61 66 3b 0a 20 20 20 20 70  pNextLeaf;.    p
bef0: 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20  Iter->pNextLeaf 
bf00: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
bf10: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
bf20: 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  o<=pSeg->pgnoLas
bf30: 74 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  t ){.    pIter->
bf40: 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61  pLeaf = fts5Data
bf50: 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20  Read(p, .       
bf60: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
bf70: 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64  WID(pSeg->iSegid
bf80: 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  , pIter->iLeafPg
bf90: 6e 6f 29 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c  no).    );.  }el
bfa0: 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  se{.    pIter->p
bfb0: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Leaf = 0;.  }.  
bfc0: 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
bfd0: 4c 65 61 66 3b 0a 0a 20 20 69 66 28 20 70 4c 65  Leaf;..  if( pLe
bfe0: 61 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  af ){.    pIter-
bff0: 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70 4c 65  >iPgidxOff = pLe
c000: 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 20 20  af->szLeaf;.    
c010: 69 66 28 20 66 74 73 35 4c 65 61 66 49 73 54 65  if( fts5LeafIsTe
c020: 72 6d 6c 65 73 73 28 70 4c 65 61 66 29 20 29 7b  rmless(pLeaf) ){
c030: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45  .      pIter->iE
c040: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c  ndofDoclist = pL
c050: 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d  eaf->nn+1;.    }
c060: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
c070: 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 2b 3d 20  r->iPgidxOff += 
c080: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
c090: 26 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d  &pLeaf->p[pIter-
c0a0: 3e 69 50 67 69 64 78 4f 66 66 5d 2c 0a 20 20 20  >iPgidxOff],.   
c0b0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45         pIter->iE
c0c0: 6e 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20 20 20  ndofDoclist.    
c0d0: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d    );.    }.  }.}
c0e0: 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
c0f0: 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62   p points to a b
c100: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
c110: 20 61 20 76 61 72 69 6e 74 20 74 6f 20 62 65 20   a varint to be 
c120: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
c130: 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  .** position lis
c140: 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 52 65  t size field. Re
c150: 61 64 20 74 68 65 20 76 61 72 69 6e 74 20 61 6e  ad the varint an
c160: 64 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  d return the num
c170: 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20  ber of bytes.** 
c180: 72 65 61 64 2e 20 42 65 66 6f 72 65 20 72 65 74  read. Before ret
c190: 75 72 6e 69 6e 67 2c 20 73 65 74 20 2a 70 6e 53  urning, set *pnS
c1a0: 7a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  z to the number 
c1b0: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
c1c0: 70 6f 73 69 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74  position.** list
c1d0: 2c 20 61 6e 64 20 2a 70 62 44 65 6c 20 74 6f 20  , and *pbDel to 
c1e0: 74 72 75 65 20 69 66 20 74 68 65 20 64 65 6c 65  true if the dele
c1f0: 74 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  te flag is set, 
c200: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
c210: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
c220: 74 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74  t fts5GetPoslist
c230: 53 69 7a 65 28 63 6f 6e 73 74 20 75 38 20 2a 70  Size(const u8 *p
c240: 2c 20 69 6e 74 20 2a 70 6e 53 7a 2c 20 69 6e 74  , int *pnSz, int
c250: 20 2a 70 62 44 65 6c 29 7b 0a 20 20 69 6e 74 20   *pbDel){.  int 
c260: 6e 53 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  nSz;.  int n = 0
c270: 3b 0a 20 20 66 74 73 35 46 61 73 74 47 65 74 56  ;.  fts5FastGetV
c280: 61 72 69 6e 74 33 32 28 70 2c 20 6e 2c 20 6e 53  arint32(p, n, nS
c290: 7a 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63 28  z);.  assert_nc(
c2a0: 20 6e 53 7a 3e 3d 30 20 29 3b 0a 20 20 2a 70 6e   nSz>=0 );.  *pn
c2b0: 53 7a 20 3d 20 6e 53 7a 2f 32 3b 0a 20 20 2a 70  Sz = nSz/2;.  *p
c2c0: 62 44 65 6c 20 3d 20 6e 53 7a 20 26 20 30 78 30  bDel = nSz & 0x0
c2d0: 30 30 31 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  001;.  return n;
c2e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65  .}../*.** Fts5Se
c2f0: 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65  gIter.iLeafOffse
c300: 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  t currently poin
c310: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
c320: 62 79 74 65 20 6f 66 20 61 0a 2a 2a 20 70 6f 73  byte of a.** pos
c330: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
c340: 66 69 65 6c 64 2e 20 52 65 61 64 20 74 68 65 20  field. Read the 
c350: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 69 65  value of the fie
c360: 6c 64 20 61 6e 64 20 73 74 6f 72 65 20 69 74 0a  ld and store it.
c370: 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ** in the follow
c380: 69 6e 67 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a  ing variables:.*
c390: 2a 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74  *.**   Fts5SegIt
c3a0: 65 72 2e 6e 50 6f 73 0a 2a 2a 20 20 20 46 74 73  er.nPos.**   Fts
c3b0: 35 53 65 67 49 74 65 72 2e 62 44 65 6c 0a 2a 2a  5SegIter.bDel.**
c3c0: 0a 2a 2a 20 4c 65 61 76 65 20 46 74 73 35 53 65  .** Leave Fts5Se
c3d0: 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65  gIter.iLeafOffse
c3e0: 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  t pointing to th
c3f0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
c400: 74 68 65 20 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e  the .** position
c410: 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 28 69   list content (i
c420: 66 20 61 6e 79 29 2e 0a 2a 2f 0a 73 74 61 74 69  f any)..*/.stati
c430: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
c440: 65 72 4c 6f 61 64 4e 50 6f 73 28 46 74 73 35 49  erLoadNPos(Fts5I
c450: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
c460: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
c470: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
c480: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
c490: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
c4a0: 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f  eafOffset;  /* O
c4b0: 66 66 73 65 74 20 74 6f 20 72 65 61 64 20 61 74  ffset to read at
c4c0: 20 2a 2f 0a 20 20 20 20 41 53 53 45 52 54 5f 53   */.    ASSERT_S
c4d0: 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e  ZLEAF_OK(pIter->
c4e0: 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20  pLeaf);.    if( 
c4f0: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
c500: 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
c510: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69  _NONE ){.      i
c520: 6e 74 20 69 45 6f 64 20 3d 20 4d 49 4e 28 70 49  nt iEod = MIN(pI
c530: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
c540: 73 74 2c 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  st, pIter->pLeaf
c550: 2d 3e 73 7a 4c 65 61 66 29 3b 0a 20 20 20 20 20  ->szLeaf);.     
c560: 20 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 30   pIter->bDel = 0
c570: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  ;.      pIter->n
c580: 50 6f 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  Pos = 1;.      i
c590: 66 28 20 69 4f 66 66 3c 69 45 6f 64 20 26 26 20  f( iOff<iEod && 
c5a0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b  pIter->pLeaf->p[
c5b0: 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  iOff]==0 ){.    
c5c0: 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65 6c 20      pIter->bDel 
c5d0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 4f 66  = 1;.        iOf
c5e0: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  f++;.        if(
c5f0: 20 69 4f 66 66 3c 69 45 6f 64 20 26 26 20 70 49   iOff<iEod && pI
c600: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f  ter->pLeaf->p[iO
c610: 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ff]==0 ){.      
c620: 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20      pIter->nPos 
c630: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 1;.          i
c640: 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  Off++;.        }
c650: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
c660: 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 30 3b  pIter->nPos = 0;
c670: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c680: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
c690: 20 20 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 20      int nSz;.   
c6a0: 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61     fts5FastGetVa
c6b0: 72 69 6e 74 33 32 28 70 49 74 65 72 2d 3e 70 4c  rint32(pIter->pL
c6c0: 65 61 66 2d 3e 70 2c 20 69 4f 66 66 2c 20 6e 53  eaf->p, iOff, nS
c6d0: 7a 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  z);.      pIter-
c6e0: 3e 62 44 65 6c 20 3d 20 28 6e 53 7a 20 26 20 30  >bDel = (nSz & 0
c6f0: 78 30 30 30 31 29 3b 0a 20 20 20 20 20 20 70 49  x0001);.      pI
c700: 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e  ter->nPos = nSz>
c710: 3e 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  >1;.      assert
c720: 5f 6e 63 28 20 70 49 74 65 72 2d 3e 6e 50 6f 73  _nc( pIter->nPos
c730: 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >=0 );.    }.   
c740: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
c750: 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a  set = iOff;.  }.
c760: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
c770: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52 6f  ts5SegIterLoadRo
c780: 77 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70  wid(Fts5Index *p
c790: 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
c7a0: 49 74 65 72 29 7b 0a 20 20 75 38 20 2a 61 20 3d  Iter){.  u8 *a =
c7b0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
c7c0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66  ;        /* Buff
c7d0: 65 72 20 74 6f 20 72 65 61 64 20 64 61 74 61 20  er to read data 
c7e0: 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  from */.  int iO
c7f0: 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  ff = pIter->iLea
c800: 66 4f 66 66 73 65 74 3b 0a 0a 20 20 41 53 53 45  fOffset;..  ASSE
c810: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74  RT_SZLEAF_OK(pIt
c820: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 69 66  er->pLeaf);.  if
c830: 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70  ( iOff>=pIter->p
c840: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
c850: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
c860: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
c870: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
c880: 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20  ->pLeaf==0 ){.  
c890: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
c8a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63  QLITE_OK ) p->rc
c8b0: 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
c8c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
c8d0: 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20     }.    iOff = 
c8e0: 34 3b 0a 20 20 20 20 61 20 3d 20 70 49 74 65 72  4;.    a = pIter
c8f0: 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 7d 0a  ->pLeaf->p;.  }.
c900: 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65    iOff += sqlite
c910: 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26  3Fts5GetVarint(&
c920: 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  a[iOff], (u64*)&
c930: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
c940: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
c950: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a  fset = iOff;.}..
c960: 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65  /*.** Fts5SegIte
c970: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63 75  r.iLeafOffset cu
c980: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
c990: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
c9a0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 22 6e 53 75   of the .** "nSu
c9b0: 66 66 69 78 22 20 66 69 65 6c 64 20 6f 66 20 61  ffix" field of a
c9c0: 20 74 65 72 6d 2e 20 46 75 6e 63 74 69 6f 6e 20   term. Function 
c9d0: 70 61 72 61 6d 65 74 65 72 20 6e 4b 65 65 70 20  parameter nKeep 
c9e0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
c9f0: 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 22 6e 50  ue.** of the "nP
ca00: 72 65 66 69 78 22 20 66 69 65 6c 64 20 28 69 66  refix" field (if
ca10: 20 74 68 65 72 65 20 77 61 73 20 6f 6e 65 20 2d   there was one -
ca20: 20 69 74 20 69 73 20 70 61 73 73 65 64 20 30 20   it is passed 0 
ca30: 69 66 20 74 68 69 73 20 69 73 0a 2a 2a 20 74 68  if this is.** th
ca40: 65 20 66 69 72 73 74 20 74 65 72 6d 20 69 6e 20  e first term in 
ca50: 74 68 65 20 73 65 67 6d 65 6e 74 29 2e 0a 2a 2a  the segment)..**
ca60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
ca70: 6e 20 70 6f 70 75 6c 61 74 65 73 3a 0a 2a 2a 0a  n populates:.**.
ca80: 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72  **   Fts5SegIter
ca90: 2e 74 65 72 6d 0a 2a 2a 20 20 20 46 74 73 35 53  .term.**   Fts5S
caa0: 65 67 49 74 65 72 2e 72 6f 77 69 64 0a 2a 2a 0a  egIter.rowid.**.
cab0: 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 61  ** accordingly a
cac0: 6e 64 20 6c 65 61 76 65 73 20 28 46 74 73 35 53  nd leaves (Fts5S
cad0: 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73  egIter.iLeafOffs
cae0: 65 74 29 20 73 65 74 20 74 6f 20 74 68 65 20 63  et) set to the c
caf0: 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 74 68 65  ontent of.** the
cb00: 20 66 69 72 73 74 20 70 6f 73 69 74 69 6f 6e 20   first position 
cb10: 6c 69 73 74 2e 20 54 68 65 20 70 6f 73 69 74 69  list. The positi
cb20: 6f 6e 20 6c 69 73 74 20 62 65 6c 6f 6e 67 69 6e  on list belongin
cb30: 67 20 74 6f 20 64 6f 63 75 6d 65 6e 74 20 0a 2a  g to document .*
cb40: 2a 20 28 46 74 73 35 53 65 67 49 74 65 72 2e 69  * (Fts5SegIter.i
cb50: 52 6f 77 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  Rowid)..*/.stati
cb60: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
cb70: 65 72 4c 6f 61 64 54 65 72 6d 28 46 74 73 35 49  erLoadTerm(Fts5I
cb80: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
cb90: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
cba0: 20 6e 4b 65 65 70 29 7b 0a 20 20 75 38 20 2a 61   nKeep){.  u8 *a
cbb0: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
cbc0: 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75  >p;        /* Bu
cbd0: 66 66 65 72 20 74 6f 20 72 65 61 64 20 64 61 74  ffer to read dat
cbe0: 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  a from */.  int 
cbf0: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
cc00: 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f  eafOffset;  /* O
cc10: 66 66 73 65 74 20 74 6f 20 72 65 61 64 20 61 74  ffset to read at
cc20: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20   */.  int nNew; 
cc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc40: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
cc50: 66 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 0a 20  f new data */.. 
cc60: 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
cc70: 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
cc80: 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 69 66 28 20  ], nNew);.  if( 
cc90: 69 4f 66 66 2b 6e 4e 65 77 3e 70 49 74 65 72 2d  iOff+nNew>pIter-
cca0: 3e 70 4c 65 61 66 2d 3e 6e 6e 20 29 7b 0a 20 20  >pLeaf->nn ){.  
ccb0: 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
ccc0: 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 65 74 75  ORRUPT;.    retu
ccd0: 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d  rn;.  }.  pIter-
cce0: 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b  >term.n = nKeep;
ccf0: 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70  .  fts5BufferApp
cd00: 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
cd10: 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e  &pIter->term, nN
cd20: 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20  ew, &a[iOff]);. 
cd30: 20 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20   iOff += nNew;. 
cd40: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
cd50: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
cd60: 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65    pIter->iTermLe
cd70: 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e  afPgno = pIter->
cd80: 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 70 49 74  iLeafPgno;.  pIt
cd90: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
cda0: 3d 20 69 4f 66 66 3b 0a 0a 20 20 69 66 28 20 70  = iOff;..  if( p
cdb0: 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 3e  Iter->iPgidxOff>
cdc0: 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e  =pIter->pLeaf->n
cdd0: 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  n ){.    pIter->
cde0: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
cdf0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
ce00: 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  +1;.  }else{.   
ce10: 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20 20 20   int nExtra;.   
ce20: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
ce30: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
ce40: 6e 74 33 32 28 26 61 5b 70 49 74 65 72 2d 3e 69  nt32(&a[pIter->i
ce50: 50 67 69 64 78 4f 66 66 5d 2c 20 6e 45 78 74 72  PgidxOff], nExtr
ce60: 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  a);.    pIter->i
ce70: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 2b 3d 20  EndofDoclist += 
ce80: 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 0a 20 20 66  nExtra;.  }..  f
ce90: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52 6f  ts5SegIterLoadRo
cea0: 77 69 64 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d  wid(p, pIter);.}
ceb0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
cec0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 46 74  s5SegIterNext(Ft
ced0: 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65  s5Index*, Fts5Se
cee0: 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73  gIter*, int*);.s
cef0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
cf00: 65 67 49 74 65 72 4e 65 78 74 5f 52 65 76 65 72  egIterNext_Rever
cf10: 73 65 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 46  se(Fts5Index*, F
cf20: 74 73 35 53 65 67 49 74 65 72 2a 2c 20 69 6e 74  ts5SegIter*, int
cf30: 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  *);.static void 
cf40: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f  fts5SegIterNext_
cf50: 4e 6f 6e 65 28 46 74 73 35 49 6e 64 65 78 2a 2c  None(Fts5Index*,
cf60: 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c 20 69   Fts5SegIter*, i
cf70: 6e 74 2a 29 3b 0a 0a 73 74 61 74 69 63 20 76 6f  nt*);..static vo
cf80: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 53 65  id fts5SegIterSe
cf90: 74 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 20  tNext(Fts5Index 
cfa0: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
cfb0: 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
cfc0: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
cfd0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
cfe0: 53 45 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  SE ){.    pIter-
cff0: 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 53 65 67  >xNext = fts5Seg
d000: 49 74 65 72 4e 65 78 74 5f 52 65 76 65 72 73 65  IterNext_Reverse
d010: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
d020: 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
d030: 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l==FTS5_DETAIL_N
d040: 4f 4e 45 20 29 7b 0a 20 20 20 20 70 49 74 65 72  ONE ){.    pIter
d050: 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 53 65  ->xNext = fts5Se
d060: 67 49 74 65 72 4e 65 78 74 5f 4e 6f 6e 65 3b 0a  gIterNext_None;.
d070: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74    }else{.    pIt
d080: 65 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35  er->xNext = fts5
d090: 53 65 67 49 74 65 72 4e 65 78 74 3b 0a 20 20 7d  SegIterNext;.  }
d0a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
d0b0: 6c 69 7a 65 20 74 68 65 20 69 74 65 72 61 74 6f  lize the iterato
d0c0: 72 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74  r object pIter t
d0d0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
d0e0: 68 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e  h the entries in
d0f0: 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 70 53 65 67  .** segment pSeg
d100: 2e 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69  . The iterator i
d110: 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
d120: 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
d130: 72 79 20 77 68 65 6e 20 0a 2a 2a 20 74 68 69 73  ry when .** this
d140: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
d150: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
d160: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73  rror occurs, Fts
d170: 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74  5Index.rc is set
d180: 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61   to an appropria
d190: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  te error code. I
d1a0: 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68  f .** an error h
d1b0: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
d1c0: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
d1d0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
d1e0: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
d1f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d200: 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28  fts5SegIterInit(
d210: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
d220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d230: 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20     /* FTS index 
d240: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
d250: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
d260: 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44   *pSeg,     /* D
d270: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65  escription of se
d280: 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53  gment */.  Fts5S
d290: 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  egIter *pIter   
d2a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
d2b0: 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ject to populate
d2c0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 53 65   */.){.  if( pSe
d2d0: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20  g->pgnoFirst==0 
d2e0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
d2f0: 61 70 70 65 6e 73 20 69 66 20 74 68 65 20 73 65  appens if the se
d300: 67 6d 65 6e 74 20 69 73 20 62 65 69 6e 67 20 75  gment is being u
d310: 73 65 64 20 61 73 20 61 6e 20 69 6e 70 75 74 20  sed as an input 
d320: 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  to an incrementa
d330: 6c 0a 20 20 20 20 2a 2a 20 6d 65 72 67 65 20 61  l.    ** merge a
d340: 6e 64 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  nd all data has 
d350: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 22 74 72  already been "tr
d360: 69 6d 6d 65 64 22 2e 20 53 65 65 20 66 75 6e 63  immed". See func
d370: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 66 74 73 35  tion.    ** fts5
d380: 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 29 20 66  TrimSegments() f
d390: 6f 72 20 64 65 74 61 69 6c 73 2e 20 49 6e 20 74  or details. In t
d3a0: 68 69 73 20 63 61 73 65 20 6c 65 61 76 65 20 74  his case leave t
d3b0: 68 65 20 69 74 65 72 61 74 6f 72 20 65 6d 70 74  he iterator empt
d3c0: 79 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61  y..    ** The ca
d3d0: 6c 6c 65 72 20 77 69 6c 6c 20 73 65 65 20 74 68  ller will see th
d3e0: 65 20 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  e (pIter->pLeaf=
d3f0: 3d 30 29 20 61 6e 64 20 61 73 73 75 6d 65 20 74  =0) and assume t
d400: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a 20  he iterator is. 
d410: 20 20 20 2a 2a 20 61 74 20 45 4f 46 20 61 6c 72     ** at EOF alr
d420: 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73  eady. */.    ass
d430: 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61  ert( pIter->pLea
d440: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  f==0 );.    retu
d450: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rn;.  }..  if( p
d460: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
d470: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ){.    memset(pI
d480: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
d490: 70 49 74 65 72 29 29 3b 0a 20 20 20 20 66 74 73  pIter));.    fts
d4a0: 35 53 65 67 49 74 65 72 53 65 74 4e 65 78 74 28  5SegIterSetNext(
d4b0: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 70  p, pIter);.    p
d4c0: 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65  Iter->pSeg = pSe
d4d0: 67 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  g;.    pIter->iL
d4e0: 65 61 66 50 67 6e 6f 20 3d 20 70 53 65 67 2d 3e  eafPgno = pSeg->
d4f0: 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20 20  pgnoFirst-1;.   
d500: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
d510: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
d520: 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
d530: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
d540: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
d550: 66 66 73 65 74 20 3d 20 34 3b 0a 20 20 20 20 61  ffset = 4;.    a
d560: 73 73 65 72 74 5f 6e 63 28 20 70 49 74 65 72 2d  ssert_nc( pIter-
d570: 3e 70 4c 65 61 66 2d 3e 6e 6e 3e 34 20 29 3b 0a  >pLeaf->nn>4 );.
d580: 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35      assert( fts5
d590: 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
d5a0: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d  (pIter->pLeaf)==
d5b0: 34 20 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  4 );.    pIter->
d5c0: 69 50 67 69 64 78 4f 66 66 20 3d 20 70 49 74 65  iPgidxOff = pIte
d5d0: 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  r->pLeaf->szLeaf
d5e0: 2b 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49  +1;.    fts5SegI
d5f0: 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70  terLoadTerm(p, p
d600: 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 66 74  Iter, 0);.    ft
d610: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
d620: 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d  s(p, pIter);.  }
d630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
d640: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
d650: 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69  ever called on i
d660: 74 65 72 61 74 6f 72 73 20 63 72 65 61 74 65 64  terators created
d670: 20 62 79 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20   by calls to.** 
d680: 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 29  Fts5IndexQuery()
d690: 20 77 69 74 68 20 74 68 65 20 46 54 53 35 49 4e   with the FTS5IN
d6a0: 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 66  DEX_QUERY_DESC f
d6b0: 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54  lag set..**.** T
d6c0: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 69  he iterator is i
d6d0: 6e 20 61 6e 20 75 6e 75 73 75 61 6c 20 73 74 61  n an unusual sta
d6e0: 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
d6f0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 3a  ction is called:
d700: 20 74 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 49   the.** Fts5SegI
d710: 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20  ter.iLeafOffset 
d720: 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20  variable is set 
d730: 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66  to the offset of
d740: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
d750: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
d760: 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20 66 6f  st size field fo
d770: 72 20 74 68 65 20 66 69 72 73 74 20 72 65 6c 65  r the first rele
d780: 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68  vant rowid on th
d790: 65 20 70 61 67 65 2e 0a 2a 2a 20 46 74 73 35 53  e page..** Fts5S
d7a0: 65 67 49 74 65 72 2e 72 6f 77 69 64 20 69 73 20  egIter.rowid is 
d7b0: 73 65 74 2c 20 62 75 74 20 6e 50 6f 73 20 61 6e  set, but nPos an
d7c0: 64 20 62 44 65 6c 20 61 72 65 20 6e 6f 74 2e 0a  d bDel are not..
d7d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
d7e0: 69 6f 6e 20 61 64 76 61 6e 63 65 73 20 74 68 65  ion advances the
d7f0: 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61   iterator so tha
d800: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  t it points to t
d810: 68 65 20 6c 61 73 74 20 0a 2a 2a 20 72 65 6c 65  he last .** rele
d820: 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68  vant rowid on th
d830: 65 20 70 61 67 65 20 61 6e 64 2c 20 69 66 20 6e  e page and, if n
d840: 65 63 65 73 73 61 72 79 2c 20 69 6e 69 74 69 61  ecessary, initia
d850: 6c 69 7a 65 73 20 74 68 65 20 0a 2a 2a 20 61 52  lizes the .** aR
d860: 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 6e 64  owidOffset[] and
d870: 20 69 52 6f 77 69 64 4f 66 66 73 65 74 20 76 61   iRowidOffset va
d880: 72 69 61 62 6c 65 73 2e 20 41 74 20 74 68 69 73  riables. At this
d890: 20 70 6f 69 6e 74 20 74 68 65 20 69 74 65 72 61   point the itera
d8a0: 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 20 69 74 73  tor.** is in its
d8b0: 20 72 65 67 75 6c 61 72 20 73 74 61 74 65 20 2d   regular state -
d8c0: 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65   Fts5SegIter.iLe
d8d0: 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 73 20  afOffset points 
d8e0: 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  to the first.** 
d8f0: 62 79 74 65 20 6f 66 20 74 68 65 20 70 6f 73 69  byte of the posi
d900: 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e  tion list conten
d910: 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
d920: 68 20 73 61 69 64 20 72 6f 77 69 64 2e 0a 2a 2f  h said rowid..*/
d930: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
d940: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49  5SegIterReverseI
d950: 6e 69 74 50 61 67 65 28 46 74 73 35 49 6e 64 65  nitPage(Fts5Inde
d960: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
d970: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
d980: 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43   eDetail = p->pC
d990: 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a  onfig->eDetail;.
d9a0: 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d    int n = pIter-
d9b0: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a  >pLeaf->szLeaf;.
d9c0: 20 20 69 6e 74 20 69 20 3d 20 70 49 74 65 72 2d    int i = pIter-
d9d0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
d9e0: 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
d9f0: 4c 65 61 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 69  Leaf->p;.  int i
da00: 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 30 3b  RowidOffset = 0;
da10: 0a 0a 20 20 69 66 28 20 6e 3e 70 49 74 65 72 2d  ..  if( n>pIter-
da20: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29  >iEndofDoclist )
da30: 7b 0a 20 20 20 20 6e 20 3d 20 70 49 74 65 72 2d  {.    n = pIter-
da40: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b 0a  >iEndofDoclist;.
da50: 20 20 7d 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a    }..  ASSERT_SZ
da60: 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70  LEAF_OK(pIter->p
da70: 4c 65 61 66 29 3b 0a 20 20 77 68 69 6c 65 28 20  Leaf);.  while( 
da80: 31 20 29 7b 0a 20 20 20 20 69 36 34 20 69 44 65  1 ){.    i64 iDe
da90: 6c 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  lta = 0;..    if
daa0: 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ( eDetail==FTS5_
dab0: 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
dac0: 20 20 20 20 20 2f 2a 20 74 6f 64 6f 20 2a 2f 0a       /* todo */.
dad0: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 20 26 26        if( i<n &&
dae0: 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20   a[i]==0 ){.    
daf0: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
db00: 20 69 66 28 20 69 3c 6e 20 26 26 20 61 5b 69 5d   if( i<n && a[i]
db10: 3d 3d 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20  ==0 ) i++;.     
db20: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
db30: 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20      int nPos;.  
db40: 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a      int bDummy;.
db50: 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47        i += fts5G
db60: 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61  etPoslistSize(&a
db70: 5b 69 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75  [i], &nPos, &bDu
db80: 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d  mmy);.      i +=
db90: 20 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a 20 20 20   nPos;.    }.   
dba0: 20 69 66 28 20 69 3e 3d 6e 20 29 20 62 72 65 61   if( i>=n ) brea
dbb0: 6b 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74 73 35  k;.    i += fts5
dbc0: 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 5d 2c  GetVarint(&a[i],
dbd0: 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b   (u64*)&iDelta);
dbe0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77  .    pIter->iRow
dbf0: 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a 20  id += iDelta;.. 
dc00: 20 20 20 2f 2a 20 49 66 20 6e 65 63 65 73 73 61     /* If necessa
dc10: 72 79 2c 20 67 72 6f 77 20 74 68 65 20 70 49 74  ry, grow the pIt
dc20: 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74  er->aRowidOffset
dc30: 5b 5d 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20  [] array. */.   
dc40: 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 73 65   if( iRowidOffse
dc50: 74 3e 3d 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64  t>=pIter->nRowid
dc60: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
dc70: 69 6e 74 20 6e 4e 65 77 20 3d 20 70 49 74 65 72  int nNew = pIter
dc80: 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 2b  ->nRowidOffset +
dc90: 20 38 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   8;.      int *a
dca0: 4e 65 77 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69  New = (int*)sqli
dcb0: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65  te3_realloc(pIte
dcc0: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 2c  r->aRowidOffset,
dcd0: 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74   nNew*sizeof(int
dce0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e  ));.      if( aN
dcf0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
dd00: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
dd10: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62  NOMEM;.        b
dd20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
dd30: 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69      pIter->aRowi
dd40: 64 4f 66 66 73 65 74 20 3d 20 61 4e 65 77 3b 0a  dOffset = aNew;.
dd50: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 6f        pIter->nRo
dd60: 77 69 64 4f 66 66 73 65 74 20 3d 20 6e 4e 65 77  widOffset = nNew
dd70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 49 74  ;.    }..    pIt
dd80: 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74  er->aRowidOffset
dd90: 5b 69 52 6f 77 69 64 4f 66 66 73 65 74 2b 2b 5d  [iRowidOffset++]
dda0: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
ddb0: 66 66 73 65 74 3b 0a 20 20 20 20 70 49 74 65 72  ffset;.    pIter
ddc0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
ddd0: 69 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e  i;.  }.  pIter->
dde0: 69 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 69  iRowidOffset = i
ddf0: 52 6f 77 69 64 4f 66 66 73 65 74 3b 0a 20 20 66  RowidOffset;.  f
de00: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
de10: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a  os(p, pIter);.}.
de20: 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  ./*.**.*/.static
de30: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
de40: 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28  rReverseNewPage(
de50: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
de60: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
de70: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
de80: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
de90: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
dea0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
deb0: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
dec0: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
ded0: 4d 20 29 3b 0a 0a 20 20 66 74 73 35 44 61 74 61  M );..  fts5Data
dee0: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
def0: 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e  Leaf);.  pIter->
df00: 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 77 68 69  pLeaf = 0;.  whi
df10: 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
df20: 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 69  E_OK && pIter->i
df30: 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e  LeafPgno>pIter->
df40: 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b  iTermLeafPgno ){
df50: 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
df60: 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  New;.    pIter->
df70: 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20  iLeafPgno--;.   
df80: 20 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61   pNew = fts5Data
df90: 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47  Read(p, FTS5_SEG
dfa0: 4d 45 4e 54 5f 52 4f 57 49 44 28 0a 20 20 20 20  MENT_ROWID(.    
dfb0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 53 65        pIter->pSe
dfc0: 67 2d 3e 69 53 65 67 69 64 2c 20 70 49 74 65 72  g->iSegid, pIter
dfd0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 0a 20 20 20 20  ->iLeafPgno.    
dfe0: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  ));.    if( pNew
dff0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 54 65   ){.      /* iTe
e000: 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 6d 61 79  rmLeafOffset may
e010: 20 62 65 20 65 71 75 61 6c 20 74 6f 20 73 7a 4c   be equal to szL
e020: 65 61 66 20 69 66 20 74 68 65 20 74 65 72 6d 20  eaf if the term 
e030: 69 73 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20  is the last.    
e040: 20 20 2a 2a 20 74 68 69 6e 67 20 6f 6e 20 74 68    ** thing on th
e050: 65 20 70 61 67 65 20 2d 20 69 2e 65 2e 20 74 68  e page - i.e. th
e060: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 73  e first rowid is
e070: 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   on the followin
e080: 67 20 70 61 67 65 2e 0a 20 20 20 20 20 20 2a 2a  g page..      **
e090: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 65   In this case le
e0a0: 61 76 65 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  ave pIter->pLeaf
e0b0: 3d 3d 30 2c 20 74 68 69 73 20 69 74 65 72 61 74  ==0, this iterat
e0c0: 6f 72 20 69 73 20 61 74 20 45 4f 46 2e 20 2a 2f  or is at EOF. */
e0d0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
e0e0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74  ->iLeafPgno==pIt
e0f0: 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  er->iTermLeafPgn
e100: 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  o ){.        ass
e110: 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61  ert( pIter->pLea
e120: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  f==0 );.        
e130: 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  if( pIter->iTerm
e140: 4c 65 61 66 4f 66 66 73 65 74 3c 70 4e 65 77 2d  LeafOffset<pNew-
e150: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
e160: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
e170: 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  f = pNew;.      
e180: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
e190: 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d 3e  Offset = pIter->
e1a0: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b  iTermLeafOffset;
e1b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e1c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e1d0: 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20  int iRowidOff;. 
e1e0: 20 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66         iRowidOff
e1f0: 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
e200: 52 6f 77 69 64 4f 66 66 28 70 4e 65 77 29 3b 0a  RowidOff(pNew);.
e210: 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77          if( iRow
e220: 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20  idOff ){.       
e230: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
e240: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
e250: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
e260: 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66  fset = iRowidOff
e270: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e280: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
e290: 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
e2a0: 20 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 26         u8 *a = &
e2b0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b  pIter->pLeaf->p[
e2c0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e2d0: 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 74  et];.        pIt
e2e0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
e2f0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
e300: 28 61 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  (a, (u64*)&pIter
e310: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
e320: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e330: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
e340: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
e350: 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
e360: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
e370: 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
e380: 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
e390: 44 6f 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d  Doclist = pIter-
e3a0: 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20  >pLeaf->nn+1;.  
e3b0: 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
e3c0: 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20  erseInitPage(p, 
e3d0: 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pIter);.  }.}../
e3e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
e3f0: 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   if the iterator
e400: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
e410: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
e420: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
e430: 74 73 20 74 6f 20 61 20 64 65 6c 65 74 65 20 6d  ts to a delete m
e440: 61 72 6b 65 72 2e 20 41 20 64 65 6c 65 74 65 20  arker. A delete 
e450: 6d 61 72 6b 65 72 20 69 73 20 61 6e 20 65 6e 74  marker is an ent
e460: 72 79 20 77 69 74 68 20 61 20 30 20 62 79 74 65  ry with a 0 byte
e470: 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  .** position-lis
e480: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
e490: 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73   fts5MultiIterIs
e4a0: 45 6d 70 74 79 28 46 74 73 35 49 6e 64 65 78 20  Empty(Fts5Index 
e4b0: 2a 70 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49  *p, Fts5Iter *pI
e4c0: 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65 67 49  ter){.  Fts5SegI
e4d0: 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
e4e0: 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e  er->aSeg[pIter->
e4f0: 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
e500: 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  ];.  return (p->
e510: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
e520: 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 26 26 20   pSeg->pLeaf && 
e530: 70 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30 29 3b 0a  pSeg->nPos==0);.
e540: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
e550: 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   iterator pIter 
e560: 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
e570: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 65  y..**.** This ve
e580: 72 73 69 6f 6e 20 6f 66 20 66 74 73 35 53 65 67  rsion of fts5Seg
e590: 49 74 65 72 4e 65 78 74 28 29 20 69 73 20 6f 6e  IterNext() is on
e5a0: 6c 79 20 75 73 65 64 20 62 79 20 72 65 76 65 72  ly used by rever
e5b0: 73 65 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f  se iterators..*/
e5c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
e5d0: 35 53 65 67 49 74 65 72 4e 65 78 74 5f 52 65 76  5SegIterNext_Rev
e5e0: 65 72 73 65 28 0a 20 20 46 74 73 35 49 6e 64 65  erse(.  Fts5Inde
e5f0: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
e600: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
e610: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
e620: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
e630: 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
e640: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
e650: 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20  to advance */.  
e660: 69 6e 74 20 2a 70 62 55 6e 75 73 65 64 20 20 20  int *pbUnused   
e670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e680: 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 29 7b 0a  /* Unused */.){.
e690: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
e6a0: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
e6b0: 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 3b  GITER_REVERSE );
e6c0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
e6d0: 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29  ->pNextLeaf==0 )
e6e0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
e6f0: 28 70 62 55 6e 75 73 65 64 29 3b 0a 0a 20 20 69  (pbUnused);..  i
e700: 66 28 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  f( pIter->iRowid
e710: 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20  Offset>0 ){.    
e720: 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
e730: 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 69 6e 74  Leaf->p;.    int
e740: 20 69 4f 66 66 3b 0a 20 20 20 20 69 36 34 20 69   iOff;.    i64 i
e750: 44 65 6c 74 61 3b 0a 0a 20 20 20 20 70 49 74 65  Delta;..    pIte
e760: 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 2d  r->iRowidOffset-
e770: 2d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  -;.    pIter->iL
e780: 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65  eafOffset = pIte
e790: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  r->aRowidOffset[
e7a0: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66  pIter->iRowidOff
e7b0: 73 65 74 5d 3b 0a 20 20 20 20 66 74 73 35 53 65  set];.    fts5Se
e7c0: 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
e7d0: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69 4f 66   pIter);.    iOf
e7e0: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
e7f0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 66 28 20  Offset;.    if( 
e800: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
e810: 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail!=FTS5_DETAIL
e820: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69  _NONE ){.      i
e830: 4f 66 66 20 2b 3d 20 70 49 74 65 72 2d 3e 6e 50  Off += pIter->nP
e840: 6f 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  os;.    }.    ft
e850: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
e860: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  Off], (u64*)&iDe
e870: 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  lta);.    pIter-
e880: 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74  >iRowid -= iDelt
e890: 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
e8a0: 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
e8b0: 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74  seNewPage(p, pIt
e8c0: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
e8d0: 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72 61 74  * Advance iterat
e8e0: 6f 72 20 70 49 74 65 72 20 74 6f 20 74 68 65 20  or pIter to the 
e8f0: 6e 65 78 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a  next entry..**.*
e900: 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  * This version o
e910: 66 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  f fts5SegIterNex
e920: 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  t() is only used
e930: 20 69 66 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20   if detail=none 
e940: 61 6e 64 20 74 68 65 0a 2a 2a 20 69 74 65 72 61  and the.** itera
e950: 74 6f 72 20 69 73 20 6e 6f 74 20 61 20 72 65 76  tor is not a rev
e960: 65 72 73 65 20 64 69 72 65 63 74 69 6f 6e 20 69  erse direction i
e970: 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  terator..*/.stat
e980: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
e990: 74 65 72 4e 65 78 74 5f 4e 6f 6e 65 28 0a 20 20  terNext_None(.  
e9a0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9c0: 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
e9d0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
e9e0: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
e9f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
ea00: 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
ea10: 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e  ce */.  int *pbN
ea20: 65 77 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  ewTerm          
ea30: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
ea40: 53 65 74 20 66 6f 72 20 6e 65 77 20 74 65 72 6d  Set for new term
ea50: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 4f 66   */.){.  int iOf
ea60: 66 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  f;..  assert( p-
ea70: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
ea80: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 74  ;.  assert( (pIt
ea90: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
eaa0: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
eab0: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
eac0: 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  ( p->pConfig->eD
ead0: 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
eae0: 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 41 53  IL_NONE );..  AS
eaf0: 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70  SERT_SZLEAF_OK(p
eb00: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
eb10: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
eb20: 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a  eafOffset;..  /*
eb30: 20 4e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f   Next entry is o
eb40: 6e 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  n the next page 
eb50: 2a 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  */.  if( pIter->
eb60: 70 53 65 67 20 26 26 20 69 4f 66 66 3e 3d 70 49  pSeg && iOff>=pI
eb70: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
eb80: 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 53 65  af ){.    fts5Se
eb90: 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
eba0: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28   pIter);.    if(
ebb0: 20 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d   p->rc || pIter-
ebc0: 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75  >pLeaf==0 ) retu
ebd0: 72 6e 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  rn;.    pIter->i
ebe0: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 69  Rowid = 0;.    i
ebf0: 4f 66 66 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20  Off = 4;.  }..  
ec00: 69 66 28 20 69 4f 66 66 3c 70 49 74 65 72 2d 3e  if( iOff<pIter->
ec10: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b  iEndofDoclist ){
ec20: 0a 20 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74  .    /* Next ent
ec30: 72 79 20 69 73 20 6f 6e 20 74 68 65 20 63 75 72  ry is on the cur
ec40: 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 20  rent page */.   
ec50: 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20   i64 iDelta;.   
ec60: 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33   iOff += sqlite3
ec70: 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  Fts5GetVarint(&p
ec80: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69  Iter->pLeaf->p[i
ec90: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  Off], (u64*)&iDe
eca0: 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  lta);.    pIter-
ecb0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
ecc0: 4f 66 66 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  Off;.    pIter->
ecd0: 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61  iRowid += iDelta
ece0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70  ;.  }else if( (p
ecf0: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
ed00: 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
ed10: 52 4d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  RM)==0 ){.    if
ed20: 28 20 70 49 74 65 72 2d 3e 70 53 65 67 20 29 7b  ( pIter->pSeg ){
ed30: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 65 70  .      int nKeep
ed40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
ed50: 69 4f 66 66 21 3d 66 74 73 35 4c 65 61 66 46 69  iOff!=fts5LeafFi
ed60: 72 73 74 54 65 72 6d 4f 66 66 28 70 49 74 65 72  rstTermOff(pIter
ed70: 2d 3e 70 4c 65 61 66 29 20 29 7b 0a 20 20 20 20  ->pLeaf) ){.    
ed80: 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
ed90: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  GetVarint32(&pIt
eda0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  er->pLeaf->p[iOf
edb0: 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  f], nKeep);.    
edc0: 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d    }.      pIter-
edd0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
ede0: 4f 66 66 3b 0a 20 20 20 20 20 20 66 74 73 35 53  Off;.      fts5S
edf0: 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70  egIterLoadTerm(p
ee00: 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b  , pIter, nKeep);
ee10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ee20: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73    const u8 *pLis
ee30: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  t = 0;.      con
ee40: 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d  st char *zTerm =
ee50: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c   0;.      int nL
ee60: 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ist;.      sqlit
ee70: 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65  e3Fts5HashScanNe
ee80: 78 74 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20  xt(p->pHash);.  
ee90: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
eea0: 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e  ashScanEntry(p->
eeb0: 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26  pHash, &zTerm, &
eec0: 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a  pList, &nList);.
eed0: 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d        if( pList=
eee0: 3d 30 20 29 20 67 6f 74 6f 20 6e 65 78 74 5f 6e  =0 ) goto next_n
eef0: 6f 6e 65 5f 65 6f 66 3b 0a 20 20 20 20 20 20 70  one_eof;.      p
ef00: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d  Iter->pLeaf->p =
ef10: 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20   (u8*)pList;.   
ef20: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d     pIter->pLeaf-
ef30: 3e 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  >nn = nList;.   
ef40: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d     pIter->pLeaf-
ef50: 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b  >szLeaf = nList;
ef60: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45  .      pIter->iE
ef70: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 6e 4c  ndofDoclist = nL
ef80: 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ist;.      sqlit
ef90: 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28  e3Fts5BufferSet(
efa0: 26 70 2d 3e 72 63 2c 26 70 49 74 65 72 2d 3e 74  &p->rc,&pIter->t
efb0: 65 72 6d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e  erm, (int)strlen
efc0: 28 7a 54 65 72 6d 29 2c 20 28 75 38 2a 29 7a 54  (zTerm), (u8*)zT
efd0: 65 72 6d 29 3b 0a 20 20 20 20 20 20 70 49 74 65  erm);.      pIte
efe0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
eff0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70   fts5GetVarint(p
f000: 4c 69 73 74 2c 20 28 75 36 34 2a 29 26 70 49 74  List, (u64*)&pIt
f010: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
f020: 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 62 4e 65   }..    if( pbNe
f030: 77 54 65 72 6d 20 29 20 2a 70 62 4e 65 77 54 65  wTerm ) *pbNewTe
f040: 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  rm = 1;.  }else{
f050: 0a 20 20 20 20 67 6f 74 6f 20 6e 65 78 74 5f 6e  .    goto next_n
f060: 6f 6e 65 5f 65 6f 66 3b 0a 20 20 7d 0a 0a 20 20  one_eof;.  }..  
f070: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
f080: 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a  Pos(p, pIter);..
f090: 20 20 72 65 74 75 72 6e 3b 0a 20 6e 65 78 74 5f    return;. next_
f0a0: 6e 6f 6e 65 5f 65 6f 66 3a 0a 20 20 66 74 73 35  none_eof:.  fts5
f0b0: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
f0c0: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74  r->pLeaf);.  pIt
f0d0: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 7d  er->pLeaf = 0;.}
f0e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  .../*.** Advance
f0f0: 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   iterator pIter 
f100: 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
f110: 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  y. .**.** If an 
f120: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74  error occurs, Ft
f130: 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65  s5Index.rc is se
f140: 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69  t to an appropri
f150: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ate error code. 
f160: 49 74 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  It .** is not co
f170: 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f  nsidered an erro
f180: 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  r if the iterato
f190: 72 20 72 65 61 63 68 65 73 20 45 4f 46 2e 20 49  r reaches EOF. I
f1a0: 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
f1b0: 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
f1c0: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
f1d0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
f1e0: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
f1f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f200: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
f210: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
f220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f230: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
f240: 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
f250: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
f260: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
f270: 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
f280: 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  vance */.  int *
f290: 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20 20 20  pbNewTerm       
f2a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
f2b0: 54 3a 20 53 65 74 20 66 6f 72 20 6e 65 77 20 74  T: Set for new t
f2c0: 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  erm */.){.  Fts5
f2d0: 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49  Data *pLeaf = pI
f2e0: 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 69 6e  ter->pLeaf;.  in
f2f0: 74 20 69 4f 66 66 3b 0a 20 20 69 6e 74 20 62 4e  t iOff;.  int bN
f300: 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 69 6e  ewTerm = 0;.  in
f310: 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 75  t nKeep = 0;.  u
f320: 38 20 2a 61 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  8 *a;.  int n;..
f330: 20 20 61 73 73 65 72 74 28 20 70 62 4e 65 77 54    assert( pbNewT
f340: 65 72 6d 3d 3d 30 20 7c 7c 20 2a 70 62 4e 65 77  erm==0 || *pbNew
f350: 54 65 72 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Term==0 );.  ass
f360: 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  ert( p->pConfig-
f370: 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44  >eDetail!=FTS5_D
f380: 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20  ETAIL_NONE );.. 
f390: 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74   /* Search for t
f3a0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 6f  he end of the po
f3b0: 73 69 74 69 6f 6e 20 6c 69 73 74 20 77 69 74 68  sition list with
f3c0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  in the current p
f3d0: 61 67 65 2e 20 2a 2f 0a 20 20 61 20 3d 20 70 4c  age. */.  a = pL
f3e0: 65 61 66 2d 3e 70 3b 0a 20 20 6e 20 3d 20 70 4c  eaf->p;.  n = pL
f3f0: 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20  eaf->szLeaf;..  
f400: 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b  ASSERT_SZLEAF_OK
f410: 28 70 4c 65 61 66 29 3b 0a 20 20 69 4f 66 66 20  (pLeaf);.  iOff 
f420: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
f430: 66 73 65 74 20 2b 20 70 49 74 65 72 2d 3e 6e 50  fset + pIter->nP
f440: 6f 73 3b 0a 0a 20 20 69 66 28 20 69 4f 66 66 3c  os;..  if( iOff<
f450: 6e 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  n ){.    /* The 
f460: 6e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e  next entry is on
f470: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
f480: 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
f490: 5f 6e 63 28 20 69 4f 66 66 3c 3d 70 49 74 65 72  _nc( iOff<=pIter
f4a0: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
f4b0: 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e  );.    if( iOff>
f4c0: 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f  =pIter->iEndofDo
f4d0: 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 62  clist ){.      b
f4e0: 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  NewTerm = 1;.   
f4f0: 20 20 20 69 66 28 20 69 4f 66 66 21 3d 66 74 73     if( iOff!=fts
f500: 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66  5LeafFirstTermOf
f510: 66 28 70 4c 65 61 66 29 20 29 7b 0a 20 20 20 20  f(pLeaf) ){.    
f520: 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
f530: 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
f540: 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  Off], nKeep);.  
f550: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
f560: 0a 20 20 20 20 20 20 75 36 34 20 69 44 65 6c 74  .      u64 iDelt
f570: 61 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  a;.      iOff +=
f580: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
f590: 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20  arint(&a[iOff], 
f5a0: 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
f5b0: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d  pIter->iRowid +=
f5c0: 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 61   iDelta;.      a
f5d0: 73 73 65 72 74 5f 6e 63 28 20 69 44 65 6c 74 61  ssert_nc( iDelta
f5e0: 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >0 );.    }.    
f5f0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
f600: 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 7d 65  et = iOff;..  }e
f610: 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 70  lse if( pIter->p
f620: 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f  Seg==0 ){.    co
f630: 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20  nst u8 *pList = 
f640: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
f650: 72 20 2a 7a 54 65 72 6d 20 3d 20 30 3b 0a 20 20  r *zTerm = 0;.  
f660: 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b    int nList = 0;
f670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 49  .    assert( (pI
f680: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
f690: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
f6a0: 4d 29 20 7c 7c 20 70 62 4e 65 77 54 65 72 6d 20  M) || pbNewTerm 
f6b0: 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  );.    if( 0==(p
f6c0: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
f6d0: 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
f6e0: 52 4d 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  RM) ){.      sql
f6f0: 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
f700: 4e 65 78 74 28 70 2d 3e 70 48 61 73 68 29 3b 0a  Next(p->pHash);.
f710: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
f720: 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70  5HashScanEntry(p
f730: 2d 3e 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c  ->pHash, &zTerm,
f740: 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29   &pList, &nList)
f750: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f760: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
f770: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
f780: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
f790: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  .      pIter->pL
f7a0: 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  eaf = 0;.    }el
f7b0: 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  se{.      pIter-
f7c0: 3e 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a  >pLeaf->p = (u8*
f7d0: 29 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49  )pList;.      pI
f7e0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 3d  ter->pLeaf->nn =
f7f0: 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49   nList;.      pI
f800: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
f810: 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20  af = nList;.    
f820: 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
f830: 6f 63 6c 69 73 74 20 3d 20 6e 4c 69 73 74 2b 31  oclist = nList+1
f840: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
f850: 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
f860: 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72  >rc, &pIter->ter
f870: 6d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  m, (int)strlen(z
f880: 54 65 72 6d 29 2c 0a 20 20 20 20 20 20 20 20 20  Term),.         
f890: 20 28 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20   (u8*)zTerm);.  
f8a0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
f8b0: 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74  Offset = fts5Get
f8c0: 56 61 72 69 6e 74 28 70 4c 69 73 74 2c 20 28 75  Varint(pList, (u
f8d0: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
f8e0: 69 64 29 3b 0a 20 20 20 20 20 20 2a 70 62 4e 65  id);.      *pbNe
f8f0: 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 7d  wTerm = 1;.    }
f900: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4f  .  }else{.    iO
f910: 66 66 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 4e  ff = 0;.    /* N
f920: 65 78 74 20 65 6e 74 72 79 20 69 73 20 6e 6f 74  ext entry is not
f930: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
f940: 70 61 67 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c  page */.    whil
f950: 65 28 20 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  e( iOff==0 ){.  
f960: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
f970: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
f980: 29 3b 0a 20 20 20 20 20 20 70 4c 65 61 66 20 3d  );.      pLeaf =
f990: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20   pIter->pLeaf;. 
f9a0: 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d       if( pLeaf==
f9b0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
f9c0: 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f   ASSERT_SZLEAF_O
f9d0: 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  K(pLeaf);.      
f9e0: 69 66 28 20 28 69 4f 66 66 20 3d 20 66 74 73 35  if( (iOff = fts5
f9f0: 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
fa00: 66 28 70 4c 65 61 66 29 29 20 26 26 20 69 4f 66  f(pLeaf)) && iOf
fa10: 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  f<pLeaf->szLeaf 
fa20: 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ){.        iOff 
fa30: 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  += sqlite3Fts5Ge
fa40: 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e  tVarint(&pLeaf->
fa50: 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  p[iOff], (u64*)&
fa60: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
fa70: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
fa80: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
fa90: 66 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  f;..        if( 
faa0: 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d  pLeaf->nn>pLeaf-
fab0: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
fac0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69       pIter->iPgi
fad0: 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73  dxOff = pLeaf->s
fae0: 7a 4c 65 61 66 20 2b 20 66 74 73 35 47 65 74 56  zLeaf + fts5GetV
faf0: 61 72 69 6e 74 33 32 28 0a 20 20 20 20 20 20 20  arint32(.       
fb00: 20 20 20 20 20 20 20 26 70 4c 65 61 66 2d 3e 70         &pLeaf->p
fb10: 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c  [pLeaf->szLeaf],
fb20: 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
fb30: 63 6c 69 73 74 0a 20 20 20 20 20 20 20 20 20 20  clist.          
fb40: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
fb50: 0a 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ..      }.      
fb60: 65 6c 73 65 20 69 66 28 20 70 4c 65 61 66 2d 3e  else if( pLeaf->
fb70: 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  nn>pLeaf->szLeaf
fb80: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65   ){.        pIte
fb90: 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70  r->iPgidxOff = p
fba0: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2b 20 66  Leaf->szLeaf + f
fbb0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 0a  ts5GetVarint32(.
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 26 70 4c 65              &pLe
fbd0: 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c  af->p[pLeaf->szL
fbe0: 65 61 66 5d 2c 20 69 4f 66 66 0a 20 20 20 20 20  eaf], iOff.     
fbf0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
fc00: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
fc10: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20  fset = iOff;.   
fc20: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64       pIter->iEnd
fc30: 6f 66 44 6f 63 6c 69 73 74 20 3d 20 69 4f 66 66  ofDoclist = iOff
fc40: 3b 0a 20 20 20 20 20 20 20 20 62 4e 65 77 54 65  ;.        bNewTe
fc50: 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rm = 1;.      }.
fc60: 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
fc70: 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c   iOff<pLeaf->szL
fc80: 65 61 66 20 29 3b 0a 20 20 20 20 20 20 69 66 28  eaf );.      if(
fc90: 20 69 4f 66 66 3e 70 4c 65 61 66 2d 3e 73 7a 4c   iOff>pLeaf->szL
fca0: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70  eaf ){.        p
fcb0: 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
fcc0: 55 50 54 3b 0a 20 20 20 20 20 20 20 20 72 65 74  UPT;.        ret
fcd0: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
fce0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
fcf0: 63 6b 20 69 66 20 74 68 65 20 69 74 65 72 61 74  ck if the iterat
fd00: 6f 72 20 69 73 20 6e 6f 77 20 61 74 20 45 4f 46  or is now at EOF
fd10: 2e 20 49 66 20 73 6f 2c 20 72 65 74 75 72 6e 20  . If so, return 
fd20: 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20  early. */.  if( 
fd30: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a  pIter->pLeaf ){.
fd40: 20 20 20 20 69 66 28 20 62 4e 65 77 54 65 72 6d      if( bNewTerm
fd50: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49   ){.      if( pI
fd60: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
fd70: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
fd80: 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  M ){.        fts
fd90: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
fda0: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20  er->pLeaf);.    
fdb0: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
fdc0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
fdd0: 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  e{.        fts5S
fde0: 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70  egIterLoadTerm(p
fdf0: 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b  , pIter, nKeep);
fe00: 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
fe10: 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20  IterLoadNPos(p, 
fe20: 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pIter);.        
fe30: 69 66 28 20 70 62 4e 65 77 54 65 72 6d 20 29 20  if( pbNewTerm ) 
fe40: 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a  *pbNewTerm = 1;.
fe50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
fe60: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e{.      /* The 
fe70: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 75 6c 64 20  following could 
fe80: 62 65 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69  be done by calli
fe90: 6e 67 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  ng fts5SegIterLo
fea0: 61 64 4e 50 6f 73 28 29 2e 20 42 75 74 0a 20 20  adNPos(). But.  
feb0: 20 20 20 20 2a 2a 20 74 68 69 73 20 62 6c 6f 63      ** this bloc
fec0: 6b 20 69 73 20 70 61 72 74 69 63 75 6c 61 72 6c  k is particularl
fed0: 79 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 63 72  y performance cr
fee0: 69 74 69 63 61 6c 2c 20 73 6f 20 65 71 75 69 76  itical, so equiv
fef0: 61 6c 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 63  alent.      ** c
ff00: 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 2e 20  ode is inlined. 
ff10: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
ff20: 2a 2a 20 4c 61 74 65 72 3a 20 53 77 69 74 63 68  ** Later: Switch
ff30: 65 64 20 62 61 63 6b 20 74 6f 20 66 74 73 35 53  ed back to fts5S
ff40: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 29  egIterLoadNPos()
ff50: 20 62 65 63 61 75 73 65 20 69 74 20 73 75 70 70   because it supp
ff60: 6f 72 74 73 0a 20 20 20 20 20 20 2a 2a 20 64 65  orts.      ** de
ff70: 74 61 69 6c 3d 6e 6f 6e 65 20 6d 6f 64 65 2e 20  tail=none mode. 
ff80: 4e 6f 74 20 69 64 65 61 6c 2e 0a 20 20 20 20 20  Not ideal..     
ff90: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 53   */.      int nS
ffa0: 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  z;.      assert(
ffb0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
ffc0: 4b 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 46  K );.      fts5F
ffd0: 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70  astGetVarint32(p
ffe0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 2c 20  Iter->pLeaf->p, 
fff0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
10000 65 74 2c 20 6e 53 7a 29 3b 0a 20 20 20 20 20 20  et, nSz);.      
10010 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 28 6e  pIter->bDel = (n
10020 53 7a 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20  Sz & 0x0001);.  
10030 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20      pIter->nPos 
10040 3d 20 6e 53 7a 3e 3e 31 3b 0a 20 20 20 20 20 20  = nSz>>1;.      
10050 61 73 73 65 72 74 5f 6e 63 28 20 70 49 74 65 72  assert_nc( pIter
10060 2d 3e 6e 50 6f 73 3e 3d 30 20 29 3b 0a 20 20 20  ->nPos>=0 );.   
10070 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e   }.  }.}..#defin
10080 65 20 53 57 41 50 56 41 4c 28 54 2c 20 61 2c 20  e SWAPVAL(T, a, 
10090 62 29 20 7b 20 54 20 74 6d 70 3b 20 74 6d 70 3d  b) { T tmp; tmp=
100a0 61 3b 20 61 3d 62 3b 20 62 3d 74 6d 70 3b 20 7d  a; a=b; b=tmp; }
100b0 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 49 6e  ..#define fts5In
100c0 64 65 78 53 6b 69 70 56 61 72 69 6e 74 28 61 2c  dexSkipVarint(a,
100d0 20 69 4f 66 66 29 20 7b 20 20 20 20 20 20 20 20   iOff) {        
100e0 20 20 20 20 5c 0a 20 20 69 6e 74 20 69 45 6e 64      \.  int iEnd
100f0 20 3d 20 69 4f 66 66 2b 39 3b 20 20 20 20 20 20   = iOff+9;      
10100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10110 20 20 20 20 20 20 20 20 5c 0a 20 20 77 68 69 6c          \.  whil
10120 65 28 20 28 61 5b 69 4f 66 66 2b 2b 5d 20 26 20  e( (a[iOff++] & 
10130 30 78 38 30 29 20 26 26 20 69 4f 66 66 3c 69 45  0x80) && iOff<iE
10140 6e 64 20 29 3b 20 20 20 20 20 20 20 5c 0a 7d 0a  nd );       \.}.
10150 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20  ./*.** Iterator 
10160 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20  pIter currently 
10170 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
10180 72 73 74 20 72 6f 77 69 64 20 69 6e 20 61 20 64  rst rowid in a d
10190 6f 63 6c 69 73 74 2e 20 54 68 69 73 0a 2a 2a 20  oclist. This.** 
101a0 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68  function sets th
101b0 65 20 69 74 65 72 61 74 6f 72 20 75 70 20 73 6f  e iterator up so
101c0 20 74 68 61 74 20 69 74 65 72 61 74 65 73 20 69   that iterates i
101d0 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
101e0 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20 64  through.** the d
101f0 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  oclist..*/.stati
10200 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
10210 65 72 52 65 76 65 72 73 65 28 46 74 73 35 49 6e  erReverse(Fts5In
10220 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49  dex *p, Fts5SegI
10230 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46  ter *pIter){.  F
10240 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
10250 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44  lidx = pIter->pD
10260 6c 69 64 78 3b 0a 20 20 46 74 73 35 44 61 74 61  lidx;.  Fts5Data
10270 20 2a 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69   *pLast = 0;.  i
10280 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b  nt pgnoLast = 0;
10290 0a 0a 20 20 69 66 28 20 70 44 6c 69 64 78 20 29  ..  if( pDlidx )
102a0 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69 64  {.    int iSegid
102b0 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e   = pIter->pSeg->
102c0 69 53 65 67 69 64 3b 0a 20 20 20 20 70 67 6e 6f  iSegid;.    pgno
102d0 4c 61 73 74 20 3d 20 66 74 73 35 44 6c 69 64 78  Last = fts5Dlidx
102e0 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
102f0 3b 0a 20 20 20 20 70 4c 61 73 74 20 3d 20 66 74  ;.    pLast = ft
10300 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
10310 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
10320 28 69 53 65 67 69 64 2c 20 70 67 6e 6f 4c 61 73  (iSegid, pgnoLas
10330 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t));.  }else{.  
10340 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
10350 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
10360 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  ;         /* Cur
10370 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a  rent leaf data *
10380 2f 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72 65 6e  /..    /* Curren
10390 74 6c 79 2c 20 46 74 73 35 53 65 67 49 74 65 72  tly, Fts5SegIter
103a0 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f 69  .iLeafOffset poi
103b0 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
103c0 20 62 79 74 65 20 6f 66 0a 20 20 20 20 2a 2a 20   byte of.    ** 
103d0 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 63 6f  position-list co
103e0 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20 63 75  ntent for the cu
103f0 72 72 65 6e 74 20 72 6f 77 69 64 2e 20 42 61 63  rrent rowid. Bac
10400 6b 20 69 74 20 75 70 20 73 6f 20 74 68 61 74 20  k it up so that 
10410 69 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 73  it.    ** points
10420 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
10430 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
10440 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 2a  st size field. *
10450 2f 0a 20 20 20 20 69 6e 74 20 69 50 6f 73 6c 69  /.    int iPosli
10460 73 74 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  st;.    if( pIte
10470 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  r->iTermLeafPgno
10480 3d 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  ==pIter->iLeafPg
10490 6e 6f 20 29 7b 0a 20 20 20 20 20 20 69 50 6f 73  no ){.      iPos
104a0 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 69 54  list = pIter->iT
104b0 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20  ermLeafOffset;. 
104c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
104d0 69 50 6f 73 6c 69 73 74 20 3d 20 34 3b 0a 20 20  iPoslist = 4;.  
104e0 20 20 7d 0a 20 20 20 20 66 74 73 35 49 6e 64 65    }.    fts5Inde
104f0 78 53 6b 69 70 56 61 72 69 6e 74 28 70 4c 65 61  xSkipVarint(pLea
10500 66 2d 3e 70 2c 20 69 50 6f 73 6c 69 73 74 29 3b  f->p, iPoslist);
10510 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
10520 66 4f 66 66 73 65 74 20 3d 20 69 50 6f 73 6c 69  fOffset = iPosli
10530 73 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  st;..    /* If t
10540 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
10550 20 74 72 75 65 20 74 68 65 6e 20 74 68 65 20 6c   true then the l
10560 61 72 67 65 73 74 20 72 6f 77 69 64 20 66 6f 72  argest rowid for
10570 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20   the current.   
10580 20 2a 2a 20 74 65 72 6d 20 6d 61 79 20 6e 6f 74   ** term may not
10590 20 62 65 20 73 74 6f 72 65 64 20 6f 6e 20 74 68   be stored on th
105a0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
105b0 53 6f 20 73 65 61 72 63 68 20 66 6f 72 77 61 72  So search forwar
105c0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65 65 20  d to.    ** see 
105d0 77 68 65 72 65 20 73 61 69 64 20 72 6f 77 69 64  where said rowid
105e0 20 72 65 61 6c 6c 79 20 69 73 2e 20 20 2a 2f 0a   really is.  */.
105f0 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
10600 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3e 3d 70 4c  EndofDoclist>=pL
10610 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
10620 20 20 20 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20       int pgno;. 
10630 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
10640 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
10650 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 0a  = pIter->pSeg;..
10660 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 61 73        /* The las
10670 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64  t rowid in the d
10680 6f 63 6c 69 73 74 20 6d 61 79 20 6e 6f 74 20 62  oclist may not b
10690 65 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e on the current
106a0 20 70 61 67 65 2e 20 53 65 61 72 63 68 0a 20 20   page. Search.  
106b0 20 20 20 20 2a 2a 20 66 6f 72 77 61 72 64 20 74      ** forward t
106c0 6f 20 66 69 6e 64 20 74 68 65 20 70 61 67 65 20  o find the page 
106d0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c  containing the l
106e0 61 73 74 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20  ast rowid.  */. 
106f0 20 20 20 20 20 66 6f 72 28 70 67 6e 6f 3d 70 49       for(pgno=pI
10700 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 31  ter->iLeafPgno+1
10710 3b 20 21 70 2d 3e 72 63 20 26 26 20 70 67 6e 6f  ; !p->rc && pgno
10720 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  <=pSeg->pgnoLast
10730 3b 20 70 67 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20  ; pgno++){.     
10740 20 20 20 69 36 34 20 69 41 62 73 20 3d 20 46 54     i64 iAbs = FT
10750 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
10760 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70  (pSeg->iSegid, p
10770 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 46 74  gno);.        Ft
10780 73 35 44 61 74 61 20 2a 70 4e 65 77 20 3d 20 66  s5Data *pNew = f
10790 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
107a0 41 62 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Abs);.        if
107b0 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
107c0 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 2c 20      int iRowid, 
107d0 62 54 65 72 6d 6c 65 73 73 3b 0a 20 20 20 20 20  bTermless;.     
107e0 20 20 20 20 20 69 52 6f 77 69 64 20 3d 20 66 74       iRowid = ft
107f0 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
10800 4f 66 66 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  Off(pNew);.     
10810 20 20 20 20 20 62 54 65 72 6d 6c 65 73 73 20 3d       bTermless =
10820 20 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c   fts5LeafIsTerml
10830 65 73 73 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ess(pNew);.     
10840 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 20       if( iRowid 
10850 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  ){.            S
10860 57 41 50 56 41 4c 28 46 74 73 35 44 61 74 61 2a  WAPVAL(Fts5Data*
10870 2c 20 70 4e 65 77 2c 20 70 4c 61 73 74 29 3b 0a  , pNew, pLast);.
10880 20 20 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f              pgno
10890 4c 61 73 74 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Last = pgno;.   
108a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
108b0 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
108c0 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  se(pNew);.      
108d0 20 20 20 20 69 66 28 20 62 54 65 72 6d 6c 65 73      if( bTermles
108e0 73 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  s==0 ) break;.  
108f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10900 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10910 49 66 20 70 4c 61 73 74 20 69 73 20 4e 55 4c 4c  If pLast is NULL
10920 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
10930 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f  then the last ro
10940 77 69 64 20 66 6f 72 20 74 68 69 73 20 64 6f 63  wid for this doc
10950 6c 69 73 74 0a 20 20 2a 2a 20 6c 69 65 73 20 6f  list.  ** lies o
10960 6e 20 74 68 65 20 70 61 67 65 20 63 75 72 72 65  n the page curre
10970 6e 74 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62  ntly indicated b
10980 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 2e 20  y the iterator. 
10990 49 6e 20 74 68 69 73 20 63 61 73 65 20 0a 20 20  In this case .  
109a0 2a 2a 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f  ** pIter->iLeafO
109b0 66 66 73 65 74 20 69 73 20 61 6c 72 65 61 64 79  ffset is already
109c0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
109d0 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
109e0 73 74 20 73 69 7a 65 0a 20 20 2a 2a 20 66 69 65  st size.  ** fie
109f0 6c 64 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ld associated wi
10a00 74 68 20 74 68 65 20 66 69 72 73 74 20 72 65 6c  th the first rel
10a10 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74  evant rowid on t
10a20 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20  he page..  **.  
10a30 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 61 73 74 20  ** Or, if pLast 
10a40 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
10a50 6e 20 69 74 20 69 73 20 74 68 65 20 70 61 67 65  n it is the page
10a60 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
10a70 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20 72 6f 77  he last.  ** row
10a80 69 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  id. In this case
10a90 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 69   configure the i
10aa0 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20  terator so that 
10ab0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
10ac0 0a 20 20 2a 2a 20 66 69 72 73 74 20 72 6f 77 69  .  ** first rowi
10ad0 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 0a  d on this page..
10ae0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74    */.  if( pLast
10af0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66   ){.    int iOff
10b00 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  ;.    fts5DataRe
10b10 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
10b20 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  af);.    pIter->
10b30 70 4c 65 61 66 20 3d 20 70 4c 61 73 74 3b 0a 20  pLeaf = pLast;. 
10b40 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50     pIter->iLeafP
10b50 67 6e 6f 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a  gno = pgnoLast;.
10b60 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 4c      iOff = fts5L
10b70 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
10b80 28 70 4c 61 73 74 29 3b 0a 20 20 20 20 69 4f 66  (pLast);.    iOf
10b90 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
10ba0 6e 74 28 26 70 4c 61 73 74 2d 3e 70 5b 69 4f 66  nt(&pLast->p[iOf
10bb0 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  f], (u64*)&pIter
10bc0 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70  ->iRowid);.    p
10bd0 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
10be0 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20 20 69  t = iOff;..    i
10bf0 66 28 20 66 74 73 35 4c 65 61 66 49 73 54 65 72  f( fts5LeafIsTer
10c00 6d 6c 65 73 73 28 70 4c 61 73 74 29 20 29 7b 0a  mless(pLast) ){.
10c10 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e        pIter->iEn
10c20 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c 61  dofDoclist = pLa
10c30 73 74 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65  st->nn+1;.    }e
10c40 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72  lse{.      pIter
10c50 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
10c60 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 54  = fts5LeafFirstT
10c70 65 72 6d 4f 66 66 28 70 4c 61 73 74 29 3b 0a 20  ermOff(pLast);. 
10c80 20 20 20 7d 0a 0a 20 20 7d 0a 0a 20 20 66 74 73     }..  }..  fts
10c90 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49  5SegIterReverseI
10ca0 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  nitPage(p, pIter
10cb0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72  );.}../*.** Iter
10cc0 61 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65  ator pIter curre
10cd0 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
10ce0 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
10cf0 66 20 61 20 64 6f 63 6c 69 73 74 2e 0a 2a 2a 20  f a doclist..** 
10d00 54 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69  There is a docli
10d10 73 74 2d 69 6e 64 65 78 20 61 73 73 6f 63 69 61  st-index associa
10d20 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6e  ted with the fin
10d30 61 6c 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 63  al term on the c
10d40 75 72 72 65 6e 74 20 0a 2a 2a 20 70 61 67 65 2e  urrent .** page.
10d50 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
10d60 74 65 72 6d 20 69 73 20 74 68 65 20 6c 61 73 74  term is the last
10d70 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 70 61 67   term on the pag
10d80 65 2c 20 6c 6f 61 64 20 74 68 65 20 0a 2a 2a 20  e, load the .** 
10d90 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 72  doclist-index fr
10da0 6f 6d 20 64 69 73 6b 20 61 6e 64 20 69 6e 69 74  om disk and init
10db0 69 61 6c 69 7a 65 20 61 6e 20 69 74 65 72 61 74  ialize an iterat
10dc0 6f 72 20 61 74 20 28 70 49 74 65 72 2d 3e 70 44  or at (pIter->pD
10dd0 6c 69 64 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  lidx)..*/.static
10de0 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
10df0 72 4c 6f 61 64 44 6c 69 64 78 28 46 74 73 35 49  rLoadDlidx(Fts5I
10e00 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
10e10 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
10e20 69 6e 74 20 69 53 65 67 20 3d 20 70 49 74 65 72  int iSeg = pIter
10e30 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  ->pSeg->iSegid;.
10e40 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28 70 49    int bRev = (pI
10e50 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
10e60 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
10e70 45 29 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  E);.  Fts5Data *
10e80 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
10e90 4c 65 61 66 3b 20 2f 2a 20 43 75 72 72 65 6e 74  Leaf; /* Current
10ea0 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20   leaf data */.. 
10eb0 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
10ec0 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
10ed0 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a  ITER_ONETERM );.
10ee0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
10ef0 3e 70 44 6c 69 64 78 3d 3d 30 20 29 3b 0a 0a 20  >pDlidx==0 );.. 
10f00 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
10f10 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74   current doclist
10f20 20 65 6e 64 73 20 6f 6e 20 74 68 69 73 20 70 61   ends on this pa
10f30 67 65 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20  ge. If it does, 
10f40 72 65 74 75 72 6e 0a 20 20 2a 2a 20 65 61 72 6c  return.  ** earl
10f50 79 20 77 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e  y without loadin
10f60 67 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  g the doclist-in
10f70 64 65 78 20 28 61 73 20 69 74 20 62 65 6c 6f 6e  dex (as it belon
10f80 67 73 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  gs to a differen
10f90 74 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 2a 2f 0a  t.  ** term. */.
10fa0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65    if( pIter->iTe
10fb0 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65  rmLeafPgno==pIte
10fc0 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 0a 20 20  r->iLeafPgno .  
10fd0 20 26 26 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f   && pIter->iEndo
10fe0 66 44 6f 63 6c 69 73 74 3c 70 4c 65 61 66 2d 3e  fDoclist<pLeaf->
10ff0 73 7a 4c 65 61 66 20 0a 20 20 29 7b 0a 20 20 20  szLeaf .  ){.   
11000 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
11010 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 3d 20  pIter->pDlidx = 
11020 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
11030 74 28 70 2c 20 62 52 65 76 2c 20 69 53 65 67 2c  t(p, bRev, iSeg,
11040 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
11050 66 50 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  fPgno);.}../*.**
11060 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62   The iterator ob
11070 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
11080 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
11090 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  nt currently con
110a0 74 61 69 6e 73 0a 2a 2a 20 6e 6f 20 76 61 6c 69  tains.** no vali
110b0 64 20 76 61 6c 75 65 73 20 65 78 63 65 70 74 20  d values except 
110c0 66 6f 72 20 74 68 65 20 46 74 73 35 53 65 67 49  for the Fts5SegI
110d0 74 65 72 2e 70 4c 65 61 66 20 6d 65 6d 62 65 72  ter.pLeaf member
110e0 20 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73 0a   variable. This.
110f0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72  ** function sear
11100 63 68 65 73 20 74 68 65 20 6c 65 61 66 20 70 61  ches the leaf pa
11110 67 65 20 66 6f 72 20 61 20 74 65 72 6d 20 6d 61  ge for a term ma
11120 74 63 68 69 6e 67 20 28 70 54 65 72 6d 2f 6e 54  tching (pTerm/nT
11130 65 72 6d 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  erm)..**.** If t
11140 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72  he specified ter
11150 6d 20 69 73 20 66 6f 75 6e 64 20 6f 6e 20 74 68  m is found on th
11160 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  e page, then the
11170 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66   iterator is lef
11180 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f  t.** pointing to
11190 20 69 74 2e 20 49 66 20 61 72 67 75 6d 65 6e 74   it. If argument
111a0 20 62 47 65 20 69 73 20 7a 65 72 6f 20 61 6e 64   bGe is zero and
111b0 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74   the term is not
111c0 20 66 6f 75 6e 64 2c 0a 2a 2a 20 74 68 65 20 69   found,.** the i
111d0 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20  terator is left 
111e0 70 6f 69 6e 74 69 6e 67 20 61 74 20 45 4f 46 2e  pointing at EOF.
111f0 0a 2a 2a 0a 2a 2a 20 49 66 20 62 47 65 20 69 73  .**.** If bGe is
11200 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
11210 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d  e specified term
11220 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74   is not found, t
11230 68 65 6e 20 74 68 65 0a 2a 2a 20 69 74 65 72 61  hen the.** itera
11240 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  tor is left poin
11250 74 69 6e 67 20 74 6f 20 74 68 65 20 73 6d 61 6c  ting to the smal
11260 6c 65 73 74 20 74 65 72 6d 20 69 6e 20 74 68 65  lest term in the
11270 20 73 65 67 6d 65 6e 74 20 74 68 61 74 0a 2a 2a   segment that.**
11280 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
11290 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
112a0 72 6d 2c 20 65 76 65 6e 20 69 66 20 74 68 69 73  rm, even if this
112b0 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 6f 6e 20   term is not on 
112c0 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70  the.** current p
112d0 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
112e0 6f 69 64 20 66 74 73 35 4c 65 61 66 53 65 65 6b  oid fts5LeafSeek
112f0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
11300 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11310 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 61 6e 79      /* Leave any
11320 20 65 72 72 6f 72 20 63 6f 64 65 20 68 65 72 65   error code here
11330 20 2a 2f 0a 20 20 69 6e 74 20 62 47 65 2c 20 20   */.  int bGe,  
11340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11350 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
11360 72 20 61 20 3e 3d 20 73 65 61 72 63 68 20 2a 2f  r a >= search */
11370 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
11380 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
11390 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
113a0 6f 20 73 65 65 6b 20 2a 2f 0a 20 20 63 6f 6e 73  o seek */.  cons
113b0 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74  t u8 *pTerm, int
113c0 20 6e 54 65 72 6d 20 20 20 20 20 20 2f 2a 20 54   nTerm      /* T
113d0 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 66 6f  erm to search fo
113e0 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 4f  r */.){.  int iO
113f0 66 66 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  ff;.  const u8 *
11400 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
11410 2d 3e 70 3b 0a 20 20 69 6e 74 20 73 7a 4c 65 61  ->p;.  int szLea
11420 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
11430 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 69 6e 74 20  ->szLeaf;.  int 
11440 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  n = pIter->pLeaf
11450 2d 3e 6e 6e 3b 0a 0a 20 20 69 6e 74 20 6e 4d 61  ->nn;..  int nMa
11460 74 63 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  tch = 0;.  int n
11470 4b 65 65 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Keep = 0;.  int 
11480 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nNew = 0;.  int 
11490 69 54 65 72 6d 4f 66 66 3b 0a 20 20 69 6e 74 20  iTermOff;.  int 
114a0 69 50 67 69 64 78 3b 20 20 20 20 20 20 20 20 20  iPgidx;         
114b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
114c0 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20 69 6e  urrent offset in
114d0 20 70 67 69 64 78 20 2a 2f 0a 20 20 69 6e 74 20   pgidx */.  int 
114e0 62 45 6e 64 4f 66 50 61 67 65 20 3d 20 30 3b 0a  bEndOfPage = 0;.
114f0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
11500 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
11510 20 20 69 50 67 69 64 78 20 3d 20 73 7a 4c 65 61    iPgidx = szLea
11520 66 3b 0a 20 20 69 50 67 69 64 78 20 2b 3d 20 66  f;.  iPgidx += f
11530 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
11540 61 5b 69 50 67 69 64 78 5d 2c 20 69 54 65 72 6d  a[iPgidx], iTerm
11550 4f 66 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 69  Off);.  iOff = i
11560 54 65 72 6d 4f 66 66 3b 0a 20 20 69 66 28 20 69  TermOff;.  if( i
11570 4f 66 66 3e 6e 20 29 7b 0a 20 20 20 20 70 2d 3e  Off>n ){.    p->
11580 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
11590 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
115a0 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29   }..  while( 1 )
115b0 7b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  {..    /* Figure
115c0 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6e 65   out how many ne
115d0 77 20 62 79 74 65 73 20 61 72 65 20 69 6e 20 74  w bytes are in t
115e0 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  his term */.    
115f0 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
11600 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e 4e 65  t32(a, iOff, nNe
11610 77 29 3b 0a 20 20 20 20 69 66 28 20 6e 4b 65 65  w);.    if( nKee
11620 70 3c 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20  p<nMatch ){.    
11630 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61    goto search_fa
11640 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iled;.    }..   
11650 20 61 73 73 65 72 74 28 20 6e 4b 65 65 70 3e 3d   assert( nKeep>=
11660 6e 4d 61 74 63 68 20 29 3b 0a 20 20 20 20 69 66  nMatch );.    if
11670 28 20 6e 4b 65 65 70 3d 3d 6e 4d 61 74 63 68 20  ( nKeep==nMatch 
11680 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6d  ){.      int nCm
11690 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  p;.      int i;.
116a0 20 20 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e        nCmp = MIN
116b0 28 6e 4e 65 77 2c 20 6e 54 65 72 6d 2d 6e 4d 61  (nNew, nTerm-nMa
116c0 74 63 68 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  tch);.      for(
116d0 69 3d 30 3b 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b  i=0; i<nCmp; i++
116e0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
116f0 5b 69 4f 66 66 2b 69 5d 21 3d 70 54 65 72 6d 5b  [iOff+i]!=pTerm[
11700 6e 4d 61 74 63 68 2b 69 5d 20 29 20 62 72 65 61  nMatch+i] ) brea
11710 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
11720 20 6e 4d 61 74 63 68 20 2b 3d 20 69 3b 0a 0a 20   nMatch += i;.. 
11730 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d       if( nTerm==
11740 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  nMatch ){.      
11750 20 20 69 66 28 20 69 3d 3d 6e 4e 65 77 20 29 7b    if( i==nNew ){
11760 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
11770 73 65 61 72 63 68 5f 73 75 63 63 65 73 73 3b 0a  search_success;.
11780 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
11790 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
117a0 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20  arch_failed;.   
117b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
117c0 73 65 20 69 66 28 20 69 3c 6e 4e 65 77 20 26 26  se if( i<nNew &&
117d0 20 61 5b 69 4f 66 66 2b 69 5d 3e 70 54 65 72 6d   a[iOff+i]>pTerm
117e0 5b 6e 4d 61 74 63 68 5d 20 29 7b 0a 20 20 20 20  [nMatch] ){.    
117f0 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f      goto search_
11800 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
11810 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
11820 50 67 69 64 78 3e 3d 6e 20 29 7b 0a 20 20 20 20  Pgidx>=n ){.    
11830 20 20 62 45 6e 64 4f 66 50 61 67 65 20 3d 20 31    bEndOfPage = 1
11840 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
11850 20 20 20 7d 0a 0a 20 20 20 20 69 50 67 69 64 78     }..    iPgidx
11860 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
11870 74 33 32 28 26 61 5b 69 50 67 69 64 78 5d 2c 20  t32(&a[iPgidx], 
11880 6e 4b 65 65 70 29 3b 0a 20 20 20 20 69 54 65 72  nKeep);.    iTer
11890 6d 4f 66 66 20 2b 3d 20 6e 4b 65 65 70 3b 0a 20  mOff += nKeep;. 
118a0 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f     iOff = iTermO
118b0 66 66 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  ff;..    /* Read
118c0 20 74 68 65 20 6e 4b 65 65 70 20 66 69 65 6c 64   the nKeep field
118d0 20 6f 66 20 74 68 65 20 6e 65 78 74 20 74 65 72   of the next ter
118e0 6d 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 46 61  m. */.    fts5Fa
118f0 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c  stGetVarint32(a,
11900 20 69 4f 66 66 2c 20 6e 4b 65 65 70 29 3b 0a 20   iOff, nKeep);. 
11910 20 7d 0a 0a 20 73 65 61 72 63 68 5f 66 61 69 6c   }.. search_fail
11920 65 64 3a 0a 20 20 69 66 28 20 62 47 65 3d 3d 30  ed:.  if( bGe==0
11930 20 29 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61   ){.    fts5Data
11940 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
11950 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72  Leaf);.    pIter
11960 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  ->pLeaf = 0;.   
11970 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65   return;.  }else
11980 20 69 66 28 20 62 45 6e 64 4f 66 50 61 67 65 20   if( bEndOfPage 
11990 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  ){.    do {.    
119a0 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
119b0 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
119c0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
119d0 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74  ->pLeaf==0 ) ret
119e0 75 72 6e 3b 0a 20 20 20 20 20 20 61 20 3d 20 70  urn;.      a = p
119f0 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a  Iter->pLeaf->p;.
11a00 20 20 20 20 20 20 69 66 28 20 66 74 73 35 4c 65        if( fts5Le
11a10 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 49 74  afIsTermless(pIt
11a20 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 30 20 29 7b  er->pLeaf)==0 ){
11a30 0a 20 20 20 20 20 20 20 20 69 50 67 69 64 78 20  .        iPgidx 
11a40 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
11a50 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20  szLeaf;.        
11a60 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65  iPgidx += fts5Ge
11a70 74 56 61 72 69 6e 74 33 32 28 26 70 49 74 65 72  tVarint32(&pIter
11a80 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 50 67 69 64  ->pLeaf->p[iPgid
11a90 78 5d 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 20  x], iOff);.     
11aa0 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c     if( iOff<4 ||
11ab0 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c   iOff>=pIter->pL
11ac0 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
11ad0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
11ae0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
11af0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
11b00 20 20 20 20 20 20 20 20 6e 4b 65 65 70 20 3d 20          nKeep = 
11b10 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 54 65  0;.          iTe
11b20 72 6d 4f 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20  rmOff = iOff;.  
11b30 20 20 20 20 20 20 20 20 6e 20 3d 20 70 49 74 65          n = pIte
11b40 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 20 20  r->pLeaf->nn;.  
11b50 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
11b60 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
11b70 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b  &a[iOff], nNew);
11b80 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
11b90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11ba0 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20    }.    }while( 
11bb0 31 20 29 3b 0a 20 20 7d 0a 0a 20 73 65 61 72 63  1 );.  }.. searc
11bc0 68 5f 73 75 63 63 65 73 73 3a 0a 0a 20 20 70 49  h_success:..  pI
11bd0 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
11be0 20 3d 20 69 4f 66 66 20 2b 20 6e 4e 65 77 3b 0a   = iOff + nNew;.
11bf0 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65    pIter->iTermLe
11c00 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72  afOffset = pIter
11c10 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20  ->iLeafOffset;. 
11c20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
11c30 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69  fPgno = pIter->i
11c40 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20 20 66 74 73  LeafPgno;..  fts
11c50 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
11c60 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  c, &pIter->term,
11c70 20 6e 4b 65 65 70 2c 20 70 54 65 72 6d 29 3b 0a   nKeep, pTerm);.
11c80 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
11c90 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
11ca0 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65  pIter->term, nNe
11cb0 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 0a 20  w, &a[iOff]);.. 
11cc0 20 69 66 28 20 69 50 67 69 64 78 3e 3d 6e 20 29   if( iPgidx>=n )
11cd0 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e  {.    pIter->iEn
11ce0 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 49 74  dofDoclist = pIt
11cf0 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b  er->pLeaf->nn+1;
11d00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
11d10 74 20 6e 45 78 74 72 61 3b 0a 20 20 20 20 69 50  t nExtra;.    iP
11d20 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56  gidx += fts5GetV
11d30 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64  arint32(&a[iPgid
11d40 78 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 20  x], nExtra);.   
11d50 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
11d60 63 6c 69 73 74 20 3d 20 69 54 65 72 6d 4f 66 66  clist = iTermOff
11d70 20 2b 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 20   + nExtra;.  }. 
11d80 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
11d90 66 20 3d 20 69 50 67 69 64 78 3b 0a 0a 20 20 66  f = iPgidx;..  f
11da0 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52 6f  ts5SegIterLoadRo
11db0 77 69 64 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  wid(p, pIter);. 
11dc0 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
11dd0 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
11de0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
11df0 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70  ize the object p
11e00 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  Iter to point to
11e10 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72   term pTerm/nTer
11e20 6d 20 77 69 74 68 69 6e 20 73 65 67 6d 65 6e 74  m within segment
11e30 0a 2a 2a 20 70 53 65 67 2e 20 49 66 20 74 68 65  .** pSeg. If the
11e40 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65  re is no such te
11e50 72 6d 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c  rm in the index,
11e60 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
11e70 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a   set to EOF..**.
11e80 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
11e90 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78  ccurs, Fts5Index
11ea0 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e  .rc is set to an
11eb0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
11ec0 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20  or code. If .** 
11ed0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
11ee0 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68  eady occurred wh
11ef0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
11f00 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
11f10 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
11f20 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
11f30 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28 0a 20  gIterSeekInit(. 
11f40 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
11f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f60 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
11f70 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
11f80 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d  pTerm, int nTerm
11f90 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f  ,     /* Term to
11fa0 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e   seek to */.  in
11fb0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
11fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11fd0 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44   Mask of FTS5IND
11fe0 45 58 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a  EX_XXX flags */.
11ff0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
12000 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20  egment *pSeg,   
12010 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
12020 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20   of segment */. 
12030 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
12040 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ter             
12050 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f   /* Object to po
12060 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69  pulate */.){.  i
12070 6e 74 20 69 50 67 20 3d 20 31 3b 0a 20 20 69 6e  nt iPg = 1;.  in
12080 74 20 62 47 65 20 3d 20 28 66 6c 61 67 73 20 26  t bGe = (flags &
12090 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
120a0 5f 53 43 41 4e 29 3b 0a 20 20 69 6e 74 20 62 44  _SCAN);.  int bD
120b0 6c 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20  lidx = 0;       
120c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
120d0 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  e if there is a 
120e0 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f  doclist-index */
120f0 0a 0a 20 20 61 73 73 65 72 74 28 20 62 47 65 3d  ..  assert( bGe=
12100 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46  =0 || (flags & F
12110 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
12120 45 53 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ESC)==0 );.  ass
12130 65 72 74 28 20 70 54 65 72 6d 20 26 26 20 6e 54  ert( pTerm && nT
12140 65 72 6d 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  erm );.  memset(
12150 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
12160 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74  (*pIter));.  pIt
12170 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b  er->pSeg = pSeg;
12180 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63  ..  /* This bloc
12190 6b 20 73 65 74 73 20 73 74 61 63 6b 20 76 61 72  k sets stack var
121a0 69 61 62 6c 65 20 69 50 67 20 74 6f 20 74 68 65  iable iPg to the
121b0 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
121c0 72 20 74 68 61 74 20 6d 61 79 0a 20 20 2a 2a 20  r that may.  ** 
121d0 63 6f 6e 74 61 69 6e 20 74 65 72 6d 20 28 70 54  contain term (pT
121e0 65 72 6d 2f 6e 54 65 72 6d 29 2c 20 69 66 20 69  erm/nTerm), if i
121f0 74 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20  t is present in 
12200 74 68 65 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a  the segment. */.
12210 20 20 69 66 28 20 70 2d 3e 70 49 64 78 53 65 6c    if( p->pIdxSel
12220 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74  ect==0 ){.    Ft
12230 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
12240 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
12250 20 20 20 20 66 74 73 35 49 6e 64 65 78 50 72 65      fts5IndexPre
12260 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e  pareStmt(p, &p->
12270 70 49 64 78 53 65 6c 65 63 74 2c 20 73 71 6c 69  pIdxSelect, sqli
12280 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
12290 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 70         "SELECT p
122a0 67 6e 6f 20 46 52 4f 4d 20 27 25 71 27 2e 27 25  gno FROM '%q'.'%
122b0 71 5f 69 64 78 27 20 57 48 45 52 45 20 22 0a 20  q_idx' WHERE ". 
122c0 20 20 20 20 20 20 20 20 20 22 73 65 67 69 64 3d           "segid=
122d0 3f 20 41 4e 44 20 74 65 72 6d 3c 3d 3f 20 4f 52  ? AND term<=? OR
122e0 44 45 52 20 42 59 20 74 65 72 6d 20 44 45 53 43  DER BY term DESC
122f0 20 4c 49 4d 49 54 20 31 22 2c 0a 20 20 20 20 20   LIMIT 1",.     
12300 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
12310 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  b, pConfig->zNam
12320 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20  e.    ));.  }.  
12330 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75  if( p->rc ) retu
12340 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  rn;.  sqlite3_bi
12350 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 53 65  nd_int(p->pIdxSe
12360 6c 65 63 74 2c 20 31 2c 20 70 53 65 67 2d 3e 69  lect, 1, pSeg->i
12370 53 65 67 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Segid);.  sqlite
12380 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70  3_bind_blob(p->p
12390 49 64 78 53 65 6c 65 63 74 2c 20 32 2c 20 70 54  IdxSelect, 2, pT
123a0 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 53 51 4c 49  erm, nTerm, SQLI
123b0 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66  TE_STATIC);.  if
123c0 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
123d0 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49  lite3_step(p->pI
123e0 64 78 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  dxSelect) ){.   
123f0 20 69 36 34 20 76 61 6c 20 3d 20 73 71 6c 69 74   i64 val = sqlit
12400 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 2d  e3_column_int(p-
12410 3e 70 49 64 78 53 65 6c 65 63 74 2c 20 30 29 3b  >pIdxSelect, 0);
12420 0a 20 20 20 20 69 50 67 20 3d 20 28 69 6e 74 29  .    iPg = (int)
12430 28 76 61 6c 3e 3e 31 29 3b 0a 20 20 20 20 62 44  (val>>1);.    bD
12440 6c 69 64 78 20 3d 20 28 76 61 6c 20 26 20 30 78  lidx = (val & 0x
12450 30 30 30 31 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  0001);.  }.  p->
12460 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
12470 65 74 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74  et(p->pIdxSelect
12480 29 3b 0a 0a 20 20 69 66 28 20 69 50 67 3c 70 53  );..  if( iPg<pS
12490 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b  eg->pgnoFirst ){
124a0 0a 20 20 20 20 69 50 67 20 3d 20 70 53 65 67 2d  .    iPg = pSeg-
124b0 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20  >pgnoFirst;.    
124c0 62 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a  bDlidx = 0;.  }.
124d0 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  .  pIter->iLeafP
124e0 67 6e 6f 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20  gno = iPg - 1;. 
124f0 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
12500 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
12510 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c  .  if( pIter->pL
12520 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 4c  eaf ){.    fts5L
12530 65 61 66 53 65 65 6b 28 70 2c 20 62 47 65 2c 20  eafSeek(p, bGe, 
12540 70 49 74 65 72 2c 20 70 54 65 72 6d 2c 20 6e 54  pIter, pTerm, nT
12550 65 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  erm);.  }..  if(
12560 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
12570 4b 20 26 26 20 62 47 65 3d 3d 30 20 29 7b 0a 20  K && bGe==0 ){. 
12580 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20     pIter->flags 
12590 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  |= FTS5_SEGITER_
125a0 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28  ONETERM;.    if(
125b0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b   pIter->pLeaf ){
125c0 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73  .      if( flags
125d0 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
125e0 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20  RY_DESC ){.     
125f0 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20     pIter->flags 
12600 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  |= FTS5_SEGITER_
12610 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 7d  REVERSE;.      }
12620 0a 20 20 20 20 20 20 69 66 28 20 62 44 6c 69 64  .      if( bDlid
12630 78 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  x ){.        fts
12640 35 53 65 67 49 74 65 72 4c 6f 61 64 44 6c 69 64  5SegIterLoadDlid
12650 78 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  x(p, pIter);.   
12660 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66     }.      if( f
12670 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
12680 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20  _QUERY_DESC ){. 
12690 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
126a0 65 72 52 65 76 65 72 73 65 28 70 2c 20 70 49 74  erReverse(p, pIt
126b0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
126c0 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65   }.  }..  fts5Se
126d0 67 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20  gIterSetNext(p, 
126e0 70 49 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 45 69  pIter);..  /* Ei
126f0 74 68 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ther:.  **.  ** 
12700 20 20 31 29 20 61 6e 20 65 72 72 6f 72 20 68 61    1) an error ha
12710 73 20 6f 63 63 75 72 72 65 64 2c 20 6f 72 0a 20  s occurred, or. 
12720 20 2a 2a 20 20 20 32 29 20 74 68 65 20 69 74 65   **   2) the ite
12730 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20  rator points to 
12740 45 4f 46 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 33  EOF, or.  **   3
12750 29 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  ) the iterator p
12760 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72  oints to an entr
12770 79 20 77 69 74 68 20 74 65 72 6d 20 28 70 54 65  y with term (pTe
12780 72 6d 2f 6e 54 65 72 6d 29 2c 20 6f 72 0a 20 20  rm/nTerm), or.  
12790 2a 2a 20 20 20 34 29 20 74 68 65 20 46 54 53 35  **   4) the FTS5
127a0 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
127b0 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 61 6e   flag was set an
127c0 64 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  d the iterator p
127d0 6f 69 6e 74 73 0a 20 20 2a 2a 20 20 20 20 20 20  oints.  **      
127e0 74 6f 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68  to an entry with
127f0 20 61 20 74 65 72 6d 20 67 72 65 61 74 65 72 20   a term greater 
12800 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
12810 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a   (pTerm/nTerm)..
12820 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
12830 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
12840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12860 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2a 2f           /* 1 */
12870 0a 20 20 20 7c 7c 20 70 49 74 65 72 2d 3e 70 4c  .   || pIter->pL
12880 65 61 66 3d 3d 30 20 20 20 20 20 20 20 20 20 20  eaf==0          
12890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128b0 20 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20       /* 2 */.   
128c0 7c 7c 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d  || fts5BufferCom
128d0 70 61 72 65 42 6c 6f 62 28 26 70 49 74 65 72 2d  pareBlob(&pIter-
128e0 3e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54  >term, pTerm, nT
128f0 65 72 6d 29 3d 3d 30 20 20 20 20 20 20 20 20 20  erm)==0         
12900 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 7c 7c 20 28   /* 3 */.   || (
12910 62 47 65 20 26 26 20 66 74 73 35 42 75 66 66 65  bGe && fts5Buffe
12920 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70 49  rCompareBlob(&pI
12930 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d  ter->term, pTerm
12940 2c 20 6e 54 65 72 6d 29 3e 30 29 20 20 2f 2a 20  , nTerm)>0)  /* 
12950 34 20 2a 2f 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a  4 */.  );.}../*.
12960 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
12970 65 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74  e object pIter t
12980 6f 20 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20  o point to term 
12990 70 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68  pTerm/nTerm with
129a0 69 6e 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d  in the.** in-mem
129b0 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20  ory hash table. 
129c0 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  If there is no s
129d0 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20  uch term in the 
129e0 68 61 73 68 2d 74 61 62 6c 65 2c 20 74 68 65 20  hash-table, the 
129f0 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20  .** iterator is 
12a00 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a  set to EOF..**.*
12a10 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
12a20 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e  curs, Fts5Index.
12a30 72 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  rc is set to an 
12a40 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
12a50 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61  r code. If .** a
12a60 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
12a70 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
12a80 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
12a90 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
12aa0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
12ab0 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
12ac0 49 74 65 72 48 61 73 68 49 6e 69 74 28 0a 20 20  IterHashInit(.  
12ad0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
12ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12af0 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
12b00 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
12b10 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c  Term, int nTerm,
12b20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
12b30 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  seek to */.  int
12b40 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
12b50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12b60 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45  Mask of FTS5INDE
12b70 58 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20  X_XXX flags */. 
12b80 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
12b90 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ter             
12ba0 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f   /* Object to po
12bb0 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63  pulate */.){.  c
12bc0 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d  onst u8 *pList =
12bd0 20 30 3b 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20   0;.  int nList 
12be0 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  = 0;.  const u8 
12bf0 2a 7a 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20  *z = 0;.  int n 
12c00 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
12c10 70 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20 61 73  p->pHash );.  as
12c20 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
12c30 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28  ITE_OK );..  if(
12c40 20 70 54 65 72 6d 3d 3d 30 20 7c 7c 20 28 66 6c   pTerm==0 || (fl
12c50 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
12c60 51 55 45 52 59 5f 53 43 41 4e 29 20 29 7b 0a 20  QUERY_SCAN) ){. 
12c70 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
12c80 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e  e3Fts5HashScanIn
12c90 69 74 28 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f  it(p->pHash, (co
12ca0 6e 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d 2c  nst char*)pTerm,
12cb0 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 73 71 6c   nTerm);.    sql
12cc0 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
12cd0 45 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20  Entry(p->pHash, 
12ce0 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26 7a  (const char**)&z
12cf0 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
12d00 29 3b 0a 20 20 20 20 6e 20 3d 20 28 7a 20 3f 20  );.    n = (z ? 
12d10 28 69 6e 74 29 73 74 72 6c 65 6e 28 28 63 6f 6e  (int)strlen((con
12d20 73 74 20 63 68 61 72 2a 29 7a 29 20 3a 20 30 29  st char*)z) : 0)
12d30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
12d40 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46  Iter->flags |= F
12d50 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
12d60 45 52 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ERM;.    sqlite3
12d70 46 74 73 35 48 61 73 68 51 75 65 72 79 28 70 2d  Fts5HashQuery(p-
12d80 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63  >pHash, (const c
12d90 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72  har*)pTerm, nTer
12da0 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73  m, &pList, &nLis
12db0 74 29 3b 0a 20 20 20 20 7a 20 3d 20 70 54 65 72  t);.    z = pTer
12dc0 6d 3b 0a 20 20 20 20 6e 20 3d 20 6e 54 65 72 6d  m;.    n = nTerm
12dd0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69  ;.  }..  if( pLi
12de0 73 74 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61  st ){.    Fts5Da
12df0 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20 20 73  ta *pLeaf;.    s
12e00 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
12e10 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74  Set(&p->rc, &pIt
12e20 65 72 2d 3e 74 65 72 6d 2c 20 6e 2c 20 7a 29 3b  er->term, n, z);
12e30 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73  .    pLeaf = fts
12e40 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69  5IdxMalloc(p, si
12e50 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29 29 3b  zeof(Fts5Data));
12e60 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d  .    if( pLeaf==
12e70 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
12e80 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29  pLeaf->p = (u8*)
12e90 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c 65 61 66  pList;.    pLeaf
12ea0 2d 3e 6e 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a  ->nn = pLeaf->sz
12eb0 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20  Leaf = nList;.  
12ec0 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
12ed0 20 70 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65   pLeaf;.    pIte
12ee0 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
12ef0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70   fts5GetVarint(p
12f00 4c 65 61 66 2d 3e 70 2c 20 28 75 36 34 2a 29 26  Leaf->p, (u64*)&
12f10 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
12f20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
12f30 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61 66  fDoclist = pLeaf
12f40 2d 3e 6e 6e 3b 0a 0a 20 20 20 20 69 66 28 20 66  ->nn;..    if( f
12f50 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
12f60 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20  _QUERY_DESC ){. 
12f70 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67       pIter->flag
12f80 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
12f90 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20  R_REVERSE;.     
12fa0 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
12fb0 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70  rseInitPage(p, p
12fc0 49 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Iter);.    }else
12fd0 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
12fe0 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
12ff0 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Iter);.    }.  }
13000 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 53  ..  fts5SegIterS
13010 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29  etNext(p, pIter)
13020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20  ;.}../*.** Zero 
13030 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
13040 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
13050 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
13060 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
13070 49 74 65 72 43 6c 65 61 72 28 46 74 73 35 53 65  IterClear(Fts5Se
13080 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
13090 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
130a0 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 20  &pIter->term);. 
130b0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
130c0 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
130d0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
130e0 65 28 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65  e(pIter->pNextLe
130f0 61 66 29 3b 0a 20 20 66 74 73 35 44 6c 69 64 78  af);.  fts5Dlidx
13100 49 74 65 72 46 72 65 65 28 70 49 74 65 72 2d 3e  IterFree(pIter->
13110 70 44 6c 69 64 78 29 3b 0a 20 20 73 71 6c 69 74  pDlidx);.  sqlit
13120 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61  e3_free(pIter->a
13130 52 6f 77 69 64 4f 66 66 73 65 74 29 3b 0a 20 20  RowidOffset);.  
13140 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
13150 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 49   sizeof(Fts5SegI
13160 74 65 72 29 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  ter));.}..#ifdef
13170 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 0a 2f   SQLITE_DEBUG../
13180 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
13190 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20 70 61  on is used as pa
131a0 72 74 20 6f 66 20 74 68 65 20 62 69 67 20 61 73  rt of the big as
131b0 73 65 72 74 28 29 20 70 72 6f 63 65 64 75 72 65  sert() procedure
131c0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 0a   implemented by.
131d0 2a 2a 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c  ** fts5AssertMul
131e0 74 69 49 74 65 72 53 65 74 75 70 28 29 2e 20 49  tiIterSetup(). I
131f0 74 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  t ensures that t
13200 68 65 20 72 65 73 75 6c 74 20 63 75 72 72 65 6e  he result curren
13210 74 6c 79 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  tly stored.** in
13220 20 2a 70 52 65 73 20 69 73 20 74 68 65 20 63 6f   *pRes is the co
13230 72 72 65 63 74 20 72 65 73 75 6c 74 20 6f 66 20  rrect result of 
13240 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 63 75  comparing the cu
13250 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20  rrent positions 
13260 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 69 74  of the.** two it
13270 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74  erators..*/.stat
13280 69 63 20 76 6f 69 64 20 66 74 73 35 41 73 73 65  ic void fts5Asse
13290 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75  rtComparisonResu
132a0 6c 74 28 0a 20 20 46 74 73 35 49 74 65 72 20 2a  lt(.  Fts5Iter *
132b0 70 49 74 65 72 2c 20 0a 20 20 46 74 73 35 53 65  pIter, .  Fts5Se
132c0 67 49 74 65 72 20 2a 70 31 2c 0a 20 20 46 74 73  gIter *p1,.  Fts
132d0 35 53 65 67 49 74 65 72 20 2a 70 32 2c 0a 20 20  5SegIter *p2,.  
132e0 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65  Fts5CResult *pRe
132f0 73 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20  s.){.  int i1 = 
13300 70 31 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67  p1 - pIter->aSeg
13310 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 70 32 20  ;.  int i2 = p2 
13320 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a 0a  - pIter->aSeg;..
13330 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 20    if( p1->pLeaf 
13340 7c 7c 20 70 32 2d 3e 70 4c 65 61 66 20 29 7b 0a  || p2->pLeaf ){.
13350 20 20 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61      if( p1->pLea
13360 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  f==0 ){.      as
13370 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72  sert( pRes->iFir
13380 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 7d 65  st==i2 );.    }e
13390 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61  lse if( p2->pLea
133a0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  f==0 ){.      as
133b0 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72  sert( pRes->iFir
133c0 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 7d 65  st==i1 );.    }e
133d0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
133e0 4d 69 6e 20 3d 20 4d 49 4e 28 70 31 2d 3e 74 65  Min = MIN(p1->te
133f0 72 6d 2e 6e 2c 20 70 32 2d 3e 74 65 72 6d 2e 6e  rm.n, p2->term.n
13400 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73  );.      int res
13410 20 3d 20 6d 65 6d 63 6d 70 28 70 31 2d 3e 74 65   = memcmp(p1->te
13420 72 6d 2e 70 2c 20 70 32 2d 3e 74 65 72 6d 2e 70  rm.p, p2->term.p
13430 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 20 20 69  , nMin);.      i
13440 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20  f( res==0 ) res 
13450 3d 20 70 31 2d 3e 74 65 72 6d 2e 6e 20 2d 20 70  = p1->term.n - p
13460 32 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a 20 20 20 20  2->term.n;..    
13470 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
13480 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13490 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 31  pRes->bTermEq==1
134a0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
134b0 72 74 28 20 70 31 2d 3e 69 52 6f 77 69 64 21 3d  rt( p1->iRowid!=
134c0 70 32 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20  p2->iRowid );.  
134d0 20 20 20 20 20 20 72 65 73 20 3d 20 28 28 70 31        res = ((p1
134e0 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69  ->iRowid > p2->i
134f0 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62  Rowid)==pIter->b
13500 52 65 76 29 20 3f 20 2d 31 20 3a 20 31 3b 0a 20  Rev) ? -1 : 1;. 
13510 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13520 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
13530 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 29 3b 0a  ->bTermEq==0 );.
13540 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
13550 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
13560 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
13570 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a  ->iFirst==i1 );.
13580 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13590 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
135a0 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20 29 3b  s->iFirst==i2 );
135b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
135c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
135d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
135e0 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51 4c 49  o-op unless SQLI
135f0 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
13600 6e 65 64 20 77 68 65 6e 20 74 68 69 73 20 6d 6f  ned when this mo
13610 64 75 6c 65 0a 2a 2a 20 69 73 20 63 6f 6d 70 69  dule.** is compi
13620 6c 65 64 2e 20 49 6e 20 74 68 61 74 20 63 61 73  led. In that cas
13630 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
13640 20 69 73 20 65 73 73 65 6e 74 69 61 6c 6c 79 20   is essentially 
13650 61 6e 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20  an assert() .** 
13660 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74  statement used t
13670 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
13680 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
13690 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  e pIter->aFirst[
136a0 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 63  ] array.** are c
136b0 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
136c0 63 20 76 6f 69 64 20 66 74 73 35 41 73 73 65 72  c void fts5Asser
136d0 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28  tMultiIterSetup(
136e0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
136f0 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  s5Iter *pIter){.
13700 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
13710 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
13720 73 35 53 65 67 49 74 65 72 20 2a 70 46 69 72 73  s5SegIter *pFirs
13730 74 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  t = &pIter->aSeg
13740 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
13750 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20  1].iFirst ];.   
13760 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 61 73 73   int i;..    ass
13770 65 72 74 28 20 28 70 46 69 72 73 74 2d 3e 70 4c  ert( (pFirst->pL
13780 65 61 66 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e  eaf==0)==pIter->
13790 62 61 73 65 2e 62 45 6f 66 20 29 3b 0a 0a 20 20  base.bEof );..  
137a0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
137b0 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
137c0 77 69 64 20 69 73 20 73 65 74 20 63 6f 72 72 65  wid is set corre
137d0 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  ctly. */.    for
137e0 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
137f0 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Seg; i++){.     
13800 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31   Fts5SegIter *p1
13810 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
13820 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  i];.      assert
13830 28 20 70 31 3d 3d 70 46 69 72 73 74 20 0a 20 20  ( p1==pFirst .  
13840 20 20 20 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e           || p1->
13850 70 4c 65 61 66 3d 3d 30 20 0a 20 20 20 20 20 20  pLeaf==0 .      
13860 20 20 20 20 20 7c 7c 20 66 74 73 35 42 75 66 66       || fts5Buff
13870 65 72 43 6f 6d 70 61 72 65 28 26 70 46 69 72 73  erCompare(&pFirs
13880 74 2d 3e 74 65 72 6d 2c 20 26 70 31 2d 3e 74 65  t->term, &p1->te
13890 72 6d 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  rm) .           
138a0 7c 7c 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70  || p1->iRowid==p
138b0 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
138c0 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  id.           ||
138d0 20 28 70 31 2d 3e 69 52 6f 77 69 64 3c 70 49 74   (p1->iRowid<pIt
138e0 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
138f0 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 0a 20  )==pIter->bRev. 
13900 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
13910 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
13920 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 3d 32 29  ter->nSeg; i+=2)
13930 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  {.      Fts5SegI
13940 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72  ter *p1 = &pIter
13950 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20  ->aSeg[i];.     
13960 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32   Fts5SegIter *p2
13970 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
13980 69 2b 31 5d 3b 0a 20 20 20 20 20 20 46 74 73 35  i+1];.      Fts5
13990 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20  CResult *pRes = 
139a0 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 28  &pIter->aFirst[(
139b0 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69 29  pIter->nSeg + i)
139c0 20 2f 20 32 5d 3b 0a 20 20 20 20 20 20 66 74 73   / 2];.      fts
139d0 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f  5AssertCompariso
139e0 6e 52 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70  nResult(pIter, p
139f0 31 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20  1, p2, pRes);.  
13a00 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 31    }..    for(i=1
13a10 3b 20 69 3c 28 70 49 74 65 72 2d 3e 6e 53 65 67  ; i<(pIter->nSeg
13a20 20 2f 20 32 29 3b 20 69 2b 3d 32 29 7b 0a 20 20   / 2); i+=2){.  
13a30 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
13a40 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  *p1 = &pIter->aS
13a50 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
13a60 74 5b 69 2a 32 5d 2e 69 46 69 72 73 74 20 5d 3b  t[i*2].iFirst ];
13a70 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
13a80 65 72 20 2a 70 32 20 3d 20 26 70 49 74 65 72 2d  er *p2 = &pIter-
13a90 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
13aa0 69 72 73 74 5b 69 2a 32 2b 31 5d 2e 69 46 69 72  irst[i*2+1].iFir
13ab0 73 74 20 5d 3b 0a 20 20 20 20 20 20 46 74 73 35  st ];.      Fts5
13ac0 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20  CResult *pRes = 
13ad0 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69  &pIter->aFirst[i
13ae0 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 41 73 73  ];.      fts5Ass
13af0 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73  ertComparisonRes
13b00 75 6c 74 28 70 49 74 65 72 2c 20 70 31 2c 20 70  ult(pIter, p1, p
13b10 32 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a  2, pRes);.    }.
13b20 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
13b30 66 69 6e 65 20 66 74 73 35 41 73 73 65 72 74 4d  fine fts5AssertM
13b40 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 78 2c  ultiIterSetup(x,
13b50 79 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  y).#endif../*.**
13b60 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73   Do the comparis
13b70 6f 6e 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  on necessary to 
13b80 70 6f 70 75 6c 61 74 65 20 70 49 74 65 72 2d 3e  populate pIter->
13b90 61 46 69 72 73 74 5b 69 4f 75 74 5d 2e 0a 2a 2a  aFirst[iOut]..**
13ba0 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72  .** If the retur
13bb0 6e 65 64 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e  ned value is non
13bc0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69  -zero, then it i
13bd0 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
13be0 6e 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 74 68  n entry.** in th
13bf0 65 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 5d 20  e pIter->aSeg[] 
13c00 61 72 72 61 79 20 74 68 61 74 20 69 73 20 28 61  array that is (a
13c10 29 20 6e 6f 74 20 61 74 20 45 4f 46 2c 20 61 6e  ) not at EOF, an
13c20 64 20 28 62 29 20 70 6f 69 6e 74 69 6e 67 0a 2a  d (b) pointing.*
13c30 2a 20 74 6f 20 61 20 6b 65 79 20 74 68 61 74 20  * to a key that 
13c40 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  is a duplicate o
13c50 66 20 61 6e 6f 74 68 65 72 2c 20 68 69 67 68 65  f another, highe
13c60 72 20 70 72 69 6f 72 69 74 79 2c 20 0a 2a 2a 20  r priority, .** 
13c70 73 65 67 6d 65 6e 74 2d 69 74 65 72 61 74 6f 72  segment-iterator
13c80 20 69 6e 20 74 68 65 20 70 53 65 67 2d 3e 61 53   in the pSeg->aS
13c90 65 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  eg[] array..*/.s
13ca0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75  tatic int fts5Mu
13cb0 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65  ltiIterDoCompare
13cc0 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72  (Fts5Iter *pIter
13cd0 2c 20 69 6e 74 20 69 4f 75 74 29 7b 0a 20 20 69  , int iOut){.  i
13ce0 6e 74 20 69 31 3b 20 20 20 20 20 20 20 20 20 20  nt i1;          
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13d00 2a 20 49 6e 64 65 78 20 6f 66 20 6c 65 66 74 2d  * Index of left-
13d10 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72  hand Fts5SegIter
13d20 20 2a 2f 0a 20 20 69 6e 74 20 69 32 3b 20 20 20   */.  int i2;   
13d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d40 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
13d50 66 20 72 69 67 68 74 2d 68 61 6e 64 20 46 74 73  f right-hand Fts
13d60 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e  5SegIter */.  in
13d70 74 20 69 52 65 73 3b 0a 20 20 46 74 73 35 53 65  t iRes;.  Fts5Se
13d80 67 49 74 65 72 20 2a 70 31 3b 20 20 20 20 20 20  gIter *p1;      
13d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66            /* Lef
13da0 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74  t-hand Fts5SegIt
13db0 65 72 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  er */.  Fts5SegI
13dc0 74 65 72 20 2a 70 32 3b 20 20 20 20 20 20 20 20  ter *p2;        
13dd0 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
13de0 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65  -hand Fts5SegIte
13df0 72 20 2a 2f 0a 20 20 46 74 73 35 43 52 65 73 75  r */.  Fts5CResu
13e00 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65  lt *pRes = &pIte
13e10 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 3b  r->aFirst[iOut];
13e20 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4f 75 74  ..  assert( iOut
13e30 3c 70 49 74 65 72 2d 3e 6e 53 65 67 20 26 26 20  <pIter->nSeg && 
13e40 69 4f 75 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  iOut>0 );.  asse
13e50 72 74 28 20 70 49 74 65 72 2d 3e 62 52 65 76 3d  rt( pIter->bRev=
13e60 3d 30 20 7c 7c 20 70 49 74 65 72 2d 3e 62 52 65  =0 || pIter->bRe
13e70 76 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20 69  v==1 );..  if( i
13e80 4f 75 74 3e 3d 28 70 49 74 65 72 2d 3e 6e 53 65  Out>=(pIter->nSe
13e90 67 2f 32 29 20 29 7b 0a 20 20 20 20 69 31 20 3d  g/2) ){.    i1 =
13ea0 20 28 69 4f 75 74 20 2d 20 70 49 74 65 72 2d 3e   (iOut - pIter->
13eb0 6e 53 65 67 2f 32 29 20 2a 20 32 3b 0a 20 20 20  nSeg/2) * 2;.   
13ec0 20 69 32 20 3d 20 69 31 20 2b 20 31 3b 0a 20 20   i2 = i1 + 1;.  
13ed0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 31 20 3d 20  }else{.    i1 = 
13ee0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f  pIter->aFirst[iO
13ef0 75 74 2a 32 5d 2e 69 46 69 72 73 74 3b 0a 20 20  ut*2].iFirst;.  
13f00 20 20 69 32 20 3d 20 70 49 74 65 72 2d 3e 61 46    i2 = pIter->aF
13f10 69 72 73 74 5b 69 4f 75 74 2a 32 2b 31 5d 2e 69  irst[iOut*2+1].i
13f20 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 70 31 20  First;.  }.  p1 
13f30 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
13f40 31 5d 3b 0a 20 20 70 32 20 3d 20 26 70 49 74 65  1];.  p2 = &pIte
13f50 72 2d 3e 61 53 65 67 5b 69 32 5d 3b 0a 0a 20 20  r->aSeg[i2];..  
13f60 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 3d 20  pRes->bTermEq = 
13f70 30 3b 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c 65  0;.  if( p1->pLe
13f80 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  af==0 ){        
13f90 20 20 20 2f 2a 20 49 66 20 70 31 20 69 73 20 61     /* If p1 is a
13fa0 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65  t EOF */.    iRe
13fb0 73 20 3d 20 69 32 3b 0a 20 20 7d 65 6c 73 65 20  s = i2;.  }else 
13fc0 69 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30  if( p2->pLeaf==0
13fd0 20 29 7b 20 20 20 20 20 2f 2a 20 49 66 20 70 32   ){     /* If p2
13fe0 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20   is at EOF */.  
13ff0 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 7d    iRes = i1;.  }
14000 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 65  else{.    int re
14010 73 20 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f  s = fts5BufferCo
14020 6d 70 61 72 65 28 26 70 31 2d 3e 74 65 72 6d 2c  mpare(&p1->term,
14030 20 26 70 32 2d 3e 74 65 72 6d 29 3b 0a 20 20 20   &p2->term);.   
14040 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
14050 20 20 20 20 20 61 73 73 65 72 74 28 20 69 32 3e       assert( i2>
14060 69 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  i1 );.      asse
14070 72 74 28 20 69 32 21 3d 30 20 29 3b 0a 20 20 20  rt( i2!=0 );.   
14080 20 20 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71     pRes->bTermEq
14090 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
140a0 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 32 2d 3e  p1->iRowid==p2->
140b0 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  iRowid ){.      
140c0 20 20 70 31 2d 3e 62 44 65 6c 20 3d 20 70 32 2d    p1->bDel = p2-
140d0 3e 62 44 65 6c 3b 0a 20 20 20 20 20 20 20 20 72  >bDel;.        r
140e0 65 74 75 72 6e 20 69 32 3b 0a 20 20 20 20 20 20  eturn i2;.      
140f0 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20 28 28  }.      res = ((
14100 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d  p1->iRowid > p2-
14110 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d  >iRowid)==pIter-
14120 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20 2b 31  >bRev) ? -1 : +1
14130 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
14140 72 74 28 20 72 65 73 21 3d 30 20 29 3b 0a 20 20  rt( res!=0 );.  
14150 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
14160 20 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a       iRes = i1;.
14170 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14180 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 20 20   iRes = i2;.    
14190 7d 0a 20 20 7d 0a 0a 20 20 70 52 65 73 2d 3e 69  }.  }..  pRes->i
141a0 46 69 72 73 74 20 3d 20 28 75 31 36 29 69 52 65  First = (u16)iRe
141b0 73 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  s;.  return 0;.}
141c0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
141d0 20 73 65 67 2d 69 74 65 72 20 73 6f 20 74 68 61   seg-iter so tha
141e0 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  t it points to t
141f0 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
14200 6e 20 70 61 67 65 20 69 4c 65 61 66 50 67 6e 6f  n page iLeafPgno
14210 2e 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20 65 72  ..** It is an er
14220 72 6f 72 20 69 66 20 6c 65 61 66 20 69 4c 65 61  ror if leaf iLea
14230 66 50 67 6e 6f 20 64 6f 65 73 20 6e 6f 74 20 65  fPgno does not e
14240 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 73  xist or contains
14250 20 6e 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73   no rowids..*/.s
14260 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
14270 65 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28 0a  egIterGotoPage(.
14280 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
14290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142a0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
142b0 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
142c0 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
142d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
142e0 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76   Iterator to adv
142f0 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ance */.  int iL
14300 65 61 66 50 67 6e 6f 0a 29 7b 0a 20 20 61 73 73  eafPgno.){.  ass
14310 65 72 74 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70  ert( iLeafPgno>p
14320 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
14330 29 3b 0a 0a 20 20 69 66 28 20 69 4c 65 61 66 50  );..  if( iLeafP
14340 67 6e 6f 3e 70 49 74 65 72 2d 3e 70 53 65 67 2d  gno>pIter->pSeg-
14350 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20  >pgnoLast ){.   
14360 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
14370 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a  RRUPT;.  }else{.
14380 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
14390 61 73 65 28 70 49 74 65 72 2d 3e 70 4e 65 78 74  ase(pIter->pNext
143a0 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72  Leaf);.    pIter
143b0 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 30 3b  ->pNextLeaf = 0;
143c0 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
143d0 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e  fPgno = iLeafPgn
143e0 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67  o-1;.    fts5Seg
143f0 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
14400 70 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  pIter);.    asse
14410 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  rt( p->rc!=SQLIT
14420 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 69  E_OK || pIter->i
14430 4c 65 61 66 50 67 6e 6f 3d 3d 69 4c 65 61 66 50  LeafPgno==iLeafP
14440 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  gno );..    if( 
14450 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
14460 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f   ){.      int iO
14470 66 66 3b 0a 20 20 20 20 20 20 75 38 20 2a 61 20  ff;.      u8 *a 
14480 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
14490 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  p;.      int n =
144a0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73   pIter->pLeaf->s
144b0 7a 4c 65 61 66 3b 0a 0a 20 20 20 20 20 20 69 4f  zLeaf;..      iO
144c0 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72  ff = fts5LeafFir
144d0 73 74 52 6f 77 69 64 4f 66 66 28 70 49 74 65 72  stRowidOff(pIter
144e0 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  ->pLeaf);.      
144f0 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20 69 4f  if( iOff<4 || iO
14500 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20  ff>=n ){.       
14510 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
14520 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  RRUPT;.      }el
14530 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66  se{.        iOff
14540 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
14550 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
14560 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
14570 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  );.        pIter
14580 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
14590 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 66 74  iOff;.        ft
145a0 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
145b0 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  s(p, pIter);.   
145c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
145d0 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
145e0 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
145f0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
14600 64 20 61 72 67 75 6d 65 6e 74 20 75 6e 74 69 6c  d argument until
14610 20 69 74 20 69 73 20 61 74 20 6f 72 20 0a 2a 2a   it is at or .**
14620 20 70 61 73 74 20 72 6f 77 69 64 20 69 46 72 6f   past rowid iFro
14630 6d 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  m. Regardless of
14640 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 46   the value of iF
14650 72 6f 6d 2c 20 74 68 65 20 69 74 65 72 61 74 6f  rom, the iterato
14660 72 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 61  r is.** always a
14670 64 76 61 6e 63 65 64 20 61 74 20 6c 65 61 73 74  dvanced at least
14680 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   once..*/.static
14690 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
146a0 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74 73  rNextFrom(.  Fts
146b0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
146c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
146d0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
146e0 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
146f0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
14700 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
14710 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
14720 2a 2f 0a 20 20 69 36 34 20 69 4d 61 74 63 68 20  */.  i64 iMatch 
14730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14740 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20       /* Advance 
14750 69 74 65 72 61 74 6f 72 20 61 74 20 6c 65 61 73  iterator at leas
14760 74 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 29 7b  t this far */.){
14770 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28 70  .  int bRev = (p
14780 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
14790 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
147a0 53 45 29 3b 0a 20 20 46 74 73 35 44 6c 69 64 78  SE);.  Fts5Dlidx
147b0 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 70  Iter *pDlidx = p
147c0 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20  Iter->pDlidx;.  
147d0 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20  int iLeafPgno = 
147e0 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
147f0 3b 0a 20 20 69 6e 74 20 62 4d 6f 76 65 20 3d 20  ;.  int bMove = 
14800 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  1;..  assert( pI
14810 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
14820 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
14830 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  M );.  assert( p
14840 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 29 3b 0a  Iter->pDlidx );.
14850 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
14860 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 69 66 28  >pLeaf );..  if(
14870 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20   bRev==0 ){.    
14880 77 68 69 6c 65 28 20 21 66 74 73 35 44 6c 69 64  while( !fts5Dlid
14890 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
148a0 64 78 29 20 26 26 20 69 4d 61 74 63 68 3e 66 74  dx) && iMatch>ft
148b0 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64  s5DlidxIterRowid
148c0 28 70 44 6c 69 64 78 29 20 29 7b 0a 20 20 20 20  (pDlidx) ){.    
148d0 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 66 74    iLeafPgno = ft
148e0 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
148f0 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66  pDlidx);.      f
14900 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
14910 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20 20 20  (p, pDlidx);.   
14920 20 7d 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63   }.    assert_nc
14930 28 20 69 4c 65 61 66 50 67 6e 6f 3e 3d 70 49 74  ( iLeafPgno>=pIt
14940 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 7c 7c  er->iLeafPgno ||
14950 20 70 2d 3e 72 63 20 29 3b 0a 20 20 20 20 69 66   p->rc );.    if
14960 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65  ( iLeafPgno>pIte
14970 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a  r->iLeafPgno ){.
14980 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
14990 72 47 6f 74 6f 50 61 67 65 28 70 2c 20 70 49 74  rGotoPage(p, pIt
149a0 65 72 2c 20 69 4c 65 61 66 50 67 6e 6f 29 3b 0a  er, iLeafPgno);.
149b0 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b        bMove = 0;
149c0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
149d0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
149e0 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20  r->pNextLeaf==0 
149f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
14a00 4d 61 74 63 68 3c 70 49 74 65 72 2d 3e 69 52 6f  Match<pIter->iRo
14a10 77 69 64 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  wid );.    while
14a20 28 20 21 66 74 73 35 44 6c 69 64 78 49 74 65 72  ( !fts5DlidxIter
14a30 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 20 26  Eof(p, pDlidx) &
14a40 26 20 69 4d 61 74 63 68 3c 66 74 73 35 44 6c 69  & iMatch<fts5Dli
14a50 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69  dxIterRowid(pDli
14a60 64 78 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73  dx) ){.      fts
14a70 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 70  5DlidxIterPrev(p
14a80 2c 20 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d  , pDlidx);.    }
14a90 0a 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d  .    iLeafPgno =
14aa0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
14ab0 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20 20 20  no(pDlidx);..   
14ac0 20 61 73 73 65 72 74 28 20 66 74 73 35 44 6c 69   assert( fts5Dli
14ad0 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
14ae0 69 64 78 29 20 7c 7c 20 69 4c 65 61 66 50 67 6e  idx) || iLeafPgn
14af0 6f 3c 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  o<=pIter->iLeafP
14b00 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  gno );..    if( 
14b10 69 4c 65 61 66 50 67 6e 6f 3c 70 49 74 65 72 2d  iLeafPgno<pIter-
14b20 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  >iLeafPgno ){.  
14b30 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
14b40 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f  Pgno = iLeafPgno
14b50 2b 31 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65  +1;.      fts5Se
14b60 67 49 74 65 72 52 65 76 65 72 73 65 4e 65 77 50  gIterReverseNewP
14b70 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
14b80 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a       bMove = 0;.
14b90 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b      }.  }..  do{
14ba0 0a 20 20 20 20 69 66 28 20 62 4d 6f 76 65 20 26  .    if( bMove &
14bb0 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
14bc0 4f 4b 20 29 20 70 49 74 65 72 2d 3e 78 4e 65 78  OK ) pIter->xNex
14bd0 74 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a  t(p, pIter, 0);.
14be0 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
14bf0 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Leaf==0 ) break;
14c00 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30  .    if( bRev==0
14c10 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f 77 69   && pIter->iRowi
14c20 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61  d>=iMatch ) brea
14c30 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 21  k;.    if( bRev!
14c40 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f  =0 && pIter->iRo
14c50 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72  wid<=iMatch ) br
14c60 65 61 6b 3b 0a 20 20 20 20 62 4d 6f 76 65 20 3d  eak;.    bMove =
14c70 20 31 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 2d   1;.  }while( p-
14c80 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
14c90 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  ;.}.../*.** Free
14ca0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62   the iterator ob
14cb0 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
14cc0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
14cd0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
14ce0 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
14cf0 46 72 65 65 28 46 74 73 35 49 74 65 72 20 2a 70  Free(Fts5Iter *p
14d00 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74  Iter){.  if( pIt
14d10 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  er ){.    int i;
14d20 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
14d30 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b  pIter->nSeg; i++
14d40 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  ){.      fts5Seg
14d50 49 74 65 72 43 6c 65 61 72 28 26 70 49 74 65 72  IterClear(&pIter
14d60 2d 3e 61 53 65 67 5b 69 5d 29 3b 0a 20 20 20 20  ->aSeg[i]);.    
14d70 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  }.    fts5Struct
14d80 75 72 65 52 65 6c 65 61 73 65 28 70 49 74 65 72  ureRelease(pIter
14d90 2d 3e 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20  ->pStruct);.    
14da0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
14db0 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
14dc0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
14dd0 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  e(pIter);.  }.}.
14de0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
14df0 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
14e00 65 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ed(.  Fts5Index 
14e10 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
14e20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
14e30 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65  ckend to iterate
14e40 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73   within */.  Fts
14e50 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  5Iter *pIter,   
14e60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14e70 49 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64 61  Iterator to upda
14e80 74 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  te aFirst[] arra
14e90 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  y for */.  int i
14ea0 43 68 61 6e 67 65 64 2c 20 20 20 20 20 20 20 20  Changed,        
14eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
14ec0 64 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72 61  dex of sub-itera
14ed0 74 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63 65  tor just advance
14ee0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 73  d */.  int iMins
14ef0 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
14f00 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75         /* Minimu
14f10 6d 20 65 6e 74 72 79 20 69 6e 20 61 46 69 72 73  m entry in aFirs
14f20 74 5b 5d 20 74 6f 20 73 65 74 20 2a 2f 0a 29 7b  t[] to set */.){
14f30 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
14f40 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69  i=(pIter->nSeg+i
14f50 43 68 61 6e 67 65 64 29 2f 32 3b 20 69 3e 3d 69  Changed)/2; i>=i
14f60 4d 69 6e 73 65 74 20 26 26 20 70 2d 3e 72 63 3d  Minset && p->rc=
14f70 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 3d 69 2f  =SQLITE_OK; i=i/
14f80 32 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 71 3b  2){.    int iEq;
14f90 0a 20 20 20 20 69 66 28 20 28 69 45 71 20 3d 20  .    if( (iEq = 
14fa0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43  fts5MultiIterDoC
14fb0 6f 6d 70 61 72 65 28 70 49 74 65 72 2c 20 69 29  ompare(pIter, i)
14fc0 29 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  ) ){.      Fts5S
14fd0 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
14fe0 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 45 71 5d  pIter->aSeg[iEq]
14ff0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15000 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
15010 20 29 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   );.      pSeg->
15020 78 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 30  xNext(p, pSeg, 0
15030 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 70 49 74  );.      i = pIt
15040 65 72 2d 3e 6e 53 65 67 20 2b 20 69 45 71 3b 0a  er->nSeg + iEq;.
15050 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
15060 2a 2a 20 53 75 62 2d 69 74 65 72 61 74 6f 72 20  ** Sub-iterator 
15070 69 43 68 61 6e 67 65 64 20 6f 66 20 69 74 65 72  iChanged of iter
15080 61 74 6f 72 20 70 49 74 65 72 20 68 61 73 20 6a  ator pIter has j
15090 75 73 74 20 62 65 65 6e 20 61 64 76 61 6e 63 65  ust been advance
150a0 64 2e 20 49 74 20 73 74 69 6c 6c 0a 2a 2a 20 70  d. It still.** p
150b0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 61 6d  oints to the sam
150c0 65 20 74 65 72 6d 20 74 68 6f 75 67 68 20 2d 20  e term though - 
150d0 6a 75 73 74 20 61 20 64 69 66 66 65 72 65 6e 74  just a different
150e0 20 72 6f 77 69 64 2e 20 54 68 69 73 20 66 75 6e   rowid. This fun
150f0 63 74 69 6f 6e 0a 2a 2a 20 61 74 74 65 6d 70 74  ction.** attempt
15100 73 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  s to update the 
15110 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
15120 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 5d 20  pIter->aFirst[] 
15130 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 20  accordingly..** 
15140 49 66 20 69 74 20 64 6f 65 73 20 73 6f 20 73 75  If it does so su
15150 63 63 65 73 73 66 75 6c 6c 79 2c 20 30 20 69 73  ccessfully, 0 is
15160 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
15170 77 69 73 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66  wise 1..**.** If
15180 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74   non-zero is ret
15190 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65  urned, the calle
151a0 72 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 66 74  r should call ft
151b0 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e  s5MultiIterAdvan
151c0 63 65 64 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20  ced().** on the 
151d0 69 74 65 72 61 74 6f 72 20 69 6e 73 74 65 61 64  iterator instead
151e0 2e 20 54 68 61 74 20 66 75 6e 63 74 69 6f 6e 20  . That function 
151f0 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 61 73  does the same as
15200 20 74 68 69 73 20 6f 6e 65 2c 20 65 78 63 65 70   this one, excep
15210 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 65 61  t.** that it dea
15220 6c 73 20 77 69 74 68 20 6d 6f 72 65 20 63 6f 6d  ls with more com
15230 70 6c 69 63 61 74 65 64 20 63 61 73 65 73 20 61  plicated cases a
15240 73 20 77 65 6c 6c 2e 0a 2a 2f 20 0a 73 74 61 74  s well..*/ .stat
15250 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69  ic int fts5Multi
15260 49 74 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64  IterAdvanceRowid
15270 28 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49  (.  Fts5Iter *pI
15280 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
15290 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
152a0 74 6f 20 75 70 64 61 74 65 20 61 46 69 72 73 74  to update aFirst
152b0 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a  [] array for */.
152c0 20 20 69 6e 74 20 69 43 68 61 6e 67 65 64 2c 20    int iChanged, 
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152e0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75    /* Index of su
152f0 62 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20  b-iterator just 
15300 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20 46 74  advanced */.  Ft
15310 73 35 53 65 67 49 74 65 72 20 2a 2a 70 70 46 69  s5SegIter **ppFi
15320 72 73 74 0a 29 7b 0a 20 20 46 74 73 35 53 65 67  rst.){.  Fts5Seg
15330 49 74 65 72 20 2a 70 4e 65 77 20 3d 20 26 70 49  Iter *pNew = &pI
15340 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67  ter->aSeg[iChang
15350 65 64 5d 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77  ed];..  if( pNew
15360 2d 3e 69 52 6f 77 69 64 3d 3d 70 49 74 65 72 2d  ->iRowid==pIter-
15370 3e 69 53 77 69 74 63 68 52 6f 77 69 64 0a 20 20  >iSwitchRowid.  
15380 20 7c 7c 20 28 70 4e 65 77 2d 3e 69 52 6f 77 69   || (pNew->iRowi
15390 64 3c 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68  d<pIter->iSwitch
153a0 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62  Rowid)==pIter->b
153b0 52 65 76 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  Rev.  ){.    int
153c0 20 69 3b 0a 20 20 20 20 46 74 73 35 53 65 67 49   i;.    Fts5SegI
153d0 74 65 72 20 2a 70 4f 74 68 65 72 20 3d 20 26 70  ter *pOther = &p
153e0 49 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e  Iter->aSeg[iChan
153f0 67 65 64 20 5e 20 30 78 30 30 30 31 5d 3b 0a 20  ged ^ 0x0001];. 
15400 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63     pIter->iSwitc
15410 68 52 6f 77 69 64 20 3d 20 70 49 74 65 72 2d 3e  hRowid = pIter->
15420 62 52 65 76 20 3f 20 53 4d 41 4c 4c 45 53 54 5f  bRev ? SMALLEST_
15430 49 4e 54 36 34 20 3a 20 4c 41 52 47 45 53 54 5f  INT64 : LARGEST_
15440 49 4e 54 36 34 3b 0a 20 20 20 20 66 6f 72 28 69  INT64;.    for(i
15450 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43  =(pIter->nSeg+iC
15460 68 61 6e 67 65 64 29 2f 32 3b 20 31 3b 20 69 3d  hanged)/2; 1; i=
15470 69 2f 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35  i/2){.      Fts5
15480 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20  CResult *pRes = 
15490 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69  &pIter->aFirst[i
154a0 5d 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ];..      assert
154b0 28 20 70 4e 65 77 2d 3e 70 4c 65 61 66 20 29 3b  ( pNew->pLeaf );
154c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
154d0 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20  Res->bTermEq==0 
154e0 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 4c 65 61 66  || pOther->pLeaf
154f0 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70   );..      if( p
15500 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 29 7b 0a  Res->bTermEq ){.
15510 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
15520 2d 3e 69 52 6f 77 69 64 3d 3d 70 4f 74 68 65 72  ->iRowid==pOther
15530 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  ->iRowid ){.    
15540 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
15550 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
15560 28 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69  ( (pOther->iRowi
15570 64 3e 70 4e 65 77 2d 3e 69 52 6f 77 69 64 29 3d  d>pNew->iRowid)=
15580 3d 70 49 74 65 72 2d 3e 62 52 65 76 20 29 7b 0a  =pIter->bRev ){.
15590 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
155a0 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20  >iSwitchRowid = 
155b0 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3b 0a  pOther->iRowid;.
155c0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
155d0 20 70 4f 74 68 65 72 3b 0a 20 20 20 20 20 20 20   pOther;.       
155e0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 74 68   }else if( (pOth
155f0 65 72 2d 3e 69 52 6f 77 69 64 3e 70 49 74 65 72  er->iRowid>pIter
15600 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d  ->iSwitchRowid)=
15610 3d 70 49 74 65 72 2d 3e 62 52 65 76 20 29 7b 0a  =pIter->bRev ){.
15620 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
15630 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20  >iSwitchRowid = 
15640 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3b 0a  pOther->iRowid;.
15650 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15660 7d 0a 20 20 20 20 20 20 70 52 65 73 2d 3e 69 46  }.      pRes->iF
15670 69 72 73 74 20 3d 20 28 75 31 36 29 28 70 4e 65  irst = (u16)(pNe
15680 77 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 29  w - pIter->aSeg)
15690 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31  ;.      if( i==1
156a0 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20   ) break;..     
156b0 20 70 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72   pOther = &pIter
156c0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
156d0 46 69 72 73 74 5b 69 20 5e 20 30 78 30 30 30 31  First[i ^ 0x0001
156e0 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
156f0 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 46 69 72 73  }.  }..  *ppFirs
15700 74 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75  t = pNew;.  retu
15710 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn 0;.}../*.** S
15720 65 74 20 74 68 65 20 70 49 74 65 72 2d 3e 62 45  et the pIter->bE
15730 6f 66 20 76 61 72 69 61 62 6c 65 20 62 61 73 65  of variable base
15740 64 20 6f 6e 20 74 68 65 20 73 74 61 74 65 20 6f  d on the state o
15750 66 20 74 68 65 20 73 75 62 2d 69 74 65 72 61 74  f the sub-iterat
15760 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ors..*/.static v
15770 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
15780 72 53 65 74 45 6f 66 28 46 74 73 35 49 74 65 72  rSetEof(Fts5Iter
15790 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35   *pIter){.  Fts5
157a0 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
157b0 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
157c0 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
157d0 46 69 72 73 74 20 5d 3b 0a 20 20 70 49 74 65 72  First ];.  pIter
157e0 2d 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20 70 53  ->base.bEof = pS
157f0 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 3b 0a 20 20  eg->pLeaf==0;.  
15800 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
15810 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77  wid = pSeg->iRow
15820 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  id;.}../*.** Mov
15830 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74  e the iterator t
15840 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
15850 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
15860 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
15870 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65  error code is le
15880 66 74 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e  ft in Fts5Index.
15890 72 63 2e 20 49 74 20 69 73 20 6e 6f 74 20 0a 2a  rc. It is not .*
158a0 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20  * considered an 
158b0 65 72 72 6f 72 20 69 66 20 74 68 65 20 69 74 65  error if the ite
158c0 72 61 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f  rator reaches EO
158d0 46 2c 20 6f 72 20 69 66 20 69 74 20 69 73 20 61  F, or if it is a
158e0 6c 72 65 61 64 79 20 61 74 20 0a 2a 2a 20 45 4f  lready at .** EO
158f0 46 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  F when this func
15900 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
15910 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
15920 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
15930 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
15940 2c 20 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  , .  Fts5Iter *p
15950 49 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 72 6f  Iter,.  int bFro
15960 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
15970 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
15980 69 66 20 61 72 67 75 6d 65 6e 74 20 69 46 72 6f  if argument iFro
15990 6d 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  m is valid */.  
159a0 69 36 34 20 69 46 72 6f 6d 20 20 20 20 20 20 20  i64 iFrom       
159b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159c0 2f 2a 20 41 64 76 61 6e 63 65 20 61 74 20 6c 65  /* Advance at le
159d0 61 73 74 20 61 73 20 66 61 72 20 61 73 20 74 68  ast as far as th
159e0 69 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62  is */.){.  int b
159f0 55 73 65 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b  UseFrom = bFrom;
15a00 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d  .  while( p->rc=
15a10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15a20 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70    int iFirst = p
15a30 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
15a40 69 46 69 72 73 74 3b 0a 20 20 20 20 69 6e 74 20  iFirst;.    int 
15a50 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20  bNewTerm = 0;.  
15a60 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
15a70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  Seg = &pIter->aS
15a80 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20 20  eg[iFirst];.    
15a90 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
15aa0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
15ab0 69 66 28 20 62 55 73 65 46 72 6f 6d 20 26 26 20  if( bUseFrom && 
15ac0 70 53 65 67 2d 3e 70 44 6c 69 64 78 20 29 7b 0a  pSeg->pDlidx ){.
15ad0 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
15ae0 72 4e 65 78 74 46 72 6f 6d 28 70 2c 20 70 53 65  rNextFrom(p, pSe
15af0 67 2c 20 69 46 72 6f 6d 29 3b 0a 20 20 20 20 7d  g, iFrom);.    }
15b00 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 53 65 67  else{.      pSeg
15b10 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53 65 67 2c  ->xNext(p, pSeg,
15b20 20 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20   &bNewTerm);.   
15b30 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 53 65 67   }..    if( pSeg
15b40 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e  ->pLeaf==0 || bN
15b50 65 77 54 65 72 6d 20 0a 20 20 20 20 20 7c 7c 20  ewTerm .     || 
15b60 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
15b70 61 6e 63 65 52 6f 77 69 64 28 70 49 74 65 72 2c  anceRowid(pIter,
15b80 20 69 46 69 72 73 74 2c 20 26 70 53 65 67 29 0a   iFirst, &pSeg).
15b90 20 20 20 20 29 7b 0a 20 20 20 20 20 20 66 74 73      ){.      fts
15ba0 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
15bb0 65 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69  ed(p, pIter, iFi
15bc0 72 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 66  rst, 1);.      f
15bd0 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45  ts5MultiIterSetE
15be0 6f 66 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20  of(pIter);.     
15bf0 20 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e   pSeg = &pIter->
15c00 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72  aSeg[pIter->aFir
15c10 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20  st[1].iFirst];. 
15c20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70       if( pSeg->p
15c30 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e  Leaf==0 ) return
15c40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73  ;.    }..    fts
15c50 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
15c60 53 65 74 75 70 28 70 2c 20 70 49 74 65 72 29 3b  Setup(p, pIter);
15c70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65  .    assert( pSe
15c80 67 3d 3d 26 70 49 74 65 72 2d 3e 61 53 65 67 5b  g==&pIter->aSeg[
15c90 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
15ca0 2e 69 46 69 72 73 74 5d 20 26 26 20 70 53 65 67  .iFirst] && pSeg
15cb0 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20 20 20 69  ->pLeaf );.    i
15cc0 66 28 20 70 49 74 65 72 2d 3e 62 53 6b 69 70 45  f( pIter->bSkipE
15cd0 6d 70 74 79 3d 3d 30 20 7c 7c 20 70 53 65 67 2d  mpty==0 || pSeg-
15ce0 3e 6e 50 6f 73 20 29 7b 0a 20 20 20 20 20 20 70  >nPos ){.      p
15cf0 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74  Iter->xSetOutput
15d00 73 28 70 49 74 65 72 2c 20 70 53 65 67 29 3b 0a  s(pIter, pSeg);.
15d10 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
15d20 20 20 7d 0a 20 20 20 20 62 55 73 65 46 72 6f 6d    }.    bUseFrom
15d30 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61   = 0;.  }.}..sta
15d40 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
15d50 74 69 49 74 65 72 4e 65 78 74 32 28 0a 20 20 46  tiIterNext2(.  F
15d60 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
15d70 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c  Fts5Iter *pIter,
15d80 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72  .  int *pbNewTer
15d90 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
15da0 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20     /* OUT: True 
15db0 69 66 20 2a 6d 69 67 68 74 2a 20 62 65 20 6e 65  if *might* be ne
15dc0 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 61  w term */.){.  a
15dd0 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 53  ssert( pIter->bS
15de0 6b 69 70 45 6d 70 74 79 20 29 3b 0a 20 20 69 66  kipEmpty );.  if
15df0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
15e00 4f 4b 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  OK ){.    do {. 
15e10 20 20 20 20 20 69 6e 74 20 69 46 69 72 73 74 20       int iFirst 
15e20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  = pIter->aFirst[
15e30 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20 20 20  1].iFirst;.     
15e40 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
15e50 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
15e60 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20  g[iFirst];.     
15e70 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20   int bNewTerm = 
15e80 30 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  0;..      assert
15e90 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
15ea0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 53 65 67  OK );.      pSeg
15eb0 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53 65 67 2c  ->xNext(p, pSeg,
15ec0 20 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20   &bNewTerm);.   
15ed0 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65     if( pSeg->pLe
15ee0 61 66 3d 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72  af==0 || bNewTer
15ef0 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20 66 74 73  m .       || fts
15f00 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
15f10 65 52 6f 77 69 64 28 70 49 74 65 72 2c 20 69 46  eRowid(pIter, iF
15f20 69 72 73 74 2c 20 26 70 53 65 67 29 0a 20 20 20  irst, &pSeg).   
15f30 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74     ){.        ft
15f40 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e  s5MultiIterAdvan
15f50 63 65 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46  ced(p, pIter, iF
15f60 69 72 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  irst, 1);.      
15f70 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53    fts5MultiIterS
15f80 65 74 45 6f 66 28 70 49 74 65 72 29 3b 0a 20 20  etEof(pIter);.  
15f90 20 20 20 20 20 20 2a 70 62 4e 65 77 54 65 72 6d        *pbNewTerm
15fa0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
15fb0 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 62 4e 65  e{.        *pbNe
15fc0 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20  wTerm = 0;.     
15fd0 20 7d 0a 20 20 20 20 20 20 66 74 73 35 41 73 73   }.      fts5Ass
15fe0 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75  ertMultiIterSetu
15ff0 70 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20  p(p, pIter);..  
16000 20 20 7d 77 68 69 6c 65 28 20 66 74 73 35 4d 75    }while( fts5Mu
16010 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70  ltiIterIsEmpty(p
16020 2c 20 70 49 74 65 72 29 20 29 3b 0a 20 20 7d 0a  , pIter) );.  }.
16030 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
16040 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
16050 73 5f 4e 6f 6f 70 28 46 74 73 35 49 74 65 72 20  s_Noop(Fts5Iter 
16060 2a 70 55 6e 75 73 65 64 31 2c 20 46 74 73 35 53  *pUnused1, Fts5S
16070 65 67 49 74 65 72 20 2a 70 55 6e 75 73 65 64 32  egIter *pUnused2
16080 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
16090 4d 32 28 70 55 6e 75 73 65 64 31 2c 20 70 55 6e  M2(pUnused1, pUn
160a0 75 73 65 64 32 29 3b 0a 7d 0a 0a 73 74 61 74 69  used2);.}..stati
160b0 63 20 46 74 73 35 49 74 65 72 20 2a 66 74 73 35  c Fts5Iter *fts5
160c0 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 0a  MultiIterAlloc(.
160d0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
160e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160f0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
16100 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74  d to iterate wit
16110 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65  hin */.  int nSe
16120 67 0a 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20  g.){.  Fts5Iter 
16130 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 53 6c  *pNew;.  int nSl
16140 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ot;             
16150 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 77 65           /* Powe
16160 72 20 6f 66 20 74 77 6f 20 3e 3d 20 6e 53 65 67  r of two >= nSeg
16170 20 2a 2f 0a 0a 20 20 66 6f 72 28 6e 53 6c 6f 74   */..  for(nSlot
16180 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65 67 3b 20  =2; nSlot<nSeg; 
16190 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32 29 3b 0a  nSlot=nSlot*2);.
161a0 20 20 70 4e 65 77 20 3d 20 66 74 73 35 49 64 78    pNew = fts5Idx
161b0 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20 20 20 20 20  Malloc(p, .     
161c0 20 73 69 7a 65 6f 66 28 46 74 73 35 49 74 65 72   sizeof(Fts5Iter
161d0 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) +             
161e0 20 20 20 20 20 2f 2a 20 70 4e 65 77 20 2a 2f 0a       /* pNew */.
161f0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
16200 35 53 65 67 49 74 65 72 29 20 2a 20 28 6e 53 6c  5SegIter) * (nSl
16210 6f 74 2d 31 29 20 2b 20 20 20 2f 2a 20 70 4e 65  ot-1) +   /* pNe
16220 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a 20 20 20  w->aSeg[] */.   
16230 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 43 52     sizeof(Fts5CR
16240 65 73 75 6c 74 29 20 2a 20 6e 53 6c 6f 74 20 20  esult) * nSlot  
16250 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 2d 3e         /* pNew->
16260 61 46 69 72 73 74 5b 5d 20 2a 2f 0a 20 20 29 3b  aFirst[] */.  );
16270 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
16280 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67 20 3d 20     pNew->nSeg = 
16290 6e 53 6c 6f 74 3b 0a 20 20 20 20 70 4e 65 77 2d  nSlot;.    pNew-
162a0 3e 61 46 69 72 73 74 20 3d 20 28 46 74 73 35 43  >aFirst = (Fts5C
162b0 52 65 73 75 6c 74 2a 29 26 70 4e 65 77 2d 3e 61  Result*)&pNew->a
162c0 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 20 20  Seg[nSlot];.    
162d0 70 4e 65 77 2d 3e 70 49 6e 64 65 78 20 3d 20 70  pNew->pIndex = p
162e0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 78 53 65 74  ;.    pNew->xSet
162f0 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35 49 74  Outputs = fts5It
16300 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6f  erSetOutputs_Noo
16310 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
16320 70 4e 65 77 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  pNew;.}..static 
16330 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73 74  void fts5Poslist
16340 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35  Callback(.  Fts5
16350 49 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c 20  Index *pUnused, 
16360 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78  .  void *pContex
16370 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  t, .  const u8 *
16380 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75  pChunk, int nChu
16390 6e 6b 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  nk.){.  UNUSED_P
163a0 41 52 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20  ARAM(pUnused);. 
163b0 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43 68 75   assert_nc( nChu
163c0 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e  nk>=0 );.  if( n
163d0 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 66  Chunk>0 ){.    f
163e0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
163f0 65 6e 64 42 6c 6f 62 28 28 46 74 73 35 42 75 66  endBlob((Fts5Buf
16400 66 65 72 2a 29 70 43 6f 6e 74 65 78 74 2c 20 70  fer*)pContext, p
16410 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a  Chunk, nChunk);.
16420 20 20 7d 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73    }.}..typedef s
16430 74 72 75 63 74 20 50 6f 73 6c 69 73 74 43 61 6c  truct PoslistCal
16440 6c 62 61 63 6b 43 74 78 20 50 6f 73 6c 69 73 74  lbackCtx Poslist
16450 43 61 6c 6c 62 61 63 6b 43 74 78 3b 0a 73 74 72  CallbackCtx;.str
16460 75 63 74 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62  uct PoslistCallb
16470 61 63 6b 43 74 78 20 7b 0a 20 20 46 74 73 35 42  ackCtx {.  Fts5B
16480 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20 20  uffer *pBuf;    
16490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70             /* Ap
164a0 70 65 6e 64 20 74 6f 20 74 68 69 73 20 62 75 66  pend to this buf
164b0 66 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c  fer */.  Fts5Col
164c0 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20  set *pColset;   
164d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
164e0 72 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20  rict matches to 
164f0 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  this column */. 
16500 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20   int eState;    
16510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16520 20 2f 2a 20 53 65 65 20 61 62 6f 76 65 20 2a 2f   /* See above */
16530 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72  .};..typedef str
16540 75 63 74 20 50 6f 73 6c 69 73 74 4f 66 66 73 65  uct PoslistOffse
16550 74 73 43 74 78 20 50 6f 73 6c 69 73 74 4f 66 66  tsCtx PoslistOff
16560 73 65 74 73 43 74 78 3b 0a 73 74 72 75 63 74 20  setsCtx;.struct 
16570 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74  PoslistOffsetsCt
16580 78 20 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72  x {.  Fts5Buffer
16590 20 2a 70 42 75 66 3b 20 20 20 20 20 20 20 20 20   *pBuf;         
165a0 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20        /* Append 
165b0 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
165c0 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  /.  Fts5Colset *
165d0 70 43 6f 6c 73 65 74 3b 20 20 20 20 20 20 20 20  pColset;        
165e0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 20      /* Restrict 
165f0 6d 61 74 63 68 65 73 20 74 6f 20 74 68 69 73 20  matches to this 
16600 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20  column */.  int 
16610 69 52 65 61 64 3b 0a 20 20 69 6e 74 20 69 57 72  iRead;.  int iWr
16620 69 74 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  ite;.};../*.** T
16630 4f 44 4f 3a 20 4d 61 6b 65 20 74 68 69 73 20 6d  ODO: Make this m
16640 6f 72 65 20 65 66 66 69 63 69 65 6e 74 21 0a 2a  ore efficient!.*
16650 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
16660 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74  5IndexColsetTest
16670 28 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f  (Fts5Colset *pCo
16680 6c 73 65 74 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  lset, int iCol){
16690 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
166a0 69 3d 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d 3e  i=0; i<pColset->
166b0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
166c0 69 66 28 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43  if( pColset->aiC
166d0 6f 6c 5b 69 5d 3d 3d 69 43 6f 6c 20 29 20 72 65  ol[i]==iCol ) re
166e0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
166f0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69  turn 0;.}..stati
16700 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69  c void fts5Posli
16710 73 74 4f 66 66 73 65 74 73 43 61 6c 6c 62 61 63  stOffsetsCallbac
16720 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  k(.  Fts5Index *
16730 70 55 6e 75 73 65 64 2c 20 0a 20 20 76 6f 69 64  pUnused, .  void
16740 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63   *pContext, .  c
16750 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c  onst u8 *pChunk,
16760 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20   int nChunk.){. 
16770 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43   PoslistOffsetsC
16780 74 78 20 2a 70 43 74 78 20 3d 20 28 50 6f 73 6c  tx *pCtx = (Posl
16790 69 73 74 4f 66 66 73 65 74 73 43 74 78 2a 29 70  istOffsetsCtx*)p
167a0 43 6f 6e 74 65 78 74 3b 0a 20 20 55 4e 55 53 45  Context;.  UNUSE
167b0 44 5f 50 41 52 41 4d 28 70 55 6e 75 73 65 64 29  D_PARAM(pUnused)
167c0 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e  ;.  assert_nc( n
167d0 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66  Chunk>=0 );.  if
167e0 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20  ( nChunk>0 ){.  
167f0 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20    int i = 0;.   
16800 20 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b   while( i<nChunk
16810 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 56   ){.      int iV
16820 61 6c 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 66  al;.      i += f
16830 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
16840 70 43 68 75 6e 6b 5b 69 5d 2c 20 69 56 61 6c 29  pChunk[i], iVal)
16850 3b 0a 20 20 20 20 20 20 69 56 61 6c 20 2b 3d 20  ;.      iVal += 
16860 70 43 74 78 2d 3e 69 52 65 61 64 20 2d 20 32 3b  pCtx->iRead - 2;
16870 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 69 52 65  .      pCtx->iRe
16880 61 64 20 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20  ad = iVal;.     
16890 20 69 66 28 20 66 74 73 35 49 6e 64 65 78 43 6f   if( fts5IndexCo
168a0 6c 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e 70  lsetTest(pCtx->p
168b0 43 6f 6c 73 65 74 2c 20 69 56 61 6c 29 20 29 7b  Colset, iVal) ){
168c0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
168d0 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
168e0 69 6e 74 28 70 43 74 78 2d 3e 70 42 75 66 2c 20  int(pCtx->pBuf, 
168f0 69 56 61 6c 20 2b 20 32 20 2d 20 70 43 74 78 2d  iVal + 2 - pCtx-
16900 3e 69 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20  >iWrite);.      
16910 20 20 70 43 74 78 2d 3e 69 57 72 69 74 65 20 3d    pCtx->iWrite =
16920 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20   iVal;.      }. 
16930 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74     }.  }.}..stat
16940 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73 6c  ic void fts5Posl
16950 69 73 74 46 69 6c 74 65 72 43 61 6c 6c 62 61 63  istFilterCallbac
16960 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  k(.  Fts5Index *
16970 70 55 6e 75 73 65 64 2c 0a 20 20 76 6f 69 64 20  pUnused,.  void 
16980 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f  *pContext, .  co
16990 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20  nst u8 *pChunk, 
169a0 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20  int nChunk.){.  
169b0 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43  PoslistCallbackC
169c0 74 78 20 2a 70 43 74 78 20 3d 20 28 50 6f 73 6c  tx *pCtx = (Posl
169d0 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 2a 29  istCallbackCtx*)
169e0 70 43 6f 6e 74 65 78 74 3b 0a 20 20 55 4e 55 53  pContext;.  UNUS
169f0 45 44 5f 50 41 52 41 4d 28 70 55 6e 75 73 65 64  ED_PARAM(pUnused
16a00 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20  );.  assert_nc( 
16a10 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69  nChunk>=0 );.  i
16a20 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20  f( nChunk>0 ){. 
16a30 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 72     /* Search thr
16a40 6f 75 67 68 20 74 6f 20 66 69 6e 64 20 74 68 65  ough to find the
16a50 20 66 69 72 73 74 20 76 61 72 69 6e 74 20 77 69   first varint wi
16a60 74 68 20 76 61 6c 75 65 20 31 2e 20 54 68 69 73  th value 1. This
16a70 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73   is the.    ** s
16a80 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
16a90 20 63 6f 6c 75 6d 6e 73 20 68 69 74 73 2e 20 2a   columns hits. *
16aa0 2f 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b  /.    int i = 0;
16ab0 0a 20 20 20 20 69 6e 74 20 69 53 74 61 72 74 20  .    int iStart 
16ac0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 43  = 0;..    if( pC
16ad0 74 78 2d 3e 65 53 74 61 74 65 3d 3d 32 20 29 7b  tx->eState==2 ){
16ae0 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b  .      int iCol;
16af0 0a 20 20 20 20 20 20 66 74 73 35 46 61 73 74 47  .      fts5FastG
16b00 65 74 56 61 72 69 6e 74 33 32 28 70 43 68 75 6e  etVarint32(pChun
16b10 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  k, i, iCol);.   
16b20 20 20 20 69 66 28 20 66 74 73 35 49 6e 64 65 78     if( fts5Index
16b30 43 6f 6c 73 65 74 54 65 73 74 28 70 43 74 78 2d  ColsetTest(pCtx-
16b40 3e 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 20  >pColset, iCol) 
16b50 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d  ){.        pCtx-
16b60 3e 65 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20  >eState = 1;.   
16b70 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
16b80 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28  afeAppendVarint(
16b90 70 43 74 78 2d 3e 70 42 75 66 2c 20 31 29 3b 0a  pCtx->pBuf, 1);.
16ba0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16bb0 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74       pCtx->eStat
16bc0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
16bd0 20 20 20 7d 0a 0a 20 20 20 20 64 6f 20 7b 0a 20     }..    do {. 
16be0 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 43       while( i<nC
16bf0 68 75 6e 6b 20 26 26 20 70 43 68 75 6e 6b 5b 69  hunk && pChunk[i
16c00 5d 21 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 20  ]!=0x01 ){.     
16c10 20 20 20 77 68 69 6c 65 28 20 70 43 68 75 6e 6b     while( pChunk
16c20 5b 69 5d 20 26 20 30 78 38 30 20 29 20 69 2b 2b  [i] & 0x80 ) i++
16c30 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20  ;.        i++;. 
16c40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16c50 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 29 7b   pCtx->eState ){
16c60 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
16c70 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
16c80 62 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 26 70  b(pCtx->pBuf, &p
16c90 43 68 75 6e 6b 5b 69 53 74 61 72 74 5d 2c 20 69  Chunk[iStart], i
16ca0 2d 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20  -iStart);.      
16cb0 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43  }.      if( i<nC
16cc0 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  hunk ){.        
16cd0 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  int iCol;.      
16ce0 20 20 69 53 74 61 72 74 20 3d 20 69 3b 0a 20 20    iStart = i;.  
16cf0 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
16d00 20 20 20 69 66 28 20 69 3e 3d 6e 43 68 75 6e 6b     if( i>=nChunk
16d10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
16d20 74 78 2d 3e 65 53 74 61 74 65 20 3d 20 32 3b 0a  tx->eState = 2;.
16d30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
16d40 20 20 20 20 20 20 20 20 20 66 74 73 35 46 61 73           fts5Fas
16d50 74 47 65 74 56 61 72 69 6e 74 33 32 28 70 43 68  tGetVarint32(pCh
16d60 75 6e 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a 20  unk, i, iCol);. 
16d70 20 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65           pCtx->e
16d80 53 74 61 74 65 20 3d 20 66 74 73 35 49 6e 64 65  State = fts5Inde
16d90 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43 74 78  xColsetTest(pCtx
16da0 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29  ->pColset, iCol)
16db0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
16dc0 70 43 74 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCtx->eState ){.
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
16de0 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
16df0 42 6c 6f 62 28 70 43 74 78 2d 3e 70 42 75 66 2c  Blob(pCtx->pBuf,
16e00 20 26 70 43 68 75 6e 6b 5b 69 53 74 61 72 74 5d   &pChunk[iStart]
16e10 2c 20 69 2d 69 53 74 61 72 74 29 3b 0a 20 20 20  , i-iStart);.   
16e20 20 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20           iStart 
16e30 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = i;.          }
16e40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16e50 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69   }.    }while( i
16e60 3c 6e 43 68 75 6e 6b 20 29 3b 0a 20 20 7d 0a 7d  <nChunk );.  }.}
16e70 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
16e80 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 0a  s5ChunkIterate(.
16e90 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
16ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16eb0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 62 6a 65 63    /* Index objec
16ec0 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
16ed0 65 72 20 2a 70 53 65 67 2c 20 20 20 20 20 20 20  er *pSeg,       
16ee0 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 6c 69 73         /* Poslis
16ef0 74 20 6f 66 20 74 68 69 73 20 69 74 65 72 61 74  t of this iterat
16f00 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  or */.  void *pC
16f10 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tx,             
16f20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
16f30 78 74 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 78  xt pointer for x
16f40 43 68 75 6e 6b 20 63 61 6c 6c 62 61 63 6b 20 2a  Chunk callback *
16f50 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 68 75 6e  /.  void (*xChun
16f60 6b 29 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 76  k)(Fts5Index*, v
16f70 6f 69 64 2a 2c 20 63 6f 6e 73 74 20 75 38 2a 2c  oid*, const u8*,
16f80 20 69 6e 74 29 0a 29 7b 0a 20 20 69 6e 74 20 6e   int).){.  int n
16f90 52 65 6d 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73  Rem = pSeg->nPos
16fa0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
16fb0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 73 74  mber of bytes st
16fc0 69 6c 6c 20 74 6f 20 63 6f 6d 65 20 2a 2f 0a 20  ill to come */. 
16fd0 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61   Fts5Data *pData
16fe0 20 3d 20 30 3b 0a 20 20 75 38 20 2a 70 43 68 75   = 0;.  u8 *pChu
16ff0 6e 6b 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61  nk = &pSeg->pLea
17000 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66  f->p[pSeg->iLeaf
17010 4f 66 66 73 65 74 5d 3b 0a 20 20 69 6e 74 20 6e  Offset];.  int n
17020 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d  Chunk = MIN(nRem
17030 2c 20 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73  , pSeg->pLeaf->s
17040 7a 4c 65 61 66 20 2d 20 70 53 65 67 2d 3e 69 4c  zLeaf - pSeg->iL
17050 65 61 66 4f 66 66 73 65 74 29 3b 0a 20 20 69 6e  eafOffset);.  in
17060 74 20 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 69  t pgno = pSeg->i
17070 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  LeafPgno;.  int 
17080 70 67 6e 6f 53 61 76 65 20 3d 20 30 3b 0a 0a 20  pgnoSave = 0;.. 
17090 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
170a0 6e 20 64 6f 65 73 20 6e 6f 74 6d 77 6f 72 6b 20  n does notmwork 
170b0 77 69 74 68 20 64 65 74 61 69 6c 3d 6e 6f 6e 65  with detail=none
170c0 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20   databases. */. 
170d0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e   assert( p->pCon
170e0 66 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54  fig->eDetail!=FT
170f0 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29  S5_DETAIL_NONE )
17100 3b 0a 0a 20 20 69 66 28 20 28 70 53 65 67 2d 3e  ;..  if( (pSeg->
17110 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
17120 49 54 45 52 5f 52 45 56 45 52 53 45 29 3d 3d 30  ITER_REVERSE)==0
17130 20 29 7b 0a 20 20 20 20 70 67 6e 6f 53 61 76 65   ){.    pgnoSave
17140 20 3d 20 70 67 6e 6f 2b 31 3b 0a 20 20 7d 0a 0a   = pgno+1;.  }..
17150 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
17160 20 20 78 43 68 75 6e 6b 28 70 2c 20 70 43 74 78    xChunk(p, pCtx
17170 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b  , pChunk, nChunk
17180 29 3b 0a 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e  );.    nRem -= n
17190 43 68 75 6e 6b 3b 0a 20 20 20 20 66 74 73 35 44  Chunk;.    fts5D
171a0 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61  ataRelease(pData
171b0 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3c  );.    if( nRem<
171c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  =0 ){.      brea
171d0 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
171e0 20 20 20 20 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20      pgno++;.    
171f0 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61    pData = fts5Da
17200 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53  taRead(p, FTS5_S
17210 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65  EGMENT_ROWID(pSe
17220 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  g->pSeg->iSegid,
17230 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 69   pgno));.      i
17240 66 28 20 70 44 61 74 61 3d 3d 30 20 29 20 62 72  f( pData==0 ) br
17250 65 61 6b 3b 0a 20 20 20 20 20 20 70 43 68 75 6e  eak;.      pChun
17260 6b 20 3d 20 26 70 44 61 74 61 2d 3e 70 5b 34 5d  k = &pData->p[4]
17270 3b 0a 20 20 20 20 20 20 6e 43 68 75 6e 6b 20 3d  ;.      nChunk =
17280 20 4d 49 4e 28 6e 52 65 6d 2c 20 70 44 61 74 61   MIN(nRem, pData
17290 2d 3e 73 7a 4c 65 61 66 20 2d 20 34 29 3b 0a 20  ->szLeaf - 4);. 
172a0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 70       if( pgno==p
172b0 67 6e 6f 53 61 76 65 20 29 7b 0a 20 20 20 20 20  gnoSave ){.     
172c0 20 20 20 61 73 73 65 72 74 28 20 70 53 65 67 2d     assert( pSeg-
172d0 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b  >pNextLeaf==0 );
172e0 0a 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70  .        pSeg->p
172f0 4e 65 78 74 4c 65 61 66 20 3d 20 70 44 61 74 61  NextLeaf = pData
17300 3b 0a 20 20 20 20 20 20 20 20 70 44 61 74 61 20  ;.        pData 
17310 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
17320 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
17330 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63  Iterator pIter c
17340 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
17350 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
17360 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69 73   (not EOF). This
17370 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  .** function app
17380 65 6e 64 73 20 74 68 65 20 70 6f 73 69 74 69 6f  ends the positio
17390 6e 20 6c 69 73 74 20 64 61 74 61 20 66 6f 72 20  n list data for 
173a0 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
173b0 79 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70  y to.** buffer p
173c0 42 75 66 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74  Buf. It does not
173d0 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
173e0 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
173f0 74 20 73 69 7a 65 0a 2a 2a 20 66 69 65 6c 64 2e  t size.** field.
17400 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17410 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69  fts5SegiterPosli
17420 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  st(.  Fts5Index 
17430 2a 70 2c 0a 20 20 46 74 73 35 53 65 67 49 74 65  *p,.  Fts5SegIte
17440 72 20 2a 70 53 65 67 2c 0a 20 20 46 74 73 35 43  r *pSeg,.  Fts5C
17450 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 0a  olset *pColset,.
17460 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
17470 75 66 0a 29 7b 0a 20 20 69 66 28 20 30 3d 3d 66  uf.){.  if( 0==f
17480 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70  ts5BufferGrow(&p
17490 2d 3e 72 63 2c 20 70 42 75 66 2c 20 70 53 65 67  ->rc, pBuf, pSeg
174a0 2d 3e 6e 50 6f 73 29 20 29 7b 0a 20 20 20 20 69  ->nPos) ){.    i
174b0 66 28 20 70 43 6f 6c 73 65 74 3d 3d 30 20 29 7b  f( pColset==0 ){
174c0 0a 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b  .      fts5Chunk
174d0 49 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 2c  Iterate(p, pSeg,
174e0 20 28 76 6f 69 64 2a 29 70 42 75 66 2c 20 66 74   (void*)pBuf, ft
174f0 73 35 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63  s5PoslistCallbac
17500 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  k);.    }else{. 
17510 20 20 20 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e       if( p->pCon
17520 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54  fig->eDetail==FT
17530 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29  S5_DETAIL_FULL )
17540 7b 0a 20 20 20 20 20 20 20 20 50 6f 73 6c 69 73  {.        Poslis
17550 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 73 43 74  tCallbackCtx sCt
17560 78 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e  x;.        sCtx.
17570 70 42 75 66 20 3d 20 70 42 75 66 3b 0a 20 20 20  pBuf = pBuf;.   
17580 20 20 20 20 20 73 43 74 78 2e 70 43 6f 6c 73 65       sCtx.pColse
17590 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 20  t = pColset;.   
175a0 20 20 20 20 20 73 43 74 78 2e 65 53 74 61 74 65       sCtx.eState
175b0 20 3d 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73   = fts5IndexCols
175c0 65 74 54 65 73 74 28 70 43 6f 6c 73 65 74 2c 20  etTest(pColset, 
175d0 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  0);.        asse
175e0 72 74 28 20 73 43 74 78 2e 65 53 74 61 74 65 3d  rt( sCtx.eState=
175f0 3d 30 20 7c 7c 20 73 43 74 78 2e 65 53 74 61 74  =0 || sCtx.eStat
17600 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  e==1 );.        
17610 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65  fts5ChunkIterate
17620 28 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a  (p, pSeg, (void*
17630 29 26 73 43 74 78 2c 20 66 74 73 35 50 6f 73 6c  )&sCtx, fts5Posl
17640 69 73 74 46 69 6c 74 65 72 43 61 6c 6c 62 61 63  istFilterCallbac
17650 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  k);.      }else{
17660 0a 20 20 20 20 20 20 20 20 50 6f 73 6c 69 73 74  .        Poslist
17670 4f 66 66 73 65 74 73 43 74 78 20 73 43 74 78 3b  OffsetsCtx sCtx;
17680 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
17690 26 73 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66  &sCtx, 0, sizeof
176a0 28 73 43 74 78 29 29 3b 0a 20 20 20 20 20 20 20  (sCtx));.       
176b0 20 73 43 74 78 2e 70 42 75 66 20 3d 20 70 42 75   sCtx.pBuf = pBu
176c0 66 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e  f;.        sCtx.
176d0 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65  pColset = pColse
176e0 74 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 43  t;.        fts5C
176f0 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70  hunkIterate(p, p
17700 53 65 67 2c 20 28 76 6f 69 64 2a 29 26 73 43 74  Seg, (void*)&sCt
17710 78 2c 20 66 74 73 35 50 6f 73 6c 69 73 74 4f 66  x, fts5PoslistOf
17720 66 73 65 74 73 43 61 6c 6c 62 61 63 6b 29 3b 0a  fsetsCallback);.
17730 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17740 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 4e 2f 4f 55  }.}../*.** IN/OU
17750 54 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 61  T parameter (*pa
17760 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 70 6f  ) points to a po
17770 73 69 74 69 6f 6e 20 6c 69 73 74 20 6e 20 62 79  sition list n by
17780 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 49 66 0a  tes in size. If.
17790 2a 2a 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  ** the position 
177a0 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 65 6e  list contains en
177b0 74 72 69 65 73 20 66 6f 72 20 63 6f 6c 75 6d 6e  tries for column
177c0 20 69 43 6f 6c 2c 20 74 68 65 6e 20 28 2a 70 61   iCol, then (*pa
177d0 29 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20 70  ) is set.** to p
177e0 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 75 62 2d  oint to the sub-
177f0 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 66 6f  position-list fo
17800 72 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 6e  r that column an
17810 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  d the number of.
17820 2a 2a 20 62 79 74 65 73 20 69 6e 20 69 74 20 72  ** bytes in it r
17830 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20  eturned. Or, if 
17840 74 68 65 20 61 72 67 75 6d 65 6e 74 20 70 6f 73  the argument pos
17850 69 74 69 6f 6e 20 6c 69 73 74 20 64 6f 65 73 20  ition list does 
17860 6e 6f 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61  not.** contain a
17870 6e 79 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63  ny entries for c
17880 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 72 65 74 75  olumn iCol, retu
17890 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 0..*/.static 
178a0 69 6e 74 20 66 74 73 35 49 6e 64 65 78 45 78 74  int fts5IndexExt
178b0 72 61 63 74 43 6f 6c 28 0a 20 20 63 6f 6e 73 74  ractCol(.  const
178c0 20 75 38 20 2a 2a 70 61 2c 20 20 20 20 20 20 20   u8 **pa,       
178d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
178e0 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f  /OUT: Pointer to
178f0 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 69 6e   poslist */.  in
17900 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t n,            
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17920 20 49 4e 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73   IN: Size of pos
17930 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  list in bytes */
17940 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20  .  int iCol     
17950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17960 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20     /* Column to 
17970 65 78 74 72 61 63 74 20 66 72 6f 6d 20 70 6f 73  extract from pos
17980 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  list */.){.  int
17990 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20   iCurrent = 0;  
179a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
179b0 41 6e 79 74 68 69 6e 67 20 62 65 66 6f 72 65 20  Anything before 
179c0 74 68 65 20 66 69 72 73 74 20 30 78 30 31 20 69  the first 0x01 i
179d0 73 20 63 6f 6c 20 30 20 2a 2f 0a 20 20 63 6f 6e  s col 0 */.  con
179e0 73 74 20 75 38 20 2a 70 20 3d 20 2a 70 61 3b 0a  st u8 *p = *pa;.
179f0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 45 6e 64    const u8 *pEnd
17a00 20 3d 20 26 70 5b 6e 5d 3b 20 20 20 20 20 20 20   = &p[n];       
17a10 20 20 2f 2a 20 4f 6e 65 20 62 79 74 65 20 70 61    /* One byte pa
17a20 73 74 20 65 6e 64 20 6f 66 20 70 6f 73 69 74 69  st end of positi
17a30 6f 6e 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 77 68  on list */..  wh
17a40 69 6c 65 28 20 69 43 6f 6c 3e 69 43 75 72 72 65  ile( iCol>iCurre
17a50 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 41 64 76  nt ){.    /* Adv
17a60 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 70 20 75  ance pointer p u
17a70 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74  ntil it points t
17a80 6f 20 70 45 6e 64 20 6f 72 20 61 6e 20 30 78 30  o pEnd or an 0x0
17a90 31 20 62 79 74 65 20 74 68 61 74 20 69 73 0a 20  1 byte that is. 
17aa0 20 20 20 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f     ** not part o
17ab0 66 20 61 20 76 61 72 69 6e 74 2e 20 4e 6f 74 65  f a varint. Note
17ac0 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
17ad0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 6e  possible for a n
17ae0 65 67 61 74 69 76 65 0a 20 20 20 20 2a 2a 20 6f  egative.    ** o
17af0 72 20 65 78 74 72 65 6d 65 6c 79 20 6c 61 72 67  r extremely larg
17b00 65 20 76 61 72 69 6e 74 20 74 6f 20 6f 63 63 75  e varint to occu
17b10 72 20 77 69 74 68 69 6e 20 61 6e 20 75 6e 63 6f  r within an unco
17b20 72 72 75 70 74 65 64 20 70 6f 73 69 74 69 6f 6e  rrupted position
17b30 20 0a 20 20 20 20 2a 2a 20 6c 69 73 74 2e 20 53   .    ** list. S
17b40 6f 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  o the last byte 
17b50 6f 66 20 65 61 63 68 20 76 61 72 69 6e 74 20 6d  of each varint m
17b60 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 6f  ay be assumed to
17b70 20 68 61 76 65 20 61 20 63 6c 65 61 72 0a 20 20   have a clear.  
17b80 20 20 2a 2a 20 30 78 38 30 20 62 69 74 2e 20 20    ** 0x80 bit.  
17b90 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70  */.    while( *p
17ba0 21 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20  !=0x01 ){.      
17bb0 77 68 69 6c 65 28 20 2a 70 2b 2b 20 26 20 30 78  while( *p++ & 0x
17bc0 38 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  80 );.      if( 
17bd0 70 3e 3d 70 45 6e 64 20 29 20 72 65 74 75 72 6e  p>=pEnd ) return
17be0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70   0;.    }.    *p
17bf0 61 20 3d 20 70 2b 2b 3b 0a 20 20 20 20 69 43 75  a = p++;.    iCu
17c00 72 72 65 6e 74 20 3d 20 2a 70 2b 2b 3b 0a 20 20  rrent = *p++;.  
17c10 20 20 69 66 28 20 69 43 75 72 72 65 6e 74 20 26    if( iCurrent &
17c20 20 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20 70   0x80 ){.      p
17c30 2d 2d 3b 0a 20 20 20 20 20 20 70 20 2b 3d 20 66  --;.      p += f
17c40 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 70  ts5GetVarint32(p
17c50 2c 20 69 43 75 72 72 65 6e 74 29 3b 0a 20 20 20  , iCurrent);.   
17c60 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f   }.  }.  if( iCo
17c70 6c 21 3d 69 43 75 72 72 65 6e 74 20 29 20 72 65  l!=iCurrent ) re
17c80 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 64  turn 0;..  /* Ad
17c90 76 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 70 20  vance pointer p 
17ca0 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20  until it points 
17cb0 74 6f 20 70 45 6e 64 20 6f 72 20 61 6e 20 30 78  to pEnd or an 0x
17cc0 30 31 20 62 79 74 65 20 74 68 61 74 20 69 73 0a  01 byte that is.
17cd0 20 20 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f 66    ** not part of
17ce0 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 77   a varint */.  w
17cf0 68 69 6c 65 28 20 70 3c 70 45 6e 64 20 26 26 20  hile( p<pEnd && 
17d00 2a 70 21 3d 30 78 30 31 20 29 7b 0a 20 20 20 20  *p!=0x01 ){.    
17d10 77 68 69 6c 65 28 20 2a 70 2b 2b 20 26 20 30 78  while( *p++ & 0x
17d20 38 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  80 );.  }..  ret
17d30 75 72 6e 20 70 20 2d 20 28 2a 70 61 29 3b 0a 7d  urn p - (*pa);.}
17d40 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
17d50 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c  5IndexExtractCol
17d60 73 65 74 20 28 0a 20 20 46 74 73 35 43 6f 6c 73  set (.  Fts5Cols
17d70 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20  et *pColset,    
17d80 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 73 65          /* Colse
17d90 74 20 74 6f 20 66 69 6c 74 65 72 20 6f 6e 20 2a  t to filter on *
17da0 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50  /.  const u8 *pP
17db0 6f 73 2c 20 69 6e 74 20 6e 50 6f 73 2c 20 20 20  os, int nPos,   
17dc0 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
17dd0 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 42 75  list */.  Fts5Bu
17de0 66 66 65 72 20 2a 70 42 75 66 20 20 20 20 20 20  ffer *pBuf      
17df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
17e00 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b  put buffer */.){
17e10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
17e20 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a  TE_OK;.  int i;.
17e30 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72  .  fts5BufferZer
17e40 6f 28 70 42 75 66 29 3b 0a 20 20 66 6f 72 28 69  o(pBuf);.  for(i
17e50 3d 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e  =0; i<pColset->n
17e60 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Col; i++){.    c
17e70 6f 6e 73 74 20 75 38 20 2a 70 53 75 62 20 3d 20  onst u8 *pSub = 
17e80 70 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20 6e 53  pPos;.    int nS
17e90 75 62 20 3d 20 66 74 73 35 49 6e 64 65 78 45 78  ub = fts5IndexEx
17ea0 74 72 61 63 74 43 6f 6c 28 26 70 53 75 62 2c 20  tractCol(&pSub, 
17eb0 6e 50 6f 73 2c 20 70 43 6f 6c 73 65 74 2d 3e 61  nPos, pColset->a
17ec0 69 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66  iCol[i]);.    if
17ed0 28 20 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20  ( nSub ){.      
17ee0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
17ef0 42 6c 6f 62 28 26 72 63 2c 20 70 42 75 66 2c 20  Blob(&rc, pBuf, 
17f00 6e 53 75 62 2c 20 70 53 75 62 29 3b 0a 20 20 20  nSub, pSub);.   
17f10 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
17f20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65  rc;.}../*.** xSe
17f30 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63  tOutputs callbac
17f40 6b 20 75 73 65 64 20 62 79 20 64 65 74 61 69 6c  k used by detail
17f50 3d 6e 6f 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2f  =none tables..*/
17f60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
17f70 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
17f80 4e 6f 6e 65 28 46 74 73 35 49 74 65 72 20 2a 70  None(Fts5Iter *p
17f90 49 74 65 72 2c 20 46 74 73 35 53 65 67 49 74 65  Iter, Fts5SegIte
17fa0 72 20 2a 70 53 65 67 29 7b 0a 20 20 61 73 73 65  r *pSeg){.  asse
17fb0 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  rt( pIter->pInde
17fc0 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  x->pConfig->eDet
17fd0 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
17fe0 5f 4e 4f 4e 45 20 29 3b 0a 20 20 70 49 74 65 72  _NONE );.  pIter
17ff0 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20  ->base.iRowid = 
18000 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20  pSeg->iRowid;.  
18010 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74  pIter->base.nDat
18020 61 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a  a = pSeg->nPos;.
18030 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74  }../*.** xSetOut
18040 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73  puts callback us
18050 65 64 20 62 79 20 64 65 74 61 69 6c 3d 66 75 6c  ed by detail=ful
18060 6c 20 61 6e 64 20 64 65 74 61 69 6c 3d 63 6f 6c  l and detail=col
18070 20 74 61 62 6c 65 73 20 77 68 65 6e 20 6e 6f 0a   tables when no.
18080 2a 2a 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72  ** column filter
18090 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64 2e  s are specified.
180a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
180b0 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
180c0 74 73 5f 4e 6f 63 6f 6c 73 65 74 28 46 74 73 35  ts_Nocolset(Fts5
180d0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73  Iter *pIter, Fts
180e0 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b  5SegIter *pSeg){
180f0 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69  .  pIter->base.i
18100 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52  Rowid = pSeg->iR
18110 6f 77 69 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62  owid;.  pIter->b
18120 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 53 65 67  ase.nData = pSeg
18130 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 61 73 73 65 72  ->nPos;..  asser
18140 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  t( pIter->pIndex
18150 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
18160 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il!=FTS5_DETAIL_
18170 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74  NONE );.  assert
18180 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74  ( pIter->pColset
18190 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ==0 );..  if( pS
181a0 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b  eg->iLeafOffset+
181b0 70 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67  pSeg->nPos<=pSeg
181c0 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  ->pLeaf->szLeaf 
181d0 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 64 61  ){.    /* All da
181e0 74 61 20 69 73 20 73 74 6f 72 65 64 20 6f 6e 20  ta is stored on 
181f0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
18200 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
18210 75 74 70 75 74 20 0a 20 20 20 20 2a 2a 20 76 61  utput .    ** va
18220 72 69 61 62 6c 65 73 20 74 6f 20 70 6f 69 6e 74  riables to point
18230 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f   into the body o
18240 66 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63  f the page objec
18250 74 2e 20 2a 2f 0a 20 20 20 20 70 49 74 65 72 2d  t. */.    pIter-
18260 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 26 70  >base.pData = &p
18270 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53  Seg->pLeaf->p[pS
18280 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d  eg->iLeafOffset]
18290 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
182a0 2a 20 54 68 65 20 64 61 74 61 20 69 73 20 64 69  * The data is di
182b0 73 74 72 69 62 75 74 65 64 20 6f 76 65 72 20 74  stributed over t
182c0 77 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73  wo or more pages
182d0 2e 20 43 6f 70 79 20 69 74 20 69 6e 74 6f 20 74  . Copy it into t
182e0 68 65 0a 20 20 20 20 2a 2a 20 46 74 73 35 49 74  he.    ** Fts5It
182f0 65 72 2e 70 6f 73 6c 69 73 74 20 62 75 66 66 65  er.poslist buffe
18300 72 20 61 6e 64 20 74 68 65 6e 20 73 65 74 20 74  r and then set t
18310 68 65 20 6f 75 74 70 75 74 20 70 6f 69 6e 74 65  he output pointe
18320 72 20 74 6f 20 70 6f 69 6e 74 0a 20 20 20 20 2a  r to point.    *
18330 2a 20 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  * to this buffer
18340 2e 20 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75  .  */.    fts5Bu
18350 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d  fferZero(&pIter-
18360 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 66  >poslist);.    f
18370 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
18380 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c  t(pIter->pIndex,
18390 20 70 53 65 67 2c 20 30 2c 20 26 70 49 74 65 72   pSeg, 0, &pIter
183a0 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  ->poslist);.    
183b0 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74  pIter->base.pDat
183c0 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  a = pIter->posli
183d0 73 74 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  st.p;.  }.}../*.
183e0 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20 63  ** xSetOutputs c
183f0 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20  allback used by 
18400 64 65 74 61 69 6c 3d 63 6f 6c 20 77 68 65 6e 20  detail=col when 
18410 74 68 65 72 65 20 69 73 20 61 20 63 6f 6c 75 6d  there is a colum
18420 6e 20 66 69 6c 74 65 72 0a 2a 2a 20 61 6e 64 20  n filter.** and 
18430 74 68 65 72 65 20 61 72 65 20 31 30 30 20 6f 72  there are 100 or
18440 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 41   more columns. A
18450 6c 73 6f 20 63 61 6c 6c 65 64 20 61 73 20 61 20  lso called as a 
18460 66 61 6c 6c 62 61 63 6b 20 66 72 6f 6d 0a 2a 2a  fallback from.**
18470 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
18480 75 74 73 5f 43 6f 6c 31 30 30 20 69 66 20 74 68  uts_Col100 if th
18490 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20 73 70  e column-list sp
184a0 61 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ans more than on
184b0 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
184c0 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53  c void fts5IterS
184d0 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 28 46 74  etOutputs_Col(Ft
184e0 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46  s5Iter *pIter, F
184f0 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
18500 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a  ){.  fts5BufferZ
18510 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c  ero(&pIter->posl
18520 69 73 74 29 3b 0a 20 20 66 74 73 35 53 65 67 69  ist);.  fts5Segi
18530 74 65 72 50 6f 73 6c 69 73 74 28 70 49 74 65 72  terPoslist(pIter
18540 2d 3e 70 49 6e 64 65 78 2c 20 70 53 65 67 2c 20  ->pIndex, pSeg, 
18550 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2c 20  pIter->pColset, 
18560 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
18570 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e  ;.  pIter->base.
18580 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69  iRowid = pSeg->i
18590 52 6f 77 69 64 3b 0a 20 20 70 49 74 65 72 2d 3e  Rowid;.  pIter->
185a0 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74  base.pData = pIt
185b0 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20  er->poslist.p;. 
185c0 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61   pIter->base.nDa
185d0 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c  ta = pIter->posl
185e0 69 73 74 2e 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ist.n;.}../*.** 
185f0 78 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c  xSetOutputs call
18600 62 61 63 6b 20 75 73 65 64 20 77 68 65 6e 3a 20  back used when: 
18610 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 64 65 74 61 69  .**.**   * detai
18620 6c 3d 63 6f 6c 2c 0a 2a 2a 20 20 20 2a 20 74 68  l=col,.**   * th
18630 65 72 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ere is a column 
18640 66 69 6c 74 65 72 2c 20 61 6e 64 0a 2a 2a 20 20  filter, and.**  
18650 20 2a 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e   * the table con
18660 74 61 69 6e 73 20 31 30 30 20 6f 72 20 66 65 77  tains 100 or few
18670 65 72 20 63 6f 6c 75 6d 6e 73 2e 20 0a 2a 2a 0a  er columns. .**.
18680 2a 2a 20 54 68 65 20 6c 61 73 74 20 70 6f 69 6e  ** The last poin
18690 74 20 69 73 20 74 6f 20 65 6e 73 75 72 65 20 61  t is to ensure a
186a0 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  ll column number
186b0 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 73 20  s are stored as 
186c0 0a 2a 2a 20 73 69 6e 67 6c 65 2d 62 79 74 65 20  .** single-byte 
186d0 76 61 72 69 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  varints..*/.stat
186e0 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72  ic void fts5Iter
186f0 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 31 30  SetOutputs_Col10
18700 30 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  0(Fts5Iter *pIte
18710 72 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  r, Fts5SegIter *
18720 70 53 65 67 29 7b 0a 0a 20 20 61 73 73 65 72 74  pSeg){..  assert
18730 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d  ( pIter->pIndex-
18740 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
18750 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 43  l==FTS5_DETAIL_C
18760 4f 4c 55 4d 4e 53 20 29 3b 0a 20 20 61 73 73 65  OLUMNS );.  asse
18770 72 74 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73  rt( pIter->pCols
18780 65 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 65  et );..  if( pSe
18790 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70  g->iLeafOffset+p
187a0 53 65 67 2d 3e 6e 50 6f 73 3e 70 53 65 67 2d 3e  Seg->nPos>pSeg->
187b0 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
187c0 0a 20 20 20 20 66 74 73 35 49 74 65 72 53 65 74  .    fts5IterSet
187d0 4f 75 74 70 75 74 73 5f 43 6f 6c 28 70 49 74 65  Outputs_Col(pIte
187e0 72 2c 20 70 53 65 67 29 3b 0a 20 20 7d 65 6c 73  r, pSeg);.  }els
187f0 65 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 28  e{.    u8 *a = (
18800 75 38 2a 29 26 70 53 65 67 2d 3e 70 4c 65 61 66  u8*)&pSeg->pLeaf
18810 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f  ->p[pSeg->iLeafO
18820 66 66 73 65 74 5d 3b 0a 20 20 20 20 75 38 20 2a  ffset];.    u8 *
18830 70 45 6e 64 20 3d 20 28 75 38 2a 29 26 61 5b 70  pEnd = (u8*)&a[p
18840 53 65 67 2d 3e 6e 50 6f 73 5d 3b 20 0a 20 20 20  Seg->nPos]; .   
18850 20 69 6e 74 20 69 50 72 65 76 20 3d 20 30 3b 0a   int iPrev = 0;.
18860 20 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 20 3d      int *aiCol =
18870 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2d   pIter->pColset-
18880 3e 61 69 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20  >aiCol;.    int 
18890 2a 61 69 43 6f 6c 45 6e 64 20 3d 20 26 61 69 43  *aiColEnd = &aiC
188a0 6f 6c 5b 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65  ol[pIter->pColse
188b0 74 2d 3e 6e 43 6f 6c 5d 3b 0a 0a 20 20 20 20 75  t->nCol];..    u
188c0 38 20 2a 61 4f 75 74 20 3d 20 70 49 74 65 72 2d  8 *aOut = pIter-
188d0 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20  >poslist.p;.    
188e0 69 6e 74 20 69 50 72 65 76 4f 75 74 20 3d 20 30  int iPrevOut = 0
188f0 3b 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61  ;..    pIter->ba
18900 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67  se.iRowid = pSeg
18910 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 20 20 77  ->iRowid;..    w
18920 68 69 6c 65 28 20 61 3c 70 45 6e 64 20 29 7b 0a  hile( a<pEnd ){.
18930 20 20 20 20 20 20 69 50 72 65 76 20 2b 3d 20 28        iPrev += (
18940 69 6e 74 29 61 2b 2b 5b 30 5d 20 2d 20 32 3b 0a  int)a++[0] - 2;.
18950 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 61 69        while( *ai
18960 43 6f 6c 3c 69 50 72 65 76 20 29 7b 0a 20 20 20  Col<iPrev ){.   
18970 20 20 20 20 20 61 69 43 6f 6c 2b 2b 3b 0a 20 20       aiCol++;.  
18980 20 20 20 20 20 20 69 66 28 20 61 69 43 6f 6c 3d        if( aiCol=
18990 3d 61 69 43 6f 6c 45 6e 64 20 29 20 67 6f 74 6f  =aiColEnd ) goto
189a0 20 73 65 74 6f 75 74 70 75 74 73 5f 63 6f 6c 5f   setoutputs_col_
189b0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
189c0 20 20 20 69 66 28 20 2a 61 69 43 6f 6c 3d 3d 69     if( *aiCol==i
189d0 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  Prev ){.        
189e0 2a 61 4f 75 74 2b 2b 20 3d 20 28 69 50 72 65 76  *aOut++ = (iPrev
189f0 20 2d 20 69 50 72 65 76 4f 75 74 29 20 2b 20 32   - iPrevOut) + 2
18a00 3b 0a 20 20 20 20 20 20 20 20 69 50 72 65 76 4f  ;.        iPrevO
18a10 75 74 20 3d 20 69 50 72 65 76 3b 0a 20 20 20 20  ut = iPrev;.    
18a20 20 20 7d 0a 20 20 20 20 7d 0a 0a 73 65 74 6f 75    }.    }..setou
18a30 74 70 75 74 73 5f 63 6f 6c 5f 6f 75 74 3a 0a 20  tputs_col_out:. 
18a40 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70     pIter->base.p
18a50 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f  Data = pIter->po
18a60 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 70 49 74  slist.p;.    pIt
18a70 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d  er->base.nData =
18a80 20 61 4f 75 74 20 2d 20 70 49 74 65 72 2d 3e 70   aOut - pIter->p
18a90 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 7d 0a 7d 0a  oslist.p;.  }.}.
18aa0 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75  ./*.** xSetOutpu
18ab0 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64  ts callback used
18ac0 20 62 79 20 64 65 74 61 69 6c 3d 66 75 6c 6c 20   by detail=full 
18ad0 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20  when there is a 
18ae0 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 2e 0a 2a  column filter..*
18af0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
18b00 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
18b10 5f 46 75 6c 6c 28 46 74 73 35 49 74 65 72 20 2a  _Full(Fts5Iter *
18b20 70 49 74 65 72 2c 20 46 74 73 35 53 65 67 49 74  pIter, Fts5SegIt
18b30 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 46 74 73  er *pSeg){.  Fts
18b40 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
18b50 20 3d 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65   = pIter->pColse
18b60 74 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65  t;.  pIter->base
18b70 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e  .iRowid = pSeg->
18b80 69 52 6f 77 69 64 3b 0a 0a 20 20 61 73 73 65 72  iRowid;..  asser
18b90 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  t( pIter->pIndex
18ba0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
18bb0 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
18bc0 46 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  FULL );.  assert
18bd0 28 20 70 43 6f 6c 73 65 74 20 29 3b 0a 0a 20 20  ( pColset );..  
18be0 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f  if( pSeg->iLeafO
18bf0 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73  ffset+pSeg->nPos
18c00 3c 3d 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73  <=pSeg->pLeaf->s
18c10 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20  zLeaf ){.    /* 
18c20 41 6c 6c 20 64 61 74 61 20 69 73 20 73 74 6f 72  All data is stor
18c30 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ed on the curren
18c40 74 20 70 61 67 65 2e 20 50 6f 70 75 6c 61 74 65  t page. Populate
18c50 20 74 68 65 20 6f 75 74 70 75 74 20 0a 20 20 20   the output .   
18c60 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 74 6f   ** variables to
18c70 20 70 6f 69 6e 74 20 69 6e 74 6f 20 74 68 65 20   point into the 
18c80 62 6f 64 79 20 6f 66 20 74 68 65 20 70 61 67 65  body of the page
18c90 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20   object. */.    
18ca0 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 26 70  const u8 *a = &p
18cb0 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53  Seg->pLeaf->p[pS
18cc0 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d  eg->iLeafOffset]
18cd0 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65  ;.    if( pColse
18ce0 74 2d 3e 6e 43 6f 6c 3d 3d 31 20 29 7b 0a 20 20  t->nCol==1 ){.  
18cf0 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e      pIter->base.
18d00 6e 44 61 74 61 20 3d 20 66 74 73 35 49 6e 64 65  nData = fts5Inde
18d10 78 45 78 74 72 61 63 74 43 6f 6c 28 26 61 2c 20  xExtractCol(&a, 
18d20 70 53 65 67 2d 3e 6e 50 6f 73 2c 70 43 6f 6c 73  pSeg->nPos,pCols
18d30 65 74 2d 3e 61 69 43 6f 6c 5b 30 5d 29 3b 0a 20  et->aiCol[0]);. 
18d40 20 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65       pIter->base
18d50 2e 70 44 61 74 61 20 3d 20 61 3b 0a 20 20 20 20  .pData = a;.    
18d60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73  }else{.      fts
18d70 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74  5BufferZero(&pIt
18d80 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20  er->poslist);.  
18d90 20 20 20 20 66 74 73 35 49 6e 64 65 78 45 78 74      fts5IndexExt
18da0 72 61 63 74 43 6f 6c 73 65 74 28 70 43 6f 6c 73  ractColset(pCols
18db0 65 74 2c 20 61 2c 20 70 53 65 67 2d 3e 6e 50 6f  et, a, pSeg->nPo
18dc0 73 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  s, &pIter->posli
18dd0 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  st);.      pIter
18de0 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70  ->base.pData = p
18df0 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b  Iter->poslist.p;
18e00 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 61  .      pIter->ba
18e10 73 65 2e 6e 44 61 74 61 20 3d 20 70 49 74 65 72  se.nData = pIter
18e20 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 20  ->poslist.n;.   
18e30 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
18e40 2f 2a 20 54 68 65 20 64 61 74 61 20 69 73 20 64  /* The data is d
18e50 69 73 74 72 69 62 75 74 65 64 20 6f 76 65 72 20  istributed over 
18e60 74 77 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  two or more page
18e70 73 2e 20 43 6f 70 79 20 69 74 20 69 6e 74 6f 20  s. Copy it into 
18e80 74 68 65 0a 20 20 20 20 2a 2a 20 46 74 73 35 49  the.    ** Fts5I
18e90 74 65 72 2e 70 6f 73 6c 69 73 74 20 62 75 66 66  ter.poslist buff
18ea0 65 72 20 61 6e 64 20 74 68 65 6e 20 73 65 74 20  er and then set 
18eb0 74 68 65 20 6f 75 74 70 75 74 20 70 6f 69 6e 74  the output point
18ec0 65 72 20 74 6f 20 70 6f 69 6e 74 0a 20 20 20 20  er to point.    
18ed0 2a 2a 20 74 6f 20 74 68 69 73 20 62 75 66 66 65  ** to this buffe
18ee0 72 2e 20 20 2a 2f 0a 20 20 20 20 66 74 73 35 42  r.  */.    fts5B
18ef0 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72  ufferZero(&pIter
18f00 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  ->poslist);.    
18f10 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69  fts5SegiterPosli
18f20 73 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  st(pIter->pIndex
18f30 2c 20 70 53 65 67 2c 20 70 43 6f 6c 73 65 74 2c  , pSeg, pColset,
18f40 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74   &pIter->poslist
18f50 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61  );.    pIter->ba
18f60 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65 72  se.pData = pIter
18f70 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20  ->poslist.p;.   
18f80 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61   pIter->base.nDa
18f90 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c  ta = pIter->posl
18fa0 69 73 74 2e 6e 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  ist.n;.  }.}..st
18fb0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74  atic void fts5It
18fc0 65 72 53 65 74 4f 75 74 70 75 74 43 62 28 69 6e  erSetOutputCb(in
18fd0 74 20 2a 70 52 63 2c 20 46 74 73 35 49 74 65 72  t *pRc, Fts5Iter
18fe0 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
18ff0 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
19000 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69  ){.    Fts5Confi
19010 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 49 74  g *pConfig = pIt
19020 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e  er->pIndex->pCon
19030 66 69 67 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  fig;.    if( pCo
19040 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46  nfig->eDetail==F
19050 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
19060 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
19070 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74  xSetOutputs = ft
19080 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
19090 5f 4e 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  _None;.    }..  
190a0 20 20 65 6c 73 65 20 69 66 28 20 70 49 74 65 72    else if( pIter
190b0 2d 3e 70 43 6f 6c 73 65 74 3d 3d 30 20 29 7b 0a  ->pColset==0 ){.
190c0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65        pIter->xSe
190d0 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35 49  tOutputs = fts5I
190e0 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f  terSetOutputs_No
190f0 63 6f 6c 73 65 74 3b 0a 20 20 20 20 7d 0a 0a 20  colset;.    }.. 
19100 20 20 20 65 6c 73 65 20 69 66 28 20 70 43 6f 6e     else if( pCon
19110 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54  fig->eDetail==FT
19120 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29  S5_DETAIL_FULL )
19130 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78  {.      pIter->x
19140 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73  SetOutputs = fts
19150 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
19160 46 75 6c 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Full;.    }..   
19170 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73   else{.      ass
19180 65 72 74 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44  ert( pConfig->eD
19190 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
191a0 49 4c 5f 43 4f 4c 55 4d 4e 53 20 29 3b 0a 20 20  IL_COLUMNS );.  
191b0 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d      if( pConfig-
191c0 3e 6e 43 6f 6c 3c 3d 31 30 30 20 29 7b 0a 20 20  >nCol<=100 ){.  
191d0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65        pIter->xSe
191e0 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35 49  tOutputs = fts5I
191f0 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f  terSetOutputs_Co
19200 6c 31 30 30 3b 0a 20 20 20 20 20 20 20 20 73 71  l100;.        sq
19210 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
19220 69 7a 65 28 70 52 63 2c 20 26 70 49 74 65 72 2d  ize(pRc, &pIter-
19230 3e 70 6f 73 6c 69 73 74 2c 20 70 43 6f 6e 66 69  >poslist, pConfi
19240 67 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  g->nCol);.      
19250 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
19260 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74  Iter->xSetOutput
19270 73 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f  s = fts5IterSetO
19280 75 74 70 75 74 73 5f 43 6f 6c 3b 0a 20 20 20 20  utputs_Col;.    
19290 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
192a0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
192b0 20 61 20 6e 65 77 20 46 74 73 35 49 74 65 72 20   a new Fts5Iter 
192c0 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
192d0 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69 6c  e new object wil
192e0 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65  l be used to ite
192f0 72 61 74 65 20 74 68 72 6f 75 67 68 20 64 61 74  rate through dat
19300 61 20 69 6e 20 73 74 72 75 63 74 75 72 65 20 70  a in structure p
19310 53 74 72 75 63 74 2e 0a 2a 2a 20 49 66 20 69 4c  Struct..** If iL
19320 65 76 65 6c 20 69 73 20 2d 76 65 2c 20 74 68 65  evel is -ve, the
19330 6e 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 61 6c  n all data in al
19340 6c 20 73 65 67 6d 65 6e 74 73 20 69 73 20 6d 65  l segments is me
19350 72 67 65 64 2e 20 4f 72 2c 20 69 66 20 69 4c 65  rged. Or, if iLe
19360 76 65 6c 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 6f  vel.** is zero o
19370 72 20 67 72 65 61 74 65 72 2c 20 64 61 74 61 20  r greater, data 
19380 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 6e  from the first n
19390 53 65 67 6d 65 6e 74 20 73 65 67 6d 65 6e 74 73  Segment segments
193a0 20 6f 6e 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c   on level iLevel
193b0 0a 2a 2a 20 69 73 20 6d 65 72 67 65 64 2e 0a 2a  .** is merged..*
193c0 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f  *.** The iterato
193d0 72 20 69 6e 69 74 69 61 6c 6c 79 20 70 6f 69 6e  r initially poin
193e0 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
193f0 74 65 72 6d 2f 72 6f 77 69 64 20 65 6e 74 72 79  term/rowid entry
19400 20 69 6e 20 74 68 65 20 0a 2a 2a 20 69 74 65 72   in the .** iter
19410 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ated data..*/.st
19420 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
19430 6c 74 69 49 74 65 72 4e 65 77 28 0a 20 20 46 74  ltiIterNew(.  Ft
19440 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19460 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f   FTS5 backend to
19470 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20   iterate within 
19480 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
19490 72 65 20 2a 70 53 74 72 75 63 74 2c 20 20 20 20  re *pStruct,    
194a0 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75 72       /* Structur
194b0 65 20 6f 66 20 73 70 65 63 69 66 69 63 20 69 6e  e of specific in
194c0 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  dex */.  int fla
194d0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
194e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
194f0 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 58 58 20  INDEX_QUERY_XXX 
19500 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 43  flags */.  Fts5C
19510 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20  olset *pColset, 
19520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
19530 6c 73 65 74 20 74 6f 20 66 69 6c 74 65 72 20 6f  lset to filter o
19540 6e 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20  n (or NULL) */. 
19550 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
19560 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20  , int nTerm,    
19570 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b   /* Term to seek
19580 20 74 6f 20 28 6f 72 20 4e 55 4c 4c 2f 30 29 20   to (or NULL/0) 
19590 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
195a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195b0 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f       /* Level to
195c0 20 69 74 65 72 61 74 65 20 28 2d 31 20 66 6f 72   iterate (-1 for
195d0 20 61 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e   all) */.  int n
195e0 53 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 20 20  Segment,        
195f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19600 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
19610 20 74 6f 20 6d 65 72 67 65 20 28 69 4c 65 76 65   to merge (iLeve
19620 6c 3e 3d 30 29 20 2a 2f 0a 20 20 46 74 73 35 49  l>=0) */.  Fts5I
19630 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20 20 20  ter **ppOut     
19640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
19650 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  w object */.){. 
19660 20 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b 20 20   int nSeg = 0;  
19670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19680 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65   /* Number of se
19690 67 6d 65 6e 74 2d 69 74 65 72 73 20 69 6e 20 75  gment-iters in u
196a0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 74 65  se */.  int iIte
196b0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
196c0 20 20 20 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20          /* */.  
196d0 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20 20 20  int iSeg;       
196e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196f0 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
19700 74 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65  te through segme
19710 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  nts */.  Fts5Str
19720 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
19730 6c 3b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  l;.  Fts5Iter *p
19740 4e 65 77 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  New;..  assert( 
19750 28 70 54 65 72 6d 3d 3d 30 20 26 26 20 6e 54 65  (pTerm==0 && nTe
19760 72 6d 3d 3d 30 29 20 7c 7c 20 69 4c 65 76 65 6c  rm==0) || iLevel
19770 3c 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  <0 );..  /* Allo
19780 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
19790 68 65 20 6e 65 77 20 6d 75 6c 74 69 2d 73 65 67  he new multi-seg
197a0 2d 69 74 65 72 61 74 6f 72 2e 20 2a 2f 0a 20 20  -iterator. */.  
197b0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
197c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
197d0 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20  iLevel<0 ){.    
197e0 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
197f0 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73  t->nSegment==fts
19800 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
19810 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29  egments(pStruct)
19820 20 29 3b 0a 20 20 20 20 20 20 6e 53 65 67 20 3d   );.      nSeg =
19830 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
19840 6e 74 3b 0a 20 20 20 20 20 20 6e 53 65 67 20 2b  nt;.      nSeg +
19850 3d 20 28 70 2d 3e 70 48 61 73 68 20 3f 20 31 20  = (p->pHash ? 1 
19860 3a 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  : 0);.    }else{
19870 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20 4d 49  .      nSeg = MI
19880 4e 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  N(pStruct->aLeve
19890 6c 5b 69 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c 20  l[iLevel].nSeg, 
198a0 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 7d  nSegment);.    }
198b0 0a 20 20 7d 0a 20 20 2a 70 70 4f 75 74 20 3d 20  .  }.  *ppOut = 
198c0 70 4e 65 77 20 3d 20 66 74 73 35 4d 75 6c 74 69  pNew = fts5Multi
198d0 49 74 65 72 41 6c 6c 6f 63 28 70 2c 20 6e 53 65  IterAlloc(p, nSe
198e0 67 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d  g);.  if( pNew==
198f0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4e  0 ) return;.  pN
19900 65 77 2d 3e 62 52 65 76 20 3d 20 28 30 21 3d 28  ew->bRev = (0!=(
19910 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
19920 58 5f 51 55 45 52 59 5f 44 45 53 43 29 29 3b 0a  X_QUERY_DESC));.
19930 20 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70    pNew->bSkipEmp
19940 74 79 20 3d 20 28 30 21 3d 28 66 6c 61 67 73 20  ty = (0!=(flags 
19950 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
19960 59 5f 53 4b 49 50 45 4d 50 54 59 29 29 3b 0a 20  Y_SKIPEMPTY));. 
19970 20 70 4e 65 77 2d 3e 70 53 74 72 75 63 74 20 3d   pNew->pStruct =
19980 20 70 53 74 72 75 63 74 3b 0a 20 20 70 4e 65 77   pStruct;.  pNew
19990 2d 3e 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c  ->pColset = pCol
199a0 73 65 74 3b 0a 20 20 66 74 73 35 53 74 72 75 63  set;.  fts5Struc
199b0 74 75 72 65 52 65 66 28 70 53 74 72 75 63 74 29  tureRef(pStruct)
199c0 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20 26  ;.  if( (flags &
199d0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
199e0 5f 4e 4f 4f 55 54 50 55 54 29 3d 3d 30 20 29 7b  _NOOUTPUT)==0 ){
199f0 0a 20 20 20 20 66 74 73 35 49 74 65 72 53 65 74  .    fts5IterSet
19a00 4f 75 74 70 75 74 43 62 28 26 70 2d 3e 72 63 2c  OutputCb(&p->rc,
19a10 20 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f   pNew);.  }..  /
19a20 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 65 61 63  * Initialize eac
19a30 68 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 6e 65  h of the compone
19a40 6e 74 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61  nt segment itera
19a50 74 6f 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70  tors. */.  if( p
19a60 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
19a70 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 65 76 65  ){.    if( iLeve
19a80 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73  l<0 ){.      Fts
19a90 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
19aa0 2a 70 45 6e 64 20 3d 20 26 70 53 74 72 75 63 74  *pEnd = &pStruct
19ab0 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75 63 74  ->aLevel[pStruct
19ac0 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 20  ->nLevel];.     
19ad0 20 69 66 28 20 70 2d 3e 70 48 61 73 68 20 29 7b   if( p->pHash ){
19ae0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20  .        /* Add 
19af0 61 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74  a segment iterat
19b00 6f 72 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  or for the curre
19b10 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  nt contents of t
19b20 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a  he hash table. *
19b30 2f 0a 20 20 20 20 20 20 20 20 46 74 73 35 53 65  /.        Fts5Se
19b40 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26  gIter *pIter = &
19b50 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72  pNew->aSeg[iIter
19b60 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ++];.        fts
19b70 35 53 65 67 49 74 65 72 48 61 73 68 49 6e 69 74  5SegIterHashInit
19b80 28 70 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d  (p, pTerm, nTerm
19b90 2c 20 66 6c 61 67 73 2c 20 70 49 74 65 72 29 3b  , flags, pIter);
19ba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
19bb0 6f 72 28 70 4c 76 6c 3d 26 70 53 74 72 75 63 74  or(pLvl=&pStruct
19bc0 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b 20 70 4c 76  ->aLevel[0]; pLv
19bd0 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b  l<pEnd; pLvl++){
19be0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65  .        for(iSe
19bf0 67 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20  g=pLvl->nSeg-1; 
19c00 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29  iSeg>=0; iSeg--)
19c10 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74 73 35  {.          Fts5
19c20 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
19c30 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e   *pSeg = &pLvl->
19c40 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20  aSeg[iSeg];.    
19c50 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
19c60 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e 65 77  r *pIter = &pNew
19c70 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b  ->aSeg[iIter++];
19c80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
19c90 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Term==0 ){.     
19ca0 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
19cb0 65 72 49 6e 69 74 28 70 2c 20 70 53 65 67 2c 20  erInit(p, pSeg, 
19cc0 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pIter);.        
19cd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19ce0 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
19cf0 53 65 65 6b 49 6e 69 74 28 70 2c 20 70 54 65 72  SeekInit(p, pTer
19d00 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c  m, nTerm, flags,
19d10 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a 20   pSeg, pIter);. 
19d20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
19d30 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
19d40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
19d50 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
19d60 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b 0a 20  Level[iLevel];. 
19d70 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 6e 53       for(iSeg=nS
19d80 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69  eg-1; iSeg>=0; i
19d90 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  Seg--){.        
19da0 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28  fts5SegIterInit(
19db0 70 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  p, &pLvl->aSeg[i
19dc0 53 65 67 5d 2c 20 26 70 4e 65 77 2d 3e 61 53 65  Seg], &pNew->aSe
19dd0 67 5b 69 49 74 65 72 2b 2b 5d 29 3b 0a 20 20 20  g[iIter++]);.   
19de0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
19df0 73 73 65 72 74 28 20 69 49 74 65 72 3d 3d 6e 53  ssert( iIter==nS
19e00 65 67 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  eg );.  }..  /* 
19e10 49 66 20 74 68 65 20 61 62 6f 76 65 20 77 61 73  If the above was
19e20 20 73 75 63 63 65 73 73 66 75 6c 2c 20 65 61 63   successful, eac
19e30 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 69 74 65 72  h component iter
19e40 61 74 6f 72 73 20 6e 6f 77 20 70 6f 69 6e 74 73  ators now points
19e50 20 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 66 69   .  ** to the fi
19e60 72 73 74 20 65 6e 74 72 79 20 69 6e 20 69 74 73  rst entry in its
19e70 20 73 65 67 6d 65 6e 74 2e 20 49 6e 20 74 68 69   segment. In thi
19e80 73 20 63 61 73 65 20 69 6e 69 74 69 61 6c 69 7a  s case initializ
19e90 65 20 74 68 65 20 0a 20 20 2a 2a 20 61 46 69 72  e the .  ** aFir
19ea0 73 74 5b 5d 20 61 72 72 61 79 2e 20 4f 72 2c 20  st[] array. Or, 
19eb0 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  if an error has 
19ec0 6f 63 63 75 72 72 65 64 2c 20 66 72 65 65 20 74  occurred, free t
19ed0 68 65 20 69 74 65 72 61 74 6f 72 0a 20 20 2a 2a  he iterator.  **
19ee0 20 6f 62 6a 65 63 74 20 61 6e 64 20 73 65 74 20   object and set 
19ef0 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
19f00 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e 20 20 2a 2f  ble to NULL.  */
19f10 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
19f20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66  LITE_OK ){.    f
19f30 6f 72 28 69 49 74 65 72 3d 70 4e 65 77 2d 3e 6e  or(iIter=pNew->n
19f40 53 65 67 2d 31 3b 20 69 49 74 65 72 3e 30 3b 20  Seg-1; iIter>0; 
19f50 69 49 74 65 72 2d 2d 29 7b 0a 20 20 20 20 20 20  iIter--){.      
19f60 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 20 20 69  int iEq;.      i
19f70 66 28 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75  f( (iEq = fts5Mu
19f80 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65  ltiIterDoCompare
19f90 28 70 4e 65 77 2c 20 69 49 74 65 72 29 29 20 29  (pNew, iIter)) )
19fa0 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 53 65  {.        Fts5Se
19fb0 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
19fc0 4e 65 77 2d 3e 61 53 65 67 5b 69 45 71 5d 3b 0a  New->aSeg[iEq];.
19fd0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
19fe0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
19ff0 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53  Seg->xNext(p, pS
1a000 65 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  eg, 0);.        
1a010 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
1a020 61 6e 63 65 64 28 70 2c 20 70 4e 65 77 2c 20 69  anced(p, pNew, i
1a030 45 71 2c 20 69 49 74 65 72 29 3b 0a 20 20 20 20  Eq, iIter);.    
1a040 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74    }.    }.    ft
1a050 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f  s5MultiIterSetEo
1a060 66 28 70 4e 65 77 29 3b 0a 20 20 20 20 66 74 73  f(pNew);.    fts
1a070 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
1a080 53 65 74 75 70 28 70 2c 20 70 4e 65 77 29 3b 0a  Setup(p, pNew);.
1a090 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 62  .    if( pNew->b
1a0a0 53 6b 69 70 45 6d 70 74 79 20 26 26 20 66 74 73  SkipEmpty && fts
1a0b0 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74  5MultiIterIsEmpt
1a0c0 79 28 70 2c 20 70 4e 65 77 29 20 29 7b 0a 20 20  y(p, pNew) ){.  
1a0d0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
1a0e0 72 4e 65 78 74 28 70 2c 20 70 4e 65 77 2c 20 30  rNext(p, pNew, 0
1a0f0 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  , 0);.    }else 
1a100 69 66 28 20 70 4e 65 77 2d 3e 62 61 73 65 2e 62  if( pNew->base.b
1a110 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Eof==0 ){.      
1a120 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
1a130 67 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b  g = &pNew->aSeg[
1a140 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  pNew->aFirst[1].
1a150 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 70  iFirst];.      p
1a160 4e 65 77 2d 3e 78 53 65 74 4f 75 74 70 75 74 73  New->xSetOutputs
1a170 28 70 4e 65 77 2c 20 70 53 65 67 29 3b 0a 20 20  (pNew, pSeg);.  
1a180 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    }..  }else{.  
1a190 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46    fts5MultiIterF
1a1a0 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 2a  ree(pNew);.    *
1a1b0 70 70 4f 75 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d  ppOut = 0;.  }.}
1a1c0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
1a1d0 6e 20 46 74 73 35 49 74 65 72 20 74 68 61 74 20  n Fts5Iter that 
1a1e0 69 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68  iterates through
1a1f0 20 74 68 65 20 64 6f 63 6c 69 73 74 20 70 72 6f   the doclist pro
1a200 76 69 64 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  vided.** as the 
1a210 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
1a220 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1a230 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
1a240 32 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  2(.  Fts5Index *
1a250 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1a260 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
1a270 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20  kend to iterate 
1a280 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35  within */.  Fts5
1a290 44 61 74 61 20 2a 70 44 61 74 61 2c 20 20 20 20  Data *pData,    
1a2a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1a2b0 6f 63 6c 69 73 74 20 74 6f 20 69 74 65 72 61 74  oclist to iterat
1a2c0 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69  e through */.  i
1a2d0 6e 74 20 62 44 65 73 63 2c 20 20 20 20 20 20 20  nt bDesc,       
1a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a2f0 2a 20 54 72 75 65 20 66 6f 72 20 64 65 73 63 65  * True for desce
1a300 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65  nding rowid orde
1a310 72 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20  r */.  Fts5Iter 
1a320 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 20  **ppOut         
1a330 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62         /* New ob
1a340 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ject */.){.  Fts
1a350 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20 70  5Iter *pNew;.  p
1a360 4e 65 77 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  New = fts5MultiI
1a370 74 65 72 41 6c 6c 6f 63 28 70 2c 20 32 29 3b 0a  terAlloc(p, 2);.
1a380 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
1a390 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
1a3a0 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53  Iter = &pNew->aS
1a3b0 65 67 5b 31 5d 3b 0a 0a 20 20 20 20 70 49 74 65  eg[1];..    pIte
1a3c0 72 2d 3e 66 6c 61 67 73 20 3d 20 46 54 53 35 5f  r->flags = FTS5_
1a3d0 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b  SEGITER_ONETERM;
1a3e0 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e  .    if( pData->
1a3f0 73 7a 4c 65 61 66 3e 30 20 29 7b 0a 20 20 20 20  szLeaf>0 ){.    
1a400 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
1a410 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20 70 49   pData;.      pI
1a420 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
1a430 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   = fts5GetVarint
1a440 28 70 44 61 74 61 2d 3e 70 2c 20 28 75 36 34 2a  (pData->p, (u64*
1a450 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
1a460 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  ;.      pIter->i
1a470 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70  EndofDoclist = p
1a480 44 61 74 61 2d 3e 6e 6e 3b 0a 20 20 20 20 20 20  Data->nn;.      
1a490 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  pNew->aFirst[1].
1a4a0 69 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20  iFirst = 1;.    
1a4b0 20 20 69 66 28 20 62 44 65 73 63 20 29 7b 0a 20    if( bDesc ){. 
1a4c0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 52 65         pNew->bRe
1a4d0 76 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  v = 1;.        p
1a4e0 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46  Iter->flags |= F
1a4f0 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
1a500 52 53 45 3b 0a 20 20 20 20 20 20 20 20 66 74 73  RSE;.        fts
1a510 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49  5SegIterReverseI
1a520 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  nitPage(p, pIter
1a530 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1a540 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
1a550 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
1a560 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
1a570 20 20 20 20 20 70 44 61 74 61 20 3d 20 30 3b 0a       pData = 0;.
1a580 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a590 20 70 4e 65 77 2d 3e 62 61 73 65 2e 62 45 6f 66   pNew->base.bEof
1a5a0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
1a5b0 66 74 73 35 53 65 67 49 74 65 72 53 65 74 4e 65  fts5SegIterSetNe
1a5c0 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20  xt(p, pIter);.. 
1a5d0 20 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77     *ppOut = pNew
1a5e0 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74  ;.  }..  fts5Dat
1a5f0 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b  aRelease(pData);
1a600 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1a610 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74 65   true if the ite
1a620 72 61 74 6f 72 20 69 73 20 61 74 20 45 4f 46 20  rator is at EOF 
1a630 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68  or if an error h
1a640 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 2a 2a  as occurred. .**
1a650 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   False otherwise
1a660 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a670 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
1a680 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
1a690 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ts5Iter *pIter){
1a6a0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
1a6b0 20 0a 20 20 20 20 20 20 7c 7c 20 28 70 49 74 65   .      || (pIte
1a6c0 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
1a6d0 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
1a6e0 20 5d 2e 70 4c 65 61 66 3d 3d 30 29 3d 3d 70 49   ].pLeaf==0)==pI
1a6f0 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20 0a  ter->base.bEof .
1a700 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70    );.  return (p
1a710 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d 3e 62  ->rc || pIter->b
1a720 61 73 65 2e 62 45 6f 66 29 3b 0a 7d 0a 0a 2f 2a  ase.bEof);.}../*
1a730 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
1a740 6f 77 69 64 20 6f 66 20 74 68 65 20 65 6e 74 72  owid of the entr
1a750 79 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61  y that the itera
1a760 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  tor currently po
1a770 69 6e 74 73 0a 2a 2a 20 74 6f 2e 20 49 66 20 74  ints.** to. If t
1a780 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
1a790 74 73 20 74 6f 20 45 4f 46 20 77 68 65 6e 20 74  ts to EOF when t
1a7a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1a7b0 63 61 6c 6c 65 64 20 74 68 65 0a 2a 2a 20 72 65  called the.** re
1a7c0 73 75 6c 74 73 20 61 72 65 20 75 6e 64 65 66 69  sults are undefi
1a7d0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1a7e0 36 34 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  64 fts5MultiIter
1a7f0 52 6f 77 69 64 28 46 74 73 35 49 74 65 72 20 2a  Rowid(Fts5Iter *
1a800 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74  pIter){.  assert
1a810 28 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70  ( pIter->aSeg[ p
1a820 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
1a830 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66 20 29  iFirst ].pLeaf )
1a840 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  ;.  return pIter
1a850 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
1a860 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
1a870 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a  ].iRowid;.}../*.
1a880 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72  ** Move the iter
1a890 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ator to the next
1a8a0 20 65 6e 74 72 79 20 61 74 20 6f 72 20 66 6f 6c   entry at or fol
1a8b0 6c 6f 77 69 6e 67 20 69 4d 61 74 63 68 2e 0a 2a  lowing iMatch..*
1a8c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1a8d0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 46  s5MultiIterNextF
1a8e0 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rom(.  Fts5Index
1a8f0 20 2a 70 2c 20 0a 20 20 46 74 73 35 49 74 65 72   *p, .  Fts5Iter
1a900 20 2a 70 49 74 65 72 2c 20 0a 20 20 69 36 34 20   *pIter, .  i64 
1a910 69 4d 61 74 63 68 0a 29 7b 0a 20 20 77 68 69 6c  iMatch.){.  whil
1a920 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36 34 20  e( 1 ){.    i64 
1a930 69 52 6f 77 69 64 3b 0a 20 20 20 20 66 74 73 35  iRowid;.    fts5
1a940 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
1a950 20 70 49 74 65 72 2c 20 31 2c 20 69 4d 61 74 63   pIter, 1, iMatc
1a960 68 29 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35  h);.    if( fts5
1a970 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
1a980 70 49 74 65 72 29 20 29 20 62 72 65 61 6b 3b 0a  pIter) ) break;.
1a990 20 20 20 20 69 52 6f 77 69 64 20 3d 20 66 74 73      iRowid = fts
1a9a0 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28  5MultiIterRowid(
1a9b0 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  pIter);.    if( 
1a9c0 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20 26  pIter->bRev==0 &
1a9d0 26 20 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68  & iRowid>=iMatch
1a9e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
1a9f0 28 20 70 49 74 65 72 2d 3e 62 52 65 76 21 3d 30  ( pIter->bRev!=0
1aa00 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4d 61 74   && iRowid<=iMat
1aa10 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ch ) break;.  }.
1aa20 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1aa30 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62  a pointer to a b
1aa40 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
1aa50 20 74 68 65 20 74 65 72 6d 20 61 73 73 6f 63 69   the term associ
1aa60 61 74 65 64 20 77 69 74 68 20 74 68 65 20 0a 2a  ated with the .*
1aa70 2a 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  * entry that the
1aa80 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e   iterator curren
1aa90 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  tly points to..*
1aaa0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
1aab0 38 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65 72  8 *fts5MultiIter
1aac0 54 65 72 6d 28 46 74 73 35 49 74 65 72 20 2a 70  Term(Fts5Iter *p
1aad0 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a  Iter, int *pn){.
1aae0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
1aaf0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
1ab00 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
1ab10 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 2a 70  ].iFirst ];.  *p
1ab20 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e 6e 3b 0a 20  n = p->term.n;. 
1ab30 20 72 65 74 75 72 6e 20 70 2d 3e 74 65 72 6d 2e   return p->term.
1ab40 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  p;.}../*.** Allo
1ab50 63 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65  cate a new segme
1ab60 6e 74 2d 69 64 20 66 6f 72 20 74 68 65 20 73 74  nt-id for the st
1ab70 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e  ructure pStruct.
1ab80 20 54 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74   The new segment
1ab90 0a 2a 2a 20 69 64 20 6d 75 73 74 20 62 65 20 62  .** id must be b
1aba0 65 74 77 65 65 6e 20 31 20 61 6e 64 20 36 35 33  etween 1 and 653
1abb0 33 35 20 69 6e 63 6c 75 73 69 76 65 2c 20 61 6e  35 inclusive, an
1abc0 64 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 75 73  d must not be us
1abd0 65 64 20 62 79 20 0a 2a 2a 20 61 6e 79 20 63 75  ed by .** any cu
1abe0 72 72 65 6e 74 6c 79 20 65 78 69 73 74 69 6e 67  rrently existing
1abf0 20 73 65 67 6d 65 6e 74 2e 20 49 66 20 61 20 66   segment. If a f
1ac00 72 65 65 20 73 65 67 6d 65 6e 74 20 69 64 20 63  ree segment id c
1ac10 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 0a  annot be found,.
1ac20 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 69  ** SQLITE_FULL i
1ac30 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
1ac40 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  * If an error ha
1ac50 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
1ac60 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
1ac70 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 30 20  n is a no-op. 0 
1ac80 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
1ac90 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
1aca0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
1acb0 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 46 74  AllocateSegid(Ft
1acc0 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
1acd0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
1ace0 63 74 29 7b 0a 20 20 69 6e 74 20 69 53 65 67 69  ct){.  int iSegi
1acf0 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d  d = 0;..  if( p-
1ad00 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1ad10 7b 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63  {.    if( pStruc
1ad20 74 2d 3e 6e 53 65 67 6d 65 6e 74 3e 3d 46 54 53  t->nSegment>=FTS
1ad30 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20 29 7b  5_MAX_SEGMENT ){
1ad40 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  .      p->rc = S
1ad50 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
1ad60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 68 69  }else{.      whi
1ad70 6c 65 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b  le( iSegid==0 ){
1ad80 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 76  .        int iLv
1ad90 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 20  l, iSeg;.       
1ada0 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
1adb0 65 73 73 28 73 69 7a 65 6f 66 28 75 33 32 29 2c  ess(sizeof(u32),
1adc0 20 28 76 6f 69 64 2a 29 26 69 53 65 67 69 64 29   (void*)&iSegid)
1add0 3b 0a 20 20 20 20 20 20 20 20 69 53 65 67 69 64  ;.        iSegid
1ade0 20 3d 20 69 53 65 67 69 64 20 26 20 28 28 31 20   = iSegid & ((1 
1adf0 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f  << FTS5_DATA_ID_
1ae00 42 29 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 66  B)-1);.        f
1ae10 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
1ae20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
1ae30 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
1ae40 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
1ae50 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c  iSeg<pStruct->aL
1ae60 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
1ae70 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
1ae80 20 20 20 20 20 20 69 66 28 20 69 53 65 67 69 64        if( iSegid
1ae90 3d 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  ==pStruct->aLeve
1aea0 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65  l[iLvl].aSeg[iSe
1aeb0 67 5d 2e 69 53 65 67 69 64 20 29 7b 0a 20 20 20  g].iSegid ){.   
1aec0 20 20 20 20 20 20 20 20 20 20 20 69 53 65 67 69             iSegi
1aed0 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
1aee0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1aef0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1af00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1af10 72 65 74 75 72 6e 20 69 53 65 67 69 64 3b 0a 7d  return iSegid;.}
1af20 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20  ../*.** Discard 
1af30 61 6c 6c 20 64 61 74 61 20 63 75 72 72 65 6e 74  all data current
1af40 6c 79 20 63 61 63 68 65 64 20 69 6e 20 74 68 65  ly cached in the
1af50 20 68 61 73 68 2d 74 61 62 6c 65 73 2e 0a 2a 2f   hash-tables..*/
1af60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1af70 35 49 6e 64 65 78 44 69 73 63 61 72 64 44 61 74  5IndexDiscardDat
1af80 61 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  a(Fts5Index *p){
1af90 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48  .  assert( p->pH
1afa0 61 73 68 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69  ash || p->nPendi
1afb0 6e 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 69  ngData==0 );.  i
1afc0 66 28 20 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20  f( p->pHash ){. 
1afd0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
1afe0 73 68 43 6c 65 61 72 28 70 2d 3e 70 48 61 73 68  shClear(p->pHash
1aff0 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69  );.    p->nPendi
1b000 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a  ngData = 0;.  }.
1b010 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1b020 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1b030 70 72 65 66 69 78 2c 20 69 6e 20 62 79 74 65 73  prefix, in bytes
1b040 2c 20 74 68 61 74 20 62 75 66 66 65 72 20 0a 2a  , that buffer .*
1b050 2a 20 28 70 4e 65 77 2f 3c 6c 65 6e 67 74 68 2d  * (pNew/<length-
1b060 75 6e 6b 6e 6f 77 6e 3e 29 20 73 68 61 72 65 73  unknown>) shares
1b070 20 77 69 74 68 20 62 75 66 66 65 72 20 28 70 4f   with buffer (pO
1b080 6c 64 2f 6e 4f 6c 64 29 2e 0a 2a 2a 0a 2a 2a 20  ld/nOld)..**.** 
1b090 42 75 66 66 65 72 20 28 70 4e 65 77 2f 3c 6c 65  Buffer (pNew/<le
1b0a0 6e 67 74 68 2d 75 6e 6b 6e 6f 77 6e 3e 29 20 69  ngth-unknown>) i
1b0b0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
1b0c0 62 65 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 74  be greater .** t
1b0d0 68 61 6e 20 62 75 66 66 65 72 20 28 70 4f 6c 64  han buffer (pOld
1b0e0 2f 6e 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  /nOld)..*/.stati
1b0f0 63 20 69 6e 74 20 66 74 73 35 50 72 65 66 69 78  c int fts5Prefix
1b100 43 6f 6d 70 72 65 73 73 28 69 6e 74 20 6e 4f 6c  Compress(int nOl
1b110 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4f 6c  d, const u8 *pOl
1b120 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4e 65  d, const u8 *pNe
1b130 77 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  w){.  int i;.  f
1b140 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
1b150 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f  i++){.    if( pO
1b160 6c 64 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d 20 29  ld[i]!=pNew[i] )
1b170 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
1b180 74 75 72 6e 20 69 3b 0a 7d 0a 0a 73 74 61 74 69  turn i;.}..stati
1b190 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
1b1a0 44 6c 69 64 78 43 6c 65 61 72 28 0a 20 20 46 74  DlidxClear(.  Ft
1b1b0 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
1b1c0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
1b1d0 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 6c  riter,.  int bFl
1b1e0 75 73 68 20 20 20 20 20 20 20 20 20 20 20 20 20  ush             
1b1f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1b200 72 75 65 2c 20 77 72 69 74 65 20 64 6c 69 64 78  rue, write dlidx
1b210 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 29 7b 0a 20   to disk */.){. 
1b220 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
1b230 28 20 62 46 6c 75 73 68 3d 3d 30 20 7c 7c 20 28  ( bFlush==0 || (
1b240 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e  pWriter->nDlidx>
1b250 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44  0 && pWriter->aD
1b260 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 29  lidx[0].buf.n>0)
1b270 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
1b280 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78  <pWriter->nDlidx
1b290 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  ; i++){.    Fts5
1b2a0 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c  DlidxWriter *pDl
1b2b0 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  idx = &pWriter->
1b2c0 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20 69  aDlidx[i];.    i
1b2d0 66 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e  f( pDlidx->buf.n
1b2e0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
1b2f0 20 69 66 28 20 62 46 6c 75 73 68 20 29 7b 0a 20   if( bFlush ){. 
1b300 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 6c       assert( pDl
1b310 69 64 78 2d 3e 70 67 6e 6f 21 3d 30 20 29 3b 0a  idx->pgno!=0 );.
1b320 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72        fts5DataWr
1b330 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20 20 20  ite(p, .        
1b340 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57    FTS5_DLIDX_ROW
1b350 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67  ID(pWriter->iSeg
1b360 69 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e 70  id, i, pDlidx->p
1b370 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  gno),.          
1b380 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20 70  pDlidx->buf.p, p
1b390 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20 20  Dlidx->buf.n.   
1b3a0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
1b3b0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1b3c0 72 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62  rZero(&pDlidx->b
1b3d0 75 66 29 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d  uf);.    pDlidx-
1b3e0 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 30 3b  >bPrevValid = 0;
1b3f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 72  .  }.}../*.** Gr
1b400 6f 77 20 74 68 65 20 70 57 72 69 74 65 72 2d 3e  ow the pWriter->
1b410 61 44 6c 69 64 78 5b 5d 20 61 72 72 61 79 20 74  aDlidx[] array t
1b420 6f 20 61 74 20 6c 65 61 73 74 20 6e 4c 76 6c 20  o at least nLvl 
1b430 65 6c 65 6d 65 6e 74 73 20 69 6e 20 73 69 7a 65  elements in size
1b440 2e 0a 2a 2a 20 41 6e 79 20 6e 65 77 20 61 72 72  ..** Any new arr
1b450 61 79 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20  ay elements are 
1b460 7a 65 72 6f 65 64 20 62 65 66 6f 72 65 20 72 65  zeroed before re
1b470 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
1b480 69 63 20 69 6e 74 20 66 74 73 35 57 72 69 74 65  ic int fts5Write
1b490 44 6c 69 64 78 47 72 6f 77 28 0a 20 20 46 74 73  DlidxGrow(.  Fts
1b4a0 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73  5Index *p,.  Fts
1b4b0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1b4c0 74 65 72 2c 0a 20 20 69 6e 74 20 6e 4c 76 6c 0a  ter,.  int nLvl.
1b4d0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
1b4e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 4c 76  SQLITE_OK && nLv
1b4f0 6c 3e 3d 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69  l>=pWriter->nDli
1b500 64 78 20 29 7b 0a 20 20 20 20 46 74 73 35 44 6c  dx ){.    Fts5Dl
1b510 69 64 78 57 72 69 74 65 72 20 2a 61 44 6c 69 64  idxWriter *aDlid
1b520 78 20 3d 20 28 46 74 73 35 44 6c 69 64 78 57 72  x = (Fts5DlidxWr
1b530 69 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72 65  iter*)sqlite3_re
1b540 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70  alloc(.        p
1b550 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 2c 20  Writer->aDlidx, 
1b560 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
1b570 57 72 69 74 65 72 29 20 2a 20 6e 4c 76 6c 0a 20  Writer) * nLvl. 
1b580 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 61 44     );.    if( aD
1b590 6c 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lidx==0 ){.     
1b5a0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
1b5b0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
1b5c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  {.      int nByt
1b5d0 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 44  e = sizeof(Fts5D
1b5e0 6c 69 64 78 57 72 69 74 65 72 29 20 2a 20 28 6e  lidxWriter) * (n
1b5f0 4c 76 6c 20 2d 20 70 57 72 69 74 65 72 2d 3e 6e  Lvl - pWriter->n
1b600 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 6d 65  Dlidx);.      me
1b610 6d 73 65 74 28 26 61 44 6c 69 64 78 5b 70 57 72  mset(&aDlidx[pWr
1b620 69 74 65 72 2d 3e 6e 44 6c 69 64 78 5d 2c 20 30  iter->nDlidx], 0
1b630 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
1b640 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 20  pWriter->aDlidx 
1b650 3d 20 61 44 6c 69 64 78 3b 0a 20 20 20 20 20 20  = aDlidx;.      
1b660 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 20  pWriter->nDlidx 
1b670 3d 20 6e 4c 76 6c 3b 0a 20 20 20 20 7d 0a 20 20  = nLvl;.    }.  
1b680 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  }.  return p->rc
1b690 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
1b6a0 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73  e current doclis
1b6b0 74 2d 69 6e 64 65 78 20 61 63 63 75 6d 75 6c 61  t-index accumula
1b6c0 74 69 6e 67 20 69 6e 20 70 57 72 69 74 65 72 2d  ting in pWriter-
1b6d0 3e 61 44 6c 69 64 78 5b 5d 20 69 73 20 6c 61 72  >aDlidx[] is lar
1b6e0 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 2c 20 66 6c  ge.** enough, fl
1b6f0 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b 20 61  ush it to disk a
1b700 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 4f 74 68  nd return 1. Oth
1b710 65 72 77 69 73 65 20 64 69 73 63 61 72 64 20 69  erwise discard i
1b720 74 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  t and return.** 
1b730 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
1b740 69 6e 74 20 66 74 73 35 57 72 69 74 65 46 6c 75  int fts5WriteFlu
1b750 73 68 44 6c 69 64 78 28 46 74 73 35 49 6e 64 65  shDlidx(Fts5Inde
1b760 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69  x *p, Fts5SegWri
1b770 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20  ter *pWriter){. 
1b780 20 69 6e 74 20 62 46 6c 61 67 20 3d 20 30 3b 0a   int bFlag = 0;.
1b790 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77  .  /* If there w
1b7a0 65 72 65 20 46 54 53 35 5f 4d 49 4e 5f 44 4c 49  ere FTS5_MIN_DLI
1b7b0 44 58 5f 53 49 5a 45 20 6f 72 20 6d 6f 72 65 20  DX_SIZE or more 
1b7c0 65 6d 70 74 79 20 6c 65 61 66 20 70 61 67 65 73  empty leaf pages
1b7d0 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f   written.  ** to
1b7e0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 61   the database, a
1b7f0 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 64 6f  lso write the do
1b800 63 6c 69 73 74 2d 69 6e 64 65 78 20 74 6f 20 64  clist-index to d
1b810 69 73 6b 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  isk.  */.  if( p
1b820 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30  Writer->aDlidx[0
1b830 5d 2e 62 75 66 2e 6e 3e 30 20 26 26 20 70 57 72  ].buf.n>0 && pWr
1b840 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54  iter->nEmpty>=FT
1b850 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a  S5_MIN_DLIDX_SIZ
1b860 45 20 29 7b 0a 20 20 20 20 62 46 6c 61 67 20 3d  E ){.    bFlag =
1b870 20 31 3b 0a 20 20 7d 0a 20 20 66 74 73 35 57 72   1;.  }.  fts5Wr
1b880 69 74 65 44 6c 69 64 78 43 6c 65 61 72 28 70 2c  iteDlidxClear(p,
1b890 20 70 57 72 69 74 65 72 2c 20 62 46 6c 61 67 29   pWriter, bFlag)
1b8a0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d  ;.  pWriter->nEm
1b8b0 70 74 79 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  pty = 0;.  retur
1b8c0 6e 20 62 46 6c 61 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  n bFlag;.}../*.*
1b8d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1b8e0 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76  is called whenev
1b8f0 65 72 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66  er processing of
1b900 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f 72   the doclist for
1b910 20 74 68 65 20 0a 2a 2a 20 6c 61 73 74 20 74 65   the .** last te
1b920 72 6d 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 20  rm on leaf page 
1b930 28 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67  (pWriter->iBtPag
1b940 65 29 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  e) is completed.
1b950 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 63 6c   .**.** The docl
1b960 69 73 74 2d 69 6e 64 65 78 20 66 6f 72 20 74 68  ist-index for th
1b970 61 74 20 74 65 72 6d 20 69 73 20 63 75 72 72 65  at term is curre
1b980 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 2d 6d  ntly stored in-m
1b990 65 6d 6f 72 79 20 77 69 74 68 69 6e 20 74 68 65  emory within the
1b9a0 0a 2a 2a 20 46 74 73 35 53 65 67 57 72 69 74 65  .** Fts5SegWrite
1b9b0 72 2e 61 44 6c 69 64 78 5b 5d 20 61 72 72 61 79  r.aDlidx[] array
1b9c0 2e 20 49 66 20 69 74 20 69 73 20 6c 61 72 67 65  . If it is large
1b9d0 20 65 6e 6f 75 67 68 2c 20 74 68 69 73 20 66 75   enough, this fu
1b9e0 6e 63 74 69 6f 6e 0a 2a 2a 20 77 72 69 74 65 73  nction.** writes
1b9f0 20 69 74 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e   it out to disk.
1ba00 20 4f 72 2c 20 69 66 20 69 74 20 69 73 20 74 6f   Or, if it is to
1ba10 6f 20 73 6d 61 6c 6c 20 74 6f 20 62 6f 74 68 65  o small to bothe
1ba20 72 20 77 69 74 68 2c 20 64 69 73 63 61 72 64 73  r with, discards
1ba30 0a 2a 2a 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 46 74  .** it..**.** Ft
1ba40 73 35 53 65 67 57 72 69 74 65 72 2e 62 74 74 65  s5SegWriter.btte
1ba50 72 6d 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  rm currently con
1ba60 74 61 69 6e 73 20 74 68 65 20 66 69 72 73 74 20  tains the first 
1ba70 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 69 42 74  term on page iBt
1ba80 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
1ba90 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 6c  void fts5WriteFl
1baa0 75 73 68 42 74 72 65 65 28 46 74 73 35 49 6e 64  ushBtree(Fts5Ind
1bab0 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72  ex *p, Fts5SegWr
1bac0 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a  iter *pWriter){.
1bad0 20 20 69 6e 74 20 62 46 6c 61 67 3b 0a 0a 20 20    int bFlag;..  
1bae0 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72 2d  assert( pWriter-
1baf0 3e 69 42 74 50 61 67 65 20 7c 7c 20 70 57 72 69  >iBtPage || pWri
1bb00 74 65 72 2d 3e 6e 45 6d 70 74 79 3d 3d 30 20 29  ter->nEmpty==0 )
1bb10 3b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  ;.  if( pWriter-
1bb20 3e 69 42 74 50 61 67 65 3d 3d 30 20 29 20 72 65  >iBtPage==0 ) re
1bb30 74 75 72 6e 3b 0a 20 20 62 46 6c 61 67 20 3d 20  turn;.  bFlag = 
1bb40 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 44 6c  fts5WriteFlushDl
1bb50 69 64 78 28 70 2c 20 70 57 72 69 74 65 72 29 3b  idx(p, pWriter);
1bb60 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
1bb70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1bb80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1bb90 28 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d  (pWriter->btterm
1bba0 2e 6e 3e 30 3f 28 63 6f 6e 73 74 20 63 68 61 72  .n>0?(const char
1bbb0 2a 29 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72  *)pWriter->btter
1bbc0 6d 2e 70 3a 22 22 29 3b 0a 20 20 20 20 2f 2a 20  m.p:"");.    /* 
1bbd0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61  The following wa
1bbe0 73 20 61 6c 72 65 61 64 79 20 64 6f 6e 65 20 69  s already done i
1bbf0 6e 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28  n fts5WriteInit(
1bc00 29 3a 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 71 6c  ): */.    /* sql
1bc10 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d  ite3_bind_int(p-
1bc20 3e 70 49 64 78 57 72 69 74 65 72 2c 20 31 2c 20  >pIdxWriter, 1, 
1bc30 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 29  pWriter->iSegid)
1bc40 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  ; */.    sqlite3
1bc50 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 49  _bind_blob(p->pI
1bc60 64 78 57 72 69 74 65 72 2c 20 32 2c 20 7a 2c 20  dxWriter, 2, z, 
1bc70 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e  pWriter->btterm.
1bc80 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  n, SQLITE_STATIC
1bc90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
1bca0 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 49 64  ind_int64(p->pId
1bcb0 78 57 72 69 74 65 72 2c 20 33 2c 20 62 46 6c 61  xWriter, 3, bFla
1bcc0 67 20 2b 20 28 28 69 36 34 29 70 57 72 69 74 65  g + ((i64)pWrite
1bcd0 72 2d 3e 69 42 74 50 61 67 65 3c 3c 31 29 29 3b  r->iBtPage<<1));
1bce0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65  .    sqlite3_ste
1bcf0 70 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 29  p(p->pIdxWriter)
1bd00 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71  ;.    p->rc = sq
1bd10 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70  lite3_reset(p->p
1bd20 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a  IdxWriter);.  }.
1bd30 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61    pWriter->iBtPa
1bd40 67 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ge = 0;.}../*.**
1bd50 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
1bd60 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 6c 65  once for each le
1bd70 61 66 20 70 61 67 65 20 65 78 63 65 70 74 20 74  af page except t
1bd80 68 65 20 66 69 72 73 74 20 74 68 61 74 20 63 6f  he first that co
1bd90 6e 74 61 69 6e 73 0a 2a 2a 20 61 74 20 6c 65 61  ntains.** at lea
1bda0 73 74 20 6f 6e 65 20 74 65 72 6d 2e 20 41 72 67  st one term. Arg
1bdb0 75 6d 65 6e 74 20 28 6e 54 65 72 6d 2f 70 54 65  ument (nTerm/pTe
1bdc0 72 6d 29 20 69 73 20 74 68 65 20 73 70 6c 69 74  rm) is the split
1bdd0 2d 6b 65 79 20 2d 20 61 20 74 65 72 6d 20 74 68  -key - a term th
1bde0 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72 20  at.** is larger 
1bdf0 74 68 61 6e 20 61 6c 6c 20 74 65 72 6d 73 20 77  than all terms w
1be00 72 69 74 74 65 6e 20 74 6f 20 65 61 72 6c 69 65  ritten to earlie
1be10 72 20 6c 65 61 76 65 73 2c 20 61 6e 64 20 65 71  r leaves, and eq
1be20 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20 73 6d 61  ual to or.** sma
1be30 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 66 69  ller than the fi
1be40 72 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20  rst term on the 
1be50 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a 2a 2a 20  new leaf..**.** 
1be60 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1be70 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
1be80 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74 73  e is left in Fts
1be90 35 49 6e 64 65 78 2e 72 63 2e 20 49 66 20 61 6e  5Index.rc. If an
1bea0 20 65 72 72 6f 72 0a 2a 2a 20 68 61 73 20 61 6c   error.** has al
1beb0 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
1bec0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1bed0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
1bee0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
1bef0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
1bf00 72 69 74 65 42 74 72 65 65 54 65 72 6d 28 0a 20  riteBtreeTerm(. 
1bf10 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
1bf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf30 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
1bf40 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
1bf50 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1bf60 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ter,         /* 
1bf70 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f  Writer object */
1bf80 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f  .  int nTerm, co
1bf90 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20 20 20  nst u8 *pTerm   
1bfa0 20 20 20 2f 2a 20 46 69 72 73 74 20 74 65 72 6d     /* First term
1bfb0 20 6f 6e 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a   on new page */.
1bfc0 29 7b 0a 20 20 66 74 73 35 57 72 69 74 65 46 6c  ){.  fts5WriteFl
1bfd0 75 73 68 42 74 72 65 65 28 70 2c 20 70 57 72 69  ushBtree(p, pWri
1bfe0 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66 66  ter);.  fts5Buff
1bff0 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
1c000 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2c 20  Writer->btterm, 
1c010 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
1c020 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67   pWriter->iBtPag
1c030 65 20 3d 20 70 57 72 69 74 65 72 2d 3e 77 72 69  e = pWriter->wri
1c040 74 65 72 2e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ter.pgno;.}../*.
1c050 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1c060 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
1c070 66 6c 75 73 68 69 6e 67 20 61 20 6c 65 61 66 20  flushing a leaf 
1c080 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
1c090 6e 73 20 6e 6f 0a 2a 2a 20 74 65 72 6d 73 20 61  ns no.** terms a
1c0a0 74 20 61 6c 6c 20 74 6f 20 64 69 73 6b 2e 0a 2a  t all to disk..*
1c0b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1c0c0 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65  s5WriteBtreeNoTe
1c0d0 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  rm(.  Fts5Index 
1c0e0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1c0f0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
1c100 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
1c110 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1c120 2a 70 57 72 69 74 65 72 20 20 20 20 20 20 20 20  *pWriter        
1c130 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65    /* Writer obje
1c140 63 74 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66  ct */.){.  /* If
1c150 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 72   there were no r
1c160 6f 77 69 64 73 20 6f 6e 20 74 68 65 20 6c 65 61  owids on the lea
1c170 66 20 70 61 67 65 20 65 69 74 68 65 72 20 61 6e  f page either an
1c180 64 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  d the doclist-in
1c190 64 65 78 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72  dex.  ** has alr
1c1a0 65 61 64 79 20 62 65 65 6e 20 73 74 61 72 74 65  eady been starte
1c1b0 64 2c 20 61 70 70 65 6e 64 20 61 6e 20 30 78 30  d, append an 0x0
1c1c0 30 20 62 79 74 65 20 74 6f 20 69 74 2e 20 20 2a  0 byte to it.  *
1c1d0 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  /.  if( pWriter-
1c1e0 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
1c1f0 67 65 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61  ge && pWriter->a
1c200 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30  Dlidx[0].buf.n>0
1c210 20 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64   ){.    Fts5Dlid
1c220 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20  xWriter *pDlidx 
1c230 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  = &pWriter->aDli
1c240 64 78 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72  dx[0];.    asser
1c250 74 28 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76  t( pDlidx->bPrev
1c260 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 73 71 6c  Valid );.    sql
1c270 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
1c280 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1c290 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c  c, &pDlidx->buf,
1c2a0 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   0);.  }..  /* I
1c2b0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 22 6e 75  ncrement the "nu
1c2c0 6d 62 65 72 20 6f 66 20 73 65 71 75 65 6e 74 69  mber of sequenti
1c2d0 61 6c 20 6c 65 61 76 65 73 20 77 69 74 68 6f 75  al leaves withou
1c2e0 74 20 61 20 74 65 72 6d 22 20 63 6f 75 6e 74 65  t a term" counte
1c2f0 72 2e 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d  r. */.  pWriter-
1c300 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a 73 74  >nEmpty++;.}..st
1c310 61 74 69 63 20 69 36 34 20 66 74 73 35 44 6c 69  atic i64 fts5Dli
1c320 64 78 45 78 74 72 61 63 74 46 69 72 73 74 52 6f  dxExtractFirstRo
1c330 77 69 64 28 46 74 73 35 42 75 66 66 65 72 20 2a  wid(Fts5Buffer *
1c340 70 42 75 66 29 7b 0a 20 20 69 36 34 20 69 52 6f  pBuf){.  i64 iRo
1c350 77 69 64 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b  wid;.  int iOff;
1c360 0a 0a 20 20 69 4f 66 66 20 3d 20 31 20 2b 20 66  ..  iOff = 1 + f
1c370 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 42  ts5GetVarint(&pB
1c380 75 66 2d 3e 70 5b 31 5d 2c 20 28 75 36 34 2a 29  uf->p[1], (u64*)
1c390 26 69 52 6f 77 69 64 29 3b 0a 20 20 66 74 73 35  &iRowid);.  fts5
1c3a0 47 65 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d  GetVarint(&pBuf-
1c3b0 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  >p[iOff], (u64*)
1c3c0 26 69 52 6f 77 69 64 29 3b 0a 20 20 72 65 74 75  &iRowid);.  retu
1c3d0 72 6e 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  rn iRowid;.}../*
1c3e0 0a 2a 2a 20 52 6f 77 69 64 20 69 52 6f 77 69 64  .** Rowid iRowid
1c3f0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
1c400 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63  ppended to the c
1c410 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65  urrent leaf page
1c420 2e 20 49 74 20 69 73 20 74 68 65 0a 2a 2a 20 66  . It is the.** f
1c430 69 72 73 74 20 6f 6e 20 74 68 65 20 70 61 67 65  irst on the page
1c440 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1c450 61 70 70 65 6e 64 73 20 61 6e 20 61 70 70 72 6f  appends an appro
1c460 70 72 69 61 74 65 20 65 6e 74 72 79 20 74 6f 20  priate entry to 
1c470 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
1c480 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2f  oclist-index..*/
1c490 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1c4a0 35 57 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e  5WriteDlidxAppen
1c4b0 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  d(.  Fts5Index *
1c4c0 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
1c4d0 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20  ter *pWriter, . 
1c4e0 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20   i64 iRowid.){. 
1c4f0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 44   int i;.  int bD
1c500 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  one = 0;..  for(
1c510 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  i=0; p->rc==SQLI
1c520 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d  TE_OK && bDone==
1c530 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34  0; i++){.    i64
1c540 20 69 56 61 6c 3b 0a 20 20 20 20 46 74 73 35 44   iVal;.    Fts5D
1c550 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69  lidxWriter *pDli
1c560 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  dx = &pWriter->a
1c570 44 6c 69 64 78 5b 69 5d 3b 0a 0a 20 20 20 20 69  Dlidx[i];..    i
1c580 66 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e  f( pDlidx->buf.n
1c590 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  >=p->pConfig->pg
1c5a0 73 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  sz ){.      /* T
1c5b0 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69  he current docli
1c5c0 73 74 2d 69 6e 64 65 78 20 70 61 67 65 20 69 73  st-index page is
1c5d0 20 66 75 6c 6c 2e 20 57 72 69 74 65 20 69 74 20   full. Write it 
1c5e0 74 6f 20 64 69 73 6b 20 61 6e 64 20 70 75 73 68  to disk and push
1c5f0 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79  .      ** a copy
1c600 20 6f 66 20 69 52 6f 77 69 64 20 28 77 68 69 63   of iRowid (whic
1c610 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  h will become th
1c620 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
1c630 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20   the next.      
1c640 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ** doclist-index
1c650 20 6c 65 61 66 20 70 61 67 65 29 20 75 70 20 69   leaf page) up i
1c660 6e 74 6f 20 74 68 65 20 6e 65 78 74 20 6c 65 76  nto the next lev
1c670 65 6c 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  el of the b-tree
1c680 20 0a 20 20 20 20 20 20 2a 2a 20 68 69 65 72 61   .      ** hiera
1c690 72 63 68 79 2e 20 49 66 20 74 68 65 20 6e 6f 64  rchy. If the nod
1c6a0 65 20 62 65 69 6e 67 20 66 6c 75 73 68 65 64 20  e being flushed 
1c6b0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65  is currently the
1c6c0 20 72 6f 6f 74 20 6e 6f 64 65 2c 0a 20 20 20 20   root node,.    
1c6d0 20 20 2a 2a 20 61 6c 73 6f 20 70 75 73 68 20 69    ** also push i
1c6e0 74 73 20 66 69 72 73 74 20 72 6f 77 69 64 20 75  ts first rowid u
1c6f0 70 77 61 72 64 73 2e 20 2a 2f 0a 20 20 20 20 20  pwards. */.     
1c700 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 5b 30   pDlidx->buf.p[0
1c710 5d 20 3d 20 30 78 30 31 3b 20 20 20 20 2f 2a 20  ] = 0x01;    /* 
1c720 4e 6f 74 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64  Not the root nod
1c730 65 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 44  e */.      fts5D
1c740 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20 20 20  ataWrite(p, .   
1c750 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44         FTS5_DLID
1c760 58 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d  X_ROWID(pWriter-
1c770 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 44 6c 69  >iSegid, i, pDli
1c780 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20 20  dx->pgno),.     
1c790 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66       pDlidx->buf
1c7a0 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e  .p, pDlidx->buf.
1c7b0 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  n.      );.     
1c7c0 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 47   fts5WriteDlidxG
1c7d0 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72 2c 20  row(p, pWriter, 
1c7e0 69 2b 32 29 3b 0a 20 20 20 20 20 20 70 44 6c 69  i+2);.      pDli
1c7f0 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  dx = &pWriter->a
1c800 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20 20 20  Dlidx[i];.      
1c810 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1c820 45 5f 4f 4b 20 26 26 20 70 44 6c 69 64 78 5b 31  E_OK && pDlidx[1
1c830 5d 2e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20  ].buf.n==0 ){.  
1c840 20 20 20 20 20 20 69 36 34 20 69 46 69 72 73 74        i64 iFirst
1c850 20 3d 20 66 74 73 35 44 6c 69 64 78 45 78 74 72   = fts5DlidxExtr
1c860 61 63 74 46 69 72 73 74 52 6f 77 69 64 28 26 70  actFirstRowid(&p
1c870 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 0a 20 20  Dlidx->buf);..  
1c880 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 77 61        /* This wa
1c890 73 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e  s the root node.
1c8a0 20 50 75 73 68 20 69 74 73 20 66 69 72 73 74 20   Push its first 
1c8b0 72 6f 77 69 64 20 75 70 20 74 6f 20 74 68 65 20  rowid up to the 
1c8c0 6e 65 77 20 72 6f 6f 74 2e 20 2a 2f 0a 20 20 20  new root. */.   
1c8d0 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 70       pDlidx[1].p
1c8e0 67 6e 6f 20 3d 20 70 44 6c 69 64 78 2d 3e 70 67  gno = pDlidx->pg
1c8f0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  no;.        sqli
1c900 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
1c910 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1c920 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66  , &pDlidx[1].buf
1c930 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
1c940 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1c950 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1c960 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62  rc, &pDlidx[1].b
1c970 75 66 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f  uf, pDlidx->pgno
1c980 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1c990 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
1c9a0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1c9b0 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c   &pDlidx[1].buf,
1c9c0 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20   iFirst);.      
1c9d0 20 20 70 44 6c 69 64 78 5b 31 5d 2e 62 50 72 65    pDlidx[1].bPre
1c9e0 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20  vValid = 1;.    
1c9f0 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 69 50      pDlidx[1].iP
1ca00 72 65 76 20 3d 20 69 46 69 72 73 74 3b 0a 20 20  rev = iFirst;.  
1ca10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c      }..      sql
1ca20 69 74 65 33 46 74 73 35 42 75 66 66 65 72 5a 65  ite3Fts5BufferZe
1ca30 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29  ro(&pDlidx->buf)
1ca40 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e  ;.      pDlidx->
1ca50 62 50 72 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a  bPrevValid = 0;.
1ca60 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 70 67        pDlidx->pg
1ca70 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no++;.    }else{
1ca80 0a 20 20 20 20 20 20 62 44 6f 6e 65 20 3d 20 31  .      bDone = 1
1ca90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1caa0 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61   pDlidx->bPrevVa
1cab0 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 69 56 61  lid ){.      iVa
1cac0 6c 20 3d 20 69 52 6f 77 69 64 20 2d 20 70 44 6c  l = iRowid - pDl
1cad0 69 64 78 2d 3e 69 50 72 65 76 3b 0a 20 20 20 20  idx->iPrev;.    
1cae0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36 34  }else{.      i64
1caf0 20 69 50 67 6e 6f 20 3d 20 28 69 3d 3d 30 20 3f   iPgno = (i==0 ?
1cb00 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72   pWriter->writer
1cb10 2e 70 67 6e 6f 20 3a 20 70 44 6c 69 64 78 5b 2d  .pgno : pDlidx[-
1cb20 31 5d 2e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  1].pgno);.      
1cb30 61 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e  assert( pDlidx->
1cb40 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  buf.n==0 );.    
1cb50 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1cb60 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1cb70 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d  &p->rc, &pDlidx-
1cb80 3e 62 75 66 2c 20 21 62 44 6f 6e 65 29 3b 0a 20  >buf, !bDone);. 
1cb90 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1cba0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1cbb0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69  nt(&p->rc, &pDli
1cbc0 64 78 2d 3e 62 75 66 2c 20 69 50 67 6e 6f 29 3b  dx->buf, iPgno);
1cbd0 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20 69 52  .      iVal = iR
1cbe0 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  owid;.    }..   
1cbf0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1cc00 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1cc10 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e  p->rc, &pDlidx->
1cc20 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20  buf, iVal);.    
1cc30 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c  pDlidx->bPrevVal
1cc40 69 64 20 3d 20 31 3b 0a 20 20 20 20 70 44 6c 69  id = 1;.    pDli
1cc50 64 78 2d 3e 69 50 72 65 76 20 3d 20 69 52 6f 77  dx->iPrev = iRow
1cc60 69 64 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  id;.  }.}..stati
1cc70 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
1cc80 46 6c 75 73 68 4c 65 61 66 28 46 74 73 35 49 6e  FlushLeaf(Fts5In
1cc90 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57  dex *p, Fts5SegW
1cca0 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b  riter *pWriter){
1ccb0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1ccc0 75 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78  u8 zero[] = { 0x
1ccd0 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  00, 0x00, 0x00, 
1cce0 30 78 30 30 20 7d 3b 0a 20 20 46 74 73 35 50 61  0x00 };.  Fts5Pa
1ccf0 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20  geWriter *pPage 
1cd00 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  = &pWriter->writ
1cd10 65 72 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64  er;.  i64 iRowid
1cd20 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  ;..  assert( (pP
1cd30 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30 29  age->pgidx.n==0)
1cd40 3d 3d 28 70 57 72 69 74 65 72 2d 3e 62 46 69 72  ==(pWriter->bFir
1cd50 73 74 54 65 72 6d 49 6e 50 61 67 65 29 20 29 3b  stTermInPage) );
1cd60 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 73  ..  /* Set the s
1cd70 7a 4c 65 61 66 20 68 65 61 64 65 72 20 66 69 65  zLeaf header fie
1cd80 6c 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ld. */.  assert(
1cd90 20 30 3d 3d 66 74 73 35 47 65 74 55 31 36 28 26   0==fts5GetU16(&
1cda0 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 29  pPage->buf.p[2])
1cdb0 20 29 3b 0a 20 20 66 74 73 35 50 75 74 55 31 36   );.  fts5PutU16
1cdc0 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32  (&pPage->buf.p[2
1cdd0 5d 2c 20 28 75 31 36 29 70 50 61 67 65 2d 3e 62  ], (u16)pPage->b
1cde0 75 66 2e 6e 29 3b 0a 0a 20 20 69 66 28 20 70 57  uf.n);..  if( pW
1cdf0 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
1ce00 6d 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2f  mInPage ){.    /
1ce10 2a 20 4e 6f 20 74 65 72 6d 20 77 61 73 20 77 72  * No term was wr
1ce20 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 70 61  itten to this pa
1ce30 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
1ce40 74 28 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e  t( pPage->pgidx.
1ce50 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 35  n==0 );.    fts5
1ce60 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d  WriteBtreeNoTerm
1ce70 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
1ce80 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 70  }else{.    /* Ap
1ce90 70 65 6e 64 20 74 68 65 20 70 67 69 64 78 20 74  pend the pgidx t
1cea0 6f 20 74 68 65 20 70 61 67 65 20 62 75 66 66 65  o the page buffe
1ceb0 72 2e 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61  r. Set the szLea
1cec0 66 20 68 65 61 64 65 72 20 66 69 65 6c 64 2e 20  f header field. 
1ced0 2a 2f 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  */.    fts5Buffe
1cee0 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
1cef0 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
1cf00 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 2c   pPage->pgidx.n,
1cf10 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 70 29   pPage->pgidx.p)
1cf20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
1cf30 65 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74  e the page out t
1cf40 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 52 6f 77  o disk */.  iRow
1cf50 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
1cf60 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d  T_ROWID(pWriter-
1cf70 3e 69 53 65 67 69 64 2c 20 70 50 61 67 65 2d 3e  >iSegid, pPage->
1cf80 70 67 6e 6f 29 3b 0a 20 20 66 74 73 35 44 61 74  pgno);.  fts5Dat
1cf90 61 57 72 69 74 65 28 70 2c 20 69 52 6f 77 69 64  aWrite(p, iRowid
1cfa0 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20  , pPage->buf.p, 
1cfb0 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a  pPage->buf.n);..
1cfc0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1cfd0 74 68 65 20 6e 65 78 74 20 70 61 67 65 2e 20 2a  the next page. *
1cfe0 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65  /.  fts5BufferZe
1cff0 72 6f 28 26 70 50 61 67 65 2d 3e 62 75 66 29 3b  ro(&pPage->buf);
1d000 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72  .  fts5BufferZer
1d010 6f 28 26 70 50 61 67 65 2d 3e 70 67 69 64 78 29  o(&pPage->pgidx)
1d020 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  ;.  fts5BufferAp
1d030 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1d040 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 34 2c   &pPage->buf, 4,
1d050 20 7a 65 72 6f 29 3b 0a 20 20 70 50 61 67 65 2d   zero);.  pPage-
1d060 3e 69 50 72 65 76 50 67 69 64 78 20 3d 20 30 3b  >iPrevPgidx = 0;
1d070 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b  .  pPage->pgno++
1d080 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 61 73 65  ;..  /* Increase
1d090 20 74 68 65 20 6c 65 61 76 65 73 20 77 72 69 74   the leaves writ
1d0a0 74 65 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ten counter */. 
1d0b0 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 57   pWriter->nLeafW
1d0c0 72 69 74 74 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20  ritten++;..  /* 
1d0d0 54 68 65 20 6e 65 77 20 6c 65 61 66 20 68 6f 6c  The new leaf hol
1d0e0 64 73 20 6e 6f 20 74 65 72 6d 73 20 6f 72 20 72  ds no terms or r
1d0f0 6f 77 69 64 73 20 2a 2f 0a 20 20 70 57 72 69 74  owids */.  pWrit
1d100 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
1d110 50 61 67 65 20 3d 20 31 3b 0a 20 20 70 57 72 69  Page = 1;.  pWri
1d120 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
1d130 49 6e 50 61 67 65 20 3d 20 31 3b 0a 7d 0a 0a 2f  InPage = 1;.}../
1d140 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 72 6d  *.** Append term
1d150 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 74 6f 20   pTerm/nTerm to 
1d160 74 68 65 20 73 65 67 6d 65 6e 74 20 62 65 69 6e  the segment bein
1d170 67 20 77 72 69 74 74 65 6e 20 62 79 20 74 68 65  g written by the
1d180 20 77 72 69 74 65 72 20 70 61 73 73 65 64 0a 2a   writer passed.*
1d190 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  * as the second 
1d1a0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
1d1b0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1d1c0 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73 35  rs, set the Fts5
1d1d0 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63  Index.rc error c
1d1e0 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ode. If an error
1d1f0 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79   has .** already
1d200 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
1d210 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1d220 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
1d230 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70  oid fts5WriteApp
1d240 65 6e 64 54 65 72 6d 28 0a 20 20 46 74 73 35 49  endTerm(.  Fts5I
1d250 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
1d260 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1d270 65 72 2c 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c  er,.  int nTerm,
1d280 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
1d290 20 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 72 65 66   .){.  int nPref
1d2a0 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ix;             
1d2b0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
1d2c0 6f 66 20 70 72 65 66 69 78 20 63 6f 6d 70 72 65  of prefix compre
1d2d0 73 73 69 6f 6e 20 66 6f 72 20 74 65 72 6d 20 2a  ssion for term *
1d2e0 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74  /.  Fts5PageWrit
1d2f0 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72  er *pPage = &pWr
1d300 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20  iter->writer;.  
1d310 46 74 73 35 42 75 66 66 65 72 20 2a 70 50 67 69  Fts5Buffer *pPgi
1d320 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77  dx = &pWriter->w
1d330 72 69 74 65 72 2e 70 67 69 64 78 3b 0a 0a 20 20  riter.pgidx;..  
1d340 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
1d350 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73  QLITE_OK );.  as
1d360 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75 66  sert( pPage->buf
1d370 2e 6e 3e 3d 34 20 29 3b 0a 20 20 61 73 73 65 72  .n>=4 );.  asser
1d380 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e  t( pPage->buf.n>
1d390 34 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62 46  4 || pWriter->bF
1d3a0 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29  irstTermInPage )
1d3b0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
1d3c0 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65  urrent leaf page
1d3d0 20 69 73 20 66 75 6c 6c 2c 20 66 6c 75 73 68 20   is full, flush 
1d3e0 69 74 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20  it to disk. */. 
1d3f0 20 69 66 28 20 28 70 50 61 67 65 2d 3e 62 75 66   if( (pPage->buf
1d400 2e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b  .n + pPgidx->n +
1d410 20 6e 54 65 72 6d 20 2b 20 32 29 3e 3d 70 2d 3e   nTerm + 2)>=p->
1d420 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b  pConfig->pgsz ){
1d430 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
1d440 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20  buf.n>4 ){.     
1d450 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
1d460 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b  eaf(p, pWriter);
1d470 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42  .    }.    fts5B
1d480 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63  ufferGrow(&p->rc
1d490 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
1d4a0 54 65 72 6d 2b 46 54 53 35 5f 44 41 54 41 5f 50  Term+FTS5_DATA_P
1d4b0 41 44 44 49 4e 47 29 3b 0a 20 20 7d 0a 20 20 0a  ADDING);.  }.  .
1d4c0 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 55 70 64 61    /* TODO1: Upda
1d4d0 74 69 6e 67 20 70 67 69 64 78 20 68 65 72 65 2e  ting pgidx here.
1d4e0 20 2a 2f 0a 20 20 70 50 67 69 64 78 2d 3e 6e 20   */.  pPgidx->n 
1d4f0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75  += sqlite3Fts5Pu
1d500 74 56 61 72 69 6e 74 28 0a 20 20 20 20 20 20 26  tVarint(.      &
1d510 70 50 67 69 64 78 2d 3e 70 5b 70 50 67 69 64 78  pPgidx->p[pPgidx
1d520 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66  ->n], pPage->buf
1d530 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 69 50 72 65  .n - pPage->iPre
1d540 76 50 67 69 64 78 0a 20 20 29 3b 0a 20 20 70 50  vPgidx.  );.  pP
1d550 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64 78 20  age->iPrevPgidx 
1d560 3d 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3b 0a  = pPage->buf.n;.
1d570 23 69 66 20 30 0a 20 20 66 74 73 35 50 75 74 55  #if 0.  fts5PutU
1d580 31 36 28 26 70 50 67 69 64 78 2d 3e 70 5b 70 50  16(&pPgidx->p[pP
1d590 67 69 64 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d  gidx->n], pPage-
1d5a0 3e 62 75 66 2e 6e 29 3b 0a 20 20 70 50 67 69 64  >buf.n);.  pPgid
1d5b0 78 2d 3e 6e 20 2b 3d 20 32 3b 0a 23 65 6e 64 69  x->n += 2;.#endi
1d5c0 66 0a 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  f..  if( pWriter
1d5d0 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
1d5e0 67 65 20 29 7b 0a 20 20 20 20 6e 50 72 65 66 69  ge ){.    nPrefi
1d5f0 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  x = 0;.    if( p
1d600 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b  Page->pgno!=1 ){
1d610 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
1d620 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
1d630 20 6f 6e 20 61 20 6c 65 61 66 20 74 68 61 74 20   on a leaf that 
1d640 69 73 20 6e 6f 74 20 74 68 65 20 6c 65 66 74 6d  is not the leftm
1d650 6f 73 74 20 6c 65 61 66 20 69 6e 0a 20 20 20 20  ost leaf in.    
1d660 20 20 2a 2a 20 74 68 65 20 73 65 67 6d 65 6e 74    ** the segment
1d670 20 62 2d 74 72 65 65 2e 20 49 6e 20 74 68 69 73   b-tree. In this
1d680 20 63 61 73 65 20 69 74 20 69 73 20 6e 65 63 65   case it is nece
1d690 73 73 61 72 79 20 74 6f 20 61 64 64 20 61 20 74  ssary to add a t
1d6a0 65 72 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  erm to.      ** 
1d6b0 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61  the b-tree hiera
1d6c0 72 63 68 79 20 74 68 61 74 20 69 73 20 28 61 29  rchy that is (a)
1d6d0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
1d6e0 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20 0a 20   largest term . 
1d6f0 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
1d700 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
1d710 65 67 6d 65 6e 74 20 61 6e 64 20 28 62 29 20 73  egment and (b) s
1d720 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72 20 65  maller than or e
1d730 71 75 61 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a  qual to.      **
1d740 20 74 68 69 73 20 74 65 72 6d 2e 20 49 6e 20 6f   this term. In o
1d750 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20 70 72  ther words, a pr
1d760 65 66 69 78 20 6f 66 20 28 70 54 65 72 6d 2f 6e  efix of (pTerm/n
1d770 54 65 72 6d 29 20 74 68 61 74 20 69 73 20 6f 6e  Term) that is on
1d780 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20  e.      ** byte 
1d790 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68 65 20  longer than the 
1d7a0 6c 6f 6e 67 65 73 74 20 70 72 65 66 69 78 20 28  longest prefix (
1d7b0 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 73 68 61  pTerm/nTerm) sha
1d7c0 72 65 73 20 77 69 74 68 20 74 68 65 0a 20 20 20  res with the.   
1d7d0 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 74     ** previous t
1d7e0 65 72 6d 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  erm. .      **. 
1d7f0 20 20 20 20 20 2a 2a 20 55 73 75 61 6c 6c 79 2c       ** Usually,
1d800 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65   the previous te
1d810 72 6d 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  rm is available 
1d820 69 6e 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 20  in pPage->term. 
1d830 54 68 65 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  The exception.  
1d840 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74 68 69      ** is if thi
1d850 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  s is the first t
1d860 65 72 6d 20 77 72 69 74 74 65 6e 20 69 6e 20 61  erm written in a
1d870 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65  n incremental-me
1d880 72 67 65 20 73 74 65 70 2e 0a 20 20 20 20 20 20  rge step..      
1d890 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
1d8a0 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 72  the previous ter
1d8b0 6d 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  m is not availab
1d8c0 6c 65 2c 20 73 6f 20 6a 75 73 74 20 77 72 69 74  le, so just writ
1d8d0 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  e a.      ** cop
1d8e0 79 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72  y of (pTerm/nTer
1d8f0 6d 29 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  m) into the pare
1d900 6e 74 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73  nt node. This is
1d910 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20   slightly.      
1d920 2a 2a 20 69 6e 65 66 66 69 63 69 65 6e 74 2c 20  ** inefficient, 
1d930 62 75 74 20 73 74 69 6c 6c 20 63 6f 72 72 65 63  but still correc
1d940 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  t.  */.      int
1d950 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20   n = nTerm;.    
1d960 20 20 69 66 28 20 70 50 61 67 65 2d 3e 74 65 72    if( pPage->ter
1d970 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  m.n ){.        n
1d980 20 3d 20 31 20 2b 20 66 74 73 35 50 72 65 66 69   = 1 + fts5Prefi
1d990 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d  xCompress(pPage-
1d9a0 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e  >term.n, pPage->
1d9b0 74 65 72 6d 2e 70 2c 20 70 54 65 72 6d 29 3b 0a  term.p, pTerm);.
1d9c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
1d9d0 73 35 57 72 69 74 65 42 74 72 65 65 54 65 72 6d  s5WriteBtreeTerm
1d9e0 28 70 2c 20 70 57 72 69 74 65 72 2c 20 6e 2c 20  (p, pWriter, n, 
1d9f0 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 70 50  pTerm);.      pP
1da00 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  age = &pWriter->
1da10 77 72 69 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20  writer;.    }.  
1da20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 65 66  }else{.    nPref
1da30 69 78 20 3d 20 66 74 73 35 50 72 65 66 69 78 43  ix = fts5PrefixC
1da40 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74  ompress(pPage->t
1da50 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65  erm.n, pPage->te
1da60 72 6d 2e 70 2c 20 70 54 65 72 6d 29 3b 0a 20 20  rm.p, pTerm);.  
1da70 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1da80 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1da90 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 50   &pPage->buf, nP
1daa0 72 65 66 69 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  refix);.  }..  /
1dab0 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e 75 6d  * Append the num
1dac0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1dad0 6e 65 77 20 64 61 74 61 2c 20 74 68 65 6e 20 74  new data, then t
1dae0 68 65 20 74 65 72 6d 20 64 61 74 61 20 69 74 73  he term data its
1daf0 65 6c 66 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  elf.  ** to the 
1db00 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42  page. */.  fts5B
1db10 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1db20 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
1db30 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e  ->buf, nTerm - n
1db40 50 72 65 66 69 78 29 3b 0a 20 20 66 74 73 35 42  Prefix);.  fts5B
1db50 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
1db60 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1db70 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72  buf, nTerm - nPr
1db80 65 66 69 78 2c 20 26 70 54 65 72 6d 5b 6e 50 72  efix, &pTerm[nPr
1db90 65 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20 55 70  efix]);..  /* Up
1dba0 64 61 74 65 20 74 68 65 20 46 74 73 35 50 61 67  date the Fts5Pag
1dbb0 65 57 72 69 74 65 72 2e 74 65 72 6d 20 66 69 65  eWriter.term fie
1dbc0 6c 64 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66  ld. */.  fts5Buf
1dbd0 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26  ferSet(&p->rc, &
1dbe0 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54 65  pPage->term, nTe
1dbf0 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70 57  rm, pTerm);.  pW
1dc00 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
1dc10 6d 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20  mInPage = 0;..  
1dc20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
1dc30 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a  owidInPage = 0;.
1dc40 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
1dc50 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20  tRowidInDoclist 
1dc60 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 1;..  assert( 
1dc70 70 2d 3e 72 63 20 7c 7c 20 28 70 57 72 69 74 65  p->rc || (pWrite
1dc80 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20 70  r->nDlidx>0 && p
1dc90 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30  Writer->aDlidx[0
1dca0 5d 2e 62 75 66 2e 6e 3d 3d 30 29 20 29 3b 0a 20  ].buf.n==0) );. 
1dcb0 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
1dcc0 5b 30 5d 2e 70 67 6e 6f 20 3d 20 70 50 61 67 65  [0].pgno = pPage
1dcd0 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pgno;.}../*.**
1dce0 20 41 70 70 65 6e 64 20 61 20 72 6f 77 69 64 20   Append a rowid 
1dcf0 61 6e 64 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  and position-lis
1dd00 74 20 73 69 7a 65 20 66 69 65 6c 64 20 74 6f 20  t size field to 
1dd10 74 68 65 20 77 72 69 74 65 72 73 20 6f 75 74 70  the writers outp
1dd20 75 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ut. .*/.static v
1dd30 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70  oid fts5WriteApp
1dd40 65 6e 64 52 6f 77 69 64 28 0a 20 20 46 74 73 35  endRowid(.  Fts5
1dd50 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
1dd60 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1dd70 74 65 72 2c 0a 20 20 69 36 34 20 69 52 6f 77 69  ter,.  i64 iRowi
1dd80 64 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  d.){.  if( p->rc
1dd90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1dda0 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65     Fts5PageWrite
1ddb0 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69  r *pPage = &pWri
1ddc0 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 0a 20 20  ter->writer;..  
1ddd0 20 20 69 66 28 20 28 70 50 61 67 65 2d 3e 62 75    if( (pPage->bu
1dde0 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e 70 67 69  f.n + pPage->pgi
1ddf0 64 78 2e 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69  dx.n)>=p->pConfi
1de00 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20  g->pgsz ){.     
1de10 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
1de20 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b  eaf(p, pWriter);
1de30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1de40 66 20 74 68 69 73 20 69 73 20 74 6f 20 62 65 20  f this is to be 
1de50 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
1de60 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 70  written to the p
1de70 61 67 65 2c 20 73 65 74 20 74 68 65 20 0a 20 20  age, set the .  
1de80 20 20 2a 2a 20 72 6f 77 69 64 2d 70 6f 69 6e 74    ** rowid-point
1de90 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 2d 68  er in the page-h
1dea0 65 61 64 65 72 2e 20 41 6c 73 6f 20 61 70 70 65  eader. Also appe
1deb0 6e 64 20 61 20 76 61 6c 75 65 20 74 6f 20 74 68  nd a value to th
1dec0 65 20 64 6c 69 64 78 0a 20 20 20 20 2a 2a 20 62  e dlidx.    ** b
1ded0 75 66 66 65 72 2c 20 69 6e 20 63 61 73 65 20 61  uffer, in case a
1dee0 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69   doclist-index i
1def0 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a  s required.  */.
1df00 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d      if( pWriter-
1df10 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
1df20 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  ge ){.      fts5
1df30 50 75 74 55 31 36 28 70 50 61 67 65 2d 3e 62 75  PutU16(pPage->bu
1df40 66 2e 70 2c 20 28 75 31 36 29 70 50 61 67 65 2d  f.p, (u16)pPage-
1df50 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66  >buf.n);.      f
1df60 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70  ts5WriteDlidxApp
1df70 65 6e 64 28 70 2c 20 70 57 72 69 74 65 72 2c 20  end(p, pWriter, 
1df80 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 0a  iRowid);.    }..
1df90 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1dfa0 20 72 6f 77 69 64 2e 20 2a 2f 0a 20 20 20 20 69   rowid. */.    i
1dfb0 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  f( pWriter->bFir
1dfc0 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74  stRowidInDoclist
1dfd0 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62 46 69   || pWriter->bFi
1dfe0 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29  rstRowidInPage )
1dff0 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  {.      fts5Buff
1e000 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1e010 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
1e020 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  uf, iRowid);.   
1e030 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1e040 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 69  sert( p->rc || i
1e050 52 6f 77 69 64 3e 70 57 72 69 74 65 72 2d 3e 69  Rowid>pWriter->i
1e060 50 72 65 76 52 6f 77 69 64 20 29 3b 0a 20 20 20  PrevRowid );.   
1e070 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1e080 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1e090 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69  , &pPage->buf, i
1e0a0 52 6f 77 69 64 20 2d 20 70 57 72 69 74 65 72 2d  Rowid - pWriter-
1e0b0 3e 69 50 72 65 76 52 6f 77 69 64 29 3b 0a 20 20  >iPrevRowid);.  
1e0c0 20 20 7d 0a 20 20 20 20 70 57 72 69 74 65 72 2d    }.    pWriter-
1e0d0 3e 69 50 72 65 76 52 6f 77 69 64 20 3d 20 69 52  >iPrevRowid = iR
1e0e0 6f 77 69 64 3b 0a 20 20 20 20 70 57 72 69 74 65  owid;.    pWrite
1e0f0 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
1e100 44 6f 63 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20  Doclist = 0;.   
1e110 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1e120 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b  RowidInPage = 0;
1e130 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
1e140 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70  oid fts5WriteApp
1e150 65 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28 0a  endPoslistData(.
1e160 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1e170 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1e180 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 63 6f   *pWriter, .  co
1e190 6e 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20 0a  nst u8 *aData, .
1e1a0 20 20 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a 20    int nData.){. 
1e1b0 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
1e1c0 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65  *pPage = &pWrite
1e1d0 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 63 6f 6e  r->writer;.  con
1e1e0 73 74 20 75 38 20 2a 61 20 3d 20 61 44 61 74 61  st u8 *a = aData
1e1f0 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74  ;.  int n = nDat
1e200 61 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  a;.  .  assert( 
1e210 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a  p->pConfig->pgsz
1e220 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  >0 );.  while( p
1e230 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1e240 0a 20 20 20 20 20 26 26 20 28 70 50 61 67 65 2d  .     && (pPage-
1e250 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e  >buf.n + pPage->
1e260 70 67 69 64 78 2e 6e 20 2b 20 6e 29 3e 3d 70 2d  pgidx.n + n)>=p-
1e270 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 0a  >pConfig->pgsz .
1e280 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65    ){.    int nRe
1e290 71 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  q = p->pConfig->
1e2a0 70 67 73 7a 20 2d 20 70 50 61 67 65 2d 3e 62 75  pgsz - pPage->bu
1e2b0 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 70 67 69  f.n - pPage->pgi
1e2c0 64 78 2e 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 43  dx.n;.    int nC
1e2d0 6f 70 79 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  opy = 0;.    whi
1e2e0 6c 65 28 20 6e 43 6f 70 79 3c 6e 52 65 71 20 29  le( nCopy<nReq )
1e2f0 7b 0a 20 20 20 20 20 20 69 36 34 20 64 75 6d 6d  {.      i64 dumm
1e300 79 3b 0a 20 20 20 20 20 20 6e 43 6f 70 79 20 2b  y;.      nCopy +
1e310 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
1e320 26 61 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34 2a  &a[nCopy], (u64*
1e330 29 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a  )&dummy);.    }.
1e340 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1e350 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1e360 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 43   &pPage->buf, nC
1e370 6f 70 79 2c 20 61 29 3b 0a 20 20 20 20 61 20 2b  opy, a);.    a +
1e380 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20 2d  = nCopy;.    n -
1e390 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74 73  = nCopy;.    fts
1e3a0 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
1e3b0 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d  p, pWriter);.  }
1e3c0 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
1e3d0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1e3e0 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
1e3f0 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 2c 20 61  pPage->buf, n, a
1e400 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1e410 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 63  Flush any data c
1e420 61 63 68 65 64 20 62 79 20 74 68 65 20 77 72 69  ached by the wri
1e430 74 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  ter object to th
1e440 65 20 64 61 74 61 62 61 73 65 2e 20 46 72 65 65  e database. Free
1e450 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   any.** allocati
1e460 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ons associated w
1e470 69 74 68 20 74 68 65 20 77 72 69 74 65 72 2e 0a  ith the writer..
1e480 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1e490 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 0a  ts5WriteFinish(.
1e4a0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1e4b0 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1e4c0 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20   *pWriter,      
1e4d0 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a     /* Writer obj
1e4e0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ect */.  int *pn
1e4f0 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20  Leaf            
1e500 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1e510 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   Number of leaf 
1e520 70 61 67 65 73 20 69 6e 20 62 2d 74 72 65 65 20  pages in b-tree 
1e530 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
1e540 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
1e550 2a 70 4c 65 61 66 20 3d 20 26 70 57 72 69 74 65  *pLeaf = &pWrite
1e560 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69 66 28  r->writer;.  if(
1e570 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1e580 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1e590 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 3e 3d 31 20   pLeaf->pgno>=1 
1e5a0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  );.    if( pLeaf
1e5b0 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20  ->buf.n>4 ){.   
1e5c0 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
1e5d0 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72  hLeaf(p, pWriter
1e5e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e  );.    }.    *pn
1e5f0 4c 65 61 66 20 3d 20 70 4c 65 61 66 2d 3e 70 67  Leaf = pLeaf->pg
1e600 6e 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35 57 72  no-1;.    fts5Wr
1e610 69 74 65 46 6c 75 73 68 42 74 72 65 65 28 70 2c  iteFlushBtree(p,
1e620 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20   pWriter);.  }. 
1e630 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1e640 26 70 4c 65 61 66 2d 3e 74 65 72 6d 29 3b 0a 20  &pLeaf->term);. 
1e650 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1e660 26 70 4c 65 61 66 2d 3e 62 75 66 29 3b 0a 20 20  &pLeaf->buf);.  
1e670 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
1e680 70 4c 65 61 66 2d 3e 70 67 69 64 78 29 3b 0a 20  pLeaf->pgidx);. 
1e690 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1e6a0 26 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d  &pWriter->btterm
1e6b0 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  );..  for(i=0; i
1e6c0 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78  <pWriter->nDlidx
1e6d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1e6e0 74 65 33 46 74 73 35 42 75 66 66 65 72 46 72 65  te3Fts5BufferFre
1e6f0 65 28 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  e(&pWriter->aDli
1e700 64 78 5b 69 5d 2e 62 75 66 29 3b 0a 20 20 7d 0a  dx[i].buf);.  }.
1e710 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1e720 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 29 3b  Writer->aDlidx);
1e730 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1e740 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 0a 20  fts5WriteInit(. 
1e750 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1e760 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1e770 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69 6e 74  *pWriter, .  int
1e780 20 69 53 65 67 69 64 0a 29 7b 0a 20 20 63 6f 6e   iSegid.){.  con
1e790 73 74 20 69 6e 74 20 6e 42 75 66 66 65 72 20 3d  st int nBuffer =
1e7a0 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73   p->pConfig->pgs
1e7b0 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41  z + FTS5_DATA_PA
1e7c0 44 44 49 4e 47 3b 0a 0a 20 20 6d 65 6d 73 65 74  DDING;..  memset
1e7d0 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a  (pWriter, 0, siz
1e7e0 65 6f 66 28 46 74 73 35 53 65 67 57 72 69 74 65  eof(Fts5SegWrite
1e7f0 72 29 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  r));.  pWriter->
1e800 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
1e810 0a 0a 20 20 66 74 73 35 57 72 69 74 65 44 6c 69  ..  fts5WriteDli
1e820 64 78 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65  dxGrow(p, pWrite
1e830 72 2c 20 31 29 3b 0a 20 20 70 57 72 69 74 65 72  r, 1);.  pWriter
1e840 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20  ->writer.pgno = 
1e850 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46  1;.  pWriter->bF
1e860 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d  irstTermInPage =
1e870 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69   1;.  pWriter->i
1e880 42 74 50 61 67 65 20 3d 20 31 3b 0a 0a 20 20 61  BtPage = 1;..  a
1e890 73 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e  ssert( pWriter->
1e8a0 77 72 69 74 65 72 2e 62 75 66 2e 6e 3d 3d 30 20  writer.buf.n==0 
1e8b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 72  );.  assert( pWr
1e8c0 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69  iter->writer.pgi
1e8d0 64 78 2e 6e 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  dx.n==0 );..  /*
1e8e0 20 47 72 6f 77 20 74 68 65 20 74 77 6f 20 62 75   Grow the two bu
1e8f0 66 66 65 72 73 20 74 6f 20 70 67 73 7a 20 2b 20  ffers to pgsz + 
1e900 70 61 64 64 69 6e 67 20 62 79 74 65 73 20 69 6e  padding bytes in
1e910 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 73 71 6c 69   size. */.  sqli
1e920 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a  te3Fts5BufferSiz
1e930 65 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74  e(&p->rc, &pWrit
1e940 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78  er->writer.pgidx
1e950 2c 20 6e 42 75 66 66 65 72 29 3b 0a 20 20 73 71  , nBuffer);.  sq
1e960 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
1e970 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 70 57 72  ize(&p->rc, &pWr
1e980 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66  iter->writer.buf
1e990 2c 20 6e 42 75 66 66 65 72 29 3b 0a 0a 20 20 69  , nBuffer);..  i
1e9a0 66 28 20 70 2d 3e 70 49 64 78 57 72 69 74 65 72  f( p->pIdxWriter
1e9b0 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43  ==0 ){.    Fts5C
1e9c0 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
1e9d0 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
1e9e0 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
1e9f0 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64  eStmt(p, &p->pId
1ea00 78 57 72 69 74 65 72 2c 20 73 71 6c 69 74 65 33  xWriter, sqlite3
1ea10 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
1ea20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
1ea30 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27 28 73   '%q'.'%q_idx'(s
1ea40 65 67 69 64 2c 74 65 72 6d 2c 70 67 6e 6f 29 20  egid,term,pgno) 
1ea50 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 29 22 2c 20  VALUES(?,?,?)", 
1ea60 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66  .          pConf
1ea70 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67  ig->zDb, pConfig
1ea80 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a  ->zName.    ));.
1ea90 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
1eaa0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1eab0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
1eac0 20 74 68 65 20 34 2d 62 79 74 65 20 6c 65 61 66   the 4-byte leaf
1ead0 2d 70 61 67 65 20 68 65 61 64 65 72 20 74 6f 20  -page header to 
1eae0 30 78 30 30 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d  0x00. */.    mem
1eaf0 73 65 74 28 70 57 72 69 74 65 72 2d 3e 77 72 69  set(pWriter->wri
1eb00 74 65 72 2e 62 75 66 2e 70 2c 20 30 2c 20 34 29  ter.buf.p, 0, 4)
1eb10 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 77  ;.    pWriter->w
1eb20 72 69 74 65 72 2e 62 75 66 2e 6e 20 3d 20 34 3b  riter.buf.n = 4;
1eb30 0a 0a 20 20 20 20 2f 2a 20 42 69 6e 64 20 74 68  ..    /* Bind th
1eb40 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74  e current output
1eb50 20 73 65 67 6d 65 6e 74 20 69 64 20 74 6f 20 74   segment id to t
1eb60 68 65 20 69 6e 64 65 78 2d 77 72 69 74 65 72 2e  he index-writer.
1eb70 20 54 68 69 73 20 69 73 20 61 6e 0a 20 20 20 20   This is an.    
1eb80 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
1eb90 6f 76 65 72 20 62 69 6e 64 69 6e 67 20 74 68 65  over binding the
1eba0 20 73 61 6d 65 20 76 61 6c 75 65 20 6f 76 65 72   same value over
1ebb0 20 61 6e 64 20 6f 76 65 72 20 61 73 20 72 6f 77   and over as row
1ebc0 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73  s are.    ** ins
1ebd0 65 72 74 65 64 20 69 6e 74 6f 20 25 5f 69 64 78  erted into %_idx
1ebe0 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
1ebf0 77 72 69 74 65 72 2e 20 20 2a 2f 0a 20 20 20 20  writer.  */.    
1ec00 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
1ec10 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20  (p->pIdxWriter, 
1ec20 31 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67  1, pWriter->iSeg
1ec30 69 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  id);.  }.}../*.*
1ec40 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72  * Iterator pIter
1ec50 20 77 61 73 20 75 73 65 64 20 74 6f 20 69 74 65   was used to ite
1ec60 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
1ec70 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
1ec80 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63 72  of on an.** incr
1ec90 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70  emental merge op
1eca0 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 66 75  eration. This fu
1ecb0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1ecc0 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   if the incremen
1ecd0 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73 74 65  tal.** merge ste
1ece0 70 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 62  p has finished b
1ecf0 75 74 20 74 68 65 20 69 6e 70 75 74 20 68 61 73  ut the input has
1ed00 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70 6c 65   not been comple
1ed10 74 65 6c 79 20 65 78 68 61 75 73 74 65 64 2e 0a  tely exhausted..
1ed20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1ed30 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28  ts5TrimSegments(
1ed40 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
1ed50 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  s5Iter *pIter){.
1ed60 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 42    int i;.  Fts5B
1ed70 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d  uffer buf;.  mem
1ed80 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a  set(&buf, 0, siz
1ed90 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
1eda0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1edb0 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29  Iter->nSeg; i++)
1edc0 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
1edd0 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72  r *pSeg = &pIter
1ede0 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 69  ->aSeg[i];.    i
1edf0 66 28 20 70 53 65 67 2d 3e 70 53 65 67 3d 3d 30  f( pSeg->pSeg==0
1ee00 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d   ){.      /* no-
1ee10 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20  op */.    }else 
1ee20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d  if( pSeg->pLeaf=
1ee30 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
1ee40 6c 6c 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 69  ll keys from thi
1ee50 73 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 20  s input segment 
1ee60 68 61 76 65 20 62 65 65 6e 20 74 72 61 6e 73 66  have been transf
1ee70 65 72 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70  ered to the outp
1ee80 75 74 2e 0a 20 20 20 20 20 20 2a 2a 20 53 65 74  ut..      ** Set
1ee90 20 62 6f 74 68 20 74 68 65 20 66 69 72 73 74 20   both the first 
1eea0 61 6e 64 20 6c 61 73 74 20 70 61 67 65 2d 6e 75  and last page-nu
1eeb0 6d 62 65 72 73 20 74 6f 20 30 20 74 6f 20 69 6e  mbers to 0 to in
1eec0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 0a  dicate that the.
1eed0 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74        ** segment
1eee0 20 69 73 20 6e 6f 77 20 65 6d 70 74 79 2e 20 2a   is now empty. *
1eef0 2f 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53  /.      pSeg->pS
1ef00 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 30  eg->pgnoLast = 0
1ef10 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53  ;.      pSeg->pS
1ef20 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20  eg->pgnoFirst = 
1ef30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1ef40 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70      int iOff = p
1ef50 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66  Seg->iTermLeafOf
1ef60 66 73 65 74 3b 20 20 20 20 20 2f 2a 20 4f 66 66  fset;     /* Off
1ef70 73 65 74 20 6f 6e 20 6e 65 77 20 66 69 72 73 74  set on new first
1ef80 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20   leaf page */.  
1ef90 20 20 20 20 69 36 34 20 69 4c 65 61 66 52 6f 77      i64 iLeafRow
1efa0 69 64 3b 0a 20 20 20 20 20 20 46 74 73 35 44 61  id;.      Fts5Da
1efb0 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 20  ta *pData;.     
1efc0 20 69 6e 74 20 69 49 64 20 3d 20 70 53 65 67 2d   int iId = pSeg-
1efd0 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20  >pSeg->iSegid;. 
1efe0 20 20 20 20 20 75 38 20 61 48 64 72 5b 34 5d 20       u8 aHdr[4] 
1eff0 3d 20 7b 30 78 30 30 2c 20 30 78 30 30 2c 20 30  = {0x00, 0x00, 0
1f000 78 30 30 2c 20 30 78 30 30 7d 3b 0a 0a 20 20 20  x00, 0x00};..   
1f010 20 20 20 69 4c 65 61 66 52 6f 77 69 64 20 3d 20     iLeafRowid = 
1f020 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
1f030 49 44 28 69 49 64 2c 20 70 53 65 67 2d 3e 69 54  ID(iId, pSeg->iT
1f040 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20  ermLeafPgno);.  
1f050 20 20 20 20 70 44 61 74 61 20 3d 20 66 74 73 35      pData = fts5
1f060 44 61 74 61 52 65 61 64 28 70 2c 20 69 4c 65 61  DataRead(p, iLea
1f070 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69  fRowid);.      i
1f080 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20  f( pData ){.    
1f090 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
1f0a0 72 6f 28 26 62 75 66 29 3b 0a 20 20 20 20 20 20  ro(&buf);.      
1f0b0 20 20 66 74 73 35 42 75 66 66 65 72 47 72 6f 77    fts5BufferGrow
1f0c0 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
1f0d0 44 61 74 61 2d 3e 6e 6e 29 3b 0a 20 20 20 20 20  Data->nn);.     
1f0e0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1f0f0 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1f100 26 62 75 66 2c 20 73 69 7a 65 6f 66 28 61 48 64  &buf, sizeof(aHd
1f110 72 29 2c 20 61 48 64 72 29 3b 0a 20 20 20 20 20  r), aHdr);.     
1f120 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1f130 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1f140 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65  , &buf, pSeg->te
1f150 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66  rm.n);.        f
1f160 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
1f170 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  lob(&p->rc, &buf
1f180 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 2c 20  , pSeg->term.n, 
1f190 70 53 65 67 2d 3e 74 65 72 6d 2e 70 29 3b 0a 20  pSeg->term.p);. 
1f1a0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1f1b0 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
1f1c0 72 63 2c 20 26 62 75 66 2c 20 70 44 61 74 61 2d  rc, &buf, pData-
1f1d0 3e 73 7a 4c 65 61 66 2d 69 4f 66 66 2c 20 26 70  >szLeaf-iOff, &p
1f1e0 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a  Data->p[iOff]);.
1f1f0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1f200 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
1f220 20 74 68 65 20 73 7a 4c 65 61 66 20 66 69 65 6c   the szLeaf fiel
1f230 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66  d */.          f
1f240 74 73 35 50 75 74 55 31 36 28 26 62 75 66 2e 70  ts5PutU16(&buf.p
1f250 5b 32 5d 2c 20 28 75 31 36 29 62 75 66 2e 6e 29  [2], (u16)buf.n)
1f260 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1f270 20 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 74       /* Set up t
1f280 68 65 20 6e 65 77 20 70 61 67 65 2d 69 6e 64 65  he new page-inde
1f290 78 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20  x array */.     
1f2a0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1f2b0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1f2c0 2c 20 26 62 75 66 2c 20 34 29 3b 0a 20 20 20 20  , &buf, 4);.    
1f2d0 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c      if( pSeg->iL
1f2e0 65 61 66 50 67 6e 6f 3d 3d 70 53 65 67 2d 3e 69  eafPgno==pSeg->i
1f2f0 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 0a 20 20  TermLeafPgno .  
1f300 20 20 20 20 20 20 20 26 26 20 70 53 65 67 2d 3e         && pSeg->
1f310 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3c 70 44  iEndofDoclist<pD
1f320 61 74 61 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 20  ata->szLeaf .   
1f330 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1f340 20 20 69 6e 74 20 6e 44 69 66 66 20 3d 20 70 44    int nDiff = pD
1f350 61 74 61 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53  ata->szLeaf - pS
1f360 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  eg->iEndofDoclis
1f370 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  t;.          fts
1f380 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1f390 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
1f3a0 2c 20 62 75 66 2e 6e 20 2d 20 31 20 2d 20 6e 44  , buf.n - 1 - nD
1f3b0 69 66 66 20 2d 20 34 29 3b 0a 20 20 20 20 20 20  iff - 4);.      
1f3c0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1f3d0 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1f3e0 20 26 62 75 66 2c 20 0a 20 20 20 20 20 20 20 20   &buf, .        
1f3f0 20 20 20 20 20 20 70 44 61 74 61 2d 3e 6e 6e 20        pData->nn 
1f400 2d 20 70 53 65 67 2d 3e 69 50 67 69 64 78 4f 66  - pSeg->iPgidxOf
1f410 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b 70 53 65  f, &pData->p[pSe
1f420 67 2d 3e 69 50 67 69 64 78 4f 66 66 5d 0a 20 20  g->iPgidxOff].  
1f430 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1f440 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 74     }..        ft
1f450 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44  s5DataRelease(pD
1f460 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70 53  ata);.        pS
1f470 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69  eg->pSeg->pgnoFi
1f480 72 73 74 20 3d 20 70 53 65 67 2d 3e 69 54 65 72  rst = pSeg->iTer
1f490 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20  mLeafPgno;.     
1f4a0 20 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74     fts5DataDelet
1f4b0 65 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e  e(p, FTS5_SEGMEN
1f4c0 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 31 29 2c  T_ROWID(iId, 1),
1f4d0 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20   iLeafRowid);.  
1f4e0 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72        fts5DataWr
1f4f0 69 74 65 28 70 2c 20 69 4c 65 61 66 52 6f 77 69  ite(p, iLeafRowi
1f500 64 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29  d, buf.p, buf.n)
1f510 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f520 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72    }.  fts5Buffer
1f530 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 73  Free(&buf);.}..s
1f540 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
1f550 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62 61 63  ergeChunkCallbac
1f560 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  k(.  Fts5Index *
1f570 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  p, .  void *pCtx
1f580 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  , .  const u8 *p
1f590 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e  Chunk, int nChun
1f5a0 6b 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 57 72  k.){.  Fts5SegWr
1f5b0 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20  iter *pWriter = 
1f5c0 28 46 74 73 35 53 65 67 57 72 69 74 65 72 2a 29  (Fts5SegWriter*)
1f5d0 70 43 74 78 3b 0a 20 20 66 74 73 35 57 72 69 74  pCtx;.  fts5Writ
1f5e0 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 44 61  eAppendPoslistDa
1f5f0 74 61 28 70 2c 20 70 57 72 69 74 65 72 2c 20 70  ta(p, pWriter, p
1f600 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a  Chunk, nChunk);.
1f610 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  }../*.**.*/.stat
1f620 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
1f630 78 4d 65 72 67 65 4c 65 76 65 6c 28 0a 20 20 46  xMergeLevel(.  F
1f640 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
1f650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f660 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
1f670 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
1f680 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
1f690 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e  uct,       /* IN
1f6a0 2f 4f 55 54 3a 20 53 74 75 63 74 75 72 65 20 6f  /OUT: Stucture o
1f6b0 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
1f6c0 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20   iLvl,          
1f6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f6e0 4c 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e  Level to read in
1f6f0 70 75 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  put from */.  in
1f700 74 20 2a 70 6e 52 65 6d 20 20 20 20 20 20 20 20  t *pnRem        
1f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f720 20 57 72 69 74 65 20 75 70 20 74 6f 20 74 68 69   Write up to thi
1f730 73 20 6d 61 6e 79 20 6f 75 74 70 75 74 20 6c 65  s many output le
1f740 61 76 65 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  aves */.){.  Fts
1f750 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
1f760 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b  uct = *ppStruct;
1f770 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1f780 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
1f790 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1f7a0 4c 76 6c 5d 3b 0a 20 20 46 74 73 35 53 74 72 75  Lvl];.  Fts5Stru
1f7b0 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
1f7c0 4f 75 74 3b 0a 20 20 46 74 73 35 49 74 65 72 20  Out;.  Fts5Iter 
1f7d0 2a 70 49 74 65 72 20 3d 20 30 3b 20 20 20 20 20  *pIter = 0;     
1f7e0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
1f7f0 20 72 65 61 64 20 69 6e 70 75 74 20 64 61 74 61   read input data
1f800 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d   */.  int nRem =
1f810 20 70 6e 52 65 6d 20 3f 20 2a 70 6e 52 65 6d 20   pnRem ? *pnRem 
1f820 3a 20 30 3b 20 20 2f 2a 20 4f 75 74 70 75 74 20  : 0;  /* Output 
1f830 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66 74 20  leaf pages left 
1f840 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e  to write */.  in
1f850 74 20 6e 49 6e 70 75 74 3b 20 20 20 20 20 20 20  t nInput;       
1f860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f870 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74   Number of input
1f880 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46   segments */.  F
1f890 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69  ts5SegWriter wri
1f8a0 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ter;           /
1f8b0 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20  * Writer object 
1f8c0 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
1f8d0 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b  reSegment *pSeg;
1f8e0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 73       /* Output s
1f8f0 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35  egment */.  Fts5
1f900 42 75 66 66 65 72 20 74 65 72 6d 3b 0a 20 20 69  Buffer term;.  i
1f910 6e 74 20 62 4f 6c 64 65 73 74 3b 20 20 20 20 20  nt bOldest;     
1f920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f930 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f 75  * True if the ou
1f940 74 70 75 74 20 73 65 67 6d 65 6e 74 20 69 73 20  tput segment is 
1f950 74 68 65 20 6f 6c 64 65 73 74 20 2a 2f 0a 20 20  the oldest */.  
1f960 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d  int eDetail = p-
1f970 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
1f980 6c 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  l;.  const int f
1f990 6c 61 67 73 20 3d 20 46 54 53 35 49 4e 44 45 58  lags = FTS5INDEX
1f9a0 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54 3b  _QUERY_NOOUTPUT;
1f9b0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c  ..  assert( iLvl
1f9c0 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
1f9d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
1f9e0 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c  vl->nMerge<=pLvl
1f9f0 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 6d 65 6d  ->nSeg );..  mem
1fa00 73 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20  set(&writer, 0, 
1fa10 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72  sizeof(Fts5SegWr
1fa20 69 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74  iter));.  memset
1fa30 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f  (&term, 0, sizeo
1fa40 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a  f(Fts5Buffer));.
1fa50 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72    if( pLvl->nMer
1fa60 67 65 20 29 7b 0a 20 20 20 20 70 4c 76 6c 4f 75  ge ){.    pLvlOu
1fa70 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  t = &pStruct->aL
1fa80 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 20 20  evel[iLvl+1];.  
1fa90 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 4f 75    assert( pLvlOu
1faa0 74 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a 20 20 20  t->nSeg>0 );.   
1fab0 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e   nInput = pLvl->
1fac0 6e 4d 65 72 67 65 3b 0a 20 20 20 20 70 53 65 67  nMerge;.    pSeg
1fad0 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65   = &pLvlOut->aSe
1fae0 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d  g[pLvlOut->nSeg-
1faf0 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69  1];..    fts5Wri
1fb00 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65  teInit(p, &write
1fb10 72 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 29  r, pSeg->iSegid)
1fb20 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 77 72 69  ;.    writer.wri
1fb30 74 65 72 2e 70 67 6e 6f 20 3d 20 70 53 65 67 2d  ter.pgno = pSeg-
1fb40 3e 70 67 6e 6f 4c 61 73 74 2b 31 3b 0a 20 20 20  >pgnoLast+1;.   
1fb50 20 77 72 69 74 65 72 2e 69 42 74 50 61 67 65 20   writer.iBtPage 
1fb60 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1fb70 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 66    int iSegid = f
1fb80 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64  ts5AllocateSegid
1fb90 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a 20  (p, pStruct);.. 
1fba0 20 20 20 2f 2a 20 45 78 74 65 6e 64 20 74 68 65     /* Extend the
1fbb0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f   Fts5Structure o
1fbc0 62 6a 65 63 74 20 61 73 20 72 65 71 75 69 72 65  bject as require
1fbd0 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  d to ensure the 
1fbe0 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 73 65  output.    ** se
1fbf0 67 6d 65 6e 74 20 65 78 69 73 74 73 2e 20 2a 2f  gment exists. */
1fc00 0a 20 20 20 20 69 66 28 20 69 4c 76 6c 3d 3d 70  .    if( iLvl==p
1fc10 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d 31  Struct->nLevel-1
1fc20 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74   ){.      fts5St
1fc30 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28  ructureAddLevel(
1fc40 26 70 2d 3e 72 63 2c 20 70 70 53 74 72 75 63 74  &p->rc, ppStruct
1fc50 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74  );.      pStruct
1fc60 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20   = *ppStruct;.  
1fc70 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75    }.    fts5Stru
1fc80 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c  ctureExtendLevel
1fc90 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74  (&p->rc, pStruct
1fca0 2c 20 69 4c 76 6c 2b 31 2c 20 31 2c 20 30 29 3b  , iLvl+1, 1, 0);
1fcb0 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29  .    if( p->rc )
1fcc0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 76   return;.    pLv
1fcd0 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
1fce0 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
1fcf0 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75  pLvlOut = &pStru
1fd00 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b  ct->aLevel[iLvl+
1fd10 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69  1];..    fts5Wri
1fd20 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65  teInit(p, &write
1fd30 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20  r, iSegid);..   
1fd40 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
1fd50 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 6f  segment to the o
1fd60 75 74 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20  utput level */. 
1fd70 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f     pSeg = &pLvlO
1fd80 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74  ut->aSeg[pLvlOut
1fd90 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20 70 4c 76  ->nSeg];.    pLv
1fda0 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20  lOut->nSeg++;.  
1fdb0 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73    pSeg->pgnoFirs
1fdc0 74 20 3d 20 31 3b 0a 20 20 20 20 70 53 65 67 2d  t = 1;.    pSeg-
1fdd0 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64  >iSegid = iSegid
1fde0 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e  ;.    pStruct->n
1fdf0 53 65 67 6d 65 6e 74 2b 2b 3b 0a 0a 20 20 20 20  Segment++;..    
1fe00 2f 2a 20 52 65 61 64 20 69 6e 70 75 74 20 66 72  /* Read input fr
1fe10 6f 6d 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20  om all segments 
1fe20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76  in the input lev
1fe30 65 6c 20 2a 2f 0a 20 20 20 20 6e 49 6e 70 75 74  el */.    nInput
1fe40 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20   = pLvl->nSeg;. 
1fe50 20 7d 0a 20 20 62 4f 6c 64 65 73 74 20 3d 20 28   }.  bOldest = (
1fe60 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d 31  pLvlOut->nSeg==1
1fe70 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65   && pStruct->nLe
1fe80 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a 20  vel==iLvl+2);.. 
1fe90 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3e 3d 30   assert( iLvl>=0
1fea0 20 29 3b 0a 20 20 66 6f 72 28 66 74 73 35 4d 75   );.  for(fts5Mu
1feb0 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53  ltiIterNew(p, pS
1fec0 74 72 75 63 74 2c 20 66 6c 61 67 73 2c 20 30 2c  truct, flags, 0,
1fed0 20 30 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e 49 6e   0, 0, iLvl, nIn
1fee0 70 75 74 2c 20 26 70 49 74 65 72 29 3b 0a 20 20  put, &pIter);.  
1fef0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
1ff00 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d  rEof(p, pIter)==
1ff10 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  0;.      fts5Mul
1ff20 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  tiIterNext(p, pI
1ff30 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a  ter, 0, 0).  ){.
1ff40 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
1ff50 2a 70 53 65 67 49 74 65 72 20 3d 20 26 70 49 74  *pSegIter = &pIt
1ff60 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
1ff70 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
1ff80 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f  t ];.    int nPo
1ff90 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1ffa0 20 20 20 20 20 20 20 2f 2a 20 70 6f 73 69 74 69         /* positi
1ffb0 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
1ffc0 6c 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20  ld value */.    
1ffd0 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 63  int nTerm;.    c
1ffe0 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 3b 0a  onst u8 *pTerm;.
1fff0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
20000 72 20 6b 65 79 20 61 6e 6e 69 68 69 6c 61 74 69  r key annihilati
20010 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  on. */.    if( p
20020 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 3d 3d 30  SegIter->nPos==0
20030 20 26 26 20 28 62 4f 6c 64 65 73 74 20 7c 7c 20   && (bOldest || 
20040 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 3d 3d  pSegIter->bDel==
20050 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  0) ) continue;..
20060 20 20 20 20 70 54 65 72 6d 20 3d 20 66 74 73 35      pTerm = fts5
20070 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49  MultiIterTerm(pI
20080 74 65 72 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20  ter, &nTerm);.  
20090 20 20 69 66 28 20 6e 54 65 72 6d 21 3d 74 65 72    if( nTerm!=ter
200a0 6d 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54  m.n || memcmp(pT
200b0 65 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65  erm, term.p, nTe
200c0 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  rm) ){.      if(
200d0 20 70 6e 52 65 6d 20 26 26 20 77 72 69 74 65 72   pnRem && writer
200e0 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e 52  .nLeafWritten>nR
200f0 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  em ){.        br
20100 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
20110 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61      /* This is a
20120 20 6e 65 77 20 74 65 72 6d 2e 20 41 70 70 65 6e   new term. Appen
20130 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20  d a term to the 
20140 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 2e 20  output segment. 
20150 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  */.      fts5Wri
20160 74 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c 20  teAppendTerm(p, 
20170 26 77 72 69 74 65 72 2c 20 6e 54 65 72 6d 2c 20  &writer, nTerm, 
20180 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 66 74  pTerm);.      ft
20190 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
201a0 72 63 2c 20 26 74 65 72 6d 2c 20 6e 54 65 72 6d  rc, &term, nTerm
201b0 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a  , pTerm);.    }.
201c0 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  .    /* Append t
201d0 68 65 20 72 6f 77 69 64 20 74 6f 20 74 68 65 20  he rowid to the 
201e0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 2f 2a  output */.    /*
201f0 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a   WRITEPOSLISTSIZ
20200 45 20 2a 2f 0a 20 20 20 20 66 74 73 35 57 72 69  E */.    fts5Wri
20210 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28 70 2c  teAppendRowid(p,
20220 20 26 77 72 69 74 65 72 2c 20 66 74 73 35 4d 75   &writer, fts5Mu
20230 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74  ltiIterRowid(pIt
20240 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 65  er));..    if( e
20250 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
20260 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AIL_NONE ){.    
20270 20 20 69 66 28 20 70 53 65 67 49 74 65 72 2d 3e    if( pSegIter->
20280 62 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  bDel ){.        
20290 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
202a0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
202b0 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75  writer.writer.bu
202c0 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  f, 0);.        i
202d0 66 28 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f  f( pSegIter->nPo
202e0 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  s>0 ){.         
202f0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
20300 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
20310 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62  &writer.writer.b
20320 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  uf, 0);.        
20330 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
20340 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 70  lse{.      /* Ap
20350 70 65 6e 64 20 74 68 65 20 70 6f 73 69 74 69 6f  pend the positio
20360 6e 2d 6c 69 73 74 20 64 61 74 61 20 74 6f 20 74  n-list data to t
20370 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20  he output */.   
20380 20 20 20 6e 50 6f 73 20 3d 20 70 53 65 67 49 74     nPos = pSegIt
20390 65 72 2d 3e 6e 50 6f 73 2a 32 20 2b 20 70 53 65  er->nPos*2 + pSe
203a0 67 49 74 65 72 2d 3e 62 44 65 6c 3b 0a 20 20 20  gIter->bDel;.   
203b0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
203c0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
203d0 2c 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72  , &writer.writer
203e0 2e 62 75 66 2c 20 6e 50 6f 73 29 3b 0a 20 20 20  .buf, nPos);.   
203f0 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
20400 61 74 65 28 70 2c 20 70 53 65 67 49 74 65 72 2c  ate(p, pSegIter,
20410 20 28 76 6f 69 64 2a 29 26 77 72 69 74 65 72 2c   (void*)&writer,
20420 20 66 74 73 35 4d 65 72 67 65 43 68 75 6e 6b 43   fts5MergeChunkC
20430 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a  allback);.    }.
20440 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20    }..  /* Flush 
20450 74 68 65 20 6c 61 73 74 20 6c 65 61 66 20 70 61  the last leaf pa
20460 67 65 20 74 6f 20 64 69 73 6b 2e 20 53 65 74 20  ge to disk. Set 
20470 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65  the output segme
20480 6e 74 20 62 2d 74 72 65 65 20 68 65 69 67 68 74  nt b-tree height
20490 0a 20 20 2a 2a 20 61 6e 64 20 6c 61 73 74 20 6c  .  ** and last l
204a0 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
204b0 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
204c0 2e 20 20 2a 2f 0a 20 20 66 74 73 35 57 72 69 74  .  */.  fts5Writ
204d0 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72 69 74  eFinish(p, &writ
204e0 65 72 2c 20 26 70 53 65 67 2d 3e 70 67 6e 6f 4c  er, &pSeg->pgnoL
204f0 61 73 74 29 3b 0a 0a 20 20 69 66 28 20 66 74 73  ast);..  if( fts
20500 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
20510 20 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69   pIter) ){.    i
20520 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  nt i;..    /* Re
20530 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64 61  move the redunda
20540 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d  nt segments from
20550 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
20560 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30  e */.    for(i=0
20570 3b 20 69 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b 29  ; i<nInput; i++)
20580 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  {.      fts5Data
20590 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28 70 2c  RemoveSegment(p,
205a0 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69   pLvl->aSeg[i].i
205b0 53 65 67 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  Segid);.    }.. 
205c0 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
205d0 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65   redundant segme
205e0 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 70  nts from the inp
205f0 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ut level */.    
20600 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d  if( pLvl->nSeg!=
20610 6e 49 6e 70 75 74 20 29 7b 0a 20 20 20 20 20 20  nInput ){.      
20620 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 28 70 4c 76  int nMove = (pLv
20630 6c 2d 3e 6e 53 65 67 20 2d 20 6e 49 6e 70 75 74  l->nSeg - nInput
20640 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53  ) * sizeof(Fts5S
20650 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
20660 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28  ;.      memmove(
20670 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 26 70 4c 76  pLvl->aSeg, &pLv
20680 6c 2d 3e 61 53 65 67 5b 6e 49 6e 70 75 74 5d 2c  l->aSeg[nInput],
20690 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 7d 0a 20   nMove);.    }. 
206a0 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67     pStruct->nSeg
206b0 6d 65 6e 74 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a  ment -= nInput;.
206c0 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d      pLvl->nSeg -
206d0 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c  = nInput;.    pL
206e0 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 30 3b 0a  vl->nMerge = 0;.
206f0 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67      if( pSeg->pg
20700 6e 6f 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20  noLast==0 ){.   
20710 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67     pLvlOut->nSeg
20720 2d 2d 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63  --;.      pStruc
20730 74 2d 3e 6e 53 65 67 6d 65 6e 74 2d 2d 3b 0a 20  t->nSegment--;. 
20740 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
20750 20 20 61 73 73 65 72 74 28 20 70 53 65 67 2d 3e    assert( pSeg->
20760 70 67 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a 20 20  pgnoLast>0 );.  
20770 20 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e    fts5TrimSegmen
20780 74 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ts(p, pIter);.  
20790 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d    pLvl->nMerge =
207a0 20 6e 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20 20   nInput;.  }..  
207b0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65  fts5MultiIterFre
207c0 65 28 70 49 74 65 72 29 3b 0a 20 20 66 74 73 35  e(pIter);.  fts5
207d0 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72 6d  BufferFree(&term
207e0 29 3b 0a 20 20 69 66 28 20 70 6e 52 65 6d 20 29  );.  if( pnRem )
207f0 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69 74 65   *pnRem -= write
20800 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b 0a  r.nLeafWritten;.
20810 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 75 70 20 74  }../*.** Do up t
20820 6f 20 6e 50 67 20 70 61 67 65 73 20 6f 66 20 61  o nPg pages of a
20830 75 74 6f 6d 65 72 67 65 20 77 6f 72 6b 20 6f 6e  utomerge work on
20840 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a   the index..**.*
20850 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
20860 20 61 6e 79 20 63 68 61 6e 67 65 73 20 77 65 72   any changes wer
20870 65 20 61 63 74 75 61 6c 6c 79 20 6d 61 64 65 2c  e actually made,
20880 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
20890 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
208a0 6e 74 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67  nt fts5IndexMerg
208b0 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
208c0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
208d0 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
208e0 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
208f0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
20900 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20 20 20  *ppStruct,      
20910 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72   /* IN/OUT: Curr
20920 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f 66  ent structure of
20930 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
20940 6e 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  nPg,            
20950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
20960 61 67 65 73 20 6f 66 20 77 6f 72 6b 20 74 6f 20  ages of work to 
20970 64 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 69 6e  do */.  int nMin
20980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20990 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d          /* Minim
209a0 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67  um number of seg
209b0 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67 65 20 2a  ments to merge *
209c0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20  /.){.  int nRem 
209d0 3d 20 6e 50 67 3b 0a 20 20 69 6e 74 20 62 52 65  = nPg;.  int bRe
209e0 74 20 3d 20 30 3b 0a 20 20 46 74 73 35 53 74 72  t = 0;.  Fts5Str
209f0 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
20a00 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 77  = *ppStruct;.  w
20a10 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 26 26 20  hile( nRem>0 && 
20a20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
20a30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c   ){.    int iLvl
20a40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20a50 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74      /* To iterat
20a60 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73  e through levels
20a70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 65 73   */.    int iBes
20a80 74 4c 76 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  tLvl = 0;       
20a90 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 66      /* Level off
20aa0 65 72 69 6e 67 20 74 68 65 20 6d 6f 73 74 20 69  ering the most i
20ab0 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f  nput segments */
20ac0 0a 20 20 20 20 69 6e 74 20 6e 42 65 73 74 20 3d  .    int nBest =
20ad0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
20ae0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
20af0 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20  put segments on 
20b00 62 65 73 74 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20  best level */.. 
20b10 20 20 20 2f 2a 20 53 65 74 20 69 42 65 73 74 4c     /* Set iBestL
20b20 76 6c 20 74 6f 20 74 68 65 20 6c 65 76 65 6c 20  vl to the level 
20b30 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 73 65  to read input se
20b40 67 6d 65 6e 74 73 20 66 72 6f 6d 2e 20 2a 2f 0a  gments from. */.
20b50 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72      assert( pStr
20b60 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b  uct->nLevel>0 );
20b70 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
20b80 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
20b90 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
20ba0 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
20bb0 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
20bc0 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
20bd0 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69  l[iLvl];.      i
20be0 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20  f( pLvl->nMerge 
20bf0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
20c00 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65 73  Lvl->nMerge>nBes
20c10 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t ){.          i
20c20 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a  BestLvl = iLvl;.
20c30 20 20 20 20 20 20 20 20 20 20 6e 42 65 73 74 20            nBest 
20c40 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a  = pLvl->nMerge;.
20c50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20c60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
20c70 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d  .      if( pLvl-
20c80 3e 6e 53 65 67 3e 6e 42 65 73 74 20 29 7b 0a 20  >nSeg>nBest ){. 
20c90 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70         nBest = p
20ca0 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20 20 20  Lvl->nSeg;.     
20cb0 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c     iBestLvl = iL
20cc0 76 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  vl;.      }.    
20cd0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 42 65  }..    /* If nBe
20ce0 73 74 20 69 73 20 73 74 69 6c 6c 20 30 2c 20 74  st is still 0, t
20cf0 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20 6d 75  hen the index mu
20d00 73 74 20 62 65 20 65 6d 70 74 79 2e 20 2a 2f 0a  st be empty. */.
20d10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
20d20 42 55 47 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c  BUG.    for(iLvl
20d30 3d 30 3b 20 6e 42 65 73 74 3d 3d 30 20 26 26 20  =0; nBest==0 && 
20d40 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
20d50 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
20d60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74       assert( pSt
20d70 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
20d80 6c 5d 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a 20 20  l].nSeg==0 );.  
20d90 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
20da0 69 66 28 20 6e 42 65 73 74 3c 6e 4d 69 6e 20 26  if( nBest<nMin &
20db0 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  & pStruct->aLeve
20dc0 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72  l[iBestLvl].nMer
20dd0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62  ge==0 ){.      b
20de0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
20df0 62 52 65 74 20 3d 20 31 3b 0a 20 20 20 20 66 74  bRet = 1;.    ft
20e00 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65  s5IndexMergeLeve
20e10 6c 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20 69  l(p, &pStruct, i
20e20 42 65 73 74 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b  BestLvl, &nRem);
20e30 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
20e40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 74  SQLITE_OK && pSt
20e50 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65  ruct->aLevel[iBe
20e60 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30  stLvl].nMerge==0
20e70 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74   ){.      fts5St
20e80 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70  ructurePromote(p
20e90 2c 20 69 42 65 73 74 4c 76 6c 2b 31 2c 20 70 53  , iBestLvl+1, pS
20ea0 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20  truct);.    }.  
20eb0 7d 0a 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20  }.  *ppStruct = 
20ec0 70 53 74 72 75 63 74 3b 0a 20 20 72 65 74 75 72  pStruct;.  retur
20ed0 6e 20 62 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n bRet;.}../*.**
20ee0 20 41 20 74 6f 74 61 6c 20 6f 66 20 6e 4c 65 61   A total of nLea
20ef0 66 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20  f leaf pages of 
20f00 64 61 74 61 20 68 61 73 20 6a 75 73 74 20 62 65  data has just be
20f10 65 6e 20 66 6c 75 73 68 65 64 20 74 6f 20 61 20  en flushed to a 
20f20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73 65 67 6d 65  level-0.** segme
20f30 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  nt. This functio
20f40 6e 20 75 70 64 61 74 65 73 20 74 68 65 20 77 72  n updates the wr
20f50 69 74 65 2d 63 6f 75 6e 74 65 72 20 61 63 63 6f  ite-counter acco
20f60 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20 69 66 0a  rdingly and, if.
20f70 2a 2a 20 6e 65 63 65 73 73 61 72 79 2c 20 70 65  ** necessary, pe
20f80 72 66 6f 72 6d 73 20 69 6e 63 72 65 6d 65 6e 74  rforms increment
20f90 61 6c 20 6d 65 72 67 65 20 77 6f 72 6b 2e 0a 2a  al merge work..*
20fa0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
20fb0 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65   occurs, set the
20fc0 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72   Fts5Index.rc er
20fd0 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20  ror code. If an 
20fe0 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c  error has .** al
20ff0 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
21000 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
21010 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
21020 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
21030 65 78 41 75 74 6f 6d 65 72 67 65 28 0a 20 20 46  exAutomerge(.  F
21040 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
21050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21060 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
21070 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
21080 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
21090 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e  uct,       /* IN
210a0 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74  /OUT: Current st
210b0 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78  ructure of index
210c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 20   */.  int nLeaf 
210d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
210f0 6f 66 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73  of output leaves
21100 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f   just written */
21110 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  .){.  if( p->rc=
21120 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
21130 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d  >pConfig->nAutom
21140 65 72 67 65 3e 30 20 29 7b 0a 20 20 20 20 46 74  erge>0 ){.    Ft
21150 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
21160 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74  ruct = *ppStruct
21170 3b 0a 20 20 20 20 75 36 34 20 6e 57 72 69 74 65  ;.    u64 nWrite
21180 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21190 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76      /* Initial v
211a0 61 6c 75 65 20 6f 66 20 77 72 69 74 65 2d 63 6f  alue of write-co
211b0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  unter */.    int
211c0 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20 20 20 20   nWork;         
211d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
211e0 6d 62 65 72 20 6f 66 20 77 6f 72 6b 2d 71 75 61  mber of work-qua
211f0 6e 74 61 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a  nta to perform *
21200 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 3b 20  /.    int nRem; 
21210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21220 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
21230 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66 74   leaf pages left
21240 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 0a 20 20   to write */..  
21250 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
21260 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 2e 20 57  write-counter. W
21270 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 20 73  hile doing so, s
21280 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20 20  et nWork. */.   
21290 20 6e 57 72 69 74 65 20 3d 20 70 53 74 72 75 63   nWrite = pStruc
212a0 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  t->nWriteCounter
212b0 3b 0a 20 20 20 20 6e 57 6f 72 6b 20 3d 20 28 69  ;.    nWork = (i
212c0 6e 74 29 28 28 28 6e 57 72 69 74 65 20 2b 20 6e  nt)(((nWrite + n
212d0 4c 65 61 66 29 20 2f 20 70 2d 3e 6e 57 6f 72 6b  Leaf) / p->nWork
212e0 55 6e 69 74 29 20 2d 20 28 6e 57 72 69 74 65 20  Unit) - (nWrite 
212f0 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 29  / p->nWorkUnit))
21300 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e  ;.    pStruct->n
21310 57 72 69 74 65 43 6f 75 6e 74 65 72 20 2b 3d 20  WriteCounter += 
21320 6e 4c 65 61 66 3b 0a 20 20 20 20 6e 52 65 6d 20  nLeaf;.    nRem 
21330 3d 20 28 69 6e 74 29 28 70 2d 3e 6e 57 6f 72 6b  = (int)(p->nWork
21340 55 6e 69 74 20 2a 20 6e 57 6f 72 6b 20 2a 20 70  Unit * nWork * p
21350 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b  Struct->nLevel);
21360 0a 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d  ..    fts5IndexM
21370 65 72 67 65 28 70 2c 20 70 70 53 74 72 75 63 74  erge(p, ppStruct
21380 2c 20 6e 52 65 6d 2c 20 70 2d 3e 70 43 6f 6e 66  , nRem, p->pConf
21390 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 29 3b  ig->nAutomerge);
213a0 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
213b0 6f 69 64 20 66 74 73 35 49 6e 64 65 78 43 72 69  oid fts5IndexCri
213c0 73 69 73 6d 65 72 67 65 28 0a 20 20 46 74 73 35  sismerge(.  Fts5
213d0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
213e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
213f0 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
21400 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
21410 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74  cture **ppStruct
21420 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
21430 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75 63  T: Current struc
21440 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  ture of index */
21450 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  .){.  const int 
21460 6e 43 72 69 73 69 73 20 3d 20 70 2d 3e 70 43 6f  nCrisis = p->pCo
21470 6e 66 69 67 2d 3e 6e 43 72 69 73 69 73 4d 65 72  nfig->nCrisisMer
21480 67 65 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  ge;.  Fts5Struct
21490 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a  ure *pStruct = *
214a0 70 70 53 74 72 75 63 74 3b 0a 20 20 69 6e 74 20  ppStruct;.  int 
214b0 69 4c 76 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73  iLvl = 0;..  ass
214c0 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49  ert( p->rc!=SQLI
214d0 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 72 75 63 74  TE_OK || pStruct
214e0 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20  ->nLevel>0 );.  
214f0 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
21500 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 74 72 75  LITE_OK && pStru
21510 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
21520 2e 6e 53 65 67 3e 3d 6e 43 72 69 73 69 73 20 29  .nSeg>=nCrisis )
21530 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d  {.    fts5IndexM
21540 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26 70 53  ergeLevel(p, &pS
21550 74 72 75 63 74 2c 20 69 4c 76 6c 2c 20 30 29 3b  truct, iLvl, 0);
21560 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
21570 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
21580 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
21590 3e 28 69 4c 76 6c 2b 31 29 20 29 3b 0a 20 20 20  >(iLvl+1) );.   
215a0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72   fts5StructurePr
215b0 6f 6d 6f 74 65 28 70 2c 20 69 4c 76 6c 2b 31 2c  omote(p, iLvl+1,
215c0 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 69   pStruct);.    i
215d0 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70  Lvl++;.  }.  *pp
215e0 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74  Struct = pStruct
215f0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
21600 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
21610 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
21620 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b   int rc = p->rc;
21630 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
21640 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e 20 72  E_OK;.  return r
21650 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74  c;.}..typedef st
21660 72 75 63 74 20 46 74 73 35 46 6c 75 73 68 43 74  ruct Fts5FlushCt
21670 78 20 46 74 73 35 46 6c 75 73 68 43 74 78 3b 0a  x Fts5FlushCtx;.
21680 73 74 72 75 63 74 20 46 74 73 35 46 6c 75 73 68  struct Fts5Flush
21690 43 74 78 20 7b 0a 20 20 46 74 73 35 49 6e 64 65  Ctx {.  Fts5Inde
216a0 78 20 2a 70 49 64 78 3b 0a 20 20 46 74 73 35 53  x *pIdx;.  Fts5S
216b0 65 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b  egWriter writer;
216c0 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66   .};../*.** Buff
216d0 65 72 20 61 42 75 66 5b 5d 20 63 6f 6e 74 61 69  er aBuf[] contai
216e0 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 72  ns a list of var
216f0 69 6e 74 73 2c 20 61 6c 6c 20 73 6d 61 6c 6c 20  ints, all small 
21700 65 6e 6f 75 67 68 20 74 6f 20 66 69 74 0a 2a 2a  enough to fit.**
21710 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74   in a 32-bit int
21720 65 67 65 72 2e 20 52 65 74 75 72 6e 20 74 68 65  eger. Return the
21730 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6c 61 72   size of the lar
21740 67 65 73 74 20 70 72 65 66 69 78 20 6f 66 20 74  gest prefix of t
21750 68 69 73 20 0a 2a 2a 20 6c 69 73 74 20 6e 4d 61  his .** list nMa
21760 78 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 20  x bytes or less 
21770 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
21780 69 63 20 69 6e 74 20 66 74 73 35 50 6f 73 6c 69  ic int fts5Posli
21790 73 74 50 72 65 66 69 78 28 63 6f 6e 73 74 20 75  stPrefix(const u
217a0 38 20 2a 61 42 75 66 2c 20 69 6e 74 20 6e 4d 61  8 *aBuf, int nMa
217b0 78 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20  x){.  int ret;. 
217c0 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 72 65   u32 dummy;.  re
217d0 74 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e  t = fts5GetVarin
217e0 74 33 32 28 61 42 75 66 2c 20 64 75 6d 6d 79 29  t32(aBuf, dummy)
217f0 3b 0a 20 20 69 66 28 20 72 65 74 3c 6e 4d 61 78  ;.  if( ret<nMax
21800 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 31   ){.    while( 1
21810 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 20   ){.      int i 
21820 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
21830 32 28 26 61 42 75 66 5b 72 65 74 5d 2c 20 64 75  2(&aBuf[ret], du
21840 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  mmy);.      if( 
21850 28 72 65 74 20 2b 20 69 29 20 3e 20 6e 4d 61 78  (ret + i) > nMax
21860 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
21870 72 65 74 20 2b 3d 20 69 3b 0a 20 20 20 20 7d 0a  ret += i;.    }.
21880 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
21890 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68  ;.}../*.** Flush
218a0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
218b0 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
218c0 74 61 62 6c 65 20 69 48 61 73 68 20 74 6f 20 61  table iHash to a
218d0 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a   new level-0 .**
218e0 20 73 65 67 6d 65 6e 74 20 6f 6e 20 64 69 73 6b   segment on disk
218f0 2e 20 41 6c 73 6f 20 75 70 64 61 74 65 20 74 68  . Also update th
21900 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
21910 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
21920 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
21930 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
21940 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63  the Fts5Index.rc
21950 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
21960 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a  an error has .**
21970 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
21980 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
21990 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
219a0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
219b0 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 46 74 73  FlushOneHash(Fts
219c0 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
219d0 73 35 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20  s5Hash *pHash = 
219e0 70 2d 3e 70 48 61 73 68 3b 0a 20 20 46 74 73 35  p->pHash;.  Fts5
219f0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
21a00 63 74 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64  ct;.  int iSegid
21a10 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74  ;.  int pgnoLast
21a20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
21a30 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6c 65        /* Last le
21a40 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  af page number i
21a50 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20  n segment */..  
21a60 2f 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65  /* Obtain a refe
21a70 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 6e 64  rence to the ind
21a80 65 78 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ex structure and
21a90 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
21aa0 73 65 67 6d 65 6e 74 2d 69 64 0a 20 20 2a 2a 20  segment-id.  ** 
21ab0 66 6f 72 20 74 68 65 20 6e 65 77 20 6c 65 76 65  for the new leve
21ac0 6c 2d 30 20 73 65 67 6d 65 6e 74 2e 20 20 2a 2f  l-0 segment.  */
21ad0 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73  .  pStruct = fts
21ae0 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
21af0 29 3b 0a 20 20 69 53 65 67 69 64 20 3d 20 66 74  );.  iSegid = ft
21b00 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28  s5AllocateSegid(
21b10 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66  p, pStruct);.  f
21b20 74 73 35 53 74 72 75 63 74 75 72 65 49 6e 76 61  ts5StructureInva
21b30 6c 69 64 61 74 65 28 70 29 3b 0a 0a 20 20 69 66  lidate(p);..  if
21b40 28 20 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20  ( iSegid ){.    
21b50 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d  const int pgsz =
21b60 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73   p->pConfig->pgs
21b70 7a 3b 0a 20 20 20 20 69 6e 74 20 65 44 65 74 61  z;.    int eDeta
21b80 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  il = p->pConfig-
21b90 3e 65 44 65 74 61 69 6c 3b 0a 20 20 20 20 46 74  >eDetail;.    Ft
21ba0 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
21bb0 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a 20 4e  nt *pSeg;   /* N
21bc0 65 77 20 73 65 67 6d 65 6e 74 20 77 69 74 68 69  ew segment withi
21bd0 6e 20 70 53 74 72 75 63 74 20 2a 2f 0a 20 20 20  n pStruct */.   
21be0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
21bf0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
21c00 2a 20 42 75 66 66 65 72 20 69 6e 20 77 68 69 63  * Buffer in whic
21c10 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 6c 65  h to assemble le
21c20 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 46  af page */.    F
21c30 74 73 35 42 75 66 66 65 72 20 2a 70 50 67 69 64  ts5Buffer *pPgid
21c40 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x;           /* 
21c50 42 75 66 66 65 72 20 69 6e 20 77 68 69 63 68 20  Buffer in which 
21c60 74 6f 20 61 73 73 65 6d 62 6c 65 20 70 67 69 64  to assemble pgid
21c70 78 20 2a 2f 0a 0a 20 20 20 20 46 74 73 35 53 65  x */..    Fts5Se
21c80 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a  gWriter writer;.
21c90 20 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69      fts5WriteIni
21ca0 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 53  t(p, &writer, iS
21cb0 65 67 69 64 29 3b 0a 0a 20 20 20 20 70 42 75 66  egid);..    pBuf
21cc0 20 3d 20 26 77 72 69 74 65 72 2e 77 72 69 74 65   = &writer.write
21cd0 72 2e 62 75 66 3b 0a 20 20 20 20 70 50 67 69 64  r.buf;.    pPgid
21ce0 78 20 3d 20 26 77 72 69 74 65 72 2e 77 72 69 74  x = &writer.writ
21cf0 65 72 2e 70 67 69 64 78 3b 0a 0a 20 20 20 20 2f  er.pgidx;..    /
21d00 2a 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28  * fts5WriteInit(
21d10 29 20 73 68 6f 75 6c 64 20 68 61 76 65 20 69 6e  ) should have in
21d20 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20 62 75  itialized the bu
21d30 66 66 65 72 73 20 74 6f 20 28 6d 6f 73 74 20 6c  ffers to (most l
21d40 69 6b 65 6c 79 29 0a 20 20 20 20 2a 2a 20 74 68  ikely).    ** th
21d50 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20  e maximum space 
21d60 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
21d70 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c   assert( p->rc |
21d80 7c 20 70 42 75 66 2d 3e 6e 53 70 61 63 65 3e 3d  | pBuf->nSpace>=
21d90 28 70 67 73 7a 20 2b 20 46 54 53 35 5f 44 41 54  (pgsz + FTS5_DAT
21da0 41 5f 50 41 44 44 49 4e 47 29 20 29 3b 0a 20 20  A_PADDING) );.  
21db0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20    assert( p->rc 
21dc0 7c 7c 20 70 50 67 69 64 78 2d 3e 6e 53 70 61 63  || pPgidx->nSpac
21dd0 65 3e 3d 28 70 67 73 7a 20 2b 20 46 54 53 35 5f  e>=(pgsz + FTS5_
21de0 44 41 54 41 5f 50 41 44 44 49 4e 47 29 20 29 3b  DATA_PADDING) );
21df0 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 73  ..    /* Begin s
21e00 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
21e10 68 61 73 68 20 74 61 62 6c 65 20 65 6e 74 72 69  hash table entri
21e20 65 73 2e 20 54 68 69 73 20 6c 6f 6f 70 20 72 75  es. This loop ru
21e30 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
21e40 0a 20 20 20 20 2a 2a 20 74 65 72 6d 2f 64 6f 63  .    ** term/doc
21e50 6c 69 73 74 20 63 75 72 72 65 6e 74 6c 79 20 73  list currently s
21e60 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68 65  tored within the
21e70 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a   hash table. */.
21e80 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
21e90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21ea0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
21eb0 33 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69  3Fts5HashScanIni
21ec0 74 28 70 48 61 73 68 2c 20 30 2c 20 30 29 3b 0a  t(pHash, 0, 0);.
21ed0 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
21ee0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
21ef0 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46  K && 0==sqlite3F
21f00 74 73 35 48 61 73 68 53 63 61 6e 45 6f 66 28 70  ts5HashScanEof(p
21f10 48 61 73 68 29 20 29 7b 0a 20 20 20 20 20 20 63  Hash) ){.      c
21f20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
21f30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75  ;          /* Bu
21f40 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
21f50 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 63 6f  term */.      co
21f60 6e 73 74 20 75 38 20 2a 70 44 6f 63 6c 69 73 74  nst u8 *pDoclist
21f70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ;         /* Poi
21f80 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 20  nter to doclist 
21f90 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20 2a 2f  for this term */
21fa0 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c  .      int nDocl
21fb0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
21fc0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f     /* Size of do
21fd0 63 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a  clist in bytes *
21fe0 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  /..      /* Writ
21ff0 65 20 74 68 65 20 74 65 72 6d 20 66 6f 72 20 74  e the term for t
22000 68 69 73 20 65 6e 74 72 79 20 74 6f 20 64 69 73  his entry to dis
22010 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  k. */.      sqli
22020 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
22030 6e 74 72 79 28 70 48 61 73 68 2c 20 26 7a 54 65  ntry(pHash, &zTe
22040 72 6d 2c 20 26 70 44 6f 63 6c 69 73 74 2c 20 26  rm, &pDoclist, &
22050 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20  nDoclist);.     
22060 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64   fts5WriteAppend
22070 54 65 72 6d 28 70 2c 20 26 77 72 69 74 65 72 2c  Term(p, &writer,
22080 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65   (int)strlen(zTe
22090 72 6d 29 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29  rm), (const u8*)
220a0 7a 54 65 72 6d 29 3b 0a 0a 20 20 20 20 20 20 61  zTerm);..      a
220b0 73 73 65 72 74 28 20 77 72 69 74 65 72 2e 62 46  ssert( writer.bF
220c0 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 3d  irstRowidInPage=
220d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
220e0 70 67 73 7a 3e 3d 28 70 42 75 66 2d 3e 6e 20 2b  pgsz>=(pBuf->n +
220f0 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 44 6f   pPgidx->n + nDo
22100 63 6c 69 73 74 20 2b 20 31 29 20 29 7b 0a 20 20  clist + 1) ){.  
22110 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74        /* The ent
22120 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c  ire doclist will
22130 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72 72   fit on the curr
22140 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20 20 20  ent leaf. */.   
22150 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
22160 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42  afeAppendBlob(pB
22170 75 66 2c 20 70 44 6f 63 6c 69 73 74 2c 20 6e 44  uf, pDoclist, nD
22180 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  oclist);.      }
22190 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36  else{.        i6
221a0 34 20 69 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  4 iRowid = 0;.  
221b0 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61        i64 iDelta
221c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
221d0 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 20  t iOff = 0;..   
221e0 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69       /* The enti
221f0 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c 20  re doclist will 
22200 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20  not fit on this 
22210 6c 65 61 66 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  leaf. The follow
22220 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ing .        ** 
22230 6c 6f 6f 70 20 69 74 65 72 61 74 65 73 20 74 68  loop iterates th
22240 72 6f 75 67 68 20 74 68 65 20 70 6f 73 6c 69 73  rough the poslis
22250 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
22260 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 20  the current .   
22270 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2e       ** doclist.
22280 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69    */.        whi
22290 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
222a0 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 6e 44 6f  E_OK && iOff<nDo
222b0 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  clist ){.       
222c0 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
222d0 65 74 56 61 72 69 6e 74 28 26 70 44 6f 63 6c 69  etVarint(&pDocli
222e0 73 74 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  st[iOff], (u64*)
222f0 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
22300 20 20 20 20 69 52 6f 77 69 64 20 2b 3d 20 69 44      iRowid += iD
22310 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20  elta;.          
22320 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77  .          if( w
22330 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69  riter.bFirstRowi
22340 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20  dInPage ){.     
22350 20 20 20 20 20 20 20 66 74 73 35 50 75 74 55 31         fts5PutU1
22360 36 28 26 70 42 75 66 2d 3e 70 5b 30 5d 2c 20 28  6(&pBuf->p[0], (
22370 75 31 36 29 70 42 75 66 2d 3e 6e 29 3b 20 20 20  u16)pBuf->n);   
22380 2f 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  /* first rowid o
22390 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  n page */.      
223a0 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d        pBuf->n +=
223b0 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56   sqlite3Fts5PutV
223c0 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70  arint(&pBuf->p[p
223d0 42 75 66 2d 3e 6e 5d 2c 20 69 52 6f 77 69 64 29  Buf->n], iRowid)
223e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 72  ;.            wr
223f0 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64  iter.bFirstRowid
22400 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  InPage = 0;.    
22410 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74          fts5Writ
22420 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20  eDlidxAppend(p, 
22430 26 77 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29  &writer, iRowid)
22440 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
22450 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
22460 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65  Buf->n += sqlite
22470 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28 26  3Fts5PutVarint(&
22480 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d  pBuf->p[pBuf->n]
22490 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  , iDelta);.     
224a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
224b0 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e   assert( pBuf->n
224c0 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29  <=pBuf->nSpace )
224d0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ;..          if(
224e0 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44   eDetail==FTS5_D
224f0 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
22500 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4f            if( iO
22510 66 66 3c 6e 44 6f 63 6c 69 73 74 20 26 26 20 70  ff<nDoclist && p
22520 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3d 3d 30  Doclist[iOff]==0
22530 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22540 20 20 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e    pBuf->p[pBuf->
22550 6e 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  n++] = 0;.      
22560 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a          iOff++;.
22570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
22580 28 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20  ( iOff<nDoclist 
22590 26 26 20 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66  && pDoclist[iOff
225a0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
225b0 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 70 5b          pBuf->p[
225c0 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a  pBuf->n++] = 0;.
225d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225e0 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  iOff++;.        
225f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22600 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22610 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b    if( (pBuf->n +
22620 20 70 50 67 69 64 78 2d 3e 6e 29 3e 3d 70 67 73   pPgidx->n)>=pgs
22630 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  z ){.           
22640 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
22650 68 4c 65 61 66 28 70 2c 20 26 77 72 69 74 65 72  hLeaf(p, &writer
22660 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
22670 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
22680 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
22690 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20  t bDummy;.      
226a0 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a        int nPos;.
226b0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
226c0 6e 43 6f 70 79 20 3d 20 66 74 73 35 47 65 74 50  nCopy = fts5GetP
226d0 6f 73 6c 69 73 74 53 69 7a 65 28 26 70 44 6f 63  oslistSize(&pDoc
226e0 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f  list[iOff], &nPo
226f0 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20  s, &bDummy);.   
22700 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20 2b           nCopy +
22710 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20  = nPos;.        
22720 20 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e      if( (pBuf->n
22730 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e   + pPgidx->n + n
22740 43 6f 70 79 29 20 3c 3d 20 70 67 73 7a 20 29 7b  Copy) <= pgsz ){
22750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
22760 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70 6f 73  * The entire pos
22770 6c 69 73 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  list will fit on
22780 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
22790 66 2e 20 53 6f 20 63 6f 70 79 0a 20 20 20 20 20  f. So copy.     
227a0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69           ** it i
227b0 6e 20 6f 6e 65 20 67 6f 2e 20 2a 2f 0a 20 20 20  n one go. */.   
227c0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
227d0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
227e0 6c 6f 62 28 70 42 75 66 2c 20 26 70 44 6f 63 6c  lob(pBuf, &pDocl
227f0 69 73 74 5b 69 4f 66 66 5d 2c 20 6e 43 6f 70 79  ist[iOff], nCopy
22800 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
22810 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
22820 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72      /* The entir
22830 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20 6e  e poslist will n
22840 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20 6c  ot fit on this l
22850 65 61 66 2e 20 53 6f 20 69 74 20 6e 65 65 64 73  eaf. So it needs
22860 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
22870 2a 20 74 6f 20 62 65 20 62 72 6f 6b 65 6e 20 69  * to be broken i
22880 6e 74 6f 20 73 65 63 74 69 6f 6e 73 2e 20 54 68  nto sections. Th
22890 65 20 6f 6e 6c 79 20 71 75 61 6c 69 66 69 63 61  e only qualifica
228a0 74 69 6f 6e 20 62 65 69 6e 67 0a 20 20 20 20 20  tion being.     
228b0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
228c0 20 65 61 63 68 20 76 61 72 69 6e 74 20 6d 75 73   each varint mus
228d0 74 20 62 65 20 73 74 6f 72 65 64 20 63 6f 6e 74  t be stored cont
228e0 69 67 75 6f 75 73 6c 79 2e 20 20 2a 2f 0a 20 20  iguously.  */.  
228f0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
22900 74 20 75 38 20 2a 70 50 6f 73 6c 69 73 74 20 3d  t u8 *pPoslist =
22910 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d   &pDoclist[iOff]
22920 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22930 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b 0a 20 20  int iPos = 0;.  
22940 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c              whil
22950 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
22960 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
22970 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70 61 63         int nSpac
22980 65 20 3d 20 70 67 73 7a 20 2d 20 70 42 75 66 2d  e = pgsz - pBuf-
22990 3e 6e 20 2d 20 70 50 67 69 64 78 2d 3e 6e 3b 0a  >n - pPgidx->n;.
229a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229b0 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20  int n = 0;.     
229c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
229d0 6e 43 6f 70 79 20 2d 20 69 50 6f 73 29 3c 3d 6e  nCopy - iPos)<=n
229e0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Space ){.       
229f0 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 6e             n = n
22a00 43 6f 70 79 20 2d 20 69 50 6f 73 3b 0a 20 20 20  Copy - iPos;.   
22a10 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
22a20 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
22a30 20 20 20 20 20 20 6e 20 3d 20 66 74 73 35 50 6f        n = fts5Po
22a40 73 6c 69 73 74 50 72 65 66 69 78 28 26 70 50 6f  slistPrefix(&pPo
22a50 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 53 70  slist[iPos], nSp
22a60 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ace);.          
22a70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22a80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
22a90 6e 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  n>0 );.         
22aa0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
22ab0 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
22ac0 70 42 75 66 2c 20 26 70 50 6f 73 6c 69 73 74 5b  pBuf, &pPoslist[
22ad0 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20 20 20 20 20  iPos], n);.     
22ae0 20 20 20 20 20 20 20 20 20 20 20 69 50 6f 73 20             iPos 
22af0 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  += n;.          
22b00 20 20 20 20 20 20 69 66 28 20 28 70 42 75 66 2d        if( (pBuf-
22b10 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 29 3e  >n + pPgidx->n)>
22b20 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20  =pgsz ){.       
22b30 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 57             fts5W
22b40 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c  riteFlushLeaf(p,
22b50 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20 20 20   &writer);.     
22b60 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
22b70 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
22b80 20 69 50 6f 73 3e 3d 6e 43 6f 70 79 20 29 20 62   iPos>=nCopy ) b
22b90 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
22ba0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22bb0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
22bc0 69 4f 66 66 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  iOff += nCopy;. 
22bd0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22be0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
22bf0 20 20 20 20 2f 2a 20 54 4f 44 4f 32 3a 20 44 6f      /* TODO2: Do
22c00 63 6c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72  clist terminator
22c10 20 77 72 69 74 74 65 6e 20 68 65 72 65 2e 20 2a   written here. *
22c20 2f 0a 20 20 20 20 20 20 2f 2a 20 70 42 75 66 2d  /.      /* pBuf-
22c30 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20  >p[pBuf->n++] = 
22c40 27 5c 30 27 3b 20 2a 2f 0a 20 20 20 20 20 20 61  '\0'; */.      a
22c50 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d  ssert( pBuf->n<=
22c60 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a  pBuf->nSpace );.
22c70 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
22c80 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28 70 48  5HashScanNext(pH
22c90 61 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ash);.    }.    
22ca0 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 43  sqlite3Fts5HashC
22cb0 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20 20  lear(pHash);.   
22cc0 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68   fts5WriteFinish
22cd0 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70 67  (p, &writer, &pg
22ce0 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 20 20 2f 2a  noLast);..    /*
22cf0 20 55 70 64 61 74 65 20 74 68 65 20 46 74 73 35   Update the Fts5
22d00 53 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73  Structure. It is
22d10 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
22d20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 79   the database by
22d30 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 74 73 35   the.    ** fts5
22d40 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
22d50 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 2e 20 20  () call below.  
22d60 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 72 75  */.    if( pStru
22d70 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 30 20 29 7b  ct->nLevel==0 ){
22d80 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
22d90 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26 70 2d  tureAddLevel(&p-
22da0 3e 72 63 2c 20 26 70 53 74 72 75 63 74 29 3b 0a  >rc, &pStruct);.
22db0 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74      }.    fts5St
22dc0 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76  ructureExtendLev
22dd0 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75  el(&p->rc, pStru
22de0 63 74 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  ct, 0, 1, 0);.  
22df0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
22e00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22e10 70 53 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d  pSeg = &pStruct-
22e20 3e 61 4c 65 76 65 6c 5b 30 5d 2e 61 53 65 67 5b  >aLevel[0].aSeg[
22e30 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
22e40 5b 30 5d 2e 6e 53 65 67 2b 2b 20 5d 3b 0a 20 20  [0].nSeg++ ];.  
22e50 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64      pSeg->iSegid
22e60 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20 20   = iSegid;.     
22e70 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
22e80 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 53 65 67   = 1;.      pSeg
22e90 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67 6e  ->pgnoLast = pgn
22ea0 6f 4c 61 73 74 3b 0a 20 20 20 20 20 20 70 53 74  oLast;.      pSt
22eb0 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b  ruct->nSegment++
22ec0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
22ed0 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
22ee0 28 70 2c 20 30 2c 20 70 53 74 72 75 63 74 29 3b  (p, 0, pStruct);
22ef0 0a 20 20 7d 0a 0a 20 20 66 74 73 35 49 6e 64 65  .  }..  fts5Inde
22f00 78 41 75 74 6f 6d 65 72 67 65 28 70 2c 20 26 70  xAutomerge(p, &p
22f10 53 74 72 75 63 74 2c 20 70 67 6e 6f 4c 61 73 74  Struct, pgnoLast
22f20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 43 72  );.  fts5IndexCr
22f30 69 73 69 73 6d 65 72 67 65 28 70 2c 20 26 70 53  isismerge(p, &pS
22f40 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74  truct);.  fts5St
22f50 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20  ructureWrite(p, 
22f60 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35  pStruct);.  fts5
22f70 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
22f80 28 70 53 74 72 75 63 74 29 3b 0a 7d 0a 0a 2f 2a  (pStruct);.}../*
22f90 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 61  .** Flush any da
22fa0 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
22fb0 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
22fc0 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 64 61  tables to the da
22fd0 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
22fe0 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
22ff0 46 6c 75 73 68 28 46 74 73 35 49 6e 64 65 78 20  Flush(Fts5Index 
23000 2a 70 29 7b 0a 20 20 2f 2a 20 55 6e 6c 65 73 73  *p){.  /* Unless
23010 20 69 74 20 69 73 20 65 6d 70 74 79 2c 20 66 6c   it is empty, fl
23020 75 73 68 20 74 68 65 20 68 61 73 68 20 74 61 62  ush the hash tab
23030 6c 65 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20  le to disk */.  
23040 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44  if( p->nPendingD
23050 61 74 61 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ata ){.    asser
23060 74 28 20 70 2d 3e 70 48 61 73 68 20 29 3b 0a 20  t( p->pHash );. 
23070 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61     p->nPendingDa
23080 74 61 20 3d 20 30 3b 0a 20 20 20 20 66 74 73 35  ta = 0;.    fts5
23090 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 70 29 3b  FlushOneHash(p);
230a0 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46  .  }.}..static F
230b0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 66 74  ts5Structure *ft
230c0 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65 53  s5IndexOptimizeS
230d0 74 72 75 63 74 28 0a 20 20 46 74 73 35 49 6e 64  truct(.  Fts5Ind
230e0 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 74  ex *p, .  Fts5St
230f0 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
23100 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  .){.  Fts5Struct
23110 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ure *pNew = 0;. 
23120 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
23130 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
23140 65 29 3b 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d  e);.  int nSeg =
23150 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
23160 6e 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  nt;.  int i;..  
23170 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69 66  /* Figure out if
23180 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
23190 72 65 71 75 69 72 65 73 20 6f 70 74 69 6d 69 7a  requires optimiz
231a0 61 74 69 6f 6e 2e 20 41 20 73 74 72 75 63 74 75  ation. A structu
231b0 72 65 20 64 6f 65 73 0a 20 20 2a 2a 20 6e 6f 74  re does.  ** not
231c0 20 72 65 71 75 69 72 65 20 6f 70 74 69 6d 69 7a   require optimiz
231d0 61 74 69 6f 6e 20 69 66 20 65 69 74 68 65 72 3a  ation if either:
231e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 2b 20 69 74  .  **.  **  + it
231f0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 66 65 77   consists of few
23200 65 72 20 74 68 61 6e 20 74 77 6f 20 73 65 67 6d  er than two segm
23210 65 6e 74 73 2c 20 6f 72 20 0a 20 20 2a 2a 20 20  ents, or .  **  
23220 2b 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 61  + all segments a
23230 72 65 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 6c  re on the same l
23240 65 76 65 6c 2c 20 6f 72 0a 20 20 2a 2a 20 20 2b  evel, or.  **  +
23250 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 65 78   all segments ex
23260 63 65 70 74 20 6f 6e 65 20 61 72 65 20 63 75 72  cept one are cur
23270 72 65 6e 74 6c 79 20 69 6e 70 75 74 73 20 74 6f  rently inputs to
23280 20 61 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69   a merge operati
23290 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  on..  **.  ** In
232a0 20 74 68 65 20 66 69 72 73 74 20 63 61 73 65 2c   the first case,
232b0 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e   return NULL. In
232c0 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 69 6e 63   the second, inc
232d0 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 2d 63  rement the ref-c
232e0 6f 75 6e 74 0a 20 20 2a 2a 20 6f 6e 20 2a 70 53  ount.  ** on *pS
232f0 74 72 75 63 74 20 61 6e 64 20 72 65 74 75 72 6e  truct and return
23300 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70   a copy of the p
23310 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 0a 20 20  ointer to it..  
23320 2a 2f 0a 20 20 69 66 28 20 6e 53 65 67 3c 32 20  */.  if( nSeg<2 
23330 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
23340 72 28 69 3d 30 3b 20 69 3c 70 53 74 72 75 63 74  r(i=0; i<pStruct
23350 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a  ->nLevel; i++){.
23360 20 20 20 20 69 6e 74 20 6e 54 68 69 73 20 3d 20      int nThis = 
23370 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
23380 69 5d 2e 6e 53 65 67 3b 0a 20 20 20 20 69 66 28  i].nSeg;.    if(
23390 20 6e 54 68 69 73 3d 3d 6e 53 65 67 20 7c 7c 20   nThis==nSeg || 
233a0 28 6e 54 68 69 73 3d 3d 6e 53 65 67 2d 31 20 26  (nThis==nSeg-1 &
233b0 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  & pStruct->aLeve
233c0 6c 5b 69 5d 2e 6e 4d 65 72 67 65 3d 3d 6e 54 68  l[i].nMerge==nTh
233d0 69 73 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73  is) ){.      fts
233e0 35 53 74 72 75 63 74 75 72 65 52 65 66 28 70 53  5StructureRef(pS
233f0 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 72 65  truct);.      re
23400 74 75 72 6e 20 70 53 74 72 75 63 74 3b 0a 20 20  turn pStruct;.  
23410 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
23420 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
23430 69 5d 2e 6e 4d 65 72 67 65 3c 3d 6e 54 68 69 73  i].nMerge<=nThis
23440 20 29 3b 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65   );.  }..  nByte
23450 20 2b 3d 20 28 70 53 74 72 75 63 74 2d 3e 6e 4c   += (pStruct->nL
23460 65 76 65 6c 2b 31 29 20 2a 20 73 69 7a 65 6f 66  evel+1) * sizeof
23470 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65  (Fts5StructureLe
23480 76 65 6c 29 3b 0a 20 20 70 4e 65 77 20 3d 20 28  vel);.  pNew = (
23490 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 73  Fts5Structure*)s
234a0 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
234b0 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79  Zero(&p->rc, nBy
234c0 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77  te);..  if( pNew
234d0 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75   ){.    Fts5Stru
234e0 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
234f0 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  ;.    int nByte 
23500 3d 20 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28  = nSeg * sizeof(
23510 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
23520 6d 65 6e 74 29 3b 0a 20 20 20 20 70 4e 65 77 2d  ment);.    pNew-
23530 3e 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63  >nLevel = pStruc
23540 74 2d 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20  t->nLevel+1;.   
23550 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b   pNew->nRef = 1;
23560 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 57 72 69 74  .    pNew->nWrit
23570 65 43 6f 75 6e 74 65 72 20 3d 20 70 53 74 72 75  eCounter = pStru
23580 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  ct->nWriteCounte
23590 72 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70  r;.    pLvl = &p
235a0 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72  New->aLevel[pStr
235b0 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20  uct->nLevel];.  
235c0 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28    pLvl->aSeg = (
235d0 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
235e0 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73  ment*)sqlite3Fts
235f0 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e  5MallocZero(&p->
23600 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  rc, nByte);.    
23610 69 66 28 20 70 4c 76 6c 2d 3e 61 53 65 67 20 29  if( pLvl->aSeg )
23620 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c  {.      int iLvl
23630 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 69 6e  , iSeg;.      in
23640 74 20 69 53 65 67 4f 75 74 20 3d 20 30 3b 0a 20  t iSegOut = 0;. 
23650 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20       /* Iterate 
23660 74 68 72 6f 75 67 68 20 61 6c 6c 20 73 65 67 6d  through all segm
23670 65 6e 74 73 2c 20 66 72 6f 6d 20 6f 6c 64 65 73  ents, from oldes
23680 74 20 74 6f 20 6e 65 77 65 73 74 2e 20 41 64 64  t to newest. Add
23690 20 74 68 65 6d 20 74 6f 0a 20 20 20 20 20 20 2a   them to.      *
236a0 2a 20 74 68 65 20 6e 65 77 20 46 74 73 35 4c 65  * the new Fts5Le
236b0 76 65 6c 20 6f 62 6a 65 63 74 20 73 6f 20 74 68  vel object so th
236c0 61 74 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 30 5d  at pLvl->aSeg[0]
236d0 20 69 73 20 74 68 65 20 6f 6c 64 65 73 74 0a 20   is the oldest. 
236e0 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20       ** segment 
236f0 69 6e 20 74 68 65 20 64 61 74 61 20 73 74 72 75  in the data stru
23700 63 74 75 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20  cture.  */.     
23710 20 66 6f 72 28 69 4c 76 6c 3d 70 53 74 72 75 63   for(iLvl=pStruc
23720 74 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 4c 76  t->nLevel-1; iLv
23730 6c 3e 3d 30 3b 20 69 4c 76 6c 2d 2d 29 7b 0a 20  l>=0; iLvl--){. 
23740 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d         for(iSeg=
23750 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d  0; iSeg<pStruct-
23760 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
23770 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  eg; iSeg++){.   
23780 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65         pLvl->aSe
23790 67 5b 69 53 65 67 4f 75 74 5d 20 3d 20 70 53 74  g[iSegOut] = pSt
237a0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
237b0 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20  l].aSeg[iSeg];. 
237c0 20 20 20 20 20 20 20 20 20 69 53 65 67 4f 75 74           iSegOut
237d0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
237e0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77      }.      pNew
237f0 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 70 4c 76  ->nSegment = pLv
23800 6c 2d 3e 6e 53 65 67 20 3d 20 6e 53 65 67 3b 0a  l->nSeg = nSeg;.
23810 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23820 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
23830 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  ew);.      pNew 
23840 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
23850 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
23860 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
23870 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65 28 46  5IndexOptimize(F
23880 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
23890 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
238a0 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74  Struct;.  Fts5St
238b0 72 75 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20  ructure *pNew = 
238c0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
238d0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
238e0 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75  ;.  fts5IndexFlu
238f0 73 68 28 70 29 3b 0a 20 20 70 53 74 72 75 63 74  sh(p);.  pStruct
23900 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
23910 52 65 61 64 28 70 29 3b 0a 20 20 66 74 73 35 53  Read(p);.  fts5S
23920 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61  tructureInvalida
23930 74 65 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 53  te(p);..  if( pS
23940 74 72 75 63 74 20 29 7b 0a 20 20 20 20 70 4e 65  truct ){.    pNe
23950 77 20 3d 20 66 74 73 35 49 6e 64 65 78 4f 70 74  w = fts5IndexOpt
23960 69 6d 69 7a 65 53 74 72 75 63 74 28 70 2c 20 70  imizeStruct(p, p
23970 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 20 20 66  Struct);.  }.  f
23980 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
23990 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 0a 20  ase(pStruct);.. 
239a0 20 61 73 73 65 72 74 28 20 70 4e 65 77 3d 3d 30   assert( pNew==0
239b0 20 7c 7c 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65   || pNew->nSegme
239c0 6e 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 4e  nt>0 );.  if( pN
239d0 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c  ew ){.    int iL
239e0 76 6c 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c  vl;.    for(iLvl
239f0 3d 30 3b 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c  =0; pNew->aLevel
23a00 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 3b 20  [iLvl].nSeg==0; 
23a10 69 4c 76 6c 2b 2b 29 7b 7d 0a 20 20 20 20 77 68  iLvl++){}.    wh
23a20 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
23a30 54 45 5f 4f 4b 20 26 26 20 70 4e 65 77 2d 3e 61  TE_OK && pNew->a
23a40 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
23a50 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >0 ){.      int 
23a60 6e 52 65 6d 20 3d 20 46 54 53 35 5f 4f 50 54 5f  nRem = FTS5_OPT_
23a70 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 20  WORK_UNIT;.     
23a80 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c   fts5IndexMergeL
23a90 65 76 65 6c 28 70 2c 20 26 70 4e 65 77 2c 20 69  evel(p, &pNew, i
23aa0 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20  Lvl, &nRem);.   
23ab0 20 7d 0a 0a 20 20 20 20 66 74 73 35 53 74 72 75   }..    fts5Stru
23ac0 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 70 4e  ctureWrite(p, pN
23ad0 65 77 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72  ew);.    fts5Str
23ae0 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 4e  uctureRelease(pN
23af0 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ew);.  }..  retu
23b00 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
23b10 72 6e 28 70 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn(p); .}../*.**
23b20 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
23b30 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
23b40 20 73 70 65 63 69 61 6c 20 22 56 41 4c 55 45 53   special "VALUES
23b50 28 27 6d 65 72 67 65 27 2c 20 24 6e 4d 65 72 67  ('merge', $nMerg
23b60 65 29 22 0a 2a 2a 20 49 4e 53 45 52 54 20 63 6f  e)".** INSERT co
23b70 6d 6d 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  mmand..*/.int sq
23b80 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4d 65  lite3Fts5IndexMe
23b90 72 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  rge(Fts5Index *p
23ba0 2c 20 69 6e 74 20 6e 4d 65 72 67 65 29 7b 0a 20  , int nMerge){. 
23bb0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
23bc0 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
23bd0 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
23be0 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
23bf0 0a 20 20 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20  .    int nMin = 
23c00 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 55 73 65  p->pConfig->nUse
23c10 72 6d 65 72 67 65 3b 0a 20 20 20 20 66 74 73 35  rmerge;.    fts5
23c20 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64  StructureInvalid
23c30 61 74 65 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ate(p);.    if( 
23c40 6e 4d 65 72 67 65 3c 30 20 29 7b 0a 20 20 20 20  nMerge<0 ){.    
23c50 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
23c60 2a 70 4e 65 77 20 3d 20 66 74 73 35 49 6e 64 65  *pNew = fts5Inde
23c70 78 4f 70 74 69 6d 69 7a 65 53 74 72 75 63 74 28  xOptimizeStruct(
23c80 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20  p, pStruct);.   
23c90 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
23ca0 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
23cb0 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 20  ;.      pStruct 
23cc0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4d  = pNew;.      nM
23cd0 69 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 6e 4d  in = 2;.      nM
23ce0 65 72 67 65 20 3d 20 6e 4d 65 72 67 65 2a 2d 31  erge = nMerge*-1
23cf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
23d00 70 53 74 72 75 63 74 20 26 26 20 70 53 74 72 75  pStruct && pStru
23d10 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 7b 0a 20 20  ct->nLevel ){.  
23d20 20 20 20 20 69 66 28 20 66 74 73 35 49 6e 64 65      if( fts5Inde
23d30 78 4d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75  xMerge(p, &pStru
23d40 63 74 2c 20 6e 4d 65 72 67 65 2c 20 6e 4d 69 6e  ct, nMerge, nMin
23d50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  ) ){.        fts
23d60 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28  5StructureWrite(
23d70 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20  p, pStruct);.   
23d80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
23d90 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
23da0 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
23db0 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  }.  return fts5I
23dc0 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
23dd0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
23de0 73 35 41 70 70 65 6e 64 52 6f 77 69 64 28 0a 20  s5AppendRowid(. 
23df0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20   Fts5Index *p,. 
23e00 20 69 36 34 20 69 44 65 6c 74 61 2c 0a 20 20 46   i64 iDelta,.  F
23e10 74 73 35 49 74 65 72 20 2a 70 55 6e 75 73 65 64  ts5Iter *pUnused
23e20 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ,.  Fts5Buffer *
23e30 70 42 75 66 0a 29 7b 0a 20 20 55 4e 55 53 45 44  pBuf.){.  UNUSED
23e40 5f 50 41 52 41 4d 28 70 55 6e 75 73 65 64 29 3b  _PARAM(pUnused);
23e50 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70  .  fts5BufferApp
23e60 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
23e70 2c 20 70 42 75 66 2c 20 69 44 65 6c 74 61 29 3b  , pBuf, iDelta);
23e80 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
23e90 66 74 73 35 41 70 70 65 6e 64 50 6f 73 6c 69 73  fts5AppendPoslis
23ea0 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
23eb0 70 2c 0a 20 20 69 36 34 20 69 44 65 6c 74 61 2c  p,.  i64 iDelta,
23ec0 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 4d 75  .  Fts5Iter *pMu
23ed0 6c 74 69 2c 0a 20 20 46 74 73 35 42 75 66 66 65  lti,.  Fts5Buffe
23ee0 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74  r *pBuf.){.  int
23ef0 20 6e 44 61 74 61 20 3d 20 70 4d 75 6c 74 69 2d   nData = pMulti-
23f00 3e 62 61 73 65 2e 6e 44 61 74 61 3b 0a 20 20 61  >base.nData;.  a
23f10 73 73 65 72 74 28 20 6e 44 61 74 61 3e 30 20 29  ssert( nData>0 )
23f20 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
23f30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 66  QLITE_OK && 0==f
23f40 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70  ts5BufferGrow(&p
23f50 2d 3e 72 63 2c 20 70 42 75 66 2c 20 6e 44 61 74  ->rc, pBuf, nDat
23f60 61 2b 39 2b 39 29 20 29 7b 0a 20 20 20 20 66 74  a+9+9) ){.    ft
23f70 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
23f80 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69  ndVarint(pBuf, i
23f90 44 65 6c 74 61 29 3b 0a 20 20 20 20 66 74 73 35  Delta);.    fts5
23fa0 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
23fb0 56 61 72 69 6e 74 28 70 42 75 66 2c 20 6e 44 61  Varint(pBuf, nDa
23fc0 74 61 2a 32 29 3b 0a 20 20 20 20 66 74 73 35 42  ta*2);.    fts5B
23fd0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
23fe0 6c 6f 62 28 70 42 75 66 2c 20 70 4d 75 6c 74 69  lob(pBuf, pMulti
23ff0 2d 3e 62 61 73 65 2e 70 44 61 74 61 2c 20 6e 44  ->base.pData, nD
24000 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 73 74  ata);.  }.}...st
24010 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f  atic void fts5Do
24020 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 46 74  clistIterNext(Ft
24030 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70  s5DoclistIter *p
24040 49 74 65 72 29 7b 0a 20 20 75 38 20 2a 70 20 3d  Iter){.  u8 *p =
24050 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74   pIter->aPoslist
24060 20 2b 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20   + pIter->nSize 
24070 2b 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73  + pIter->nPoslis
24080 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  t;..  assert( pI
24090 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 29 3b  ter->aPoslist );
240a0 0a 20 20 69 66 28 20 70 3e 3d 70 49 74 65 72 2d  .  if( p>=pIter-
240b0 3e 61 45 6f 66 20 29 7b 0a 20 20 20 20 70 49 74  >aEof ){.    pIt
240c0 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 30  er->aPoslist = 0
240d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
240e0 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20  64 iDelta;..    
240f0 70 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  p += fts5GetVari
24100 6e 74 28 70 2c 20 28 75 36 34 2a 29 26 69 44 65  nt(p, (u64*)&iDe
24110 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  lta);.    pIter-
24120 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74  >iRowid += iDelt
24130 61 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  a;..    /* Read 
24140 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73 69  position list si
24150 7a 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 5b  ze */.    if( p[
24160 30 5d 20 26 20 30 78 38 30 20 29 7b 0a 20 20 20  0] & 0x80 ){.   
24170 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
24180 20 20 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20     pIter->nSize 
24190 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
241a0 32 28 70 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20  2(p, nPos);.    
241b0 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73    pIter->nPoslis
241c0 74 20 3d 20 28 6e 50 6f 73 3e 3e 31 29 3b 0a 20  t = (nPos>>1);. 
241d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
241e0 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20  pIter->nPoslist 
241f0 3d 20 28 28 69 6e 74 29 28 70 5b 30 5d 29 29 20  = ((int)(p[0])) 
24200 3e 3e 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65  >> 1;.      pIte
24210 72 2d 3e 6e 53 69 7a 65 20 3d 20 31 3b 0a 20 20  r->nSize = 1;.  
24220 20 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e    }..    pIter->
24230 61 50 6f 73 6c 69 73 74 20 3d 20 70 3b 0a 20 20  aPoslist = p;.  
24240 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
24250 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
24260 49 6e 69 74 28 0a 20 20 46 74 73 35 42 75 66 66  Init(.  Fts5Buff
24270 65 72 20 2a 70 42 75 66 2c 20 0a 20 20 46 74 73  er *pBuf, .  Fts
24280 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49  5DoclistIter *pI
24290 74 65 72 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28  ter.){.  memset(
242a0 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
242b0 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74  (*pIter));.  pIt
242c0 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70  er->aPoslist = p
242d0 42 75 66 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d  Buf->p;.  pIter-
242e0 3e 61 45 6f 66 20 3d 20 26 70 42 75 66 2d 3e 70  >aEof = &pBuf->p
242f0 5b 70 42 75 66 2d 3e 6e 5d 3b 0a 20 20 66 74 73  [pBuf->n];.  fts
24300 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
24310 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 23 69 66 20  (pIter);.}..#if 
24320 30 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  0./*.** Append a
24330 20 64 6f 63 6c 69 73 74 20 74 6f 20 62 75 66 66   doclist to buff
24340 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54  er pBuf..**.** T
24350 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
24360 75 6d 65 73 20 74 68 61 74 20 73 70 61 63 65 20  umes that space 
24370 77 69 74 68 69 6e 20 74 68 65 20 62 75 66 66 65  within the buffe
24380 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  r has already be
24390 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e  en.** allocated.
243a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
243b0 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44  fts5MergeAppendD
243c0 6f 63 69 64 28 0a 20 20 46 74 73 35 42 75 66 66  ocid(.  Fts5Buff
243d0 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  er *pBuf,       
243e0 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
243f0 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  r to write to */
24400 0a 20 20 69 36 34 20 2a 70 69 4c 61 73 74 52 6f  .  i64 *piLastRo
24410 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  wid,            
24420 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72     /* IN/OUT: Pr
24430 65 76 69 6f 75 73 20 72 6f 77 69 64 20 77 72 69  evious rowid wri
24440 74 74 65 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f  tten (if any) */
24450 0a 20 20 69 36 34 20 69 52 6f 77 69 64 20 20 20  .  i64 iRowid   
24460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24470 20 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61     /* Rowid to a
24480 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 61 73  ppend */.){.  as
24490 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 21 3d 30  sert( pBuf->n!=0
244a0 20 7c 7c 20 28 2a 70 69 4c 61 73 74 52 6f 77 69   || (*piLastRowi
244b0 64 29 3d 3d 30 20 29 3b 0a 20 20 66 74 73 35 42  d)==0 );.  fts5B
244c0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
244d0 61 72 69 6e 74 28 70 42 75 66 2c 20 69 52 6f 77  arint(pBuf, iRow
244e0 69 64 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77 69  id - *piLastRowi
244f0 64 29 3b 0a 20 20 2a 70 69 4c 61 73 74 52 6f 77  d);.  *piLastRow
24500 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 23  id = iRowid;.}.#
24510 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 66  endif..#define f
24520 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
24530 63 69 64 28 70 42 75 66 2c 20 69 4c 61 73 74 52  cid(pBuf, iLastR
24540 6f 77 69 64 2c 20 69 52 6f 77 69 64 29 20 7b 20  owid, iRowid) { 
24550 20 20 20 20 20 20 5c 0a 20 20 61 73 73 65 72 74        \.  assert
24560 28 20 28 70 42 75 66 29 2d 3e 6e 21 3d 30 20 7c  ( (pBuf)->n!=0 |
24570 7c 20 28 69 4c 61 73 74 52 6f 77 69 64 29 3d 3d  | (iLastRowid)==
24580 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
24590 20 20 20 20 20 20 20 5c 0a 20 20 66 74 73 35 42         \.  fts5B
245a0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
245b0 61 72 69 6e 74 28 28 70 42 75 66 29 2c 20 28 69  arint((pBuf), (i
245c0 52 6f 77 69 64 29 20 2d 20 28 69 4c 61 73 74 52  Rowid) - (iLastR
245d0 6f 77 69 64 29 29 3b 20 5c 0a 20 20 28 69 4c 61  owid)); \.  (iLa
245e0 73 74 52 6f 77 69 64 29 20 3d 20 28 69 52 6f 77  stRowid) = (iRow
245f0 69 64 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  id);            
24600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24610 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a           \.}../*
24620 0a 2a 2a 20 53 77 61 70 20 74 68 65 20 63 6f 6e  .** Swap the con
24630 74 65 6e 74 73 20 6f 66 20 62 75 66 66 65 72 20  tents of buffer 
24640 2a 70 31 20 77 69 74 68 20 74 68 61 74 20 6f 66  *p1 with that of
24650 20 2a 70 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   *p2..*/.static 
24660 76 6f 69 64 20 66 74 73 35 42 75 66 66 65 72 53  void fts5BufferS
24670 77 61 70 28 46 74 73 35 42 75 66 66 65 72 20 2a  wap(Fts5Buffer *
24680 70 31 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  p1, Fts5Buffer *
24690 70 32 29 7b 0a 20 20 46 74 73 35 42 75 66 66 65  p2){.  Fts5Buffe
246a0 72 20 74 6d 70 20 3d 20 2a 70 31 3b 0a 20 20 2a  r tmp = *p1;.  *
246b0 70 31 20 3d 20 2a 70 32 3b 0a 20 20 2a 70 32 20  p1 = *p2;.  *p2 
246c0 3d 20 74 6d 70 3b 0a 7d 0a 0a 73 74 61 74 69 63  = tmp;.}..static
246d0 20 76 6f 69 64 20 66 74 73 35 4e 65 78 74 52 6f   void fts5NextRo
246e0 77 69 64 28 46 74 73 35 42 75 66 66 65 72 20 2a  wid(Fts5Buffer *
246f0 70 42 75 66 2c 20 69 6e 74 20 2a 70 69 4f 66 66  pBuf, int *piOff
24700 2c 20 69 36 34 20 2a 70 69 52 6f 77 69 64 29 7b  , i64 *piRowid){
24710 0a 20 20 69 6e 74 20 69 20 3d 20 2a 70 69 4f 66  .  int i = *piOf
24720 66 3b 0a 20 20 69 66 28 20 69 3e 3d 70 42 75 66  f;.  if( i>=pBuf
24730 2d 3e 6e 20 29 7b 0a 20 20 20 20 2a 70 69 4f 66  ->n ){.    *piOf
24740 66 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  f = -1;.  }else{
24750 0a 20 20 20 20 75 36 34 20 69 56 61 6c 3b 0a 20  .    u64 iVal;. 
24760 20 20 20 2a 70 69 4f 66 66 20 3d 20 69 20 2b 20     *piOff = i + 
24770 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
24780 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69 5d  rint(&pBuf->p[i]
24790 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 2a 70  , &iVal);.    *p
247a0 69 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a  iRowid += iVal;.
247b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
247c0 73 20 69 73 20 74 68 65 20 65 71 75 69 76 61 6c  s is the equival
247d0 65 6e 74 20 6f 66 20 66 74 73 35 4d 65 72 67 65  ent of fts5Merge
247e0 50 72 65 66 69 78 4c 69 73 74 73 28 29 20 66 6f  PrefixLists() fo
247f0 72 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 6d 6f  r detail=none mo
24800 64 65 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63  de..** In this c
24810 61 73 65 20 74 68 65 20 62 75 66 66 65 72 73 20  ase the buffers 
24820 63 6f 6e 73 69 73 74 20 6f 66 20 61 20 64 65 6c  consist of a del
24830 74 61 2d 65 6e 63 6f 64 65 64 20 6c 69 73 74 20  ta-encoded list 
24840 6f 66 20 72 6f 77 69 64 73 20 6f 6e 6c 79 2e 0a  of rowids only..
24850 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
24860 74 73 35 4d 65 72 67 65 52 6f 77 69 64 4c 69 73  ts5MergeRowidLis
24870 74 73 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ts(.  Fts5Index 
24880 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
24890 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
248a0 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
248b0 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 31    Fts5Buffer *p1
248c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
248d0 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20    /* First list 
248e0 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74  to merge */.  Ft
248f0 73 35 42 75 66 66 65 72 20 2a 70 32 20 20 20 20  s5Buffer *p2    
24900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24910 20 53 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20   Second list to 
24920 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  merge */.){.  in
24930 74 20 69 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t i1 = 0;.  int 
24940 69 32 20 3d 20 30 3b 0a 20 20 69 36 34 20 69 52  i2 = 0;.  i64 iR
24950 6f 77 69 64 31 20 3d 20 30 3b 0a 20 20 69 36 34  owid1 = 0;.  i64
24960 20 69 52 6f 77 69 64 32 20 3d 20 30 3b 0a 20 20   iRowid2 = 0;.  
24970 69 36 34 20 69 4f 75 74 20 3d 20 30 3b 0a 0a 20  i64 iOut = 0;.. 
24980 20 46 74 73 35 42 75 66 66 65 72 20 6f 75 74 3b   Fts5Buffer out;
24990 0a 20 20 6d 65 6d 73 65 74 28 26 6f 75 74 2c 20  .  memset(&out, 
249a0 30 2c 20 73 69 7a 65 6f 66 28 6f 75 74 29 29 3b  0, sizeof(out));
249b0 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75  .  sqlite3Fts5Bu
249c0 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c  fferSize(&p->rc,
249d0 20 26 6f 75 74 2c 20 70 31 2d 3e 6e 20 2b 20 70   &out, p1->n + p
249e0 32 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 70 2d 3e  2->n);.  if( p->
249f0 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  rc ) return;..  
24a00 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70 31  fts5NextRowid(p1
24a10 2c 20 26 69 31 2c 20 26 69 52 6f 77 69 64 31 29  , &i1, &iRowid1)
24a20 3b 0a 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69  ;.  fts5NextRowi
24a30 64 28 70 32 2c 20 26 69 32 2c 20 26 69 52 6f 77  d(p2, &i2, &iRow
24a40 69 64 32 29 3b 0a 20 20 77 68 69 6c 65 28 20 69  id2);.  while( i
24a50 31 3e 3d 30 20 7c 7c 20 69 32 3e 3d 30 20 29 7b  1>=0 || i2>=0 ){
24a60 0a 20 20 20 20 69 66 28 20 69 31 3e 3d 30 20 26  .    if( i1>=0 &
24a70 26 20 28 69 32 3c 30 20 7c 7c 20 69 52 6f 77 69  & (i2<0 || iRowi
24a80 64 31 3c 69 52 6f 77 69 64 32 29 20 29 7b 0a 20  d1<iRowid2) ){. 
24a90 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f 75       assert( iOu
24aa0 74 3d 3d 30 20 7c 7c 20 69 52 6f 77 69 64 31 3e  t==0 || iRowid1>
24ab0 69 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 66 74  iOut );.      ft
24ac0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
24ad0 6e 64 56 61 72 69 6e 74 28 26 6f 75 74 2c 20 69  ndVarint(&out, i
24ae0 52 6f 77 69 64 31 20 2d 20 69 4f 75 74 29 3b 0a  Rowid1 - iOut);.
24af0 20 20 20 20 20 20 69 4f 75 74 20 3d 20 69 52 6f        iOut = iRo
24b00 77 69 64 31 3b 0a 20 20 20 20 20 20 66 74 73 35  wid1;.      fts5
24b10 4e 65 78 74 52 6f 77 69 64 28 70 31 2c 20 26 69  NextRowid(p1, &i
24b20 31 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a 20 20  1, &iRowid1);.  
24b30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
24b40 73 73 65 72 74 28 20 69 4f 75 74 3d 3d 30 20 7c  ssert( iOut==0 |
24b50 7c 20 69 52 6f 77 69 64 32 3e 69 4f 75 74 20 29  | iRowid2>iOut )
24b60 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
24b70 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
24b80 6e 74 28 26 6f 75 74 2c 20 69 52 6f 77 69 64 32  nt(&out, iRowid2
24b90 20 2d 20 69 4f 75 74 29 3b 0a 20 20 20 20 20 20   - iOut);.      
24ba0 69 4f 75 74 20 3d 20 69 52 6f 77 69 64 32 3b 0a  iOut = iRowid2;.
24bb0 20 20 20 20 20 20 69 66 28 20 69 31 3e 3d 30 20        if( i1>=0 
24bc0 26 26 20 69 52 6f 77 69 64 31 3d 3d 69 52 6f 77  && iRowid1==iRow
24bd0 69 64 32 20 29 7b 0a 20 20 20 20 20 20 20 20 66  id2 ){.        f
24be0 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70 31 2c  ts5NextRowid(p1,
24bf0 20 26 69 31 2c 20 26 69 52 6f 77 69 64 31 29 3b   &i1, &iRowid1);
24c00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
24c10 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70 32 2c  ts5NextRowid(p2,
24c20 20 26 69 32 2c 20 26 69 52 6f 77 69 64 32 29 3b   &i2, &iRowid2);
24c30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74  .    }.  }..  ft
24c40 73 35 42 75 66 66 65 72 53 77 61 70 28 26 6f 75  s5BufferSwap(&ou
24c50 74 2c 20 70 31 29 3b 0a 20 20 66 74 73 35 42 75  t, p1);.  fts5Bu
24c60 66 66 65 72 46 72 65 65 28 26 6f 75 74 29 3b 0a  fferFree(&out);.
24c70 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 73  }../*.** Buffers
24c80 20 70 31 20 61 6e 64 20 70 32 20 63 6f 6e 74 61   p1 and p2 conta
24c90 69 6e 20 64 6f 63 6c 69 73 74 73 2e 20 54 68 69  in doclists. Thi
24ca0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65  s function merge
24cb0 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a  s the content.**
24cc0 20 6f 66 20 74 68 65 20 74 77 6f 20 64 6f 63 6c   of the two docl
24cd0 69 73 74 73 20 74 6f 67 65 74 68 65 72 20 61 6e  ists together an
24ce0 64 20 73 65 74 73 20 62 75 66 66 65 72 20 70 31  d sets buffer p1
24cf0 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 62   to the result b
24d00 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69  efore.** returni
24d10 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
24d20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
24d30 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c   error code is l
24d40 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 66  eft in p->rc. If
24d50 20 61 6e 20 65 72 72 6f 72 20 68 61 73 0a 2a 2a   an error has.**
24d60 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
24d70 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
24d80 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
24d90 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
24da0 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73  MergePrefixLists
24db0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
24dc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24dd0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
24de0 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
24df0 46 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20  Fts5Buffer *p1, 
24e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e10 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f  /* First list to
24e20 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35   merge */.  Fts5
24e30 42 75 66 66 65 72 20 2a 70 32 20 20 20 20 20 20  Buffer *p2      
24e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
24e50 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65  econd list to me
24e60 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  rge */.){.  if( 
24e70 70 32 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34  p2->n ){.    i64
24e80 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b   iLastRowid = 0;
24e90 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74  .    Fts5Doclist
24ea0 49 74 65 72 20 69 31 3b 0a 20 20 20 20 46 74 73  Iter i1;.    Fts
24eb0 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69 32 3b  5DoclistIter i2;
24ec0 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
24ed0 6f 75 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b  out = {0, 0, 0};
24ee0 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
24ef0 74 6d 70 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b  tmp = {0, 0, 0};
24f00 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
24f10 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28  3Fts5BufferSize(
24f20 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 70 31  &p->rc, &out, p1
24f30 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 29 20 29 20 72  ->n + p2->n) ) r
24f40 65 74 75 72 6e 3b 0a 20 20 20 20 66 74 73 35 44  eturn;.    fts5D
24f50 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70  oclistIterInit(p
24f60 31 2c 20 26 69 31 29 3b 0a 20 20 20 20 66 74 73  1, &i1);.    fts
24f70 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74  5DoclistIterInit
24f80 28 70 32 2c 20 26 69 32 29 3b 0a 0a 20 20 20 20  (p2, &i2);..    
24f90 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
24fa0 20 20 69 66 28 20 69 31 2e 69 52 6f 77 69 64 3c    if( i1.iRowid<
24fb0 69 32 2e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20  i2.iRowid ){.   
24fc0 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74       /* Copy ent
24fd0 72 79 20 66 72 6f 6d 20 69 31 20 2a 2f 0a 20 20  ry from i1 */.  
24fe0 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41        fts5MergeA
24ff0 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c  ppendDocid(&out,
25000 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 31 2e   iLastRowid, i1.
25010 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
25020 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
25030 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20  ppendBlob(&out, 
25040 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e  i1.aPoslist, i1.
25050 6e 50 6f 73 6c 69 73 74 2b 69 31 2e 6e 53 69 7a  nPoslist+i1.nSiz
25060 65 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  e);.        fts5
25070 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
25080 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &i1);.        if
25090 28 20 69 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30  ( i1.aPoslist==0
250a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
250b0 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28  }.      else if(
250c0 20 69 32 2e 69 52 6f 77 69 64 21 3d 69 31 2e 69   i2.iRowid!=i1.i
250d0 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
250e0 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66   /* Copy entry f
250f0 72 6f 6d 20 69 32 20 2a 2f 0a 20 20 20 20 20 20  rom i2 */.      
25100 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e    fts5MergeAppen
25110 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61  dDocid(&out, iLa
25120 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77  stRowid, i2.iRow
25130 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
25140 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
25150 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 32 2e 61  dBlob(&out, i2.a
25160 50 6f 73 6c 69 73 74 2c 20 69 32 2e 6e 50 6f 73  Poslist, i2.nPos
25170 6c 69 73 74 2b 69 32 2e 6e 53 69 7a 65 29 3b 0a  list+i2.nSize);.
25180 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c          fts5Docl
25190 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 32 29  istIterNext(&i2)
251a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 32  ;.        if( i2
251b0 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 29 20 62  .aPoslist==0 ) b
251c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
251d0 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
251e0 20 20 2f 2a 20 4d 65 72 67 65 20 74 68 65 20 74    /* Merge the t
251f0 77 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  wo position list
25200 73 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 69  s. */ .        i
25210 36 34 20 69 50 6f 73 31 20 3d 20 30 3b 0a 20 20  64 iPos1 = 0;.  
25220 20 20 20 20 20 20 69 36 34 20 69 50 6f 73 32 20        i64 iPos2 
25230 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
25240 20 69 4f 66 66 31 20 3d 20 30 3b 0a 20 20 20 20   iOff1 = 0;.    
25250 20 20 20 20 69 6e 74 20 69 4f 66 66 32 20 3d 20      int iOff2 = 
25260 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61  0;.        u8 *a
25270 31 20 3d 20 26 69 31 2e 61 50 6f 73 6c 69 73 74  1 = &i1.aPoslist
25280 5b 69 31 2e 6e 53 69 7a 65 5d 3b 0a 20 20 20 20  [i1.nSize];.    
25290 20 20 20 20 75 38 20 2a 61 32 20 3d 20 26 69 32      u8 *a2 = &i2
252a0 2e 61 50 6f 73 6c 69 73 74 5b 69 32 2e 6e 53 69  .aPoslist[i2.nSi
252b0 7a 65 5d 3b 0a 0a 20 20 20 20 20 20 20 20 69 36  ze];..        i6
252c0 34 20 69 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  4 iPrev = 0;.   
252d0 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74       Fts5Poslist
252e0 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a 20  Writer writer;. 
252f0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 77         memset(&w
25300 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  riter, 0, sizeof
25310 28 77 72 69 74 65 72 29 29 3b 0a 0a 20 20 20 20  (writer));..    
25320 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70      fts5MergeApp
25330 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69  endDocid(&out, i
25340 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52  LastRowid, i2.iR
25350 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66  owid);.        f
25360 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 74  ts5BufferZero(&t
25370 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  mp);.        sql
25380 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69  ite3Fts5BufferSi
25390 7a 65 28 26 70 2d 3e 72 63 2c 20 26 74 6d 70 2c  ze(&p->rc, &tmp,
253a0 20 69 31 2e 6e 50 6f 73 6c 69 73 74 20 2b 20 69   i1.nPoslist + i
253b0 32 2e 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20  2.nPoslist);.   
253c0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29       if( p->rc )
253d0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20   break;..       
253e0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
253f0 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31  istNext64(a1, i1
25400 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66  .nPoslist, &iOff
25410 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20  1, &iPos1);.    
25420 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
25430 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61 32 2c  oslistNext64(a2,
25440 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69   i2.nPoslist, &i
25450 4f 66 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20  Off2, &iPos2);. 
25460 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
25470 50 6f 73 31 3e 3d 30 20 26 26 20 69 50 6f 73 32  Pos1>=0 && iPos2
25480 3e 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  >=0 );..        
25490 69 66 28 20 69 50 6f 73 31 3c 69 50 6f 73 32 20  if( iPos1<iPos2 
254a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
254b0 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53  ite3Fts5PoslistS
254c0 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20  afeAppend(&tmp, 
254d0 26 69 50 72 65 76 2c 20 69 50 6f 73 31 29 3b 0a  &iPrev, iPos1);.
254e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
254f0 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74  3Fts5PoslistNext
25500 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69  64(a1, i1.nPosli
25510 73 74 2c 20 26 69 4f 66 66 31 2c 20 26 69 50 6f  st, &iOff1, &iPo
25520 73 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  s1);.        }el
25530 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
25540 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
25550 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c  SafeAppend(&tmp,
25560 20 26 69 50 72 65 76 2c 20 69 50 6f 73 32 29 3b   &iPrev, iPos2);
25570 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
25580 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78  e3Fts5PoslistNex
25590 74 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c  t64(a2, i2.nPosl
255a0 69 73 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50  ist, &iOff2, &iP
255b0 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  os2);.        }.
255c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f  .        if( iPo
255d0 73 31 3e 3d 30 20 26 26 20 69 50 6f 73 32 3e 3d  s1>=0 && iPos2>=
255e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  0 ){.          w
255f0 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20  hile( 1 ){.     
25600 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31         if( iPos1
25610 3c 69 50 6f 73 32 20 29 7b 0a 20 20 20 20 20 20  <iPos2 ){.      
25620 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73          if( iPos
25630 31 21 3d 69 50 72 65 76 20 29 7b 0a 20 20 20 20  1!=iPrev ){.    
25640 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
25650 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61  te3Fts5PoslistSa
25660 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26  feAppend(&tmp, &
25670 69 50 72 65 76 2c 20 69 50 6f 73 31 29 3b 0a 20  iPrev, iPos1);. 
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
25690 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
256a0 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e  ite3Fts5PoslistN
256b0 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f  ext64(a1, i1.nPo
256c0 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 20 26  slist, &iOff1, &
256d0 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20  iPos1);.        
256e0 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 3c        if( iPos1<
256f0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
25700 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
25710 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
25720 72 74 28 20 69 50 6f 73 32 21 3d 69 50 72 65 76  rt( iPos2!=iPrev
25730 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
25740 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
25750 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28 26  listSafeAppend(&
25760 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f  tmp, &iPrev, iPo
25770 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  s2);.           
25780 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
25790 73 6c 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20  slistNext64(a2, 
257a0 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f  i2.nPoslist, &iO
257b0 66 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20  ff2, &iPos2);.  
257c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
257d0 69 50 6f 73 32 3c 30 20 29 20 62 72 65 61 6b 3b  iPos2<0 ) break;
257e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
257f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25800 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
25810 28 20 69 50 6f 73 31 3e 3d 30 20 29 7b 0a 20 20  ( iPos1>=0 ){.  
25820 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73          if( iPos
25830 31 21 3d 69 50 72 65 76 20 29 7b 0a 20 20 20 20  1!=iPrev ){.    
25840 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
25850 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70  ts5PoslistSafeAp
25860 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65  pend(&tmp, &iPre
25870 76 2c 20 69 50 6f 73 31 29 3b 0a 20 20 20 20 20  v, iPos1);.     
25880 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
25890 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
258a0 70 70 65 6e 64 42 6c 6f 62 28 26 74 6d 70 2c 20  ppendBlob(&tmp, 
258b0 26 61 31 5b 69 4f 66 66 31 5d 2c 20 69 31 2e 6e  &a1[iOff1], i1.n
258c0 50 6f 73 6c 69 73 74 2d 69 4f 66 66 31 29 3b 0a  Poslist-iOff1);.
258d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
258e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
258f0 20 69 50 6f 73 32 3e 3d 30 20 26 26 20 69 50 6f   iPos2>=0 && iPo
25900 73 32 21 3d 69 50 72 65 76 20 29 3b 0a 20 20 20  s2!=iPrev );.   
25910 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
25920 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70  s5PoslistSafeApp
25930 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76  end(&tmp, &iPrev
25940 2c 20 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20  , iPos2);.      
25950 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
25960 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 74 6d  feAppendBlob(&tm
25970 70 2c 20 26 61 32 5b 69 4f 66 66 32 5d 2c 20 69  p, &a2[iOff2], i
25980 32 2e 6e 50 6f 73 6c 69 73 74 2d 69 4f 66 66 32  2.nPoslist-iOff2
25990 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
259a0 20 20 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f        /* WRITEPO
259b0 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20  SLISTSIZE */.   
259c0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
259d0 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28  afeAppendVarint(
259e0 26 6f 75 74 2c 20 74 6d 70 2e 6e 20 2a 20 32 29  &out, tmp.n * 2)
259f0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
25a00 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
25a10 6f 62 28 26 6f 75 74 2c 20 74 6d 70 2e 70 2c 20  ob(&out, tmp.p, 
25a20 74 6d 70 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20  tmp.n);.        
25a30 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
25a40 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20  ext(&i1);.      
25a50 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
25a60 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20 20 20  rNext(&i2);.    
25a70 20 20 20 20 69 66 28 20 69 31 2e 61 50 6f 73 6c      if( i1.aPosl
25a80 69 73 74 3d 3d 30 20 7c 7c 20 69 32 2e 61 50 6f  ist==0 || i2.aPo
25a90 73 6c 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b  slist==0 ) break
25aa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
25ab0 0a 20 20 20 20 69 66 28 20 69 31 2e 61 50 6f 73  .    if( i1.aPos
25ac0 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 74  list ){.      ft
25ad0 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
25ae0 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f  id(&out, iLastRo
25af0 77 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b  wid, i1.iRowid);
25b00 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
25b10 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
25b20 26 6f 75 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73  &out, i1.aPoslis
25b30 74 2c 20 69 31 2e 61 45 6f 66 20 2d 20 69 31 2e  t, i1.aEof - i1.
25b40 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 7d  aPoslist);.    }
25b50 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 69 32  .    else if( i2
25b60 2e 61 50 6f 73 6c 69 73 74 20 29 7b 0a 20 20 20  .aPoslist ){.   
25b70 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65     fts5MergeAppe
25b80 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c  ndDocid(&out, iL
25b90 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f  astRowid, i2.iRo
25ba0 77 69 64 29 3b 0a 20 20 20 20 20 20 66 74 73 35  wid);.      fts5
25bb0 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
25bc0 42 6c 6f 62 28 26 6f 75 74 2c 20 69 32 2e 61 50  Blob(&out, i2.aP
25bd0 6f 73 6c 69 73 74 2c 20 69 32 2e 61 45 6f 66 20  oslist, i2.aEof 
25be0 2d 20 69 32 2e 61 50 6f 73 6c 69 73 74 29 3b 0a  - i2.aPoslist);.
25bf0 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42      }..    fts5B
25c00 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
25c10 20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e   p1, out.n, out.
25c20 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  p);.    fts5Buff
25c30 65 72 46 72 65 65 28 26 74 6d 70 29 3b 0a 20 20  erFree(&tmp);.  
25c40 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
25c50 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  (&out);.  }.}..s
25c60 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
25c70 65 74 75 70 50 72 65 66 69 78 49 74 65 72 28 0a  etupPrefixIter(.
25c80 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
25c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ca0 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 72 65    /* Index to re
25cb0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
25cc0 20 62 44 65 73 63 2c 20 20 20 20 20 20 20 20 20   bDesc,         
25cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25ce0 54 72 75 65 20 66 6f 72 20 22 4f 52 44 45 52 20  True for "ORDER 
25cf0 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 2a  BY rowid DESC" *
25d00 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
25d10 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  oken,           
25d20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
25d30 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69 78 20  ntaining prefix 
25d40 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69 6e  to match */.  in
25d50 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20  t nToken,       
25d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25d70 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
25d80 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73 20  pToken in bytes 
25d90 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  */.  Fts5Colset 
25da0 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20  *pColset,       
25db0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
25dc0 20 6d 61 74 63 68 65 73 20 74 6f 20 74 68 65 73   matches to thes
25dd0 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 46  e columns */.  F
25de0 74 73 35 49 74 65 72 20 2a 2a 70 70 49 74 65 72  ts5Iter **ppIter
25df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
25e00 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72 20 2a  : New iterator *
25e10 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  /.){.  Fts5Struc
25e20 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20  ture *pStruct;. 
25e30 20 46 74 73 35 42 75 66 66 65 72 20 2a 61 42 75   Fts5Buffer *aBu
25e40 66 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  f;.  const int n
25e50 42 75 66 20 3d 20 33 32 3b 0a 0a 20 20 76 6f 69  Buf = 32;..  voi
25e60 64 20 28 2a 78 4d 65 72 67 65 29 28 46 74 73 35  d (*xMerge)(Fts5
25e70 49 6e 64 65 78 2a 2c 20 46 74 73 35 42 75 66 66  Index*, Fts5Buff
25e80 65 72 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a  er*, Fts5Buffer*
25e90 29 3b 0a 20 20 76 6f 69 64 20 28 2a 78 41 70 70  );.  void (*xApp
25ea0 65 6e 64 29 28 46 74 73 35 49 6e 64 65 78 2a 2c  end)(Fts5Index*,
25eb0 20 69 36 34 2c 20 46 74 73 35 49 74 65 72 2a 2c   i64, Fts5Iter*,
25ec0 20 46 74 73 35 42 75 66 66 65 72 2a 29 3b 0a 20   Fts5Buffer*);. 
25ed0 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d   if( p->pConfig-
25ee0 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44  >eDetail==FTS5_D
25ef0 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
25f00 20 20 78 4d 65 72 67 65 20 3d 20 66 74 73 35 4d    xMerge = fts5M
25f10 65 72 67 65 52 6f 77 69 64 4c 69 73 74 73 3b 0a  ergeRowidLists;.
25f20 20 20 20 20 78 41 70 70 65 6e 64 20 3d 20 66 74      xAppend = ft
25f30 73 35 41 70 70 65 6e 64 52 6f 77 69 64 3b 0a 20  s5AppendRowid;. 
25f40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 4d 65 72   }else{.    xMer
25f50 67 65 20 3d 20 66 74 73 35 4d 65 72 67 65 50 72  ge = fts5MergePr
25f60 65 66 69 78 4c 69 73 74 73 3b 0a 20 20 20 20 78  efixLists;.    x
25f70 41 70 70 65 6e 64 20 3d 20 66 74 73 35 41 70 70  Append = fts5App
25f80 65 6e 64 50 6f 73 6c 69 73 74 3b 0a 20 20 7d 0a  endPoslist;.  }.
25f90 0a 20 20 61 42 75 66 20 3d 20 28 46 74 73 35 42  .  aBuf = (Fts5B
25fa0 75 66 66 65 72 2a 29 66 74 73 35 49 64 78 4d 61  uffer*)fts5IdxMa
25fb0 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46  lloc(p, sizeof(F
25fc0 74 73 35 42 75 66 66 65 72 29 2a 6e 42 75 66 29  ts5Buffer)*nBuf)
25fd0 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74  ;.  pStruct = ft
25fe0 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
25ff0 70 29 3b 0a 0a 20 20 69 66 28 20 61 42 75 66 20  p);..  if( aBuf 
26000 26 26 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20  && pStruct ){.  
26010 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
26020 73 20 3d 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s = FTS5INDEX_QU
26030 45 52 59 5f 53 43 41 4e 20 0a 20 20 20 20 20 20  ERY_SCAN .      
26040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
26050 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
26060 53 4b 49 50 45 4d 50 54 59 20 0a 20 20 20 20 20  SKIPEMPTY .     
26070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
26080 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
26090 5f 4e 4f 4f 55 54 50 55 54 3b 0a 20 20 20 20 69  _NOOUTPUT;.    i
260a0 6e 74 20 69 3b 0a 20 20 20 20 69 36 34 20 69 4c  nt i;.    i64 iL
260b0 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  astRowid = 0;.  
260c0 20 20 46 74 73 35 49 74 65 72 20 2a 70 31 20 3d    Fts5Iter *p1 =
260d0 20 30 3b 20 20 20 20 20 2f 2a 20 49 74 65 72 61   0;     /* Itera
260e0 74 6f 72 20 75 73 65 64 20 74 6f 20 67 61 74 68  tor used to gath
260f0 65 72 20 64 61 74 61 20 66 72 6f 6d 20 69 6e 64  er data from ind
26100 65 78 20 2a 2f 0a 20 20 20 20 46 74 73 35 44 61  ex */.    Fts5Da
26110 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 46  ta *pData;.    F
26120 74 73 35 42 75 66 66 65 72 20 64 6f 63 6c 69 73  ts5Buffer doclis
26130 74 3b 0a 20 20 20 20 69 6e 74 20 62 4e 65 77 54  t;.    int bNewT
26140 65 72 6d 20 3d 20 31 3b 0a 0a 20 20 20 20 6d 65  erm = 1;..    me
26150 6d 73 65 74 28 26 64 6f 63 6c 69 73 74 2c 20 30  mset(&doclist, 0
26160 2c 20 73 69 7a 65 6f 66 28 64 6f 63 6c 69 73 74  , sizeof(doclist
26170 29 29 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74  ));.    fts5Mult
26180 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72  iIterNew(p, pStr
26190 75 63 74 2c 20 66 6c 61 67 73 2c 20 70 43 6f 6c  uct, flags, pCol
261a0 73 65 74 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f  set, pToken, nTo
261b0 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 31 29  ken, -1, 0, &p1)
261c0 3b 0a 20 20 20 20 66 74 73 35 49 74 65 72 53 65  ;.    fts5IterSe
261d0 74 4f 75 74 70 75 74 43 62 28 26 70 2d 3e 72 63  tOutputCb(&p->rc
261e0 2c 20 70 31 29 3b 0a 20 20 20 20 66 6f 72 28 20  , p1);.    for( 
261f0 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 20 3b 0a 20 20  /* no-op */ ;.  
26200 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
26210 74 65 72 45 6f 66 28 70 2c 20 70 31 29 3d 3d 30  terEof(p, p1)==0
26220 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  ;.        fts5Mu
26230 6c 74 69 49 74 65 72 4e 65 78 74 32 28 70 2c 20  ltiIterNext2(p, 
26240 70 31 2c 20 26 62 4e 65 77 54 65 72 6d 29 0a 20  p1, &bNewTerm). 
26250 20 20 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35     ){.      Fts5
26260 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
26270 26 70 31 2d 3e 61 53 65 67 5b 20 70 31 2d 3e 61  &p1->aSeg[ p1->a
26280 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
26290 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65  ];.      int nTe
262a0 72 6d 20 3d 20 70 53 65 67 2d 3e 74 65 72 6d 2e  rm = pSeg->term.
262b0 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  n;.      const u
262c0 38 20 2a 70 54 65 72 6d 20 3d 20 70 53 65 67 2d  8 *pTerm = pSeg-
262d0 3e 74 65 72 6d 2e 70 3b 0a 20 20 20 20 20 20 70  >term.p;.      p
262e0 31 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 28 70  1->xSetOutputs(p
262f0 31 2c 20 70 53 65 67 29 3b 0a 0a 20 20 20 20 20  1, pSeg);..     
26300 20 61 73 73 65 72 74 5f 6e 63 28 20 6d 65 6d 63   assert_nc( memc
26310 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d  mp(pToken, pTerm
26320 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54  , MIN(nToken, nT
26330 65 72 6d 29 29 3c 3d 30 20 29 3b 0a 20 20 20 20  erm))<=0 );.    
26340 20 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29    if( bNewTerm )
26350 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54  {.        if( nT
26360 65 72 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65  erm<nToken || me
26370 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65  mcmp(pToken, pTe
26380 72 6d 2c 20 6e 54 6f 6b 65 6e 29 20 29 20 62 72  rm, nToken) ) br
26390 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
263a0 20 20 20 20 69 66 28 20 70 31 2d 3e 62 61 73 65      if( p1->base
263b0 2e 6e 44 61 74 61 3d 3d 30 20 29 20 63 6f 6e 74  .nData==0 ) cont
263c0 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 69 66 28  inue;..      if(
263d0 20 70 31 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64   p1->base.iRowid
263e0 3c 3d 69 4c 61 73 74 52 6f 77 69 64 20 26 26 20  <=iLastRowid && 
263f0 64 6f 63 6c 69 73 74 2e 6e 3e 30 20 29 7b 0a 20  doclist.n>0 ){. 
26400 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
26410 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
26420 20 26 26 20 64 6f 63 6c 69 73 74 2e 6e 3b 20 69   && doclist.n; i
26430 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ++){.          a
26440 73 73 65 72 74 28 20 69 3c 6e 42 75 66 20 29 3b  ssert( i<nBuf );
26450 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
26460 42 75 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20  Buf[i].n==0 ){. 
26470 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
26480 75 66 66 65 72 53 77 61 70 28 26 64 6f 63 6c 69  ufferSwap(&docli
26490 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20  st, &aBuf[i]);. 
264a0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
264b0 75 66 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69  ufferZero(&docli
264c0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  st);.          }
264d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
264e0 20 20 78 4d 65 72 67 65 28 70 2c 20 26 64 6f 63    xMerge(p, &doc
264f0 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b  list, &aBuf[i]);
26500 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
26510 35 42 75 66 66 65 72 5a 65 72 6f 28 26 61 42 75  5BufferZero(&aBu
26520 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  f[i]);.         
26530 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
26540 20 20 20 20 20 69 4c 61 73 74 52 6f 77 69 64 20       iLastRowid 
26550 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 0;.      }..  
26560 20 20 20 20 78 41 70 70 65 6e 64 28 70 2c 20 70      xAppend(p, p
26570 31 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 2d 69  1->base.iRowid-i
26580 4c 61 73 74 52 6f 77 69 64 2c 20 70 31 2c 20 26  LastRowid, p1, &
26590 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  doclist);.      
265a0 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 70 31 2d  iLastRowid = p1-
265b0 3e 62 61 73 65 2e 69 52 6f 77 69 64 3b 0a 20 20  >base.iRowid;.  
265c0 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30    }..    for(i=0
265d0 3b 20 69 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a  ; i<nBuf; i++){.
265e0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
265f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26600 20 20 20 20 20 20 78 4d 65 72 67 65 28 70 2c 20        xMerge(p, 
26610 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b  &doclist, &aBuf[
26620 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
26630 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
26640 65 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  e(&aBuf[i]);.   
26650 20 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69   }.    fts5Multi
26660 49 74 65 72 46 72 65 65 28 70 31 29 3b 0a 0a 20  IterFree(p1);.. 
26670 20 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 49     pData = fts5I
26680 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65  dxMalloc(p, size
26690 6f 66 28 46 74 73 35 44 61 74 61 29 20 2b 20 64  of(Fts5Data) + d
266a0 6f 63 6c 69 73 74 2e 6e 29 3b 0a 20 20 20 20 69  oclist.n);.    i
266b0 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20  f( pData ){.    
266c0 20 20 70 44 61 74 61 2d 3e 70 20 3d 20 28 75 38    pData->p = (u8
266d0 2a 29 26 70 44 61 74 61 5b 31 5d 3b 0a 20 20 20  *)&pData[1];.   
266e0 20 20 20 70 44 61 74 61 2d 3e 6e 6e 20 3d 20 70     pData->nn = p
266f0 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 3d 20 64  Data->szLeaf = d
26700 6f 63 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 20 20  oclist.n;.      
26710 6d 65 6d 63 70 79 28 70 44 61 74 61 2d 3e 70 2c  memcpy(pData->p,
26720 20 64 6f 63 6c 69 73 74 2e 70 2c 20 64 6f 63 6c   doclist.p, docl
26730 69 73 74 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74  ist.n);.      ft
26740 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 32 28  s5MultiIterNew2(
26750 70 2c 20 70 44 61 74 61 2c 20 62 44 65 73 63 2c  p, pData, bDesc,
26760 20 70 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a   ppIter);.    }.
26770 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
26780 65 65 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20  ee(&doclist);.  
26790 7d 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  }..  fts5Structu
267a0 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
267b0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t);.  sqlite3_fr
267c0 65 65 28 61 42 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a  ee(aBuf);.}.../*
267d0 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
267e0 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  t all subsequent
267f0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
26800 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28  3Fts5IndexWrite(
26810 29 20 70 65 72 74 61 69 6e 0a 2a 2a 20 74 6f 20  ) pertain.** to 
26820 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74  the document wit
26830 68 20 72 6f 77 69 64 20 69 52 6f 77 69 64 2e 0a  h rowid iRowid..
26840 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
26850 73 35 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74  s5IndexBeginWrit
26860 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
26870 69 6e 74 20 62 44 65 6c 65 74 65 2c 20 69 36 34  int bDelete, i64
26880 20 69 52 6f 77 69 64 29 7b 0a 20 20 61 73 73 65   iRowid){.  asse
26890 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
268a0 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  E_OK );..  /* Al
268b0 6c 6f 63 61 74 65 20 74 68 65 20 68 61 73 68 20  locate the hash 
268c0 74 61 62 6c 65 20 69 66 20 69 74 20 68 61 73 20  table if it has 
268d0 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
268e0 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
268f0 69 66 28 20 70 2d 3e 70 48 61 73 68 3d 3d 30 20  if( p->pHash==0 
26900 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
26910 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 4e 65  qlite3Fts5HashNe
26920 77 28 70 2d 3e 70 43 6f 6e 66 69 67 2c 20 26 70  w(p->pConfig, &p
26930 2d 3e 70 48 61 73 68 2c 20 26 70 2d 3e 6e 50 65  ->pHash, &p->nPe
26940 6e 64 69 6e 67 44 61 74 61 29 3b 0a 20 20 7d 0a  ndingData);.  }.
26950 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20  .  /* Flush the 
26960 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69  hash table to di
26970 73 6b 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  sk if required *
26980 2f 0a 20 20 69 66 28 20 69 52 6f 77 69 64 3c 70  /.  if( iRowid<p
26990 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 0a 20  ->iWriteRowid . 
269a0 20 20 7c 7c 20 28 69 52 6f 77 69 64 3d 3d 70 2d    || (iRowid==p-
269b0 3e 69 57 72 69 74 65 52 6f 77 69 64 20 26 26 20  >iWriteRowid && 
269c0 70 2d 3e 62 44 65 6c 65 74 65 3d 3d 30 29 0a 20  p->bDelete==0). 
269d0 20 20 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64 69 6e    || (p->nPendin
269e0 67 44 61 74 61 20 3e 20 70 2d 3e 70 43 6f 6e 66  gData > p->pConf
269f0 69 67 2d 3e 6e 48 61 73 68 53 69 7a 65 29 20 0a  ig->nHashSize) .
26a00 20 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64    ){.    fts5Ind
26a10 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a  exFlush(p);.  }.
26a20 0a 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69  .  p->iWriteRowi
26a30 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 70 2d  d = iRowid;.  p-
26a40 3e 62 44 65 6c 65 74 65 20 3d 20 62 44 65 6c 65  >bDelete = bDele
26a50 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  te;.  return fts
26a60 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
26a70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
26a80 20 64 61 74 61 20 74 6f 20 64 69 73 6b 2e 0a 2a   data to disk..*
26a90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
26aa0 35 49 6e 64 65 78 53 79 6e 63 28 46 74 73 35 49  5IndexSync(Fts5I
26ab0 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62 43 6f  ndex *p, int bCo
26ac0 6d 6d 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28  mmit){.  assert(
26ad0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
26ae0 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78  K );.  fts5Index
26af0 46 6c 75 73 68 28 70 29 3b 0a 20 20 69 66 28 20  Flush(p);.  if( 
26b00 62 43 6f 6d 6d 69 74 20 29 20 66 74 73 35 43 6c  bCommit ) fts5Cl
26b10 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20  oseReader(p);.  
26b20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
26b30 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
26b40 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6e 79 20  .** Discard any 
26b50 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
26b60 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  he in-memory has
26b70 68 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74  h tables. Do not
26b80 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20   write it.** to 
26b90 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64  the database. Ad
26ba0 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75  ditionally, assu
26bb0 6d 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  me that the cont
26bc0 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61  ents of the %_da
26bd0 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20  ta.** table may 
26be0 68 61 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20  have changed on 
26bf0 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d  disk. So any in-
26c00 6d 65 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66  memory caches of
26c10 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f   %_data .** reco
26c20 72 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61  rds must be inva
26c30 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  lidated..*/.int 
26c40 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
26c50 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64  Rollback(Fts5Ind
26c60 65 78 20 2a 70 29 7b 0a 20 20 66 74 73 35 43 6c  ex *p){.  fts5Cl
26c70 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20  oseReader(p);.  
26c80 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64  fts5IndexDiscard
26c90 44 61 74 61 28 70 29 3b 0a 20 20 66 74 73 35 53  Data(p);.  fts5S
26ca0 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61  tructureInvalida
26cb0 74 65 28 70 29 3b 0a 20 20 2f 2a 20 61 73 73 65  te(p);.  /* asse
26cc0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
26cd0 45 5f 4f 4b 20 29 3b 20 2a 2f 0a 20 20 72 65 74  E_OK ); */.  ret
26ce0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
26cf0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61  ../*.** The %_da
26d00 74 61 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70  ta table is comp
26d10 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 77 68 65  letely empty whe
26d20 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
26d30 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 0a  is called. This.
26d40 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75  ** function popu
26d50 6c 61 74 65 73 20 69 74 20 77 69 74 68 20 74 68  lates it with th
26d60 65 20 69 6e 69 74 69 61 6c 20 73 74 72 75 63 74  e initial struct
26d70 75 72 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  ure objects for 
26d80 65 61 63 68 20 69 6e 64 65 78 2c 0a 2a 2a 20 61  each index,.** a
26d90 6e 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  nd the initial v
26da0 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 22 61  ersion of the "a
26db0 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20  verages" record 
26dc0 28 61 20 7a 65 72 6f 2d 62 79 74 65 20 62 6c 6f  (a zero-byte blo
26dd0 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  b)..*/.int sqlit
26de0 65 33 46 74 73 35 49 6e 64 65 78 52 65 69 6e 69  e3Fts5IndexReini
26df0 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  t(Fts5Index *p){
26e00 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
26e10 20 73 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74   s;.  fts5Struct
26e20 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29  ureInvalidate(p)
26e30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30  ;.  memset(&s, 0
26e40 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
26e50 75 63 74 75 72 65 29 29 3b 0a 20 20 66 74 73 35  ucture));.  fts5
26e60 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53  DataWrite(p, FTS
26e70 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
26e80 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 22 2c  , (const u8*)"",
26e90 20 30 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63   0);.  fts5Struc
26ea0 74 75 72 65 57 72 69 74 65 28 70 2c 20 26 73 29  tureWrite(p, &s)
26eb0 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
26ec0 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
26ed0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
26ee0 65 77 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e  ew Fts5Index han
26ef0 64 6c 65 2e 20 49 66 20 74 68 65 20 62 43 72 65  dle. If the bCre
26f00 61 74 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ate argument is 
26f10 74 72 75 65 2c 20 63 72 65 61 74 65 0a 2a 2a 20  true, create.** 
26f20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
26f30 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 25 5f  he underlying %_
26f40 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  data table..**.*
26f50 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
26f60 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e   set *pp to poin
26f70 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a  t to the new obj
26f80 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ect and return S
26f90 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68  QLITE_OK..** Oth
26fa0 65 72 77 69 73 65 2c 20 73 65 74 20 2a 70 70 20  erwise, set *pp 
26fb0 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75  to NULL and retu
26fc0 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
26fd0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  or code..*/.int 
26fe0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
26ff0 4f 70 65 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66  Open(.  Fts5Conf
27000 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20  ig *pConfig, .  
27010 69 6e 74 20 62 43 72 65 61 74 65 2c 20 0a 20 20  int bCreate, .  
27020 46 74 73 35 49 6e 64 65 78 20 2a 2a 70 70 2c 0a  Fts5Index **pp,.
27030 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
27040 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
27050 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 49 6e  ITE_OK;.  Fts5In
27060 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20  dex *p;         
27070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
27080 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a 70   object */..  *p
27090 70 20 3d 20 70 20 3d 20 28 46 74 73 35 49 6e 64  p = p = (Fts5Ind
270a0 65 78 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  ex*)sqlite3Fts5M
270b0 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73  allocZero(&rc, s
270c0 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 29  izeof(Fts5Index)
270d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
270e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d  ITE_OK ){.    p-
270f0 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66  >pConfig = pConf
27100 69 67 3b 0a 20 20 20 20 70 2d 3e 6e 57 6f 72 6b  ig;.    p->nWork
27110 55 6e 69 74 20 3d 20 46 54 53 35 5f 57 4f 52 4b  Unit = FTS5_WORK
27120 5f 55 4e 49 54 3b 0a 20 20 20 20 70 2d 3e 7a 44  _UNIT;.    p->zD
27130 61 74 61 54 62 6c 20 3d 20 73 71 6c 69 74 65 33  ataTbl = sqlite3
27140 46 74 73 35 4d 70 72 69 6e 74 66 28 26 72 63 2c  Fts5Mprintf(&rc,
27150 20 22 25 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e   "%s_data", pCon
27160 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  fig->zName);.   
27170 20 69 66 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c   if( p->zDataTbl
27180 20 26 26 20 62 43 72 65 61 74 65 20 29 7b 0a 20   && bCreate ){. 
27190 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
271a0 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65  3Fts5CreateTable
271b0 28 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e  (.          pCon
271c0 66 69 67 2c 20 22 64 61 74 61 22 2c 20 22 69 64  fig, "data", "id
271d0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
271e0 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42   KEY, block BLOB
271f0 22 2c 20 30 2c 20 70 7a 45 72 72 0a 20 20 20 20  ", 0, pzErr.    
27200 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72    );.      if( r
27210 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27220 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
27230 69 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61  ite3Fts5CreateTa
27240 62 6c 65 28 70 43 6f 6e 66 69 67 2c 20 22 69 64  ble(pConfig, "id
27250 78 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  x", .           
27260 20 22 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70   "segid, term, p
27270 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  gno, PRIMARY KEY
27280 28 73 65 67 69 64 2c 20 74 65 72 6d 29 22 2c 20  (segid, term)", 
27290 0a 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  .            1, 
272a0 70 7a 45 72 72 0a 20 20 20 20 20 20 20 20 29 3b  pzErr.        );
272b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
272c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
272d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
272e0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
272f0 78 52 65 69 6e 69 74 28 70 29 3b 0a 20 20 20 20  xReinit(p);.    
27300 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
27310 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
27320 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
27330 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
27340 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71  if( rc ){.    sq
27350 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c  lite3Fts5IndexCl
27360 6f 73 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 20  ose(p);.    *pp 
27370 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
27380 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
27390 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6f 70  lose a handle op
273a0 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ened by an earli
273b0 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  er call to sqlit
273c0 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28  e3Fts5IndexOpen(
273d0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
273e0 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28  3Fts5IndexClose(
273f0 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
27400 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
27410 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  _OK;.  if( p ){.
27420 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
27430 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20  Reader==0 );.   
27440 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e   fts5StructureIn
27450 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20 20 20  validate(p);.   
27460 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
27470 65 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20  e(p->pWriter);. 
27480 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
27490 69 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65 72 29  ize(p->pDeleter)
274a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
274b0 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78 57 72  nalize(p->pIdxWr
274c0 69 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  iter);.    sqlit
274d0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70  e3_finalize(p->p
274e0 49 64 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 20  IdxDeleter);.   
274f0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
27500 65 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29  e(p->pIdxSelect)
27510 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
27520 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 61 74 61 56  nalize(p->pDataV
27530 65 72 73 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c  ersion);.    sql
27540 69 74 65 33 46 74 73 35 48 61 73 68 46 72 65 65  ite3Fts5HashFree
27550 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20  (p->pHash);.    
27560 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
27570 7a 44 61 74 61 54 62 6c 29 3b 0a 20 20 20 20 73  zDataTbl);.    s
27580 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
27590 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
275a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
275b0 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61  nt p points to a
275c0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
275d0 6e 67 20 75 74 66 2d 38 20 74 65 78 74 20 74 68  ng utf-8 text th
275e0 61 74 20 69 73 20 6e 20 62 79 74 65 73 20 69 6e  at is n bytes in
275f0 20 0a 2a 2a 20 73 69 7a 65 2e 20 52 65 74 75 72   .** size. Retur
27600 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
27610 62 79 74 65 73 20 69 6e 20 74 68 65 20 6e 43 68  bytes in the nCh
27620 61 72 20 63 68 61 72 61 63 74 65 72 20 70 72 65  ar character pre
27630 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20 62 75  fix of the.** bu
27640 66 66 65 72 2c 20 6f 72 20 30 20 69 66 20 74 68  ffer, or 0 if th
27650 65 72 65 20 61 72 65 20 6c 65 73 73 20 74 68 61  ere are less tha
27660 6e 20 6e 43 68 61 72 20 63 68 61 72 61 63 74 65  n nChar characte
27670 72 73 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a  rs in total..*/.
27680 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
27690 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74  ndexCharlenToByt
276a0 65 6c 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68  elen(.  const ch
276b0 61 72 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6e 42  ar *p, .  int nB
276c0 79 74 65 2c 20 0a 20 20 69 6e 74 20 6e 43 68 61  yte, .  int nCha
276d0 72 0a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  r.){.  int n = 0
276e0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
276f0 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69  (i=0; i<nChar; i
27700 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 3e 3d  ++){.    if( n>=
27710 6e 42 79 74 65 20 29 20 72 65 74 75 72 6e 20 30  nByte ) return 0
27720 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20  ;      /* Input 
27730 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74  contains fewer t
27740 68 61 6e 20 6e 43 68 61 72 20 63 68 61 72 73 20  han nChar chars 
27750 2a 2f 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69  */.    if( (unsi
27760 67 6e 65 64 20 63 68 61 72 29 70 5b 6e 2b 2b 5d  gned char)p[n++]
27770 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20  >=0xc0 ){.      
27780 77 68 69 6c 65 28 20 28 70 5b 6e 5d 20 26 20 30  while( (p[n] & 0
27790 78 63 30 29 3d 3d 30 78 38 30 20 29 20 6e 2b 2b  xc0)==0x80 ) n++
277a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
277b0 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
277c0 20 70 49 6e 20 69 73 20 61 20 55 54 46 2d 38 20   pIn is a UTF-8 
277d0 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20  encoded string, 
277e0 6e 49 6e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  nIn bytes in siz
277f0 65 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  e. Return the nu
27800 6d 62 65 72 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f  mber of.** unico
27810 64 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  de characters in
27820 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a   the string..*/.
27830 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
27840 6e 64 65 78 43 68 61 72 6c 65 6e 28 63 6f 6e 73  ndexCharlen(cons
27850 74 20 63 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74  t char *pIn, int
27860 20 6e 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 43 68   nIn){.  int nCh
27870 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ar = 0;         
27880 20 20 20 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b     .  int i = 0;
27890 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20  .  while( i<nIn 
278a0 29 7b 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69  ){.    if( (unsi
278b0 67 6e 65 64 20 63 68 61 72 29 70 49 6e 5b 69 2b  gned char)pIn[i+
278c0 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20  +]>=0xc0 ){.    
278d0 20 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 26    while( i<nIn &
278e0 26 20 28 70 49 6e 5b 69 5d 20 26 20 30 78 63 30  & (pIn[i] & 0xc0
278f0 29 3d 3d 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20  )==0x80 ) i++;. 
27900 20 20 20 7d 0a 20 20 20 20 6e 43 68 61 72 2b 2b     }.    nChar++
27910 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
27920 43 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  Char;.}../*.** I
27930 6e 73 65 72 74 20 6f 72 20 72 65 6d 6f 76 65 20  nsert or remove 
27940 64 61 74 61 20 74 6f 20 6f 72 20 66 72 6f 6d 20  data to or from 
27950 74 68 65 20 69 6e 64 65 78 2e 20 45 61 63 68 20  the index. Each 
27960 74 69 6d 65 20 61 20 64 6f 63 75 6d 65 6e 74 20  time a document 
27970 69 73 20 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20  is .** added to 
27980 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  or removed from 
27990 74 68 65 20 69 6e 64 65 78 2c 20 74 68 69 73 20  the index, this 
279a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
279b0 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a  ed one or more.*
279c0 2a 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  * times..**.** F
279d0 6f 72 20 61 6e 20 69 6e 73 65 72 74 2c 20 69 74  or an insert, it
279e0 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
279f0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 6f  once for each to
27a00 6b 65 6e 20 69 6e 20 74 68 65 20 6e 65 77 20 64  ken in the new d
27a10 6f 63 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20 74  ocument..** If t
27a20 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
27a30 61 20 64 65 6c 65 74 65 2c 20 69 74 20 6d 75 73  a delete, it mus
27a40 74 20 62 65 20 63 61 6c 6c 65 64 20 28 61 74 20  t be called (at 
27a50 6c 65 61 73 74 29 20 6f 6e 63 65 20 66 6f 72 20  least) once for 
27a60 65 61 63 68 0a 2a 2a 20 75 6e 69 71 75 65 20 74  each.** unique t
27a70 6f 6b 65 6e 20 69 6e 20 74 68 65 20 64 6f 63 75  oken in the docu
27a80 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 69 43 6f  ment with an iCo
27a90 6c 20 76 61 6c 75 65 20 6c 65 73 73 20 74 68 61  l value less tha
27aa0 6e 20 7a 65 72 6f 2e 20 54 68 65 20 69 50 6f 73  n zero. The iPos
27ab0 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20  .** argument is 
27ac0 69 67 6e 6f 72 65 64 20 66 6f 72 20 61 20 64 65  ignored for a de
27ad0 6c 65 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lete..*/.int sql
27ae0 69 74 65 33 46 74 73 35 49 6e 64 65 78 57 72 69  ite3Fts5IndexWri
27af0 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  te(.  Fts5Index 
27b00 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
27b10 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
27b20 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20  o write to */.  
27b30 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20  int iCol,       
27b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b50 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20  /* Column token 
27b60 61 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20  appears in (-ve 
27b70 2d 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20  -> delete) */.  
27b80 69 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20  int iPos,       
27b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ba0 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74  /* Position of t
27bb0 6f 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75  oken within colu
27bc0 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  mn */.  const ch
27bd0 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20  ar *pToken, int 
27be0 6e 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e  nToken  /* Token
27bf0 20 74 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f 76   to add or remov
27c00 65 20 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64  e to or from ind
27c10 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ex */.){.  int i
27c20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
27c40 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
27c50 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f  rough indexes */
27c60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
27c70 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
27c80 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
27c90 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69  e */.  Fts5Confi
27ca0 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
27cb0 70 43 6f 6e 66 69 67 3b 0a 0a 20 20 61 73 73 65  pConfig;..  asse
27cc0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
27cd0 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OK );.  assert
27ce0 28 20 28 69 43 6f 6c 3c 30 29 3d 3d 70 2d 3e 62  ( (iCol<0)==p->b
27cf0 44 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20  Delete );..  /* 
27d00 41 64 64 20 74 68 65 20 65 6e 74 72 79 20 74 6f  Add the entry to
27d10 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 73 20   the main terms 
27d20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 72 63 20 3d  index. */.  rc =
27d30 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
27d40 57 72 69 74 65 28 0a 20 20 20 20 20 20 70 2d 3e  Write(.      p->
27d50 70 48 61 73 68 2c 20 70 2d 3e 69 57 72 69 74 65  pHash, p->iWrite
27d60 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f  Rowid, iCol, iPo
27d70 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45  s, FTS5_MAIN_PRE
27d80 46 49 58 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f  FIX, pToken, nTo
27d90 6b 65 6e 0a 20 20 29 3b 0a 0a 20 20 66 6f 72 28  ken.  );..  for(
27da0 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e  i=0; i<pConfig->
27db0 6e 50 72 65 66 69 78 20 26 26 20 72 63 3d 3d 53  nPrefix && rc==S
27dc0 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a  QLITE_OK; i++){.
27dd0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43      const int nC
27de0 68 61 72 20 3d 20 70 43 6f 6e 66 69 67 2d 3e 61  har = pConfig->a
27df0 50 72 65 66 69 78 5b 69 5d 3b 0a 20 20 20 20 69  Prefix[i];.    i
27e00 6e 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74  nt nByte = sqlit
27e10 65 33 46 74 73 35 49 6e 64 65 78 43 68 61 72 6c  e3Fts5IndexCharl
27e20 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54 6f 6b  enToBytelen(pTok
27e30 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 6e 43 68 61  en, nToken, nCha
27e40 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  r);.    if( nByt
27e50 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
27e60 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 57  sqlite3Fts5HashW
27e70 72 69 74 65 28 70 2d 3e 70 48 61 73 68 2c 20 0a  rite(p->pHash, .
27e80 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 57 72            p->iWr
27e90 69 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20  iteRowid, iCol, 
27ea0 69 50 6f 73 2c 20 28 63 68 61 72 29 28 46 54 53  iPos, (char)(FTS
27eb0 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2b 69 2b  5_MAIN_PREFIX+i+
27ec0 31 29 2c 20 70 54 6f 6b 65 6e 2c 0a 20 20 20 20  1), pToken,.    
27ed0 20 20 20 20 20 20 6e 42 79 74 65 0a 20 20 20 20        nByte.    
27ee0 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a    );.    }.  }..
27ef0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27f00 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
27f10 20 69 74 65 72 61 74 6f 72 20 74 6f 20 69 74 65   iterator to ite
27f20 72 61 74 65 20 74 68 6f 75 67 68 20 61 6c 6c 20  rate though all 
27f30 72 6f 77 69 64 20 74 68 61 74 20 6d 61 74 63 68  rowid that match
27f40 20 74 68 65 20 0a 2a 2a 20 73 70 65 63 69 66 69   the .** specifi
27f50 65 64 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65  ed token or toke
27f60 6e 20 70 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74  n prefix..*/.int
27f70 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
27f80 78 51 75 65 72 79 28 0a 20 20 46 74 73 35 49 6e  xQuery(.  Fts5In
27f90 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
27fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
27fb0 20 69 6e 64 65 78 20 74 6f 20 71 75 65 72 79 20   index to query 
27fc0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
27fd0 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f  *pToken, int nTo
27fe0 6b 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f  ken, /* Token (o
27ff0 72 20 70 72 65 66 69 78 29 20 74 6f 20 71 75 65  r prefix) to que
28000 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ry for */.  int 
28010 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
28020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
28030 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58  ask of FTS5INDEX
28040 5f 51 55 45 52 59 5f 58 20 66 6c 61 67 73 20 2a  _QUERY_X flags *
28050 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  /.  Fts5Colset *
28060 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20  pColset,        
28070 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 68 65      /* Match the
28080 73 65 20 63 6f 6c 75 6d 6e 73 20 6f 6e 6c 79 20  se columns only 
28090 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  */.  Fts5IndexIt
280a0 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20  er **ppIter     
280b0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77       /* OUT: New
280c0 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
280d0 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e   */.){.  Fts5Con
280e0 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
280f0 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73  ->pConfig;.  Fts
28100 35 49 74 65 72 20 2a 70 52 65 74 20 3d 20 30 3b  5Iter *pRet = 0;
28110 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75  .  Fts5Buffer bu
28120 66 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a  f = {0, 0, 0};..
28130 20 20 2f 2a 20 49 66 20 74 68 65 20 51 55 45 52    /* If the QUER
28140 59 5f 53 43 41 4e 20 66 6c 61 67 20 69 73 20 73  Y_SCAN flag is s
28150 65 74 2c 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c  et, all other fl
28160 61 67 73 20 6d 75 73 74 20 62 65 20 63 6c 65 61  ags must be clea
28170 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  r. */.  assert( 
28180 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
28190 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3d 3d  EX_QUERY_SCAN)==
281a0 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 46 54 53 35  0 || flags==FTS5
281b0 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
281c0 20 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74   );..  if( sqlit
281d0 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65  e3Fts5BufferSize
281e0 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 6e  (&p->rc, &buf, n
281f0 54 6f 6b 65 6e 2b 31 29 3d 3d 30 20 29 7b 0a 20  Token+1)==0 ){. 
28200 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b     int iIdx = 0;
28210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28220 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 73 65 61   /* Index to sea
28230 72 63 68 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70  rch */.    memcp
28240 79 28 26 62 75 66 2e 70 5b 31 5d 2c 20 70 54 6f  y(&buf.p[1], pTo
28250 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 0a 20  ken, nToken);.. 
28260 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
28270 20 77 68 69 63 68 20 69 6e 64 65 78 20 74 6f 20   which index to 
28280 73 65 61 72 63 68 20 61 6e 64 20 73 65 74 20 69  search and set i
28290 49 64 78 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  Idx accordingly.
282a0 20 49 66 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   If this.    ** 
282b0 69 73 20 61 20 70 72 65 66 69 78 20 71 75 65 72  is a prefix quer
282c0 79 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72  y for which ther
282d0 65 20 69 73 20 6e 6f 20 70 72 65 66 69 78 20 69  e is no prefix i
282e0 6e 64 65 78 2c 20 73 65 74 20 69 49 64 78 20 74  ndex, set iIdx t
282f0 6f 0a 20 20 20 20 2a 2a 20 67 72 65 61 74 65 72  o.    ** greater
28300 20 74 68 61 6e 20 70 43 6f 6e 66 69 67 2d 3e 6e   than pConfig->n
28310 50 72 65 66 69 78 20 74 6f 20 69 6e 64 69 63 61  Prefix to indica
28320 74 65 20 74 68 61 74 20 74 68 65 20 71 75 65 72  te that the quer
28330 79 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a  y will be.    **
28340 20 73 61 74 69 73 66 69 65 64 20 62 79 20 73 63   satisfied by sc
28350 61 6e 6e 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  anning multiple 
28360 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6d 61 69  terms in the mai
28370 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a  n index..    **.
28380 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 51 55      ** If the QU
28390 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20 66  ERY_TEST_NOIDX f
283a0 6c 61 67 20 77 61 73 20 73 70 65 63 69 66 69 65  lag was specifie
283b0 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 75 73  d, then this mus
283c0 74 20 62 65 20 61 0a 20 20 20 20 2a 2a 20 70 72  t be a.    ** pr
283d0 65 66 69 78 2d 71 75 65 72 79 2e 20 49 6e 73 74  efix-query. Inst
283e0 65 61 64 20 6f 66 20 75 73 69 6e 67 20 61 20 70  ead of using a p
283f0 72 65 66 69 78 2d 69 6e 64 65 78 20 28 69 66 20  refix-index (if 
28400 6f 6e 65 20 65 78 69 73 74 73 29 2c 20 0a 20 20  one exists), .  
28410 20 20 2a 2a 20 65 76 61 6c 75 61 74 65 20 74 68    ** evaluate th
28420 65 20 70 72 65 66 69 78 20 71 75 65 72 79 20 75  e prefix query u
28430 73 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 46 54  sing the main FT
28440 53 20 69 6e 64 65 78 2e 20 54 68 69 73 20 69 73  S index. This is
28450 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72   used.    ** for
28460 20 69 6e 74 65 72 6e 61 6c 20 73 61 6e 69 74 79   internal sanity
28470 20 63 68 65 63 6b 69 6e 67 20 62 79 20 74 68 65   checking by the
28480 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
28490 20 69 6e 20 64 65 62 75 67 20 0a 20 20 20 20 2a   in debug .    *
284a0 2a 20 6d 6f 64 65 20 6f 6e 6c 79 2e 20 20 2a 2f  * mode only.  */
284b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
284c0 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 43 6f  EBUG.    if( pCo
284d0 6e 66 69 67 2d 3e 62 50 72 65 66 69 78 49 6e 64  nfig->bPrefixInd
284e0 65 78 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20  ex==0 || (flags 
284f0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
28500 59 5f 54 45 53 54 5f 4e 4f 49 44 58 29 20 29 7b  Y_TEST_NOIDX) ){
28510 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66  .      assert( f
28520 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
28530 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20 29 3b  _QUERY_PREFIX );
28540 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 31 2b  .      iIdx = 1+
28550 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
28560 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
28570 69 66 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  if.    if( flags
28580 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
28590 52 59 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20  RY_PREFIX ){.   
285a0 20 20 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 66     int nChar = f
285b0 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28  ts5IndexCharlen(
285c0 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b  pToken, nToken);
285d0 0a 20 20 20 20 20 20 66 6f 72 28 69 49 64 78 3d  .      for(iIdx=
285e0 31 3b 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67  1; iIdx<=pConfig
285f0 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b  ->nPrefix; iIdx+
28600 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
28610 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78  pConfig->aPrefix
28620 5b 69 49 64 78 2d 31 5d 3d 3d 6e 43 68 61 72 20  [iIdx-1]==nChar 
28630 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
28640 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
28650 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e  iIdx<=pConfig->n
28660 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20  Prefix ){.      
28670 2f 2a 20 53 74 72 61 69 67 68 74 20 69 6e 64 65  /* Straight inde
28680 78 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20  x lookup */.    
28690 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
286a0 2a 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53  *pStruct = fts5S
286b0 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
286c0 0a 20 20 20 20 20 20 62 75 66 2e 70 5b 30 5d 20  .      buf.p[0] 
286d0 3d 20 28 75 38 29 28 46 54 53 35 5f 4d 41 49 4e  = (u8)(FTS5_MAIN
286e0 5f 50 52 45 46 49 58 20 2b 20 69 49 64 78 29 3b  _PREFIX + iIdx);
286f0 0a 20 20 20 20 20 20 69 66 28 20 70 53 74 72 75  .      if( pStru
28700 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  ct ){.        ft
28710 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
28720 2c 20 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73  , pStruct, flags
28730 20 7c 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   | FTS5INDEX_QUE
28740 52 59 5f 53 4b 49 50 45 4d 50 54 59 2c 20 0a 20  RY_SKIPEMPTY, . 
28750 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 73             pCols
28760 65 74 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65  et, buf.p, nToke
28770 6e 2b 31 2c 20 2d 31 2c 20 30 2c 20 26 70 52 65  n+1, -1, 0, &pRe
28780 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  t.        );.   
28790 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
287a0 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
287b0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
287c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
287d0 53 63 61 6e 20 6d 75 6c 74 69 70 6c 65 20 74 65  Scan multiple te
287e0 72 6d 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  rms in the main 
287f0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
28800 6e 74 20 62 44 65 73 63 20 3d 20 28 66 6c 61 67  nt bDesc = (flag
28810 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
28820 45 52 59 5f 44 45 53 43 29 21 3d 30 3b 0a 20 20  ERY_DESC)!=0;.  
28830 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20 46      buf.p[0] = F
28840 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 3b  TS5_MAIN_PREFIX;
28850 0a 20 20 20 20 20 20 66 74 73 35 53 65 74 75 70  .      fts5Setup
28860 50 72 65 66 69 78 49 74 65 72 28 70 2c 20 62 44  PrefixIter(p, bD
28870 65 73 63 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b  esc, buf.p, nTok
28880 65 6e 2b 31 2c 20 70 43 6f 6c 73 65 74 2c 20 26  en+1, pColset, &
28890 70 52 65 74 29 3b 0a 20 20 20 20 20 20 61 73 73  pRet);.      ass
288a0 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49  ert( p->rc!=SQLI
288b0 54 45 5f 4f 4b 20 7c 7c 20 70 52 65 74 2d 3e 70  TE_OK || pRet->p
288c0 43 6f 6c 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20  Colset==0 );.   
288d0 20 20 20 66 74 73 35 49 74 65 72 53 65 74 4f 75     fts5IterSetOu
288e0 74 70 75 74 43 62 28 26 70 2d 3e 72 63 2c 20 70  tputCb(&p->rc, p
288f0 52 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Ret);.      if( 
28900 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
28910 20 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35   ){.        Fts5
28920 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
28930 26 70 52 65 74 2d 3e 61 53 65 67 5b 70 52 65 74  &pRet->aSeg[pRet
28940 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
28950 73 74 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  st];.        if(
28960 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 29 20 70   pSeg->pLeaf ) p
28970 52 65 74 2d 3e 78 53 65 74 4f 75 74 70 75 74 73  Ret->xSetOutputs
28980 28 70 52 65 74 2c 20 70 53 65 67 29 3b 0a 20 20  (pRet, pSeg);.  
28990 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
289a0 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20   if( p->rc ){.  
289b0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49      sqlite3Fts5I
289c0 74 65 72 43 6c 6f 73 65 28 26 70 52 65 74 2d 3e  terClose(&pRet->
289d0 62 61 73 65 29 3b 0a 20 20 20 20 20 20 70 52 65  base);.      pRe
289e0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 74 73  t = 0;.      fts
289f0 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b  5CloseReader(p);
28a00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a 70 70 49  .    }..    *ppI
28a10 74 65 72 20 3d 20 26 70 52 65 74 2d 3e 62 61 73  ter = &pRet->bas
28a20 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  e;.    sqlite3Ft
28a30 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75  s5BufferFree(&bu
28a40 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
28a50 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
28a60 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (p);.}../*.** Re
28a70 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
28a80 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
28a90 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
28aa0 75 6d 65 6e 74 20 69 73 20 61 74 20 45 4f 46 2e  ument is at EOF.
28ab0 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .*/./*.** Move t
28ac0 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68  o the next match
28ad0 69 6e 67 20 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69  ing rowid. .*/.i
28ae0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
28af0 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78  erNext(Fts5Index
28b00 49 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72  Iter *pIndexIter
28b10 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  ){.  Fts5Iter *p
28b20 49 74 65 72 20 3d 20 28 46 74 73 35 49 74 65 72  Iter = (Fts5Iter
28b30 2a 29 70 49 6e 64 65 78 49 74 65 72 3b 0a 20 20  *)pIndexIter;.  
28b40 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
28b50 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54  Index->rc==SQLIT
28b60 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 4d 75  E_OK );.  fts5Mu
28b70 6c 74 69 49 74 65 72 4e 65 78 74 28 70 49 74 65  ltiIterNext(pIte
28b80 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72  r->pIndex, pIter
28b90 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  , 0, 0);.  retur
28ba0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
28bb0 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29  n(pIter->pIndex)
28bc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
28bd0 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63  to the next matc
28be0 68 69 6e 67 20 74 65 72 6d 2f 72 6f 77 69 64 2e  hing term/rowid.
28bf0 20 55 73 65 64 20 62 79 20 74 68 65 20 66 74 73   Used by the fts
28c00 35 76 6f 63 61 62 20 6d 6f 64 75 6c 65 2e 0a 2a  5vocab module..*
28c10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
28c20 35 49 74 65 72 4e 65 78 74 53 63 61 6e 28 46 74  5IterNextScan(Ft
28c30 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e  s5IndexIter *pIn
28c40 64 65 78 49 74 65 72 29 7b 0a 20 20 46 74 73 35  dexIter){.  Fts5
28c50 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 28 46  Iter *pIter = (F
28c60 74 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49  ts5Iter*)pIndexI
28c70 74 65 72 3b 0a 20 20 46 74 73 35 49 6e 64 65 78  ter;.  Fts5Index
28c80 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e   *p = pIter->pIn
28c90 64 65 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  dex;..  assert( 
28ca0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72  pIter->pIndex->r
28cb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
28cc0 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  .  fts5MultiIter
28cd0 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30  Next(p, pIter, 0
28ce0 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  , 0);.  if( p->r
28cf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28d00 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
28d10 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
28d20 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
28d30 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
28d40 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70  .    if( pSeg->p
28d50 4c 65 61 66 20 26 26 20 70 53 65 67 2d 3e 74 65  Leaf && pSeg->te
28d60 72 6d 2e 70 5b 30 5d 21 3d 46 54 53 35 5f 4d 41  rm.p[0]!=FTS5_MA
28d70 49 4e 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20  IN_PREFIX ){.   
28d80 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
28d90 73 65 28 70 53 65 67 2d 3e 70 4c 65 61 66 29 3b  se(pSeg->pLeaf);
28da0 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 4c 65  .      pSeg->pLe
28db0 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 49  af = 0;.      pI
28dc0 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20 3d  ter->base.bEof =
28dd0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
28de0 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
28df0 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70  xReturn(pIter->p
28e00 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Index);.}../*.**
28e10 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78   Move to the nex
28e20 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64  t matching rowid
28e30 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
28e40 6f 72 20 61 66 74 65 72 20 69 4d 61 74 63 68 2e  or after iMatch.
28e50 20 54 68 65 0a 2a 2a 20 64 65 66 69 6e 69 74 69   The.** definiti
28e60 6f 6e 20 6f 66 20 22 61 74 20 6f 72 20 61 66 74  on of "at or aft
28e70 65 72 22 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  er" depends on w
28e80 68 65 74 68 65 72 20 74 68 69 73 20 69 74 65 72  hether this iter
28e90 61 74 6f 72 20 69 74 65 72 61 74 65 73 0a 2a 2a  ator iterates.**
28ea0 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
28eb0 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69   descending rowi
28ec0 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20  d order..*/.int 
28ed0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
28ee0 65 78 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65  extFrom(Fts5Inde
28ef0 78 49 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65  xIter *pIndexIte
28f00 72 2c 20 69 36 34 20 69 4d 61 74 63 68 29 7b 0a  r, i64 iMatch){.
28f10 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65    Fts5Iter *pIte
28f20 72 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29 70  r = (Fts5Iter*)p
28f30 49 6e 64 65 78 49 74 65 72 3b 0a 20 20 66 74 73  IndexIter;.  fts
28f40 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72  5MultiIterNextFr
28f50 6f 6d 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  om(pIter->pIndex
28f60 2c 20 70 49 74 65 72 2c 20 69 4d 61 74 63 68 29  , pIter, iMatch)
28f70 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
28f80 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65 72  ndexReturn(pIter
28f90 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a  ->pIndex);.}../*
28fa0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
28fb0 75 72 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a  urrent term..*/.
28fc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
28fd0 74 65 33 46 74 73 35 49 74 65 72 54 65 72 6d 28  te3Fts5IterTerm(
28fe0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
28ff0 49 6e 64 65 78 49 74 65 72 2c 20 69 6e 74 20 2a  IndexIter, int *
29000 70 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  pn){.  int n;.  
29010 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
29020 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 66 74 73  (const char*)fts
29030 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 28  5MultiIterTerm((
29040 46 74 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78  Fts5Iter*)pIndex
29050 49 74 65 72 2c 20 26 6e 29 3b 0a 20 20 2a 70 6e  Iter, &n);.  *pn
29060 20 3d 20 6e 2d 31 3b 0a 20 20 72 65 74 75 72 6e   = n-1;.  return
29070 20 26 7a 5b 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   &z[1];.}../*.**
29080 20 43 6c 6f 73 65 20 61 6e 20 69 74 65 72 61 74   Close an iterat
29090 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20  or opened by an 
290a0 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
290b0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
290c0 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Query()..*/.void
290d0 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
290e0 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 49  Close(Fts5IndexI
290f0 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72 29  ter *pIndexIter)
29100 7b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 49 74  {.  if( pIndexIt
29110 65 72 20 29 7b 0a 20 20 20 20 46 74 73 35 49 74  er ){.    Fts5It
29120 65 72 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73  er *pIter = (Fts
29130 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65  5Iter*)pIndexIte
29140 72 3b 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78  r;.    Fts5Index
29150 20 2a 70 49 6e 64 65 78 20 3d 20 70 49 74 65 72   *pIndex = pIter
29160 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 66 74  ->pIndex;.    ft
29170 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
29180 70 49 74 65 72 29 3b 0a 20 20 20 20 66 74 73 35  pIter);.    fts5
29190 43 6c 6f 73 65 52 65 61 64 65 72 28 70 49 6e 64  CloseReader(pInd
291a0 65 78 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ex);.  }.}../*.*
291b0 2a 20 52 65 61 64 20 61 6e 64 20 64 65 63 6f 64  * Read and decod
291c0 65 20 74 68 65 20 22 61 76 65 72 61 67 65 73 22  e the "averages"
291d0 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
291e0 20 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a   database. .**.*
291f0 2a 20 50 61 72 61 6d 65 74 65 72 20 61 6e 53 69  * Parameter anSi
29200 7a 65 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ze must point to
29210 20 61 6e 20 61 72 72 61 79 20 6f 66 20 73 69 7a   an array of siz
29220 65 20 6e 43 6f 6c 2c 20 77 68 65 72 65 20 6e 43  e nCol, where nC
29230 6f 6c 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6d  ol is.** the num
29240 62 65 72 20 6f 66 20 75 73 65 72 20 64 65 66 69  ber of user defi
29250 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  ned columns in t
29260 68 65 20 46 54 53 20 74 61 62 6c 65 2e 0a 2a 2f  he FTS table..*/
29270 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
29280 49 6e 64 65 78 47 65 74 41 76 65 72 61 67 65 73  IndexGetAverages
29290 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
292a0 36 34 20 2a 70 6e 52 6f 77 2c 20 69 36 34 20 2a  64 *pnRow, i64 *
292b0 61 6e 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 6e  anSize){.  int n
292c0 43 6f 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  Col = p->pConfig
292d0 2d 3e 6e 43 6f 6c 3b 0a 20 20 46 74 73 35 44 61  ->nCol;.  Fts5Da
292e0 74 61 20 2a 70 44 61 74 61 3b 0a 0a 20 20 2a 70  ta *pData;..  *p
292f0 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 6d 65 6d 73  nRow = 0;.  mems
29300 65 74 28 61 6e 53 69 7a 65 2c 20 30 2c 20 73 69  et(anSize, 0, si
29310 7a 65 6f 66 28 69 36 34 29 20 2a 20 6e 43 6f 6c  zeof(i64) * nCol
29320 29 3b 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73  );.  pData = fts
29330 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53  5DataRead(p, FTS
29340 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
29350 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
29360 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61  SQLITE_OK && pDa
29370 74 61 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 69 6e  ta->nn ){.    in
29380 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  t i = 0;.    int
29390 20 69 43 6f 6c 3b 0a 20 20 20 20 69 20 2b 3d 20   iCol;.    i += 
293a0 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  fts5GetVarint(&p
293b0 44 61 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34  Data->p[i], (u64
293c0 2a 29 70 6e 52 6f 77 29 3b 0a 20 20 20 20 66 6f  *)pnRow);.    fo
293d0 72 28 69 43 6f 6c 3d 30 3b 20 69 3c 70 44 61 74  r(iCol=0; i<pDat
293e0 61 2d 3e 6e 6e 20 26 26 20 69 43 6f 6c 3c 6e 43  a->nn && iCol<nC
293f0 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
29400 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
29410 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b  arint(&pData->p[
29420 69 5d 2c 20 28 75 36 34 2a 29 26 61 6e 53 69 7a  i], (u64*)&anSiz
29430 65 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 7d 0a  e[iCol]);.    }.
29440 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52    }..  fts5DataR
29450 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20  elease(pData);. 
29460 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
29470 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
29480 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65  *.** Replace the
29490 20 63 75 72 72 65 6e 74 20 22 61 76 65 72 61 67   current "averag
294a0 65 73 22 20 72 65 63 6f 72 64 20 77 69 74 68 20  es" record with 
294b0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
294c0 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 73  the buffer .** s
294d0 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 20 73  upplied as the s
294e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
294f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
29500 73 35 49 6e 64 65 78 53 65 74 41 76 65 72 61 67  s5IndexSetAverag
29510 65 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  es(Fts5Index *p,
29520 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61   const u8 *pData
29530 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20  , int nData){.  
29540 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
29550 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74  QLITE_OK );.  ft
29560 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 46  s5DataWrite(p, F
29570 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
29580 49 44 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61  ID, pData, nData
29590 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
295a0 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
295b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
295c0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
295d0 20 6f 66 20 62 6c 6f 63 6b 73 20 74 68 69 73 20   of blocks this 
295e0 6d 6f 64 75 6c 65 20 68 61 73 20 72 65 61 64 20  module has read 
295f0 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 0a  from the %_data.
29600 2a 2a 20 74 61 62 6c 65 20 73 69 6e 63 65 20 69  ** table since i
29610 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a  t was created..*
29620 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
29630 35 49 6e 64 65 78 52 65 61 64 73 28 46 74 73 35  5IndexReads(Fts5
29640 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 72 65 74  Index *p){.  ret
29650 75 72 6e 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a  urn p->nRead;.}.
29660 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 33  ./*.** Set the 3
29670 32 2d 62 69 74 20 63 6f 6f 6b 69 65 20 76 61 6c  2-bit cookie val
29680 75 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  ue stored at the
29690 20 73 74 61 72 74 20 6f 66 20 61 6c 6c 20 73 74   start of all st
296a0 72 75 63 74 75 72 65 20 0a 2a 2a 20 72 65 63 6f  ructure .** reco
296b0 72 64 73 20 74 6f 20 74 68 65 20 76 61 6c 75 65  rds to the value
296c0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
296d0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
296e0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
296f0 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
29700 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
29710 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  te error code if
29720 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63   an error.** occ
29730 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  urs..*/.int sqli
29740 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 43  te3Fts5IndexSetC
29750 6f 6f 6b 69 65 28 46 74 73 35 49 6e 64 65 78 20  ookie(Fts5Index 
29760 2a 70 2c 20 69 6e 74 20 69 4e 65 77 29 7b 0a 20  *p, int iNew){. 
29770 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
29780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29790 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
297a0 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f  code */.  Fts5Co
297b0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
297c0 70 2d 3e 70 43 6f 6e 66 69 67 3b 20 20 20 20 2f  p->pConfig;    /
297d0 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
297e0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 38 20 61  object */.  u8 a
297f0 43 6f 6f 6b 69 65 5b 34 5d 3b 20 20 20 20 20 20  Cookie[4];      
29800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29810 20 2f 2a 20 42 69 6e 61 72 79 20 72 65 70 72 65   /* Binary repre
29820 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 69 4e 65  sentation of iNe
29830 77 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62  w */.  sqlite3_b
29840 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a  lob *pBlob = 0;.
29850 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
29860 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
29870 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 33   sqlite3Fts5Put3
29880 32 28 61 43 6f 6f 6b 69 65 2c 20 69 4e 65 77 29  2(aCookie, iNew)
29890 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
298a0 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e  3_blob_open(pCon
298b0 66 69 67 2d 3e 64 62 2c 20 70 43 6f 6e 66 69 67  fig->db, pConfig
298c0 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54  ->zDb, p->zDataT
298d0 62 6c 2c 20 0a 20 20 20 20 20 20 22 62 6c 6f 63  bl, .      "bloc
298e0 6b 22 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55  k", FTS5_STRUCTU
298f0 52 45 5f 52 4f 57 49 44 2c 20 31 2c 20 26 70 42  RE_ROWID, 1, &pB
29900 6c 6f 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  lob.  );.  if( r
29910 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29920 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
29930 5f 77 72 69 74 65 28 70 42 6c 6f 62 2c 20 61 43  _write(pBlob, aC
29940 6f 6f 6b 69 65 2c 20 34 2c 20 30 29 3b 0a 20 20  ookie, 4, 0);.  
29950 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
29960 6c 6f 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29  lob_close(pBlob)
29970 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
29980 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  rc;.}..int sqlit
29990 65 33 46 74 73 35 49 6e 64 65 78 4c 6f 61 64 43  e3Fts5IndexLoadC
299a0 6f 6e 66 69 67 28 46 74 73 35 49 6e 64 65 78 20  onfig(Fts5Index 
299b0 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  *p){.  Fts5Struc
299c0 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20  ture *pStruct;. 
299d0 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53   pStruct = fts5S
299e0 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
299f0 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
29a00 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
29a10 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
29a20 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
29a30 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
29a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
29a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29ac0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f  ********.** Belo
29ad0 77 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20  w this point is 
29ae0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
29af0 6f 6e 20 6f 66 20 74 68 65 20 69 6e 74 65 67 72  on of the integr
29b00 69 74 79 2d 63 68 65 63 6b 20 0a 2a 2a 20 66 75  ity-check .** fu
29b10 6e 63 74 69 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a  nctionality..*/.
29b20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
29b30 73 69 6d 70 6c 65 20 63 68 65 63 6b 73 75 6d 20  simple checksum 
29b40 76 61 6c 75 65 20 62 61 73 65 64 20 6f 6e 20 74  value based on t
29b50 68 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  he arguments..*/
29b60 0a 75 36 34 20 73 71 6c 69 74 65 33 46 74 73 35  .u64 sqlite3Fts5
29b70 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28  IndexEntryCksum(
29b80 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a  .  i64 iRowid, .
29b90 20 20 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69    int iCol, .  i
29ba0 6e 74 20 69 50 6f 73 2c 20 0a 20 20 69 6e 74 20  nt iPos, .  int 
29bb0 69 49 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68  iIdx,.  const ch
29bc0 61 72 20 2a 70 54 65 72 6d 2c 0a 20 20 69 6e 74  ar *pTerm,.  int
29bd0 20 6e 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20   nTerm.){.  int 
29be0 69 3b 0a 20 20 75 36 34 20 72 65 74 20 3d 20 69  i;.  u64 ret = i
29bf0 52 6f 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20  Rowid;.  ret += 
29c00 28 72 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b  (ret<<3) + iCol;
29c10 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c  .  ret += (ret<<
29c20 33 29 20 2b 20 69 50 6f 73 3b 0a 20 20 69 66 28  3) + iPos;.  if(
29c30 20 69 49 64 78 3e 3d 30 20 29 20 72 65 74 20 2b   iIdx>=0 ) ret +
29c40 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 28 46 54  = (ret<<3) + (FT
29c50 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b  S5_MAIN_PREFIX +
29c60 20 69 49 64 78 29 3b 0a 20 20 66 6f 72 28 69 3d   iIdx);.  for(i=
29c70 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29  0; i<nTerm; i++)
29c80 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29   ret += (ret<<3)
29c90 20 2b 20 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 72   + pTerm[i];.  r
29ca0 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69  eturn ret;.}..#i
29cb0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
29cc0 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  G./*.** This fun
29cd0 63 74 69 6f 6e 20 69 73 20 70 75 72 65 6c 79 20  ction is purely 
29ce0 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74  an internal test
29cf0 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f  . It does not co
29d00 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20  ntribute to .** 
29d10 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  FTS functionalit
29d20 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69  y, or even the i
29d30 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20  ntegrity-check, 
29d40 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a  in any way..**.*
29d50 2a 20 49 6e 73 74 65 61 64 2c 20 69 74 20 74 65  * Instead, it te
29d60 73 74 73 20 74 68 61 74 20 74 68 65 20 73 61 6d  sts that the sam
29d70 65 20 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f  e set of pgno/ro
29d80 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  wid combinations
29d90 20 61 72 65 20 0a 2a 2a 20 76 69 73 69 74 65 64   are .** visited
29da0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
29db0 68 65 74 68 65 72 20 74 68 65 20 64 6f 63 6c 69  hether the docli
29dc0 73 74 2d 69 6e 64 65 78 20 69 64 65 6e 74 69 66  st-index identif
29dd0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
29de0 73 0a 2a 2a 20 69 53 65 67 69 64 2f 69 4c 65 61  s.** iSegid/iLea
29df0 66 20 69 73 20 69 74 65 72 61 74 65 64 20 69 6e  f is iterated in
29e00 20 66 6f 72 77 61 72 64 73 20 6f 72 20 72 65 76   forwards or rev
29e10 65 72 73 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  erse order..*/.s
29e20 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 54  tatic void fts5T
29e30 65 73 74 44 6c 69 64 78 52 65 76 65 72 73 65 28  estDlidxReverse(
29e40 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
29e50 20 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20   .  int iSegid, 
29e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e70 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69      /* Segment i
29e80 64 20 74 6f 20 6c 6f 61 64 20 66 72 6f 6d 20 2a  d to load from *
29e90 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 20 20 20  /.  int iLeaf   
29ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29eb0 20 20 20 20 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c      /* Load docl
29ec0 69 73 74 2d 69 6e 64 65 78 20 66 6f 72 20 74 68  ist-index for th
29ed0 69 73 20 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20 20  is leaf */.){.  
29ee0 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
29ef0 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 75 36 34  Dlidx = 0;.  u64
29f00 20 63 6b 73 75 6d 31 20 3d 20 31 33 3b 0a 20 20   cksum1 = 13;.  
29f10 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 31 33 3b  u64 cksum2 = 13;
29f20 0a 0a 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66  ..  for(pDlidx=f
29f30 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
29f40 28 70 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69  (p, 0, iSegid, i
29f50 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 66 74 73  Leaf);.      fts
29f60 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
29f70 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20   pDlidx)==0;.   
29f80 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
29f90 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a  Next(p, pDlidx).
29fa0 20 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f    ){.    i64 iRo
29fb0 77 69 64 20 3d 20 66 74 73 35 44 6c 69 64 78 49  wid = fts5DlidxI
29fc0 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29  terRowid(pDlidx)
29fd0 3b 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d  ;.    int pgno =
29fe0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
29ff0 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  no(pDlidx);.    
2a000 61 73 73 65 72 74 28 20 70 67 6e 6f 3e 69 4c 65  assert( pgno>iLe
2a010 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31  af );.    cksum1
2a020 20 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69   += iRowid + ((i
2a030 36 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20  64)pgno<<32);.  
2a040 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65  }.  fts5DlidxIte
2a050 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20  rFree(pDlidx);. 
2a060 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20   pDlidx = 0;..  
2a070 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44  for(pDlidx=fts5D
2a080 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20  lidxIterInit(p, 
2a090 31 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66  1, iSegid, iLeaf
2a0a0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  );.      fts5Dli
2a0b0 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
2a0c0 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66  idx)==0;.      f
2a0d0 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76  ts5DlidxIterPrev
2a0e0 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 29 7b  (p, pDlidx).  ){
2a0f0 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20  .    i64 iRowid 
2a100 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 52  = fts5DlidxIterR
2a110 6f 77 69 64 28 70 44 6c 69 64 78 29 3b 0a 20 20  owid(pDlidx);.  
2a120 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73    int pgno = fts
2a130 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
2a140 44 6c 69 64 78 29 3b 0a 20 20 20 20 61 73 73 65  Dlidx);.    asse
2a150 72 74 28 20 66 74 73 35 44 6c 69 64 78 49 74 65  rt( fts5DlidxIte
2a160 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3e 69 4c  rPgno(pDlidx)>iL
2a170 65 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d  eaf );.    cksum
2a180 32 20 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28  2 += iRowid + ((
2a190 69 36 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20  i64)pgno<<32);. 
2a1a0 20 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74   }.  fts5DlidxIt
2a1b0 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a  erFree(pDlidx);.
2a1c0 20 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20    pDlidx = 0;.. 
2a1d0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
2a1e0 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21  TE_OK && cksum1!
2a1f0 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20  =cksum2 ) p->rc 
2a200 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2a210 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
2a220 73 35 51 75 65 72 79 43 6b 73 75 6d 28 0a 20 20  s5QueryCksum(.  
2a230 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
2a240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a250 2f 2a 20 46 74 73 35 20 69 6e 64 65 78 20 6f 62  /* Fts5 index ob
2a260 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49  ject */.  int iI
2a270 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  dx,.  const char
2a280 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20   *z,            
2a290 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6b        /* Index k
2a2a0 65 79 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  ey to query for 
2a2b0 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  int n,     
2a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2d0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2a2e0 69 6e 64 65 78 20 6b 65 79 20 69 6e 20 62 79 74  index key in byt
2a2f0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  es */.  int flag
2a300 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2a310 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
2a320 20 66 6f 72 20 46 74 73 35 49 6e 64 65 78 51 75   for Fts5IndexQu
2a330 65 72 79 20 2a 2f 0a 20 20 75 36 34 20 2a 70 43  ery */.  u64 *pC
2a340 6b 73 75 6d 20 20 20 20 20 20 20 20 20 20 20 20  ksum            
2a350 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
2a360 55 54 3a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c  UT: Checksum val
2a370 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65  ue */.){.  int e
2a380 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e  Detail = p->pCon
2a390 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20  fig->eDetail;.  
2a3a0 75 36 34 20 63 6b 73 75 6d 20 3d 20 2a 70 43 6b  u64 cksum = *pCk
2a3b0 73 75 6d 3b 0a 20 20 46 74 73 35 49 6e 64 65 78  sum;.  Fts5Index
2a3c0 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b  Iter *pIter = 0;
2a3d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
2a3e0 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72  te3Fts5IndexQuer
2a3f0 79 28 70 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67 73  y(p, z, n, flags
2a400 2c 20 30 2c 20 26 70 49 74 65 72 29 3b 0a 0a 20  , 0, &pIter);.. 
2a410 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
2a420 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69  TE_OK && 0==sqli
2a430 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70  te3Fts5IterEof(p
2a440 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69 36 34  Iter) ){.    i64
2a450 20 72 6f 77 69 64 20 3d 20 70 49 74 65 72 2d 3e   rowid = pIter->
2a460 69 52 6f 77 69 64 3b 0a 0a 20 20 20 20 69 66 28  iRowid;..    if(
2a470 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44   eDetail==FTS5_D
2a480 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
2a490 20 20 20 20 63 6b 73 75 6d 20 5e 3d 20 73 71 6c      cksum ^= sql
2a4a0 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74  ite3Fts5IndexEnt
2a4b0 72 79 43 6b 73 75 6d 28 72 6f 77 69 64 2c 20 30  ryCksum(rowid, 0
2a4c0 2c 20 30 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29  , 0, iIdx, z, n)
2a4d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2a4e0 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65     Fts5PoslistRe
2a4f0 61 64 65 72 20 73 52 65 61 64 65 72 3b 0a 20 20  ader sReader;.  
2a500 20 20 20 20 66 6f 72 28 73 71 6c 69 74 65 33 46      for(sqlite3F
2a510 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
2a520 49 6e 69 74 28 70 49 74 65 72 2d 3e 70 44 61 74  Init(pIter->pDat
2a530 61 2c 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 2c  a, pIter->nData,
2a540 20 26 73 52 65 61 64 65 72 29 3b 0a 20 20 20 20   &sReader);.    
2a550 20 20 20 20 20 20 73 52 65 61 64 65 72 2e 62 45        sReader.bE
2a560 6f 66 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20  of==0;.         
2a570 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
2a580 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 73  istReaderNext(&s
2a590 52 65 61 64 65 72 29 0a 20 20 20 20 20 20 29 7b  Reader).      ){
2a5a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
2a5b0 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c  l = FTS5_POS2COL
2a5c0 55 4d 4e 28 73 52 65 61 64 65 72 2e 69 50 6f 73  UMN(sReader.iPos
2a5d0 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  );.        int i
2a5e0 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f  Off = FTS5_POS2O
2a5f0 46 46 53 45 54 28 73 52 65 61 64 65 72 2e 69 50  FFSET(sReader.iP
2a600 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73  os);.        cks
2a610 75 6d 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73  um ^= sqlite3Fts
2a620 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d  5IndexEntryCksum
2a630 28 72 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 4f  (rowid, iCol, iO
2a640 66 66 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b  ff, iIdx, z, n);
2a650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2a660 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2a670 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
2a680 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74   = sqlite3Fts5It
2a690 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a 20  erNext(pIter);. 
2a6a0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
2a6b0 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28  e3Fts5IterClose(
2a6c0 70 49 74 65 72 29 3b 0a 0a 20 20 2a 70 43 6b 73  pIter);..  *pCks
2a6d0 75 6d 20 3d 20 63 6b 73 75 6d 3b 0a 20 20 72 65  um = cksum;.  re
2a6e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
2a6f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2a700 20 69 73 20 61 6c 73 6f 20 70 75 72 65 6c 79 20   is also purely 
2a710 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74  an internal test
2a720 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f  . It does not co
2a730 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20  ntribute to .** 
2a740 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  FTS functionalit
2a750 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69  y, or even the i
2a760 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20  ntegrity-check, 
2a770 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 73  in any way..*/.s
2a780 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 54  tatic void fts5T
2a790 65 73 74 54 65 72 6d 28 0a 20 20 46 74 73 35 49  estTerm(.  Fts5I
2a7a0 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
2a7b0 42 75 66 66 65 72 20 2a 70 50 72 65 76 2c 20 20  Buffer *pPrev,  
2a7c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2a7d0 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a  revious term */.
2a7e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c    const char *z,
2a7f0 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
2a800 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6e 65    /* Possibly ne
2a810 77 20 74 65 72 6d 20 74 6f 20 74 65 73 74 20 2a  w term to test *
2a820 2f 0a 20 20 75 36 34 20 65 78 70 65 63 74 65 64  /.  u64 expected
2a830 2c 0a 20 20 75 36 34 20 2a 70 43 6b 73 75 6d 0a  ,.  u64 *pCksum.
2a840 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d  ){.  int rc = p-
2a850 3e 72 63 3b 0a 20 20 69 66 28 20 70 50 72 65 76  >rc;.  if( pPrev
2a860 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74  ->n==0 ){.    ft
2a870 73 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c  s5BufferSet(&rc,
2a880 20 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73   pPrev, n, (cons
2a890 74 20 75 38 2a 29 7a 29 3b 0a 20 20 7d 65 6c 73  t u8*)z);.  }els
2a8a0 65 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  e.  if( rc==SQLI
2a8b0 54 45 5f 4f 4b 20 26 26 20 28 70 50 72 65 76 2d  TE_OK && (pPrev-
2a8c0 3e 6e 21 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28  >n!=n || memcmp(
2a8d0 70 50 72 65 76 2d 3e 70 2c 20 7a 2c 20 6e 29 29  pPrev->p, z, n))
2a8e0 20 29 7b 0a 20 20 20 20 75 36 34 20 63 6b 73 75   ){.    u64 cksu
2a8f0 6d 33 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20  m3 = *pCksum;.  
2a900 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
2a910 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  erm = (const cha
2a920 72 2a 29 26 70 50 72 65 76 2d 3e 70 5b 31 5d 3b  r*)&pPrev->p[1];
2a930 20 20 2f 2a 20 74 65 72 6d 20 73 61 6e 73 20 70    /* term sans p
2a940 72 65 66 69 78 2d 62 79 74 65 20 2a 2f 0a 20 20  refix-byte */.  
2a950 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70 50    int nTerm = pP
2a960 72 65 76 2d 3e 6e 2d 31 3b 20 20 20 20 20 20 20  rev->n-1;       
2a970 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2a980 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a  zTerm in bytes *
2a990 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d  /.    int iIdx =
2a9a0 20 28 70 50 72 65 76 2d 3e 70 5b 30 5d 20 2d 20   (pPrev->p[0] - 
2a9b0 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58  FTS5_MAIN_PREFIX
2a9c0 29 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  );.    int flags
2a9d0 20 3d 20 28 69 49 64 78 3d 3d 30 20 3f 20 30 20   = (iIdx==0 ? 0 
2a9e0 3a 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  : FTS5INDEX_QUER
2a9f0 59 5f 50 52 45 46 49 58 29 3b 0a 20 20 20 20 75  Y_PREFIX);.    u
2aa00 36 34 20 63 6b 31 20 3d 20 30 3b 0a 20 20 20 20  64 ck1 = 0;.    
2aa10 75 36 34 20 63 6b 32 20 3d 20 30 3b 0a 0a 20 20  u64 ck2 = 0;..  
2aa20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
2aa30 74 68 65 20 72 65 73 75 6c 74 73 20 72 65 74 75  the results retu
2aa40 72 6e 65 64 20 66 6f 72 20 41 53 43 20 61 6e 64  rned for ASC and
2aa50 20 44 45 53 43 20 71 75 65 72 69 65 73 20 61 72   DESC queries ar
2aa60 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d  e.    ** the sam
2aa70 65 2e 20 49 66 20 6e 6f 74 2c 20 63 61 6c 6c 20  e. If not, call 
2aa80 74 68 69 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e  this corruption.
2aa90 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74    */.    rc = ft
2aaa0 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20  s5QueryCksum(p, 
2aab0 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  iIdx, zTerm, nTe
2aac0 72 6d 2c 20 66 6c 61 67 73 2c 20 26 63 6b 31 29  rm, flags, &ck1)
2aad0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2aae0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2aaf0 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46   int f = flags|F
2ab00 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
2ab10 45 53 43 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ESC;.      rc = 
2ab20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70  fts5QueryCksum(p
2ab30 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e  , iIdx, zTerm, n
2ab40 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a  Term, f, &ck2);.
2ab50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2ab60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
2ab70 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46  k1!=ck2 ) rc = F
2ab80 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20  TS5_CORRUPT;..  
2ab90 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
2aba0 61 20 70 72 65 66 69 78 20 71 75 65 72 79 2c 20  a prefix query, 
2abb0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 72  check that the r
2abc0 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64 20  esults returned 
2abd0 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68  if the.    ** th
2abe0 65 20 69 6e 64 65 78 20 69 73 20 64 69 73 61 62  e index is disab
2abf0 6c 65 64 20 61 72 65 20 74 68 65 20 73 61 6d 65  led are the same
2ac00 2e 20 49 6e 20 62 6f 74 68 20 41 53 43 20 61 6e  . In both ASC an
2ac10 64 20 44 45 53 43 20 6f 72 64 65 72 2e 20 0a 20  d DESC order. . 
2ac20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
2ac30 73 20 63 68 65 63 6b 20 6d 61 79 20 6f 6e 6c 79  s check may only
2ac40 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66   be performed if
2ac50 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
2ac60 69 73 20 65 6d 70 74 79 2e 20 54 68 69 73 0a 20  is empty. This. 
2ac70 20 20 20 2a 2a 20 69 73 20 62 65 63 61 75 73 65     ** is because
2ac80 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
2ac90 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 61 20  only supports a 
2aca0 73 69 6e 67 6c 65 20 73 63 61 6e 20 71 75 65 72  single scan quer
2acb0 79 20 61 74 0a 20 20 20 20 2a 2a 20 61 20 74 69  y at.    ** a ti
2acc0 6d 65 2c 20 61 6e 64 20 74 68 65 20 6d 75 6c 74  me, and the mult
2acd0 69 2d 69 74 65 72 20 6c 6f 6f 70 20 66 72 6f 6d  i-iter loop from
2ace0 20 77 68 69 63 68 20 74 68 69 73 20 66 75 6e 63   which this func
2acf0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 0a 20  tion is called. 
2ad00 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79     ** is already
2ad10 20 70 65 72 66 6f 72 6d 69 6e 67 20 73 75 63 68   performing such
2ad20 20 61 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20   a scan. */.    
2ad30 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44  if( p->nPendingD
2ad40 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ata==0 ){.      
2ad50 69 66 28 20 69 49 64 78 3e 30 20 26 26 20 72 63  if( iIdx>0 && rc
2ad60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2ad70 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66         int f = f
2ad80 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51  lags|FTS5INDEX_Q
2ad90 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 3b  UERY_TEST_NOIDX;
2ada0 0a 20 20 20 20 20 20 20 20 63 6b 32 20 3d 20 30  .        ck2 = 0
2adb0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  ;.        rc = f
2adc0 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c  ts5QueryCksum(p,
2add0 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54   iIdx, zTerm, nT
2ade0 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20  erm, f, &ck2);. 
2adf0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2ae00 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21  QLITE_OK && ck1!
2ae10 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35  =ck2 ) rc = FTS5
2ae20 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2ae30 7d 0a 20 20 20 20 20 20 69 66 28 20 69 49 64 78  }.      if( iIdx
2ae40 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  >0 && rc==SQLITE
2ae50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
2ae60 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53  nt f = flags|FTS
2ae70 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53  5INDEX_QUERY_TES
2ae80 54 5f 4e 4f 49 44 58 7c 46 54 53 35 49 4e 44 45  T_NOIDX|FTS5INDE
2ae90 58 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a 20 20  X_QUERY_DESC;.  
2aea0 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20        ck2 = 0;. 
2aeb0 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
2aec0 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49  QueryCksum(p, iI
2aed0 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  dx, zTerm, nTerm
2aee0 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20  , f, &ck2);.    
2aef0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2af00 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b  TE_OK && ck1!=ck
2af10 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f  2 ) rc = FTS5_CO
2af20 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  RRUPT;.      }. 
2af30 20 20 20 7d 0a 0a 20 20 20 20 63 6b 73 75 6d 33     }..    cksum3
2af40 20 5e 3d 20 63 6b 31 3b 0a 20 20 20 20 66 74 73   ^= ck1;.    fts
2af50 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20  5BufferSet(&rc, 
2af60 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74  pPrev, n, (const
2af70 20 75 38 2a 29 7a 29 3b 0a 0a 20 20 20 20 69 66   u8*)z);..    if
2af80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2af90 26 26 20 63 6b 73 75 6d 33 21 3d 65 78 70 65 63  && cksum3!=expec
2afa0 74 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ted ){.      rc 
2afb0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2afc0 20 20 20 20 7d 0a 20 20 20 20 2a 70 43 6b 73 75      }.    *pCksu
2afd0 6d 20 3d 20 63 6b 73 75 6d 33 3b 0a 20 20 7d 0a  m = cksum3;.  }.
2afe0 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a    p->rc = rc;.}.
2aff0 20 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65   .#else.# define
2b000 20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52 65   fts5TestDlidxRe
2b010 76 65 72 73 65 28 78 2c 79 2c 7a 29 0a 23 20 64  verse(x,y,z).# d
2b020 65 66 69 6e 65 20 66 74 73 35 54 65 73 74 54 65  efine fts5TestTe
2b030 72 6d 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a  rm(u,v,w,x,y,z).
2b040 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68  #endif../*.** Ch
2b050 65 63 6b 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20  eck that:.**.** 
2b060 20 20 31 29 20 41 6c 6c 20 6c 65 61 76 65 73 20    1) All leaves 
2b070 6f 66 20 70 53 65 67 20 62 65 74 77 65 65 6e 20  of pSeg between 
2b080 69 46 69 72 73 74 20 61 6e 64 20 69 4c 61 73 74  iFirst and iLast
2b090 20 28 69 6e 63 6c 75 73 69 76 65 29 20 65 78 69   (inclusive) exi
2b0a0 73 74 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63  st and.**      c
2b0b0 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 74 65 72 6d  ontain zero term
2b0c0 73 2e 0a 2a 2a 20 20 20 32 29 20 41 6c 6c 20 6c  s..**   2) All l
2b0d0 65 61 76 65 73 20 6f 66 20 70 53 65 67 20 62 65  eaves of pSeg be
2b0e0 74 77 65 65 6e 20 69 4e 6f 52 6f 77 69 64 20 61  tween iNoRowid a
2b0f0 6e 64 20 69 4c 61 73 74 20 28 69 6e 63 6c 75 73  nd iLast (inclus
2b100 69 76 65 29 20 65 78 69 73 74 20 61 6e 64 0a 2a  ive) exist and.*
2b110 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a  *      contain z
2b120 65 72 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73  ero rowids..*/.s
2b130 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
2b140 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
2b150 63 6b 45 6d 70 74 79 28 0a 20 20 46 74 73 35 49  ckEmpty(.  Fts5I
2b160 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53  ndex *p,.  Fts5S
2b170 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
2b180 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 53 65  *pSeg,     /* Se
2b190 67 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69  gment to check i
2b1a0 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65  nternal consiste
2b1b0 6e 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  ncy */.  int iFi
2b1c0 72 73 74 2c 0a 20 20 69 6e 74 20 69 4e 6f 52 6f  rst,.  int iNoRo
2b1d0 77 69 64 2c 0a 20 20 69 6e 74 20 69 4c 61 73 74  wid,.  int iLast
2b1e0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  .){.  int i;..  
2b1f0 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  /* Now check tha
2b200 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d 70 74  t the iter.nEmpt
2b210 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69  y leaves followi
2b220 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  ng the current l
2b230 65 61 66 0a 20 20 2a 2a 20 28 61 29 20 65 78 69  eaf.  ** (a) exi
2b240 73 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61  st and (b) conta
2b250 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a  in no terms. */.
2b260 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20    for(i=iFirst; 
2b270 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
2b280 20 26 26 20 69 3c 3d 69 4c 61 73 74 3b 20 69 2b   && i<=iLast; i+
2b290 2b 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61  +){.    Fts5Data
2b2a0 20 2a 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61   *pLeaf = fts5Da
2b2b0 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53  taRead(p, FTS5_S
2b2c0 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65  EGMENT_ROWID(pSe
2b2d0 67 2d 3e 69 53 65 67 69 64 2c 20 69 29 29 3b 0a  g->iSegid, i));.
2b2e0 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b      if( pLeaf ){
2b2f0 0a 20 20 20 20 20 20 69 66 28 20 21 66 74 73 35  .      if( !fts5
2b300 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70  LeafIsTermless(p
2b310 4c 65 61 66 29 20 29 20 70 2d 3e 72 63 20 3d 20  Leaf) ) p->rc = 
2b320 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2b330 20 20 20 20 69 66 28 20 69 3e 3d 69 4e 6f 52 6f      if( i>=iNoRo
2b340 77 69 64 20 26 26 20 30 21 3d 66 74 73 35 4c 65  wid && 0!=fts5Le
2b350 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28  afFirstRowidOff(
2b360 70 4c 65 61 66 29 20 29 20 70 2d 3e 72 63 20 3d  pLeaf) ) p->rc =
2b370 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2b380 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74     }.    fts5Dat
2b390 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
2b3a0 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
2b3b0 6f 69 64 20 66 74 73 35 49 6e 74 65 67 72 69 74  oid fts5Integrit
2b3c0 79 43 68 65 63 6b 50 67 69 64 78 28 46 74 73 35  yCheckPgidx(Fts5
2b3d0 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 61  Index *p, Fts5Da
2b3e0 74 61 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69 6e  ta *pLeaf){.  in
2b3f0 74 20 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a  t iTermOff = 0;.
2b400 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 46 74 73    int ii;..  Fts
2b410 35 42 75 66 66 65 72 20 62 75 66 31 20 3d 20 7b  5Buffer buf1 = {
2b420 30 2c 30 2c 30 7d 3b 0a 20 20 46 74 73 35 42 75  0,0,0};.  Fts5Bu
2b430 66 66 65 72 20 62 75 66 32 20 3d 20 7b 30 2c 30  ffer buf2 = {0,0
2b440 2c 30 7d 3b 0a 0a 20 20 69 69 20 3d 20 70 4c 65  ,0};..  ii = pLe
2b450 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 77 68  af->szLeaf;.  wh
2b460 69 6c 65 28 20 69 69 3c 70 4c 65 61 66 2d 3e 6e  ile( ii<pLeaf->n
2b470 6e 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  n && p->rc==SQLI
2b480 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
2b490 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 69 4f   res;.    int iO
2b4a0 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 63  ff;.    int nInc
2b4b0 72 3b 0a 0a 20 20 20 20 69 69 20 2b 3d 20 66 74  r;..    ii += ft
2b4c0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
2b4d0 4c 65 61 66 2d 3e 70 5b 69 69 5d 2c 20 6e 49 6e  Leaf->p[ii], nIn
2b4e0 63 72 29 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66  cr);.    iTermOf
2b4f0 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20 20 20  f += nIncr;.    
2b500 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
2b510 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d  ..    if( iOff>=
2b520 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
2b530 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46  .      p->rc = F
2b540 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2b550 20 7d 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d   }else if( iTerm
2b560 4f 66 66 3d 3d 6e 49 6e 63 72 20 29 7b 0a 20 20  Off==nIncr ){.  
2b570 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20      int nByte;. 
2b580 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
2b590 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
2b5a0 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42  eaf->p[iOff], nB
2b5b0 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  yte);.      if( 
2b5c0 28 69 4f 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65  (iOff+nByte)>pLe
2b5d0 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
2b5e0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
2b5f0 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2b600 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2b610 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
2b620 70 2d 3e 72 63 2c 20 26 62 75 66 31 2c 20 6e 42  p->rc, &buf1, nB
2b630 79 74 65 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69  yte, &pLeaf->p[i
2b640 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Off]);.      }. 
2b650 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b660 69 6e 74 20 6e 4b 65 65 70 2c 20 6e 42 79 74 65  int nKeep, nByte
2b670 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
2b680 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
2b690 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
2b6a0 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 69   nKeep);.      i
2b6b0 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
2b6c0 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70  rint32(&pLeaf->p
2b6d0 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a  [iOff], nByte);.
2b6e0 20 20 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3e        if( nKeep>
2b6f0 62 75 66 31 2e 6e 20 7c 7c 20 28 69 4f 66 66 2b  buf1.n || (iOff+
2b700 6e 42 79 74 65 29 3e 70 4c 65 61 66 2d 3e 73 7a  nByte)>pLeaf->sz
2b710 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
2b720 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2b730 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RUPT;.      }els
2b740 65 7b 0a 20 20 20 20 20 20 20 20 62 75 66 31 2e  e{.        buf1.
2b750 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20  n = nKeep;.     
2b760 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
2b770 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
2b780 26 62 75 66 31 2c 20 6e 42 79 74 65 2c 20 26 70  &buf1, nByte, &p
2b790 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a  Leaf->p[iOff]);.
2b7a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
2b7b0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
2b7c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2b7d0 65 73 20 3d 20 66 74 73 35 42 75 66 66 65 72 43  es = fts5BufferC
2b7e0 6f 6d 70 61 72 65 28 26 62 75 66 31 2c 20 26 62  ompare(&buf1, &b
2b7f0 75 66 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66  uf2);.        if
2b800 28 20 72 65 73 3c 3d 30 20 29 20 70 2d 3e 72 63  ( res<=0 ) p->rc
2b810 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2b820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2b830 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
2b840 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 32 2c 20  (&p->rc, &buf2, 
2b850 62 75 66 31 2e 6e 2c 20 62 75 66 31 2e 70 29 3b  buf1.n, buf1.p);
2b860 0a 20 20 7d 0a 0a 20 20 66 74 73 35 42 75 66 66  .  }..  fts5Buff
2b870 65 72 46 72 65 65 28 26 62 75 66 31 29 3b 0a 20  erFree(&buf1);. 
2b880 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
2b890 26 62 75 66 32 29 3b 0a 7d 0a 0a 73 74 61 74 69  &buf2);.}..stati
2b8a0 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
2b8b0 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53 65  IntegrityCheckSe
2b8c0 67 6d 65 6e 74 28 0a 20 20 46 74 73 35 49 6e 64  gment(.  Fts5Ind
2b8d0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
2b8e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
2b8f0 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
2b900 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
2b910 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
2b920 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
2b930 74 6f 20 63 68 65 63 6b 20 69 6e 74 65 72 6e 61  to check interna
2b940 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f  l consistency */
2b950 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  .){.  Fts5Config
2b960 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
2b970 43 6f 6e 66 69 67 3b 0a 20 20 73 71 6c 69 74 65  Config;.  sqlite
2b980 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
2b990 30 3b 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  0;.  int rc2;.  
2b9a0 69 6e 74 20 69 49 64 78 50 72 65 76 4c 65 61 66  int iIdxPrevLeaf
2b9b0 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72   = pSeg->pgnoFir
2b9c0 73 74 2d 31 3b 0a 20 20 69 6e 74 20 69 44 6c 69  st-1;.  int iDli
2b9d0 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65  dxPrevLeaf = pSe
2b9e0 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 0a 20 20  g->pgnoLast;..  
2b9f0 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69  if( pSeg->pgnoFi
2ba00 72 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  rst==0 ) return;
2ba10 0a 0a 20 20 66 74 73 35 49 6e 64 65 78 50 72 65  ..  fts5IndexPre
2ba20 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 53 74  pareStmt(p, &pSt
2ba30 6d 74 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  mt, sqlite3_mpri
2ba40 6e 74 66 28 0a 20 20 20 20 20 20 22 53 45 4c 45  ntf(.      "SELE
2ba50 43 54 20 73 65 67 69 64 2c 20 74 65 72 6d 2c 20  CT segid, term, 
2ba60 28 70 67 6e 6f 3e 3e 31 29 2c 20 28 70 67 6e 6f  (pgno>>1), (pgno
2ba70 26 31 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  &1) FROM %Q.'%q_
2ba80 69 64 78 27 20 57 48 45 52 45 20 73 65 67 69 64  idx' WHERE segid
2ba90 3d 25 64 22 2c 0a 20 20 20 20 20 20 70 43 6f 6e  =%d",.      pCon
2baa0 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
2bab0 67 2d 3e 7a 4e 61 6d 65 2c 20 70 53 65 67 2d 3e  g->zName, pSeg->
2bac0 69 53 65 67 69 64 0a 20 20 29 29 3b 0a 0a 20 20  iSegid.  ));..  
2bad0 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  /* Iterate throu
2bae0 67 68 20 74 68 65 20 62 2d 74 72 65 65 20 68 69  gh the b-tree hi
2baf0 65 72 61 72 63 68 79 2e 20 20 2a 2f 0a 20 20 77  erarchy.  */.  w
2bb00 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
2bb10 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
2bb20 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
2bb30 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
2bb40 20 69 36 34 20 69 52 6f 77 3b 20 20 20 20 20 20   i64 iRow;      
2bb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bb60 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73  * Rowid for this
2bb70 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 46 74 73   leaf */.    Fts
2bb80 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20  5Data *pLeaf;   
2bb90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
2bba0 74 61 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66  ta for this leaf
2bbb0 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 6e 49 64   */..    int nId
2bbc0 78 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 5f  xTerm = sqlite3_
2bbd0 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
2bbe0 6d 74 2c 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73  mt, 1);.    cons
2bbf0 74 20 63 68 61 72 20 2a 7a 49 64 78 54 65 72 6d  t char *zIdxTerm
2bc00 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
2bc10 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2bc20 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20  ext(pStmt, 1);. 
2bc30 20 20 20 69 6e 74 20 69 49 64 78 4c 65 61 66 20     int iIdxLeaf 
2bc40 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2bc50 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a  _int(pStmt, 2);.
2bc60 20 20 20 20 69 6e 74 20 62 49 64 78 44 6c 69 64      int bIdxDlid
2bc70 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  x = sqlite3_colu
2bc80 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33 29  mn_int(pStmt, 3)
2bc90 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2bca0 20 6c 65 61 66 20 69 6e 20 71 75 65 73 74 69 6f   leaf in questio
2bcb0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
2bcc0 65 6e 20 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20  en trimmed from 
2bcd0 74 68 65 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20  the segment, .  
2bce0 20 20 2a 2a 20 69 67 6e 6f 72 65 20 74 68 69 73    ** ignore this
2bcf0 20 62 2d 74 72 65 65 20 65 6e 74 72 79 2e 20 4f   b-tree entry. O
2bd00 74 68 65 72 77 69 73 65 2c 20 6c 6f 61 64 20 69  therwise, load i
2bd10 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a  t into memory. *
2bd20 2f 0a 20 20 20 20 69 66 28 20 69 49 64 78 4c 65  /.    if( iIdxLe
2bd30 61 66 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  af<pSeg->pgnoFir
2bd40 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  st ) continue;. 
2bd50 20 20 20 69 52 6f 77 20 3d 20 46 54 53 35 5f 53     iRow = FTS5_S
2bd60 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65  EGMENT_ROWID(pSe
2bd70 67 2d 3e 69 53 65 67 69 64 2c 20 69 49 64 78 4c  g->iSegid, iIdxL
2bd80 65 61 66 29 3b 0a 20 20 20 20 70 4c 65 61 66 20  eaf);.    pLeaf 
2bd90 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
2bda0 2c 20 69 52 6f 77 29 3b 0a 20 20 20 20 69 66 28  , iRow);.    if(
2bdb0 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61   pLeaf==0 ) brea
2bdc0 6b 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  k;..    /* Check
2bdd0 20 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 63   that the leaf c
2bde0 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74  ontains at least
2bdf0 20 6f 6e 65 20 74 65 72 6d 2c 20 61 6e 64 20 74   one term, and t
2be00 68 61 74 20 69 74 20 69 73 20 65 71 75 61 6c 0a  hat it is equal.
2be10 20 20 20 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72      ** to or lar
2be20 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 70 6c  ger than the spl
2be30 69 74 2d 6b 65 79 20 69 6e 20 7a 49 64 78 54 65  it-key in zIdxTe
2be40 72 6d 2e 20 20 41 6c 73 6f 20 63 68 65 63 6b 20  rm.  Also check 
2be50 74 68 61 74 20 69 66 20 74 68 65 72 65 0a 20 20  that if there.  
2be60 20 20 2a 2a 20 69 73 20 61 6c 73 6f 20 61 20 72    ** is also a r
2be70 6f 77 69 64 20 70 6f 69 6e 74 65 72 20 77 69 74  owid pointer wit
2be80 68 69 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67  hin the leaf pag
2be90 65 20 68 65 61 64 65 72 2c 20 69 74 20 70 6f 69  e header, it poi
2bea0 6e 74 73 20 74 6f 20 61 0a 20 20 20 20 2a 2a 20  nts to a.    ** 
2beb0 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20  location before 
2bec0 74 68 65 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20  the term.  */.  
2bed0 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3c    if( pLeaf->nn<
2bee0 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  =pLeaf->szLeaf )
2bef0 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
2bf00 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2bf10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
2bf20 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20  nt iOff;        
2bf30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
2bf40 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 65  fset of first te
2bf50 72 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20  rm on leaf */.  
2bf60 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66      int iRowidOf
2bf70 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
2bf80 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72  /* Offset of fir
2bf90 73 74 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66  st rowid on leaf
2bfa0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 54   */.      int nT
2bfb0 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
2bfc0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2bfd0 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e   term on leaf in
2bfe0 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20   bytes */.      
2bff0 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20  int res;        
2c000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2c010 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 65 72  omparison of ter
2c020 6d 20 61 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20  m and split-key 
2c030 2a 2f 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d  */..      iOff =
2c040 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65   fts5LeafFirstTe
2c050 72 6d 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20  rmOff(pLeaf);.  
2c060 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20      iRowidOff = 
2c070 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77  fts5LeafFirstRow
2c080 69 64 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20  idOff(pLeaf);.  
2c090 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66      if( iRowidOf
2c0a0 66 3e 3d 69 4f 66 66 20 29 7b 0a 20 20 20 20 20  f>=iOff ){.     
2c0b0 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
2c0c0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
2c0d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f  else{.        iO
2c0e0 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
2c0f0 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b  int32(&pLeaf->p[
2c100 69 4f 66 66 5d 2c 20 6e 54 65 72 6d 29 3b 0a 20  iOff], nTerm);. 
2c110 20 20 20 20 20 20 20 72 65 73 20 3d 20 6d 65 6d         res = mem
2c120 63 6d 70 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  cmp(&pLeaf->p[iO
2c130 66 66 5d 2c 20 7a 49 64 78 54 65 72 6d 2c 20 4d  ff], zIdxTerm, M
2c140 49 4e 28 6e 54 65 72 6d 2c 20 6e 49 64 78 54 65  IN(nTerm, nIdxTe
2c150 72 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rm));.        if
2c160 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d  ( res==0 ) res =
2c170 20 6e 54 65 72 6d 20 2d 20 6e 49 64 78 54 65 72   nTerm - nIdxTer
2c180 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  m;.        if( r
2c190 65 73 3c 30 20 29 20 70 2d 3e 72 63 20 3d 20 46  es<0 ) p->rc = F
2c1a0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2c1b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 35     }..      fts5
2c1c0 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 50 67  IntegrityCheckPg
2c1d0 69 64 78 28 70 2c 20 70 4c 65 61 66 29 3b 0a 20  idx(p, pLeaf);. 
2c1e0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74     }.    fts5Dat
2c1f0 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
2c200 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29  .    if( p->rc )
2c210 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
2c220 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
2c230 68 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c  he iter.nEmpty l
2c240 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  eaves following 
2c250 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
2c260 0a 20 20 20 20 2a 2a 20 28 61 29 20 65 78 69 73  .    ** (a) exis
2c270 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69  t and (b) contai
2c280 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20  n no terms. */. 
2c290 20 20 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65     fts5IndexInte
2c2a0 67 72 69 74 79 43 68 65 63 6b 45 6d 70 74 79 28  grityCheckEmpty(
2c2b0 0a 20 20 20 20 20 20 20 20 70 2c 20 70 53 65 67  .        p, pSeg
2c2c0 2c 20 69 49 64 78 50 72 65 76 4c 65 61 66 2b 31  , iIdxPrevLeaf+1
2c2d0 2c 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66  , iDlidxPrevLeaf
2c2e0 2b 31 2c 20 69 49 64 78 4c 65 61 66 2d 31 0a 20  +1, iIdxLeaf-1. 
2c2f0 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d     );.    if( p-
2c300 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  >rc ) break;..  
2c310 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
2c320 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
2c330 2c 20 63 68 65 63 6b 20 74 68 61 74 20 69 74 20  , check that it 
2c340 6c 6f 6f 6b 73 20 72 69 67 68 74 2e 20 2a 2f 0a  looks right. */.
2c350 20 20 20 20 69 66 28 20 62 49 64 78 44 6c 69 64      if( bIdxDlid
2c360 78 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 44  x ){.      Fts5D
2c370 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
2c380 20 3d 20 30 3b 20 20 2f 2a 20 46 6f 72 20 69 74   = 0;  /* For it
2c390 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
2c3a0 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f  doclist index */
2c3b0 0a 20 20 20 20 20 20 69 6e 74 20 69 50 72 65 76  .      int iPrev
2c3c0 4c 65 61 66 20 3d 20 69 49 64 78 4c 65 61 66 3b  Leaf = iIdxLeaf;
2c3d0 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 69  .      int iSegi
2c3e0 64 20 3d 20 70 53 65 67 2d 3e 69 53 65 67 69 64  d = pSeg->iSegid
2c3f0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 67 20  ;.      int iPg 
2c400 3d 20 30 3b 0a 20 20 20 20 20 20 69 36 34 20 69  = 0;.      i64 i
2c410 4b 65 79 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  Key;..      for(
2c420 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78  pDlidx=fts5Dlidx
2c430 49 74 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69  IterInit(p, 0, i
2c440 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29  Segid, iIdxLeaf)
2c450 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
2c460 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
2c470 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20  pDlidx)==0;.    
2c480 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
2c490 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64  terNext(p, pDlid
2c4a0 78 29 0a 20 20 20 20 20 20 29 7b 0a 0a 20 20 20  x).      ){..   
2c4b0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 61 6e       /* Check an
2c4c0 79 20 72 6f 77 69 64 2d 6c 65 73 73 20 70 61 67  y rowid-less pag
2c4d0 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 62 65  es that occur be
2c4e0 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  fore the current
2c4f0 20 6c 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20   leaf. */.      
2c500 20 20 66 6f 72 28 69 50 67 3d 69 50 72 65 76 4c    for(iPg=iPrevL
2c510 65 61 66 2b 31 3b 20 69 50 67 3c 66 74 73 35 44  eaf+1; iPg<fts5D
2c520 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
2c530 69 64 78 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20  idx); iPg++){.  
2c540 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46          iKey = F
2c550 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
2c560 44 28 69 53 65 67 69 64 2c 20 69 50 67 29 3b 0a  D(iSegid, iPg);.
2c570 20 20 20 20 20 20 20 20 20 20 70 4c 65 61 66 20            pLeaf 
2c580 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
2c590 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  , iKey);.       
2c5a0 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a     if( pLeaf ){.
2c5b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2c5c0 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77  fts5LeafFirstRow
2c5d0 69 64 4f 66 66 28 70 4c 65 61 66 29 21 3d 30 20  idOff(pLeaf)!=0 
2c5e0 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43  ) p->rc = FTS5_C
2c5f0 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
2c600 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
2c610 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  ase(pLeaf);.    
2c620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c630 7d 0a 20 20 20 20 20 20 20 20 69 50 72 65 76 4c  }.        iPrevL
2c640 65 61 66 20 3d 20 66 74 73 35 44 6c 69 64 78 49  eaf = fts5DlidxI
2c650 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b  terPgno(pDlidx);
2c660 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  ..        /* Che
2c670 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61 66  ck that the leaf
2c680 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20   page indicated 
2c690 62 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  by the iterator 
2c6a0 72 65 61 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20  really does.    
2c6b0 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74      ** contain t
2c6c0 68 65 20 72 6f 77 69 64 20 73 75 67 67 65 73 74  he rowid suggest
2c6d0 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 2e 20  ed by the same. 
2c6e0 2a 2f 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20  */.        iKey 
2c6f0 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
2c700 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69 50 72  OWID(iSegid, iPr
2c710 65 76 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  evLeaf);.       
2c720 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
2c730 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a  aRead(p, iKey);.
2c740 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
2c750 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  f ){.          i
2c760 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20  64 iRowid;.     
2c770 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f       int iRowidO
2c780 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72  ff = fts5LeafFir
2c790 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66  stRowidOff(pLeaf
2c7a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 41 53 53  );.          ASS
2c7b0 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c  ERT_SZLEAF_OK(pL
2c7c0 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eaf);.          
2c7d0 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d 70  if( iRowidOff>=p
2c7e0 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
2c7f0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72              p->r
2c800 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2c810 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2c820 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  e{.            f
2c830 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c  ts5GetVarint(&pL
2c840 65 61 66 2d 3e 70 5b 69 52 6f 77 69 64 4f 66 66  eaf->p[iRowidOff
2c850 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64  ], (u64*)&iRowid
2c860 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2c870 66 28 20 69 52 6f 77 69 64 21 3d 66 74 73 35 44  f( iRowid!=fts5D
2c880 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44  lidxIterRowid(pD
2c890 6c 69 64 78 29 20 29 20 70 2d 3e 72 63 20 3d 20  lidx) ) p->rc = 
2c8a0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2c8b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c8c0 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
2c8d0 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  ase(pLeaf);.    
2c8e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
2c8f0 20 20 20 20 20 69 44 6c 69 64 78 50 72 65 76 4c       iDlidxPrevL
2c900 65 61 66 20 3d 20 69 50 67 3b 0a 20 20 20 20 20  eaf = iPg;.     
2c910 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
2c920 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  ee(pDlidx);.    
2c930 20 20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52    fts5TestDlidxR
2c940 65 76 65 72 73 65 28 70 2c 20 69 53 65 67 69 64  everse(p, iSegid
2c950 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a 20 20 20  , iIdxLeaf);.   
2c960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 44   }else{.      iD
2c970 6c 69 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70  lidxPrevLeaf = p
2c980 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20  Seg->pgnoLast;. 
2c990 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68       /* TODO: Ch
2c9a0 65 63 6b 20 74 68 65 72 65 20 69 73 20 6e 6f 20  eck there is no 
2c9b0 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f  doclist index */
2c9c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 49 64 78  .    }..    iIdx
2c9d0 50 72 65 76 4c 65 61 66 20 3d 20 69 49 64 78 4c  PrevLeaf = iIdxL
2c9e0 65 61 66 3b 0a 20 20 7d 0a 0a 20 20 72 63 32 20  eaf;.  }..  rc2 
2c9f0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
2ca00 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  ze(pStmt);.  if(
2ca10 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
2ca20 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b  K ) p->rc = rc2;
2ca30 0a 0a 20 20 2f 2a 20 50 61 67 65 20 69 74 65 72  ..  /* Page iter
2ca40 2e 69 4c 65 61 66 20 6d 75 73 74 20 6e 6f 77 20  .iLeaf must now 
2ca50 62 65 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74  be the rightmost
2ca60 20 6c 65 61 66 2d 70 61 67 65 20 69 6e 20 74 68   leaf-page in th
2ca70 65 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 23 69 66  e segment */.#if
2ca80 20 30 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d   0.  if( p->rc==
2ca90 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 74 65  SQLITE_OK && ite
2caa0 72 2e 69 4c 65 61 66 21 3d 70 53 65 67 2d 3e 70  r.iLeaf!=pSeg->p
2cab0 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70  gnoLast ){.    p
2cac0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2cad0 55 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  UPT;.  }.#endif.
2cae0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 69 6e  }.../*.** Run in
2caf0 74 65 72 6e 61 6c 20 63 68 65 63 6b 73 20 74 6f  ternal checks to
2cb00 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
2cb10 20 46 54 53 20 69 6e 64 65 78 20 28 61 29 20 69   FTS index (a) i
2cb20 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a  s internally .**
2cb30 20 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20   consistent and 
2cb40 28 62 29 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74  (b) contains ent
2cb50 72 69 65 73 20 66 6f 72 20 77 68 69 63 68 20 74  ries for which t
2cb60 68 65 20 58 4f 52 20 6f 66 20 74 68 65 20 63 68  he XOR of the ch
2cb70 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 73 20 63 61  ecksums.** as ca
2cb80 6c 63 75 6c 61 74 65 64 20 62 79 20 73 71 6c 69  lculated by sqli
2cb90 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72  te3Fts5IndexEntr
2cba0 79 43 6b 73 75 6d 28 29 20 69 73 20 63 6b 73 75  yCksum() is cksu
2cbb0 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  m..**.** Return 
2cbc0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
2cbd0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 69 6e 74  f any of the int
2cbe0 65 72 6e 61 6c 20 63 68 65 63 6b 73 20 66 61 69  ernal checks fai
2cbf0 6c 2c 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20  l, or if the.** 
2cc00 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e 6f  checksum does no
2cc10 74 20 6d 61 74 63 68 2e 20 52 65 74 75 72 6e 20  t match. Return 
2cc20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
2cc30 20 63 68 65 63 6b 73 20 70 61 73 73 20 77 69 74   checks pass wit
2cc40 68 6f 75 74 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f  hout.** error, o
2cc50 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 53 51 4c  r some other SQL
2cc60 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
2cc70 66 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20  f another error 
2cc80 28 65 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63  (e.g. OOM).** oc
2cc90 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  curs..*/.int sql
2cca0 69 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 74  ite3Fts5IndexInt
2ccb0 65 67 72 69 74 79 43 68 65 63 6b 28 46 74 73 35  egrityCheck(Fts5
2ccc0 49 6e 64 65 78 20 2a 70 2c 20 75 36 34 20 63 6b  Index *p, u64 ck
2ccd0 73 75 6d 29 7b 0a 20 20 69 6e 74 20 65 44 65 74  sum){.  int eDet
2cce0 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  ail = p->pConfig
2ccf0 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 75 36 34  ->eDetail;.  u64
2cd00 20 63 6b 73 75 6d 32 20 3d 20 30 3b 20 20 20 20   cksum2 = 0;    
2cd10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cd20 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f  Checksum based o
2cd30 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e  n contents of in
2cd40 64 65 78 65 73 20 2a 2f 0a 20 20 46 74 73 35 42  dexes */.  Fts5B
2cd50 75 66 66 65 72 20 70 6f 73 6c 69 73 74 20 3d 20  uffer poslist = 
2cd60 7b 30 2c 30 2c 30 7d 3b 20 20 20 2f 2a 20 42 75  {0,0,0};   /* Bu
2cd70 66 66 65 72 20 75 73 65 64 20 74 6f 20 68 6f 6c  ffer used to hol
2cd80 64 20 61 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20  d a poslist */. 
2cd90 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
2cda0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cdb0 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
2cdc0 61 74 65 20 74 68 72 6f 75 67 68 20 65 6e 74 69  ate through enti
2cdd0 72 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74  re index */.  Ft
2cde0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
2cdf0 72 75 63 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  ruct;         /*
2ce00 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
2ce10 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
2ce20 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 55 73  TE_DEBUG.  /* Us
2ce30 65 64 20 62 79 20 65 78 74 72 61 20 69 6e 74 65  ed by extra inte
2ce40 72 6e 61 6c 20 74 65 73 74 73 20 6f 6e 6c 79 20  rnal tests only 
2ce50 72 75 6e 20 69 66 20 4e 44 45 42 55 47 20 69 73  run if NDEBUG is
2ce60 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 2a 2f 0a   not defined */.
2ce70 20 20 75 36 34 20 63 6b 73 75 6d 33 20 3d 20 30    u64 cksum3 = 0
2ce80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ce90 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61    /* Checksum ba
2cea0 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20  sed on contents 
2ceb0 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  of indexes */.  
2cec0 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 20  Fts5Buffer term 
2ced0 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20  = {0,0,0};      
2cee0 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 74  /* Buffer used t
2cef0 6f 20 68 6f 6c 64 20 6d 6f 73 74 20 72 65 63 65  o hold most rece
2cf00 6e 74 20 74 65 72 6d 20 2a 2f 0a 23 65 6e 64 69  nt term */.#endi
2cf10 66 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c  f.  const int fl
2cf20 61 67 73 20 3d 20 46 54 53 35 49 4e 44 45 58 5f  ags = FTS5INDEX_
2cf30 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54 3b 0a  QUERY_NOOUTPUT;.
2cf40 20 20 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65    .  /* Load the
2cf50 20 46 54 53 20 69 6e 64 65 78 20 73 74 72 75 63   FTS index struc
2cf60 74 75 72 65 20 2a 2f 0a 20 20 70 53 74 72 75 63  ture */.  pStruc
2cf70 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
2cf80 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 2f 2a 20  eRead(p);..  /* 
2cf90 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 69  Check that the i
2cfa0 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20 6f 66  nternal nodes of
2cfb0 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 6d 61   each segment ma
2cfc0 74 63 68 20 74 68 65 20 6c 65 61 76 65 73 20 2a  tch the leaves *
2cfd0 2f 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20  /.  if( pStruct 
2cfe0 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c  ){.    int iLvl,
2cff0 20 69 53 65 67 3b 0a 20 20 20 20 66 6f 72 28 69   iSeg;.    for(i
2d000 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72  Lvl=0; iLvl<pStr
2d010 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
2d020 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  l++){.      for(
2d030 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74  iSeg=0; iSeg<pSt
2d040 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
2d050 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29  l].nSeg; iSeg++)
2d060 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 53 74  {.        Fts5St
2d070 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
2d080 70 53 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d  pSeg = &pStruct-
2d090 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53  >aLevel[iLvl].aS
2d0a0 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20  eg[iSeg];.      
2d0b0 20 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67    fts5IndexInteg
2d0c0 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65 6e 74  rityCheckSegment
2d0d0 28 70 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20  (p, pSeg);.     
2d0e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2d0f0 2f 2a 20 54 68 65 20 63 6b 73 75 6d 20 61 72 67  /* The cksum arg
2d100 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
2d110 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2d120 20 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63   a checksum calc
2d130 75 6c 61 74 65 64 0a 20 20 2a 2a 20 62 61 73 65  ulated.  ** base
2d140 64 20 6f 6e 20 61 6c 6c 20 65 78 70 65 63 74 65  d on all expecte
2d150 64 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  d entries in the
2d160 20 46 54 53 20 69 6e 64 65 78 20 28 69 6e 63 6c   FTS index (incl
2d170 75 64 69 6e 67 20 70 72 65 66 69 78 20 69 6e 64  uding prefix ind
2d180 65 78 0a 20 20 2a 2a 20 65 6e 74 72 69 65 73 29  ex.  ** entries)
2d190 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 68 65  . This block che
2d1a0 63 6b 73 20 74 68 61 74 20 61 20 63 68 65 63 6b  cks that a check
2d1b0 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 20 62  sum calculated b
2d1c0 61 73 65 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  ased on the.  **
2d1d0 20 61 63 74 75 61 6c 20 63 6f 6e 74 65 6e 74 73   actual contents
2d1e0 20 6f 66 20 46 54 53 20 69 6e 64 65 78 20 69 73   of FTS index is
2d1f0 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a   identical..  **
2d200 0a 20 20 2a 2a 20 54 77 6f 20 76 65 72 73 69 6f  .  ** Two versio
2d210 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 63  ns of the same c
2d220 68 65 63 6b 73 75 6d 20 61 72 65 20 63 61 6c 63  hecksum are calc
2d230 75 6c 61 74 65 64 2e 20 54 68 65 20 66 69 72 73  ulated. The firs
2d240 74 20 28 73 74 61 63 6b 0a 20 20 2a 2a 20 76 61  t (stack.  ** va
2d250 72 69 61 62 6c 65 20 63 6b 73 75 6d 32 29 20 62  riable cksum2) b
2d260 61 73 65 64 20 6f 6e 20 65 6e 74 72 69 65 73 20  ased on entries 
2d270 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
2d280 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  he full-text ind
2d290 65 78 0a 20 20 2a 2a 20 77 68 69 6c 65 20 64 6f  ex.  ** while do
2d2a0 69 6e 67 20 61 20 6c 69 6e 65 61 72 20 73 63 61  ing a linear sca
2d2b0 6e 20 6f 66 20 65 61 63 68 20 69 6e 64 69 76 69  n of each indivi
2d2c0 64 75 61 6c 20 69 6e 64 65 78 20 69 6e 20 74 75  dual index in tu
2d2d0 72 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  rn. .  **.  ** A
2d2e0 73 20 65 61 63 68 20 74 65 72 6d 20 76 69 73 69  s each term visi
2d2f0 74 65 64 20 62 79 20 74 68 65 20 6c 69 6e 65 61  ted by the linea
2d300 72 20 73 63 61 6e 73 2c 20 61 20 73 65 70 61 72  r scans, a separ
2d310 61 74 65 20 71 75 65 72 79 20 66 6f 72 20 74 68  ate query for th
2d320 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 65 72 6d  e.  ** same term
2d330 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 63   is performed. c
2d340 6b 73 75 6d 33 20 69 73 20 63 61 6c 63 75 6c 61  ksum3 is calcula
2d350 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
2d360 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 65 78   entries.  ** ex
2d370 74 72 61 63 74 65 64 20 62 79 20 74 68 65 73 65  tracted by these
2d380 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20   queries..  */. 
2d390 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74   for(fts5MultiIt
2d3a0 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74  erNew(p, pStruct
2d3b0 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 30  , flags, 0, 0, 0
2d3c0 2c 20 2d 31 2c 20 30 2c 20 26 70 49 74 65 72 29  , -1, 0, &pIter)
2d3d0 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  ;.      fts5Mult
2d3e0 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65  iIterEof(p, pIte
2d3f0 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73  r)==0;.      fts
2d400 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
2d410 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20  , pIter, 0, 0). 
2d420 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20   ){.    int n;  
2d430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d440 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
2d450 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  erm in bytes */.
2d460 20 20 20 20 69 36 34 20 69 50 6f 73 20 3d 20 30      i64 iPos = 0
2d470 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d480 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 72 65 61 64  /* Position read
2d490 20 66 72 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f   from poslist */
2d4a0 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  .    int iOff = 
2d4b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2d4c0 20 2f 2a 20 4f 66 66 73 65 74 20 77 69 74 68 69   /* Offset withi
2d4d0 6e 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20  n poslist */.   
2d4e0 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74   i64 iRowid = ft
2d4f0 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64  s5MultiIterRowid
2d500 28 70 49 74 65 72 29 3b 0a 20 20 20 20 63 68 61  (pIter);.    cha
2d510 72 20 2a 7a 20 3d 20 28 63 68 61 72 2a 29 66 74  r *z = (char*)ft
2d520 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28  s5MultiIterTerm(
2d530 70 49 74 65 72 2c 20 26 6e 29 3b 0a 0a 20 20 20  pIter, &n);..   
2d540 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2d550 20 6e 65 77 20 74 65 72 6d 2c 20 71 75 65 72 79   new term, query
2d560 20 66 6f 72 20 69 74 2e 20 55 70 64 61 74 65 20   for it. Update 
2d570 63 6b 73 75 6d 33 20 77 69 74 68 20 74 68 65 20  cksum3 with the 
2d580 72 65 73 75 6c 74 73 2e 20 2a 2f 0a 20 20 20 20  results. */.    
2d590 66 74 73 35 54 65 73 74 54 65 72 6d 28 70 2c 20  fts5TestTerm(p, 
2d5a0 26 74 65 72 6d 2c 20 7a 2c 20 6e 2c 20 63 6b 73  &term, z, n, cks
2d5b0 75 6d 32 2c 20 26 63 6b 73 75 6d 33 29 3b 0a 0a  um2, &cksum3);..
2d5c0 20 20 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d      if( eDetail=
2d5d0 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e  =FTS5_DETAIL_NON
2d5e0 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30  E ){.      if( 0
2d5f0 3d 3d 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49  ==fts5MultiIterI
2d600 73 45 6d 70 74 79 28 70 2c 20 70 49 74 65 72 29  sEmpty(p, pIter)
2d610 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6b 73 75   ){.        cksu
2d620 6d 32 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73  m2 ^= sqlite3Fts
2d630 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d  5IndexEntryCksum
2d640 28 69 52 6f 77 69 64 2c 20 30 2c 20 30 2c 20 2d  (iRowid, 0, 0, -
2d650 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  1, z, n);.      
2d660 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2d670 20 20 20 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30     poslist.n = 0
2d680 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 69  ;.      fts5Segi
2d690 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20 26 70  terPoslist(p, &p
2d6a0 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72  Iter->aSeg[pIter
2d6b0 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
2d6c0 73 74 5d 2c 20 30 2c 20 26 70 6f 73 6c 69 73 74  st], 0, &poslist
2d6d0 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
2d6e0 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 50 6f  0==sqlite3Fts5Po
2d6f0 73 6c 69 73 74 4e 65 78 74 36 34 28 70 6f 73 6c  slistNext64(posl
2d700 69 73 74 2e 70 2c 20 70 6f 73 6c 69 73 74 2e 6e  ist.p, poslist.n
2d710 2c 20 26 69 4f 66 66 2c 20 26 69 50 6f 73 29 20  , &iOff, &iPos) 
2d720 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
2d730 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32 43  Col = FTS5_POS2C
2d740 4f 4c 55 4d 4e 28 69 50 6f 73 29 3b 0a 20 20 20  OLUMN(iPos);.   
2d750 20 20 20 20 20 69 6e 74 20 69 54 6f 6b 4f 66 66       int iTokOff
2d760 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53   = FTS5_POS2OFFS
2d770 45 54 28 69 50 6f 73 29 3b 0a 20 20 20 20 20 20  ET(iPos);.      
2d780 20 20 63 6b 73 75 6d 32 20 5e 3d 20 73 71 6c 69    cksum2 ^= sqli
2d790 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72  te3Fts5IndexEntr
2d7a0 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 69  yCksum(iRowid, i
2d7b0 43 6f 6c 2c 20 69 54 6f 6b 4f 66 66 2c 20 2d 31  Col, iTokOff, -1
2d7c0 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  , z, n);.      }
2d7d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73  .    }.  }.  fts
2d7e0 35 54 65 73 74 54 65 72 6d 28 70 2c 20 26 74 65  5TestTerm(p, &te
2d7f0 72 6d 2c 20 30 2c 20 30 2c 20 63 6b 73 75 6d 32  rm, 0, 0, cksum2
2d800 2c 20 26 63 6b 73 75 6d 33 29 3b 0a 0a 20 20 66  , &cksum3);..  f
2d810 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
2d820 28 70 49 74 65 72 29 3b 0a 20 20 69 66 28 20 70  (pIter);.  if( p
2d830 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
2d840 26 26 20 63 6b 73 75 6d 21 3d 63 6b 73 75 6d 32  && cksum!=cksum2
2d850 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
2d860 43 4f 52 52 55 50 54 3b 0a 0a 20 20 66 74 73 35  CORRUPT;..  fts5
2d870 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
2d880 28 70 53 74 72 75 63 74 29 3b 0a 23 69 66 64 65  (pStruct);.#ifde
2d890 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
2d8a0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
2d8b0 26 74 65 72 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  &term);.#endif. 
2d8c0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
2d8d0 26 70 6f 73 6c 69 73 74 29 3b 0a 20 20 72 65 74  &poslist);.  ret
2d8e0 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
2d8f0 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  urn(p);.}../****
2d900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d940 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
2d950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d990 0a 2a 2a 20 42 65 6c 6f 77 20 74 68 69 73 20 70  .** Below this p
2d9a0 6f 69 6e 74 20 69 73 20 74 68 65 20 69 6d 70 6c  oint is the impl
2d9b0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
2d9c0 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20  e fts5_decode() 
2d9d0 73 63 61 6c 61 72 0a 2a 2a 20 66 75 6e 63 74 69  scalar.** functi
2d9e0 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f 0a 0a 2f 2a 0a  on only..*/../*.
2d9f0 2a 2a 20 44 65 63 6f 64 65 20 61 20 73 65 67 6d  ** Decode a segm
2da00 65 6e 74 2d 64 61 74 61 20 72 6f 77 69 64 20 66  ent-data rowid f
2da10 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74  rom the %_data t
2da20 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
2da30 69 6f 6e 20 69 73 0a 2a 2a 20 74 68 65 20 6f 70  ion is.** the op
2da40 70 6f 73 69 74 65 20 6f 66 20 6d 61 63 72 6f 20  posite of macro 
2da50 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
2da60 49 44 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ID()..*/.static 
2da70 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 52  void fts5DecodeR
2da80 6f 77 69 64 28 0a 20 20 69 36 34 20 69 52 6f 77  owid(.  i64 iRow
2da90 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
2daa0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
2dab0 20 66 72 6f 6d 20 25 5f 64 61 74 61 20 74 61 62   from %_data tab
2dac0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 53  le */.  int *piS
2dad0 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  egid,           
2dae0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2daf0 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20  Segment id */.  
2db00 69 6e 74 20 2a 70 62 44 6c 69 64 78 2c 20 20 20  int *pbDlidx,   
2db10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db20 2f 2a 20 4f 55 54 3a 20 44 6c 69 64 78 20 66 6c  /* OUT: Dlidx fl
2db30 61 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 48  ag */.  int *piH
2db40 65 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  eight,          
2db50 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2db60 48 65 69 67 68 74 20 2a 2f 0a 20 20 69 6e 74 20  Height */.  int 
2db70 2a 70 69 50 67 6e 6f 20 20 20 20 20 20 20 20 20  *piPgno         
2db80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2db90 55 54 3a 20 50 61 67 65 20 6e 75 6d 62 65 72 20  UT: Page number 
2dba0 2a 2f 0a 29 7b 0a 20 20 2a 70 69 50 67 6e 6f 20  */.){.  *piPgno 
2dbb0 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26  = (int)(iRowid &
2dbc0 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53   (((i64)1 << FTS
2dbd0 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 20 2d  5_DATA_PAGE_B) -
2dbe0 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e   1));.  iRowid >
2dbf0 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47  >= FTS5_DATA_PAG
2dc00 45 5f 42 3b 0a 0a 20 20 2a 70 69 48 65 69 67 68  E_B;..  *piHeigh
2dc10 74 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64  t = (int)(iRowid
2dc20 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46   & (((i64)1 << F
2dc30 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f  TS5_DATA_HEIGHT_
2dc40 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77  B) - 1));.  iRow
2dc50 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41  id >>= FTS5_DATA
2dc60 5f 48 45 49 47 48 54 5f 42 3b 0a 0a 20 20 2a 70  _HEIGHT_B;..  *p
2dc70 62 44 6c 69 64 78 20 3d 20 28 69 6e 74 29 28 69  bDlidx = (int)(i
2dc80 52 6f 77 69 64 20 26 20 30 78 30 30 30 31 29 3b  Rowid & 0x0001);
2dc90 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54  .  iRowid >>= FT
2dca0 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 3b 0a 0a  S5_DATA_DLI_B;..
2dcb0 20 20 2a 70 69 53 65 67 69 64 20 3d 20 28 69 6e    *piSegid = (in
2dcc0 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69  t)(iRowid & (((i
2dcd0 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54  64)1 << FTS5_DAT
2dce0 41 5f 49 44 5f 42 29 20 2d 20 31 29 29 3b 0a 7d  A_ID_B) - 1));.}
2dcf0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
2dd00 73 35 44 65 62 75 67 52 6f 77 69 64 28 69 6e 74  s5DebugRowid(int
2dd10 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66 65   *pRc, Fts5Buffe
2dd20 72 20 2a 70 42 75 66 2c 20 69 36 34 20 69 4b 65  r *pBuf, i64 iKe
2dd30 79 29 7b 0a 20 20 69 6e 74 20 69 53 65 67 69 64  y){.  int iSegid
2dd40 2c 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e 6f  , iHeight, iPgno
2dd50 2c 20 62 44 6c 69 64 78 3b 20 20 20 20 20 20 20  , bDlidx;       
2dd60 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 65 6e 65  /* Rowid compene
2dd70 6e 74 73 20 2a 2f 0a 20 20 66 74 73 35 44 65 63  nts */.  fts5Dec
2dd80 6f 64 65 52 6f 77 69 64 28 69 4b 65 79 2c 20 26  odeRowid(iKey, &
2dd90 69 53 65 67 69 64 2c 20 26 62 44 6c 69 64 78 2c  iSegid, &bDlidx,
2dda0 20 26 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e   &iHeight, &iPgn
2ddb0 6f 29 3b 0a 0a 20 20 69 66 28 20 69 53 65 67 69  o);..  if( iSegi
2ddc0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  d==0 ){.    if( 
2ddd0 69 4b 65 79 3d 3d 46 54 53 35 5f 41 56 45 52 41  iKey==FTS5_AVERA
2dde0 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  GES_ROWID ){.   
2ddf0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2de00 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2de10 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 61 76  (pRc, pBuf, "{av
2de20 65 72 61 67 65 73 7d 20 22 29 3b 0a 20 20 20 20  erages} ");.    
2de30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
2de40 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2de50 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
2de60 70 42 75 66 2c 20 22 7b 73 74 72 75 63 74 75 72  pBuf, "{structur
2de70 65 7d 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e}");.    }.  }.
2de80 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69    else{.    sqli
2de90 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2dea0 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2deb0 42 75 66 2c 20 22 7b 25 73 73 65 67 69 64 3d 25  Buf, "{%ssegid=%
2dec0 64 20 68 3d 25 64 20 70 67 6e 6f 3d 25 64 7d 22  d h=%d pgno=%d}"
2ded0 2c 0a 20 20 20 20 20 20 20 20 62 44 6c 69 64 78  ,.        bDlidx
2dee0 20 3f 20 22 64 6c 69 64 78 20 22 20 3a 20 22 22   ? "dlidx " : ""
2def0 2c 20 69 53 65 67 69 64 2c 20 69 48 65 69 67 68  , iSegid, iHeigh
2df00 74 2c 20 69 50 67 6e 6f 0a 20 20 20 20 29 3b 0a  t, iPgno.    );.
2df10 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
2df20 69 64 20 66 74 73 35 44 65 62 75 67 53 74 72 75  id fts5DebugStru
2df30 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52  cture(.  int *pR
2df40 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2df50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
2df60 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  UT: error code *
2df70 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
2df80 70 42 75 66 2c 0a 20 20 46 74 73 35 53 74 72 75  pBuf,.  Fts5Stru
2df90 63 74 75 72 65 20 2a 70 0a 29 7b 0a 20 20 69 6e  cture *p.){.  in
2dfa0 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 20 20 20  t iLvl, iSeg;   
2dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dfc0 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
2dfd0 20 6c 65 76 65 6c 73 2c 20 73 65 67 6d 65 6e 74   levels, segment
2dfe0 73 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 4c 76 6c  s */..  for(iLvl
2dff0 3d 30 3b 20 69 4c 76 6c 3c 70 2d 3e 6e 4c 65 76  =0; iLvl<p->nLev
2e000 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
2e010 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
2e020 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 2d 3e  vel *pLvl = &p->
2e030 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
2e040 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2e050 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2e060 70 52 63 2c 20 70 42 75 66 2c 20 0a 20 20 20 20  pRc, pBuf, .    
2e070 20 20 20 20 22 20 7b 6c 76 6c 3d 25 64 20 6e 4d      " {lvl=%d nM
2e080 65 72 67 65 3d 25 64 20 6e 53 65 67 3d 25 64 22  erge=%d nSeg=%d"
2e090 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 2d 3e 6e 4d  , iLvl, pLvl->nM
2e0a0 65 72 67 65 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67  erge, pLvl->nSeg
2e0b0 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 6f 72 28  .    );.    for(
2e0c0 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76  iSeg=0; iSeg<pLv
2e0d0 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29  l->nSeg; iSeg++)
2e0e0 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  {.      Fts5Stru
2e0f0 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
2e100 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67  eg = &pLvl->aSeg
2e110 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 73 71  [iSeg];.      sq
2e120 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2e130 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
2e140 20 70 42 75 66 2c 20 22 20 7b 69 64 3d 25 64 20   pBuf, " {id=%d 
2e150 6c 65 61 76 65 73 3d 25 64 2e 2e 25 64 7d 22 2c  leaves=%d..%d}",
2e160 20 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 67   .          pSeg
2e170 2d 3e 69 53 65 67 69 64 2c 20 70 53 65 67 2d 3e  ->iSegid, pSeg->
2e180 70 67 6e 6f 46 69 72 73 74 2c 20 70 53 65 67 2d  pgnoFirst, pSeg-
2e190 3e 70 67 6e 6f 4c 61 73 74 0a 20 20 20 20 20 20  >pgnoLast.      
2e1a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2e1b0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2e1c0 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
2e1d0 70 42 75 66 2c 20 22 7d 22 29 3b 0a 20 20 7d 0a  pBuf, "}");.  }.
2e1e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
2e1f0 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 74 73   part of the fts
2e200 35 5f 64 65 63 6f 64 65 28 29 20 64 65 62 75 67  5_decode() debug
2e210 67 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a 2a 2a 20  ging aid..**.** 
2e220 41 72 67 75 6d 65 6e 74 73 20 70 42 6c 6f 62 2f  Arguments pBlob/
2e230 6e 42 6c 6f 62 20 63 6f 6e 74 61 69 6e 20 61 20  nBlob contain a 
2e240 73 65 72 69 61 6c 69 7a 65 64 20 46 74 73 35 53  serialized Fts5S
2e250 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 2e  tructure object.
2e260 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
2e270 6e 20 61 70 70 65 6e 64 73 20 61 20 68 75 6d 61  n appends a huma
2e280 6e 2d 72 65 61 64 61 62 6c 65 20 72 65 70 72 65  n-readable repre
2e290 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
2e2a0 20 73 61 6d 65 20 6f 62 6a 65 63 74 0a 2a 2a 20   same object.** 
2e2b0 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 61  to the buffer pa
2e2c0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2e2d0 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f  nd argument. .*/
2e2e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
2e2f0 35 44 65 63 6f 64 65 53 74 72 75 63 74 75 72 65  5DecodeStructure
2e300 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20  (.  int *pRc,   
2e310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e320 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65      /* IN/OUT: e
2e330 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46  rror code */.  F
2e340 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
2e350 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c  .  const u8 *pBl
2e360 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b  ob, int nBlob.){
2e370 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2e380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e390 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2e3a0 65 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  e */.  Fts5Struc
2e3b0 74 75 72 65 20 2a 70 20 3d 20 30 3b 20 20 20 20  ture *p = 0;    
2e3c0 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6f 64 65         /* Decode
2e3d0 64 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65  d structure obje
2e3e0 63 74 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74  ct */..  rc = ft
2e3f0 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64  s5StructureDecod
2e400 65 28 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20  e(pBlob, nBlob, 
2e410 30 2c 20 26 70 29 3b 0a 20 20 69 66 28 20 72 63  0, &p);.  if( rc
2e420 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e430 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20     *pRc = rc;.  
2e440 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
2e450 20 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74   fts5DebugStruct
2e460 75 72 65 28 70 52 63 2c 20 70 42 75 66 2c 20 70  ure(pRc, pBuf, p
2e470 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  );.  fts5Structu
2e480 72 65 52 65 6c 65 61 73 65 28 70 29 3b 0a 7d 0a  reRelease(p);.}.
2e490 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 70  ./*.** This is p
2e4a0 61 72 74 20 6f 66 20 74 68 65 20 66 74 73 35 5f  art of the fts5_
2e4b0 64 65 63 6f 64 65 28 29 20 64 65 62 75 67 67 69  decode() debuggi
2e4c0 6e 67 20 61 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72  ng aid..**.** Ar
2e4d0 67 75 6d 65 6e 74 73 20 70 42 6c 6f 62 2f 6e 42  guments pBlob/nB
2e4e0 6c 6f 62 20 63 6f 6e 74 61 69 6e 20 61 6e 20 22  lob contain an "
2e4f0 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64  averages" record
2e500 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2e510 0a 2a 2a 20 61 70 70 65 6e 64 73 20 61 20 68 75  .** appends a hu
2e520 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 72 65 70  man-readable rep
2e530 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72  resentation of r
2e540 65 63 6f 72 64 20 74 6f 20 74 68 65 20 62 75 66  ecord to the buf
2e550 66 65 72 20 70 61 73 73 65 64 20 0a 2a 2a 20 61  fer passed .** a
2e560 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
2e570 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69  ument. .*/.stati
2e580 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64  c void fts5Decod
2e590 65 41 76 65 72 61 67 65 73 28 0a 20 20 69 6e 74  eAverages(.  int
2e5a0 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
2e5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e5c0 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f  IN/OUT: error co
2e5d0 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  de */.  Fts5Buff
2e5e0 65 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73  er *pBuf,.  cons
2e5f0 74 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74  t u8 *pBlob, int
2e600 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20   nBlob.){.  int 
2e610 69 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63  i = 0;.  const c
2e620 68 61 72 20 2a 7a 53 70 61 63 65 20 3d 20 22 22  har *zSpace = ""
2e630 3b 0a 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 42  ;..  while( i<nB
2e640 6c 6f 62 20 29 7b 0a 20 20 20 20 75 36 34 20 69  lob ){.    u64 i
2e650 56 61 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71  Val;.    i += sq
2e660 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
2e670 6e 74 28 26 70 42 6c 6f 62 5b 69 5d 2c 20 26 69  nt(&pBlob[i], &i
2e680 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
2e690 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2e6a0 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2e6b0 66 2c 20 22 25 73 25 64 22 2c 20 7a 53 70 61 63  f, "%s%d", zSpac
2e6c0 65 2c 20 28 69 6e 74 29 69 56 61 6c 29 3b 0a 20  e, (int)iVal);. 
2e6d0 20 20 20 7a 53 70 61 63 65 20 3d 20 22 20 22 3b     zSpace = " ";
2e6e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75  .  }.}../*.** Bu
2e6f0 66 66 65 72 20 28 61 2f 6e 29 20 69 73 20 61 73  ffer (a/n) is as
2e700 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  sumed to contain
2e710 20 61 20 6c 69 73 74 20 6f 66 20 73 65 72 69 61   a list of seria
2e720 6c 69 7a 65 64 20 76 61 72 69 6e 74 73 2e 20 52  lized varints. R
2e730 65 61 64 0a 2a 2a 20 65 61 63 68 20 76 61 72 69  ead.** each vari
2e740 6e 74 20 61 6e 64 20 61 70 70 65 6e 64 20 69 74  nt and append it
2e750 73 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  s string represe
2e760 6e 74 61 74 69 6f 6e 20 74 6f 20 62 75 66 66 65  ntation to buffe
2e770 72 20 70 42 75 66 2e 20 52 65 74 75 72 6e 0a 2a  r pBuf. Return.*
2e780 2a 20 61 66 74 65 72 20 65 69 74 68 65 72 20 74  * after either t
2e790 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72 20  he input buffer 
2e7a0 69 73 20 65 78 68 61 75 73 74 65 64 20 6f 72 20  is exhausted or 
2e7b0 61 20 30 20 76 61 6c 75 65 20 69 73 20 72 65 61  a 0 value is rea
2e7c0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
2e7d0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
2e7e0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
2e7f0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69   read from the i
2e800 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a  nput buffer..*/.
2e810 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
2e820 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 69 6e 74  ecodePoslist(int
2e830 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66 65   *pRc, Fts5Buffe
2e840 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75  r *pBuf, const u
2e850 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  8 *a, int n){.  
2e860 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20  int iOff = 0;.  
2e870 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b  while( iOff<n ){
2e880 0a 20 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20  .    int iVal;. 
2e890 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
2e8a0 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
2e8b0 66 66 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20  ff], iVal);.    
2e8c0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2e8d0 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
2e8e0 63 2c 20 70 42 75 66 2c 20 22 20 25 64 22 2c 20  c, pBuf, " %d", 
2e8f0 69 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74  iVal);.  }.  ret
2e900 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a  urn iOff;.}../*.
2e910 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66 20  ** The start of 
2e920 62 75 66 66 65 72 20 28 61 2f 6e 29 20 63 6f 6e  buffer (a/n) con
2e930 74 61 69 6e 73 20 74 68 65 20 73 74 61 72 74 20  tains the start 
2e940 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68  of a doclist. Th
2e950 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61 79  e doclist.** may
2e960 20 6f 72 20 6d 61 79 20 6e 6f 74 20 66 69 6e 69   or may not fini
2e970 73 68 20 77 69 74 68 69 6e 20 74 68 65 20 62 75  sh within the bu
2e980 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  ffer. This funct
2e990 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 74 65  ion appends a te
2e9a0 78 74 0a 2a 2a 20 72 65 70 72 65 73 65 6e 74 61  xt.** representa
2e9b0 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 74  tion of the part
2e9c0 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20   of the doclist 
2e9d0 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74 20  that is present 
2e9e0 74 6f 20 62 75 66 66 65 72 0a 2a 2a 20 70 42 75  to buffer.** pBu
2e9f0 66 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  f. .**.** The re
2ea00 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
2ea10 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
2ea20 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
2ea30 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f  input buffer..*/
2ea40 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
2ea50 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 69 6e  DecodeDoclist(in
2ea60 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66  t *pRc, Fts5Buff
2ea70 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20  er *pBuf, const 
2ea80 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20  u8 *a, int n){. 
2ea90 20 69 36 34 20 69 44 6f 63 69 64 20 3d 20 30 3b   i64 iDocid = 0;
2eaa0 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b  .  int iOff = 0;
2eab0 0a 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  ..  if( n>0 ){. 
2eac0 20 20 20 69 4f 66 66 20 3d 20 73 71 6c 69 74 65     iOff = sqlite
2ead0 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 61  3Fts5GetVarint(a
2eae0 2c 20 28 75 36 34 2a 29 26 69 44 6f 63 69 64 29  , (u64*)&iDocid)
2eaf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
2eb00 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2eb10 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
2eb20 20 69 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69   id=%lld", iDoci
2eb30 64 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  d);.  }.  while(
2eb40 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69   iOff<n ){.    i
2eb50 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 69 6e 74  nt nPos;.    int
2eb60 20 62 44 65 6c 3b 0a 20 20 20 20 69 4f 66 66 20   bDel;.    iOff 
2eb70 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73  += fts5GetPoslis
2eb80 74 53 69 7a 65 28 26 61 5b 69 4f 66 66 5d 2c 20  tSize(&a[iOff], 
2eb90 26 6e 50 6f 73 2c 20 26 62 44 65 6c 29 3b 0a 20  &nPos, &bDel);. 
2eba0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2ebb0 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2ebc0 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 6e 50  (pRc, pBuf, " nP
2ebd0 6f 73 3d 25 64 25 73 22 2c 20 6e 50 6f 73 2c 20  os=%d%s", nPos, 
2ebe0 62 44 65 6c 3f 22 2a 22 3a 22 22 29 3b 0a 20 20  bDel?"*":"");.  
2ebf0 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65    iOff += fts5De
2ec00 63 6f 64 65 50 6f 73 6c 69 73 74 28 70 52 63 2c  codePoslist(pRc,
2ec10 20 70 42 75 66 2c 20 26 61 5b 69 4f 66 66 5d 2c   pBuf, &a[iOff],
2ec20 20 4d 49 4e 28 6e 2d 69 4f 66 66 2c 20 6e 50 6f   MIN(n-iOff, nPo
2ec30 73 29 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66  s));.    if( iOf
2ec40 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34  f<n ){.      i64
2ec50 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 69   iDelta;.      i
2ec60 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  Off += sqlite3Ft
2ec70 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
2ec80 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  Off], (u64*)&iDe
2ec90 6c 74 61 29 3b 0a 20 20 20 20 20 20 69 44 6f 63  lta);.      iDoc
2eca0 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20  id += iDelta;.  
2ecb0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2ecc0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2ecd0 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 69  f(pRc, pBuf, " i
2ece0 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29  d=%lld", iDocid)
2ecf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
2ed00 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f  eturn iOff;.}../
2ed10 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2ed20 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  on is part of th
2ed30 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20  e fts5_decode() 
2ed40 64 65 62 75 67 67 69 6e 67 20 66 75 6e 63 74 69  debugging functi
2ed50 6f 6e 2e 20 49 74 20 69 73 20 0a 2a 2a 20 6f 6e  on. It is .** on
2ed60 6c 79 20 65 76 65 72 20 75 73 65 64 20 77 69 74  ly ever used wit
2ed70 68 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 74 61  h detail=none ta
2ed80 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 42 75 66 66  bles..**.** Buff
2ed90 65 72 20 28 70 44 61 74 61 2f 6e 44 61 74 61 29  er (pData/nData)
2eda0 20 63 6f 6e 74 61 69 6e 73 20 61 20 64 6f 63 6c   contains a docl
2edb0 69 73 74 20 69 6e 20 74 68 65 20 66 6f 72 6d 61  ist in the forma
2edc0 74 20 75 73 65 64 20 62 79 20 64 65 74 61 69 6c  t used by detail
2edd0 3d 6e 6f 6e 65 0a 2a 2a 20 74 61 62 6c 65 73 2e  =none.** tables.
2ede0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
2edf0 70 70 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72  ppends a human-r
2ee00 65 61 64 61 62 6c 65 20 76 65 72 73 69 6f 6e 20  eadable version 
2ee10 6f 66 20 74 68 61 74 20 6c 69 73 74 20 74 6f 0a  of that list to.
2ee20 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  ** buffer pBuf..
2ee30 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73  **.** If *pRc is
2ee40 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
2ee50 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20  TE_OK when this 
2ee60 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2ee70 65 64 2c 20 69 74 20 69 73 20 61 0a 2a 2a 20 6e  ed, it is a.** n
2ee80 6f 2d 6f 70 2e 20 49 66 20 61 6e 20 4f 4f 4d 20  o-op. If an OOM 
2ee90 6f 72 20 6f 74 68 65 72 20 65 72 72 6f 72 20 6f  or other error o
2eea0 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 69  ccurs within thi
2eeb0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 2a 70 52 63  s function, *pRc
2eec0 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 61 6e   is.** set to an
2eed0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
2eee0 64 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  de before return
2eef0 69 6e 67 2e 20 54 68 65 20 66 69 6e 61 6c 20 73  ing. The final s
2ef00 74 61 74 65 20 6f 66 20 62 75 66 66 65 72 0a 2a  tate of buffer.*
2ef10 2a 20 70 42 75 66 20 69 73 20 75 6e 64 65 66 69  * pBuf is undefi
2ef20 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
2ef30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2ef40 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64   fts5DecodeRowid
2ef50 4c 69 73 74 28 0a 20 20 69 6e 74 20 2a 70 52 63  List(.  int *pRc
2ef60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ef70 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
2ef80 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f  T: Error code */
2ef90 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
2efa0 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
2efb0 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
2efc0 61 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20 2a  append text to *
2efd0 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44  /.  const u8 *pD
2efe0 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 20 20  ata, int nData  
2eff0 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 64      /* Data to d
2f000 65 63 6f 64 65 20 6c 69 73 74 2d 6f 66 2d 72 6f  ecode list-of-ro
2f010 77 69 64 73 20 66 72 6f 6d 20 2a 2f 0a 29 7b 0a  wids from */.){.
2f020 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
2f030 36 34 20 69 52 6f 77 69 64 20 3d 20 30 3b 0a 0a  64 iRowid = 0;..
2f040 20 20 77 68 69 6c 65 28 20 69 3c 6e 44 61 74 61    while( i<nData
2f050 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2f060 61 72 20 2a 7a 41 70 70 20 3d 20 22 22 3b 0a 20  ar *zApp = "";. 
2f070 20 20 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20     u64 iVal;.   
2f080 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73   i += sqlite3Fts
2f090 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74  5GetVarint(&pDat
2f0a0 61 5b 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20  a[i], &iVal);.  
2f0b0 20 20 69 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c    iRowid += iVal
2f0c0 3b 0a 0a 20 20 20 20 69 66 28 20 69 3c 6e 44 61  ;..    if( i<nDa
2f0d0 74 61 20 26 26 20 70 44 61 74 61 5b 69 5d 3d 3d  ta && pData[i]==
2f0e0 30 78 30 30 20 29 7b 0a 20 20 20 20 20 20 69 2b  0x00 ){.      i+
2f0f0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e  +;.      if( i<n
2f100 44 61 74 61 20 26 26 20 70 44 61 74 61 5b 69 5d  Data && pData[i]
2f110 3d 3d 30 78 30 30 20 29 7b 0a 20 20 20 20 20 20  ==0x00 ){.      
2f120 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7a    i++;.        z
2f130 41 70 70 20 3d 20 22 2b 22 3b 0a 20 20 20 20 20  App = "+";.     
2f140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f150 7a 41 70 70 20 3d 20 22 2a 22 3b 0a 20 20 20 20  zApp = "*";.    
2f160 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73    }.    }..    s
2f170 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2f180 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2f190 2c 20 70 42 75 66 2c 20 22 20 25 6c 6c 64 25 73  , pBuf, " %lld%s
2f1a0 22 2c 20 69 52 6f 77 69 64 2c 20 7a 41 70 70 29  ", iRowid, zApp)
2f1b0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
2f1c0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
2f1d0 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65  n of user-define
2f1e0 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  d scalar functio
2f1f0 6e 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 2e  n fts5_decode().
2f200 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2f210 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69  fts5DecodeFuncti
2f220 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  on(.  sqlite3_co
2f230 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20  ntext *pCtx,    
2f240 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
2f250 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a  n call context *
2f260 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
2f270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f280 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2f290 20 61 72 67 73 20 28 61 6c 77 61 79 73 20 32 29   args (always 2)
2f2a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
2f2b0 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20  lue **apVal     
2f2c0 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
2f2d0 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  n arguments */.)
2f2e0 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20  {.  i64 iRowid; 
2f2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f300 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72      /* Rowid for
2f310 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65   record being de
2f320 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  coded */.  int i
2f330 53 65 67 69 64 2c 69 48 65 69 67 68 74 2c 69 50  Segid,iHeight,iP
2f340 67 6e 6f 2c 62 44 6c 69 64 78 3b 2f 2a 20 52 6f  gno,bDlidx;/* Ro
2f350 77 69 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a  wid components *
2f360 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 42  /.  const u8 *aB
2f370 6c 6f 62 3b 20 69 6e 74 20 6e 3b 20 20 20 20 20  lob; int n;     
2f380 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 6f      /* Record to
2f390 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20   decode */.  u8 
2f3a0 2a 61 20 3d 20 30 3b 0a 20 20 46 74 73 35 42 75  *a = 0;.  Fts5Bu
2f3b0 66 66 65 72 20 73 3b 20 20 20 20 20 20 20 20 20  ffer s;         
2f3c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 69            /* Bui
2f3d0 6c 64 20 75 70 20 74 65 78 74 20 74 6f 20 72 65  ld up text to re
2f3e0 74 75 72 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  turn here */.  i
2f3f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2f400 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
2f410 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2f420 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 20 3d 20  .  int nSpace = 
2f430 30 3b 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c  0;.  int eDetail
2f440 4e 6f 6e 65 20 3d 20 28 73 71 6c 69 74 65 33 5f  None = (sqlite3_
2f450 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 21  user_data(pCtx)!
2f460 3d 30 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  =0);..  assert( 
2f470 6e 41 72 67 3d 3d 32 20 29 3b 0a 20 20 55 4e 55  nArg==2 );.  UNU
2f480 53 45 44 5f 50 41 52 41 4d 28 6e 41 72 67 29 3b  SED_PARAM(nArg);
2f490 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c  .  memset(&s, 0,
2f4a0 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
2f4b0 65 72 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3d  er));.  iRowid =
2f4c0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
2f4d0 6e 74 36 34 28 61 70 56 61 6c 5b 30 5d 29 3b 0a  nt64(apVal[0]);.
2f4e0 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70  .  /* Make a cop
2f4f0 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  y of the second 
2f500 61 72 67 75 6d 65 6e 74 20 28 61 20 62 6c 6f 62  argument (a blob
2f510 29 20 69 6e 20 61 42 6c 6f 62 5b 5d 2e 20 54 68  ) in aBlob[]. Th
2f520 65 20 61 42 6c 6f 62 5b 5d 0a 20 20 2a 2a 20 63  e aBlob[].  ** c
2f530 6f 70 79 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20  opy is followed 
2f540 62 79 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52  by FTS5_DATA_ZER
2f550 4f 5f 50 41 44 44 49 4e 47 20 30 78 30 30 20 62  O_PADDING 0x00 b
2f560 79 74 65 73 2c 20 77 68 69 63 68 20 70 72 65 76  ytes, which prev
2f570 65 6e 74 73 0a 20 20 2a 2a 20 62 75 66 66 65 72  ents.  ** buffer
2f580 20 6f 76 65 72 72 65 61 64 73 20 65 76 65 6e 20   overreads even 
2f590 69 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  if the record is
2f5a0 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20   corrupt.  */.  
2f5b0 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
2f5c0 65 5f 62 79 74 65 73 28 61 70 56 61 6c 5b 31 5d  e_bytes(apVal[1]
2f5d0 29 3b 0a 20 20 61 42 6c 6f 62 20 3d 20 73 71 6c  );.  aBlob = sql
2f5e0 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
2f5f0 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 6e 53 70  apVal[1]);.  nSp
2f600 61 63 65 20 3d 20 6e 20 2b 20 46 54 53 35 5f 44  ace = n + FTS5_D
2f610 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47  ATA_ZERO_PADDING
2f620 3b 0a 20 20 61 20 3d 20 28 75 38 2a 29 73 71 6c  ;.  a = (u8*)sql
2f630 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
2f640 72 6f 28 26 72 63 2c 20 6e 53 70 61 63 65 29 3b  ro(&rc, nSpace);
2f650 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 20 67 6f  .  if( a==0 ) go
2f660 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20  to decode_out;. 
2f670 20 6d 65 6d 63 70 79 28 61 2c 20 61 42 6c 6f 62   memcpy(a, aBlob
2f680 2c 20 6e 29 3b 0a 0a 0a 20 20 66 74 73 35 44 65  , n);...  fts5De
2f690 63 6f 64 65 52 6f 77 69 64 28 69 52 6f 77 69 64  codeRowid(iRowid
2f6a0 2c 20 26 69 53 65 67 69 64 2c 20 26 62 44 6c 69  , &iSegid, &bDli
2f6b0 64 78 2c 20 26 69 48 65 69 67 68 74 2c 20 26 69  dx, &iHeight, &i
2f6c0 50 67 6e 6f 29 3b 0a 0a 20 20 66 74 73 35 44 65  Pgno);..  fts5De
2f6d0 62 75 67 52 6f 77 69 64 28 26 72 63 2c 20 26 73  bugRowid(&rc, &s
2f6e0 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 69 66 28  , iRowid);.  if(
2f6f0 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 46   bDlidx ){.    F
2f700 74 73 35 44 61 74 61 20 64 6c 69 64 78 3b 0a 20  ts5Data dlidx;. 
2f710 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20     Fts5DlidxLvl 
2f720 6c 76 6c 3b 0a 0a 20 20 20 20 64 6c 69 64 78 2e  lvl;..    dlidx.
2f730 70 20 3d 20 61 3b 0a 20 20 20 20 64 6c 69 64 78  p = a;.    dlidx
2f740 2e 6e 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 6d 65  .nn = n;..    me
2f750 6d 73 65 74 28 26 6c 76 6c 2c 20 30 2c 20 73 69  mset(&lvl, 0, si
2f760 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76  zeof(Fts5DlidxLv
2f770 6c 29 29 3b 0a 20 20 20 20 6c 76 6c 2e 70 44 61  l));.    lvl.pDa
2f780 74 61 20 3d 20 26 64 6c 69 64 78 3b 0a 20 20 20  ta = &dlidx;.   
2f790 20 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 20 3d   lvl.iLeafPgno =
2f7a0 20 69 50 67 6e 6f 3b 0a 0a 20 20 20 20 66 6f 72   iPgno;..    for
2f7b0 28 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78  (fts5DlidxLvlNex
2f7c0 74 28 26 6c 76 6c 29 3b 20 6c 76 6c 2e 62 45 6f  t(&lvl); lvl.bEo
2f7d0 66 3d 3d 30 3b 20 66 74 73 35 44 6c 69 64 78 4c  f==0; fts5DlidxL
2f7e0 76 6c 4e 65 78 74 28 26 6c 76 6c 29 29 7b 0a 20  vlNext(&lvl)){. 
2f7f0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
2f800 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2f810 74 66 28 26 72 63 2c 20 26 73 2c 20 0a 20 20 20  tf(&rc, &s, .   
2f820 20 20 20 20 20 20 20 22 20 25 64 28 25 6c 6c 64         " %d(%lld
2f830 29 22 2c 20 6c 76 6c 2e 69 4c 65 61 66 50 67 6e  )", lvl.iLeafPgn
2f840 6f 2c 20 6c 76 6c 2e 69 52 6f 77 69 64 0a 20 20  o, lvl.iRowid.  
2f850 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
2f860 65 6c 73 65 20 69 66 28 20 69 53 65 67 69 64 3d  else if( iSegid=
2f870 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 52  =0 ){.    if( iR
2f880 6f 77 69 64 3d 3d 46 54 53 35 5f 41 56 45 52 41  owid==FTS5_AVERA
2f890 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  GES_ROWID ){.   
2f8a0 20 20 20 66 74 73 35 44 65 63 6f 64 65 41 76 65     fts5DecodeAve
2f8b0 72 61 67 65 73 28 26 72 63 2c 20 26 73 2c 20 61  rages(&rc, &s, a
2f8c0 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
2f8d0 0a 20 20 20 20 20 20 66 74 73 35 44 65 63 6f 64  .      fts5Decod
2f8e0 65 53 74 72 75 63 74 75 72 65 28 26 72 63 2c 20  eStructure(&rc, 
2f8f0 26 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d  &s, a, n);.    }
2f900 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65  .  }else if( eDe
2f910 74 61 69 6c 4e 6f 6e 65 20 29 7b 0a 20 20 20 20  tailNone ){.    
2f920 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b  Fts5Buffer term;
2f930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f940 20 43 75 72 72 65 6e 74 20 74 65 72 6d 20 72 65   Current term re
2f950 61 64 20 66 72 6f 6d 20 70 61 67 65 20 2a 2f 0a  ad from page */.
2f960 20 20 20 20 69 6e 74 20 73 7a 4c 65 61 66 3b 0a      int szLeaf;.
2f970 20 20 20 20 69 6e 74 20 69 50 67 69 64 78 4f 66      int iPgidxOf
2f980 66 20 3d 20 73 7a 4c 65 61 66 20 3d 20 66 74 73  f = szLeaf = fts
2f990 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a  5GetU16(&a[2]);.
2f9a0 20 20 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66      int iTermOff
2f9b0 3b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 20  ;.    int nKeep 
2f9c0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66  = 0;.    int iOf
2f9d0 66 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  f;..    memset(&
2f9e0 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  term, 0, sizeof(
2f9f0 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20  Fts5Buffer));.. 
2fa00 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 61 6e 79     /* Decode any
2fa10 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63   entries that oc
2fa20 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20 66  cur before the f
2fa30 69 72 73 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  irst term. */.  
2fa40 20 20 69 66 28 20 73 7a 4c 65 61 66 3c 6e 20 29    if( szLeaf<n )
2fa50 7b 0a 20 20 20 20 20 20 69 50 67 69 64 78 4f 66  {.      iPgidxOf
2fa60 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
2fa70 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66  nt32(&a[iPgidxOf
2fa80 66 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20  f], iTermOff);. 
2fa90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2faa0 69 54 65 72 6d 4f 66 66 20 3d 20 73 7a 4c 65 61  iTermOff = szLea
2fab0 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  f;.    }.    fts
2fac0 35 44 65 63 6f 64 65 52 6f 77 69 64 4c 69 73 74  5DecodeRowidList
2fad0 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 34 5d 2c  (&rc, &s, &a[4],
2fae0 20 69 54 65 72 6d 4f 66 66 2d 34 29 3b 0a 0a 20   iTermOff-4);.. 
2faf0 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f     iOff = iTermO
2fb00 66 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  ff;.    while( i
2fb10 4f 66 66 3c 73 7a 4c 65 61 66 20 29 7b 0a 20 20  Off<szLeaf ){.  
2fb20 20 20 20 20 69 6e 74 20 6e 41 70 70 65 6e 64 3b      int nAppend;
2fb30 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20  ..      /* Read 
2fb40 74 68 65 20 74 65 72 6d 20 64 61 74 61 20 66 6f  the term data fo
2fb50 72 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 2a  r the next term*
2fb60 2f 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  /.      iOff += 
2fb70 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
2fb80 26 61 5b 69 4f 66 66 5d 2c 20 6e 41 70 70 65 6e  &a[iOff], nAppen
2fb90 64 29 3b 0a 20 20 20 20 20 20 74 65 72 6d 2e 6e  d);.      term.n
2fba0 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20   = nKeep;.      
2fbb0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
2fbc0 42 6c 6f 62 28 26 72 63 2c 20 26 74 65 72 6d 2c  Blob(&rc, &term,
2fbd0 20 6e 41 70 70 65 6e 64 2c 20 26 61 5b 69 4f 66   nAppend, &a[iOf
2fbe0 66 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  f]);.      sqlit
2fbf0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2fc00 6e 64 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ndPrintf(.      
2fc10 20 20 20 20 26 72 63 2c 20 26 73 2c 20 22 20 74      &rc, &s, " t
2fc20 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e  erm=%.*s", term.
2fc30 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  n, (const char*)
2fc40 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 29 3b 0a  term.p.      );.
2fc50 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 41        iOff += nA
2fc60 70 70 65 6e 64 3b 0a 0a 20 20 20 20 20 20 2f 2a  ppend;..      /*
2fc70 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72   Figure out wher
2fc80 65 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f  e the doclist fo
2fc90 72 20 74 68 69 73 20 74 65 72 6d 20 65 6e 64 73  r this term ends
2fca0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 50   */.      if( iP
2fcb0 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  gidxOff<n ){.   
2fcc0 20 20 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b 0a       int nIncr;.
2fcd0 20 20 20 20 20 20 20 20 69 50 67 69 64 78 4f 66          iPgidxOf
2fce0 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
2fcf0 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66  nt32(&a[iPgidxOf
2fd00 66 5d 2c 20 6e 49 6e 63 72 29 3b 0a 20 20 20 20  f], nIncr);.    
2fd10 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20      iTermOff += 
2fd20 6e 49 6e 63 72 3b 0a 20 20 20 20 20 20 7d 65 6c  nIncr;.      }el
2fd30 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 65 72  se{.        iTer
2fd40 6d 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20  mOff = szLeaf;. 
2fd50 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74       }..      ft
2fd60 73 35 44 65 63 6f 64 65 52 6f 77 69 64 4c 69 73  s5DecodeRowidLis
2fd70 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f  t(&rc, &s, &a[iO
2fd80 66 66 5d 2c 20 69 54 65 72 6d 4f 66 66 2d 69 4f  ff], iTermOff-iO
2fd90 66 66 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  ff);.      iOff 
2fda0 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20  = iTermOff;.    
2fdb0 20 20 69 66 28 20 69 4f 66 66 3c 73 7a 4c 65 61    if( iOff<szLea
2fdc0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66  f ){.        iOf
2fdd0 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
2fde0 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
2fdf0 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Keep);.      }. 
2fe00 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75     }..    fts5Bu
2fe10 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b  fferFree(&term);
2fe20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74  .  }else{.    Ft
2fe30 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20  s5Buffer term;  
2fe40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2fe50 75 72 72 65 6e 74 20 74 65 72 6d 20 72 65 61 64  urrent term read
2fe60 20 66 72 6f 6d 20 70 61 67 65 20 2a 2f 0a 20 20   from page */.  
2fe70 20 20 69 6e 74 20 73 7a 4c 65 61 66 3b 20 20 20    int szLeaf;   
2fe80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe90 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 70 67 69  /* Offset of pgi
2fea0 64 78 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 20  dx in a[] */.   
2feb0 20 69 6e 74 20 69 50 67 69 64 78 4f 66 66 3b 0a   int iPgidxOff;.
2fec0 20 20 20 20 69 6e 74 20 69 50 67 69 64 78 50 72      int iPgidxPr
2fed0 65 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ev = 0;         
2fee0 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61    /* Previous va
2fef0 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 70 67  lue read from pg
2ff00 69 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  idx */.    int i
2ff10 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 20  TermOff = 0;.   
2ff20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 20 3d   int iRowidOff =
2ff30 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66   0;.    int iOff
2ff40 3b 0a 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69  ;.    int nDocli
2ff50 73 74 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28  st;..    memset(
2ff60 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &term, 0, sizeof
2ff70 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a  (Fts5Buffer));..
2ff80 20 20 20 20 69 66 28 20 6e 3c 34 20 29 7b 0a 20      if( n<4 ){. 
2ff90 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
2ffa0 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 26  BufferSet(&rc, &
2ffb0 73 2c 20 37 2c 20 28 63 6f 6e 73 74 20 75 38 2a  s, 7, (const u8*
2ffc0 29 22 63 6f 72 72 75 70 74 22 29 3b 0a 20 20 20  )"corrupt");.   
2ffd0 20 20 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f     goto decode_o
2ffe0 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ut;.    }else{. 
2fff0 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d       iRowidOff =
30000 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 30   fts5GetU16(&a[0
30010 5d 29 3b 0a 20 20 20 20 20 20 69 50 67 69 64 78  ]);.      iPgidx
30020 4f 66 66 20 3d 20 73 7a 4c 65 61 66 20 3d 20 66  Off = szLeaf = f
30030 74 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29  ts5GetU16(&a[2])
30040 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 67 69  ;.      if( iPgi
30050 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20  dxOff<n ){.     
30060 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74     fts5GetVarint
30070 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d  32(&a[iPgidxOff]
30080 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20 20  , iTermOff);.   
30090 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
300a0 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 6f  /* Decode the po
300b0 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 61 69 6c  sition list tail
300c0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
300d0 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
300e0 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 21 3d   if( iRowidOff!=
300f0 30 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20  0 ){.      iOff 
30100 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20  = iRowidOff;.   
30110 20 7d 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d   }else if( iTerm
30120 4f 66 66 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Off!=0 ){.      
30130 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
30140 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30150 20 20 69 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b    iOff = szLeaf;
30160 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44  .    }.    fts5D
30170 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 26 72 63  ecodePoslist(&rc
30180 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69 4f 66  , &s, &a[4], iOf
30190 66 2d 34 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65  f-4);..    /* De
301a0 63 6f 64 65 20 61 6e 79 20 6d 6f 72 65 20 64 6f  code any more do
301b0 63 6c 69 73 74 20 64 61 74 61 20 74 68 61 74 20  clist data that 
301c0 61 70 70 65 61 72 73 20 6f 6e 20 74 68 65 20 70  appears on the p
301d0 61 67 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20  age before the. 
301e0 20 20 20 2a 2a 20 66 69 72 73 74 20 74 65 72 6d     ** first term
301f0 2e 20 2a 2f 0a 20 20 20 20 6e 44 6f 63 6c 69 73  . */.    nDoclis
30200 74 20 3d 20 28 69 54 65 72 6d 4f 66 66 20 3f 20  t = (iTermOff ? 
30210 69 54 65 72 6d 4f 66 66 20 3a 20 73 7a 4c 65 61  iTermOff : szLea
30220 66 29 20 2d 20 69 4f 66 66 3b 0a 20 20 20 20 66  f) - iOff;.    f
30230 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74  ts5DecodeDoclist
30240 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66  (&rc, &s, &a[iOf
30250 66 5d 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 0a  f], nDoclist);..
30260 20 20 20 20 77 68 69 6c 65 28 20 69 50 67 69 64      while( iPgid
30270 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20  xOff<n ){.      
30280 69 6e 74 20 62 46 69 72 73 74 20 3d 20 28 69 50  int bFirst = (iP
30290 67 69 64 78 4f 66 66 3d 3d 73 7a 4c 65 61 66 29  gidxOff==szLeaf)
302a0 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f  ;     /* True fo
302b0 72 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  r first term on 
302c0 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  page */.      in
302d0 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
302e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
302f0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
30300 64 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 69 6e  data */.      in
30310 74 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 0a 20  t iEnd;.      . 
30320 20 20 20 20 20 69 50 67 69 64 78 4f 66 66 20 2b       iPgidxOff +
30330 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
30340 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c  2(&a[iPgidxOff],
30350 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69   nByte);.      i
30360 50 67 69 64 78 50 72 65 76 20 2b 3d 20 6e 42 79  PgidxPrev += nBy
30370 74 65 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d  te;.      iOff =
30380 20 69 50 67 69 64 78 50 72 65 76 3b 0a 0a 20 20   iPgidxPrev;..  
30390 20 20 20 20 69 66 28 20 69 50 67 69 64 78 4f 66      if( iPgidxOf
303a0 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 66  f<n ){.        f
303b0 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
303c0 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 42  a[iPgidxOff], nB
303d0 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 45  yte);.        iE
303e0 6e 64 20 3d 20 69 50 67 69 64 78 50 72 65 76 20  nd = iPgidxPrev 
303f0 2b 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 7d  + nByte;.      }
30400 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 45  else{.        iE
30410 6e 64 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20  nd = szLeaf;.   
30420 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
30430 62 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20  bFirst==0 ){.   
30440 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
30450 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
30460 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  iOff], nByte);. 
30470 20 20 20 20 20 20 20 74 65 72 6d 2e 6e 20 3d 20         term.n = 
30480 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20  nByte;.      }. 
30490 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
304a0 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
304b0 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  iOff], nByte);. 
304c0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
304d0 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20 26  ppendBlob(&rc, &
304e0 74 65 72 6d 2c 20 6e 42 79 74 65 2c 20 26 61 5b  term, nByte, &a[
304f0 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 69 4f  iOff]);.      iO
30500 66 66 20 2b 3d 20 6e 42 79 74 65 3b 0a 0a 20 20  ff += nByte;..  
30510 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
30520 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
30530 66 28 0a 20 20 20 20 20 20 20 20 20 20 26 72 63  f(.          &rc
30540 2c 20 26 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a  , &s, " term=%.*
30550 73 22 2c 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e  s", term.n, (con
30560 73 74 20 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a  st char*)term.p.
30570 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
30580 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64  Off += fts5Decod
30590 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73  eDoclist(&rc, &s
305a0 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 69 45 6e 64  , &a[iOff], iEnd
305b0 2d 69 4f 66 66 29 3b 0a 20 20 20 20 7d 0a 0a 20  -iOff);.    }.. 
305c0 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
305d0 65 28 26 74 65 72 6d 29 3b 0a 20 20 7d 0a 20 20  e(&term);.  }.  
305e0 0a 20 64 65 63 6f 64 65 5f 6f 75 74 3a 0a 20 20  . decode_out:.  
305f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b  sqlite3_free(a);
30600 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
30610 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
30620 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
30630 70 43 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61  pCtx, (const cha
30640 72 2a 29 73 2e 70 2c 20 73 2e 6e 2c 20 53 51 4c  r*)s.p, s.n, SQL
30650 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
30660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
30670 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
30680 72 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63 29  r_code(pCtx, rc)
30690 3b 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66  ;.  }.  fts5Buff
306a0 65 72 46 72 65 65 28 26 73 29 3b 0a 7d 0a 0a 2f  erFree(&s);.}../
306b0 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
306c0 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d  ntation of user-
306d0 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66  defined scalar f
306e0 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 72 6f 77  unction fts5_row
306f0 69 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  id()..*/.static 
30700 76 6f 69 64 20 66 74 73 35 52 6f 77 69 64 46 75  void fts5RowidFu
30710 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
30720 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
30730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
30740 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65  ction call conte
30750 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  xt */.  int nArg
30760 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
30770 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
30780 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61 79  r of args (alway
30790 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s 2) */.  sqlite
307a0 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20  3_value **apVal 
307b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
307c0 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
307d0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
307e0 61 72 20 2a 7a 41 72 67 3b 0a 20 20 69 66 28 20  ar *zArg;.  if( 
307f0 6e 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73  nArg==0 ){.    s
30800 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
30810 72 6f 72 28 70 43 74 78 2c 20 22 73 68 6f 75 6c  ror(pCtx, "shoul
30820 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64  d be: fts5_rowid
30830 28 73 75 62 6a 65 63 74 2c 20 2e 2e 2e 2e 29 22  (subject, ....)"
30840 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , -1);.  }else{.
30850 20 20 20 20 7a 41 72 67 20 3d 20 28 63 6f 6e 73      zArg = (cons
30860 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
30870 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
30880 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  [0]);.    if( 0=
30890 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70  =sqlite3_stricmp
308a0 28 7a 41 72 67 2c 20 22 73 65 67 6d 65 6e 74 22  (zArg, "segment"
308b0 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69  ) ){.      i64 i
308c0 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 6e 74  Rowid;.      int
308d0 20 73 65 67 69 64 2c 20 70 67 6e 6f 3b 0a 20 20   segid, pgno;.  
308e0 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 33 20      if( nArg!=3 
308f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
30900 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
30910 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20 20 20  pCtx, .         
30920 20 20 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66     "should be: f
30930 74 73 35 5f 72 6f 77 69 64 28 27 73 65 67 6d 65  ts5_rowid('segme
30940 6e 74 27 2c 20 73 65 67 69 64 2c 20 70 67 6e 6f  nt', segid, pgno
30950 29 29 22 2c 20 2d 31 0a 20 20 20 20 20 20 20 20  ))", -1.        
30960 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
30970 20 20 20 20 20 20 20 20 73 65 67 69 64 20 3d 20          segid = 
30980 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
30990 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20  t(apVal[1]);.   
309a0 20 20 20 20 20 70 67 6e 6f 20 3d 20 73 71 6c 69       pgno = sqli
309b0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70  te3_value_int(ap
309c0 56 61 6c 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20  Val[2]);.       
309d0 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53   iRowid = FTS5_S
309e0 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 73 65 67  EGMENT_ROWID(seg
309f0 69 64 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  id, pgno);.     
30a00 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
30a10 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 69 52  t_int64(pCtx, iR
30a20 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  owid);.      }. 
30a30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30a40 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
30a50 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20  rror(pCtx, .    
30a60 20 20 20 20 22 66 69 72 73 74 20 61 72 67 20 74      "first arg t
30a70 6f 20 66 74 73 35 5f 72 6f 77 69 64 28 29 20 6d  o fts5_rowid() m
30a80 75 73 74 20 62 65 20 27 73 65 67 6d 65 6e 74 27  ust be 'segment'
30a90 22 20 2c 20 2d 31 0a 20 20 20 20 20 20 29 3b 0a  " , -1.      );.
30aa0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
30ab0 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  ** This is calle
30ac0 64 20 61 73 20 70 61 72 74 20 6f 66 20 72 65 67  d as part of reg
30ad0 69 73 74 65 72 69 6e 67 20 74 68 65 20 46 54 53  istering the FTS
30ae0 35 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 64 61  5 module with da
30af0 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
30b00 74 69 6f 6e 20 64 62 2e 20 49 74 20 72 65 67 69  tion db. It regi
30b10 73 74 65 72 73 20 73 65 76 65 72 61 6c 20 75 73  sters several us
30b20 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61  er-defined scala
30b30 72 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 66  r functions usef
30b40 75 6c 0a 2a 2a 20 77 69 74 68 20 46 54 53 35 2e  ul.** with FTS5.
30b50 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
30b60 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
30b70 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
30b80 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
30b90 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 53   some other.** S
30ba0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
30bb0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73   is returned ins
30bc0 74 65 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tead..*/.int sql
30bd0 69 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 69  ite3Fts5IndexIni
30be0 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
30bf0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
30c00 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
30c10 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22 66  on(.      db, "f
30c20 74 73 35 5f 64 65 63 6f 64 65 22 2c 20 32 2c 20  ts5_decode", 2, 
30c30 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
30c40 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69  fts5DecodeFuncti
30c50 6f 6e 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 0a 20  on, 0, 0.  );.. 
30c60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30c70 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
30c80 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
30c90 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20  nction(.        
30ca0 64 62 2c 20 22 66 74 73 35 5f 64 65 63 6f 64 65  db, "fts5_decode
30cb0 5f 6e 6f 6e 65 22 2c 20 32 2c 20 0a 20 20 20 20  _none", 2, .    
30cc0 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c      SQLITE_UTF8,
30cd0 20 28 76 6f 69 64 2a 29 64 62 2c 20 66 74 73 35   (void*)db, fts5
30ce0 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20  DecodeFunction, 
30cf0 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  0, 0.    );.  }.
30d00 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
30d10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
30d20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
30d30 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20  function(.      
30d40 20 20 64 62 2c 20 22 66 74 73 35 5f 72 6f 77 69    db, "fts5_rowi
30d50 64 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  d", -1, SQLITE_U
30d60 54 46 38 2c 20 30 2c 20 66 74 73 35 52 6f 77 69  TF8, 0, fts5Rowi
30d70 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a  dFunction, 0, 0.
30d80 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74      );.  }.  ret
30d90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 69 6e 74 20  urn rc;.}...int 
30da0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
30db0 52 65 73 65 74 28 46 74 73 35 49 6e 64 65 78 20  Reset(Fts5Index 
30dc0 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
30dd0 2d 3e 70 53 74 72 75 63 74 3d 3d 30 20 7c 7c 20  ->pStruct==0 || 
30de0 70 2d 3e 69 53 74 72 75 63 74 56 65 72 73 69 6f  p->iStructVersio
30df0 6e 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 66 74  n!=0 );.  if( ft
30e00 73 35 49 6e 64 65 78 44 61 74 61 56 65 72 73 69  s5IndexDataVersi
30e10 6f 6e 28 70 29 21 3d 70 2d 3e 69 53 74 72 75 63  on(p)!=p->iStruc
30e20 74 56 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20  tVersion ){.    
30e30 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e 76  fts5StructureInv
30e40 61 6c 69 64 61 74 65 28 70 29 3b 0a 20 20 7d 0a  alidate(p);.  }.
30e50 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
30e60 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a     exReturn(p);.}.