/ Hex Artifact Content
Login

Artifact e25ac419fc66f412e6044595b20b4bf8f7cea284:


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 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
8230: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
8240: 3e 70 44 61 74 61 56 65 72 73 69 6f 6e 3d 3d 30  >pDataVersion==0
8250: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
8260: 3d 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61  = fts5IndexPrepa
8270: 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 44  reStmt(p, &p->pD
8280: 61 74 61 56 65 72 73 69 6f 6e 2c 20 0a 20 20 20  ataVersion, .   
8290: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
82a0: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 25  printf("PRAGMA %
82b0: 51 2e 64 61 74 61 5f 76 65 72 73 69 6f 6e 22 2c  Q.data_version",
82c0: 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 7a 44 62   p->pConfig->zDb
82d0: 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ).          );. 
82e0: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29       if( p->rc )
82f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
8300: 0a 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ..    if( SQLITE
8310: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
8320: 65 70 28 70 2d 3e 70 44 61 74 61 56 65 72 73 69  ep(p->pDataVersi
8330: 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 69 56 65  on) ){.      iVe
8340: 72 73 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f  rsion = sqlite3_
8350: 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 2d 3e  column_int64(p->
8360: 70 44 61 74 61 56 65 72 73 69 6f 6e 2c 20 30 29  pDataVersion, 0)
8370: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72  ;.    }.    p->r
8380: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
8390: 74 28 70 2d 3e 70 44 61 74 61 56 65 72 73 69 6f  t(p->pDataVersio
83a0: 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  n);.  }..  retur
83b0: 6e 20 69 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f  n iVersion;.}../
83c0: 2a 0a 2a 2a 20 52 65 61 64 2c 20 64 65 73 65 72  *.** Read, deser
83d0: 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75 72  ialize and retur
83e0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
83f0: 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  record..**.** Th
8400: 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e  e Fts5Structure.
8410: 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63  aLevel[] and eac
8420: 68 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  h Fts5StructureL
8430: 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61  evel.aSeg[] arra
8440: 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c  y.** are over-al
8450: 6c 6f 63 61 74 65 64 20 61 73 20 64 65 73 63 72  located as descr
8460: 69 62 65 64 20 66 6f 72 20 66 75 6e 63 74 69 6f  ibed for functio
8470: 6e 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  n fts5StructureD
8480: 65 63 6f 64 65 28 29 20 0a 2a 2a 20 61 62 6f 76  ecode() .** abov
8490: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  e..**.** If an e
84a0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
84b0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
84c0: 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
84d0: 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20 46  left in the.** F
84e0: 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e  ts5Index handle.
84f0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
8500: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
8510: 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
8520: 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
8530: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
8540: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35  ..*/.static Fts5
8550: 53 74 72 75 63 74 75 72 65 20 2a 66 74 73 35 53  Structure *fts5S
8560: 74 72 75 63 74 75 72 65 52 65 61 64 28 46 74 73  tructureRead(Fts
8570: 35 49 6e 64 65 78 20 2a 70 29 7b 0a 0a 20 20 69  5Index *p){..  i
8580: 66 28 20 70 2d 3e 70 53 74 72 75 63 74 3d 3d 30  f( p->pStruct==0
8590: 20 29 7b 0a 20 20 20 20 70 2d 3e 69 53 74 72 75   ){.    p->iStru
85a0: 63 74 56 65 72 73 69 6f 6e 20 3d 20 66 74 73 35  ctVersion = fts5
85b0: 49 6e 64 65 78 44 61 74 61 56 65 72 73 69 6f 6e  IndexDataVersion
85c0: 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  (p);.    if( p->
85d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
85e0: 0a 20 20 20 20 20 20 70 2d 3e 70 53 74 72 75 63  .      p->pStruc
85f0: 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
8600: 65 52 65 61 64 55 6e 63 61 63 68 65 64 28 70 29  eReadUncached(p)
8610: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
8620: 20 30 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 46   0.  else{.    F
8630: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 54  ts5Structure *pT
8640: 65 73 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  est = fts5Struct
8650: 75 72 65 52 65 61 64 55 6e 63 61 63 68 65 64 28  ureReadUncached(
8660: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 73  p);.    if( pTes
8670: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
8680: 2c 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  , j;.      asser
8690: 74 5f 6e 63 28 20 70 2d 3e 70 53 74 72 75 63 74  t_nc( p->pStruct
86a0: 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 70 54 65 73  ->nSegment==pTes
86b0: 74 2d 3e 6e 53 65 67 6d 65 6e 74 20 29 3b 0a 20  t->nSegment );. 
86c0: 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
86d0: 70 2d 3e 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  p->pStruct->nLev
86e0: 65 6c 3d 3d 70 54 65 73 74 2d 3e 6e 4c 65 76 65  el==pTest->nLeve
86f0: 6c 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  l );.      for(i
8700: 3d 30 3b 20 69 3c 70 54 65 73 74 2d 3e 6e 4c 65  =0; i<pTest->nLe
8710: 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vel; i++){.     
8720: 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 2d     assert_nc( p-
8730: 3e 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  >pStruct->aLevel
8740: 5b 69 5d 2e 6e 4d 65 72 67 65 3d 3d 70 54 65 73  [i].nMerge==pTes
8750: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65  t->aLevel[i].nMe
8760: 72 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 61  rge );.        a
8770: 73 73 65 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74  ssert_nc( p->pSt
8780: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  ruct->aLevel[i].
8790: 6e 53 65 67 3d 3d 70 54 65 73 74 2d 3e 61 4c 65  nSeg==pTest->aLe
87a0: 76 65 6c 5b 69 5d 2e 6e 53 65 67 20 29 3b 0a 20  vel[i].nSeg );. 
87b0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
87c0: 6a 3c 70 54 65 73 74 2d 3e 61 4c 65 76 65 6c 5b  j<pTest->aLevel[
87d0: 69 5d 2e 6e 53 65 67 3b 20 6a 2b 2b 29 7b 0a 20  i].nSeg; j++){. 
87e0: 20 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72           Fts5Str
87f0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
8800: 31 20 3d 20 26 70 54 65 73 74 2d 3e 61 4c 65 76  1 = &pTest->aLev
8810: 65 6c 5b 69 5d 2e 61 53 65 67 5b 6a 5d 3b 0a 20  el[i].aSeg[j];. 
8820: 20 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72           Fts5Str
8830: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
8840: 32 20 3d 20 26 70 2d 3e 70 53 74 72 75 63 74 2d  2 = &p->pStruct-
8850: 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65 67 5b  >aLevel[i].aSeg[
8860: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  j];.          as
8870: 73 65 72 74 5f 6e 63 28 20 70 31 2d 3e 69 53 65  sert_nc( p1->iSe
8880: 67 69 64 3d 3d 70 32 2d 3e 69 53 65 67 69 64 20  gid==p2->iSegid 
8890: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
88a0: 65 72 74 5f 6e 63 28 20 70 31 2d 3e 70 67 6e 6f  ert_nc( p1->pgno
88b0: 46 69 72 73 74 3d 3d 70 32 2d 3e 70 67 6e 6f 46  First==p2->pgnoF
88c0: 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  irst );.        
88d0: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 31 2d    assert_nc( p1-
88e0: 3e 70 67 6e 6f 4c 61 73 74 3d 3d 70 32 2d 3e 70  >pgnoLast==p2->p
88f0: 67 6e 6f 4c 61 73 74 20 29 3b 0a 20 20 20 20 20  gnoLast );.     
8900: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8910: 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
8920: 52 65 6c 65 61 73 65 28 70 54 65 73 74 29 3b 0a  Release(pTest);.
8930: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
8940: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53  ..  if( p->rc!=S
8950: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
8960: 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 0;.  assert( p
8970: 2d 3e 69 53 74 72 75 63 74 56 65 72 73 69 6f 6e  ->iStructVersion
8980: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
8990: 20 70 2d 3e 70 53 74 72 75 63 74 21 3d 30 20 29   p->pStruct!=0 )
89a0: 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
89b0: 65 52 65 66 28 70 2d 3e 70 53 74 72 75 63 74 29  eRef(p->pStruct)
89c0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 53  ;.  return p->pS
89d0: 74 72 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63  truct;.}..static
89e0: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
89f0: 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 46 74  ureInvalidate(Ft
8a00: 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69  s5Index *p){.  i
8a10: 66 28 20 70 2d 3e 70 53 74 72 75 63 74 20 29 7b  f( p->pStruct ){
8a20: 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
8a30: 72 65 52 65 6c 65 61 73 65 28 70 2d 3e 70 53 74  reRelease(p->pSt
8a40: 72 75 63 74 29 3b 0a 20 20 20 20 70 2d 3e 70 53  ruct);.    p->pS
8a50: 74 72 75 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d  truct = 0;.  }.}
8a60: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
8a70: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
8a80: 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69  of segments in i
8a90: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 70  ndex structure p
8aa0: 53 74 72 75 63 74 2e 20 54 68 69 73 0a 2a 2a 20  Struct. This.** 
8ab0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
8ac0: 20 65 76 65 72 20 75 73 65 64 20 61 73 20 70 61   ever used as pa
8ad0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 63  rt of assert() c
8ae0: 6f 6e 64 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69  onditions..*/.#i
8af0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
8b00: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  G.static int fts
8b10: 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
8b20: 65 67 6d 65 6e 74 73 28 46 74 73 35 53 74 72 75  egments(Fts5Stru
8b30: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b  cture *pStruct){
8b40: 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20  .  int nSegment 
8b50: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
8b60: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
8b70: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a  er of segments *
8b80: 2f 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20  /.  if( pStruct 
8b90: 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b  ){.    int iLvl;
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bb0: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
8bc0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
8bd0: 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 66 6f  levels */.    fo
8be0: 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
8bf0: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
8c00: 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  iLvl++){.      n
8c10: 53 65 67 6d 65 6e 74 20 2b 3d 20 70 53 74 72 75  Segment += pStru
8c20: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
8c30: 2e 6e 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  .nSeg;.    }.  }
8c40: 0a 0a 20 20 72 65 74 75 72 6e 20 6e 53 65 67 6d  ..  return nSegm
8c50: 65 6e 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  ent;.}.#endif..#
8c60: 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65  define fts5Buffe
8c70: 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
8c80: 70 42 75 66 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c  pBuf, pBlob, nBl
8c90: 6f 62 29 20 7b 20 20 20 20 20 5c 0a 20 20 61 73  ob) {     \.  as
8ca0: 73 65 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 53  sert( (pBuf)->nS
8cb0: 70 61 63 65 3e 3d 28 28 70 42 75 66 29 2d 3e 6e  pace>=((pBuf)->n
8cc0: 2b 6e 42 6c 6f 62 29 20 29 3b 20 20 20 20 20 20  +nBlob) );      
8cd0: 20 20 20 20 20 20 20 5c 0a 20 20 6d 65 6d 63 70         \.  memcp
8ce0: 79 28 26 28 70 42 75 66 29 2d 3e 70 5b 28 70 42  y(&(pBuf)->p[(pB
8cf0: 75 66 29 2d 3e 6e 5d 2c 20 70 42 6c 6f 62 2c 20  uf)->n], pBlob, 
8d00: 6e 42 6c 6f 62 29 3b 20 20 20 20 20 20 20 20 20  nBlob);         
8d10: 20 20 20 20 5c 0a 20 20 28 70 42 75 66 29 2d 3e      \.  (pBuf)->
8d20: 6e 20 2b 3d 20 6e 42 6c 6f 62 3b 20 20 20 20 20  n += nBlob;     
8d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d50: 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74   \.}..#define ft
8d60: 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
8d70: 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69  ndVarint(pBuf, i
8d80: 56 61 6c 29 20 7b 20 20 20 20 20 20 20 20 20 20  Val) {          
8d90: 20 20 20 20 20 20 5c 0a 20 20 28 70 42 75 66 29        \.  (pBuf)
8da0: 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
8db0: 73 35 50 75 74 56 61 72 69 6e 74 28 26 28 70 42  s5PutVarint(&(pB
8dc0: 75 66 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e  uf)->p[(pBuf)->n
8dd0: 5d 2c 20 28 69 56 61 6c 29 29 3b 20 20 5c 0a 20  ], (iVal));  \. 
8de0: 20 61 73 73 65 72 74 28 20 28 70 42 75 66 29 2d   assert( (pBuf)-
8df0: 3e 6e 53 70 61 63 65 3e 3d 28 70 42 75 66 29 2d  >nSpace>=(pBuf)-
8e00: 3e 6e 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  >n );           
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
8e20: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 72 69 61  .}.../*.** Seria
8e30: 6c 69 7a 65 20 61 6e 64 20 73 74 6f 72 65 20 74  lize and store t
8e40: 68 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72  he "structure" r
8e50: 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ecord..**.** If 
8e60: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
8e70: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
8e80: 63 6f 64 65 20 69 6e 20 74 68 65 20 46 74 73 35  code in the Fts5
8e90: 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 20 49 66  Index object. If
8ea0: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 68 61 73   an.** error has
8eb0: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
8ec0: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
8ed0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
8ee0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
8ef0: 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 46  StructureWrite(F
8f00: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
8f10: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
8f20: 75 63 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  uct){.  if( p->r
8f30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8f40: 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 62      Fts5Buffer b
8f50: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
8f60: 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 73    /* Buffer to s
8f70: 65 72 69 61 6c 69 7a 65 20 72 65 63 6f 72 64 20  erialize record 
8f80: 69 6e 74 6f 20 2a 2f 0a 20 20 20 20 69 6e 74 20  into */.    int 
8f90: 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iLvl;           
8fa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
8fb0: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
8fc0: 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20  ough levels */. 
8fd0: 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20     int iCookie; 
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ff0: 20 2f 2a 20 43 6f 6f 6b 69 65 20 76 61 6c 75 65   /* Cookie value
9000: 20 74 6f 20 73 74 6f 72 65 20 2a 2f 0a 0a 20 20   to store */..  
9010: 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
9020: 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73  t->nSegment==fts
9030: 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
9040: 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29  egments(pStruct)
9050: 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   );.    memset(&
9060: 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  buf, 0, sizeof(F
9070: 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20  ts5Buffer));..  
9080: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
9090: 63 75 72 72 65 6e 74 20 63 6f 6e 66 69 67 75 72  current configur
90a0: 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a  ation cookie */.
90b0: 20 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 2d      iCookie = p-
90c0: 3e 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69  >pConfig->iCooki
90d0: 65 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6f 6b  e;.    if( iCook
90e0: 69 65 3c 30 20 29 20 69 43 6f 6f 6b 69 65 20 3d  ie<0 ) iCookie =
90f0: 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d   0;..    if( 0==
9100: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
9110: 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 62  rSize(&p->rc, &b
9120: 75 66 2c 20 34 2b 39 2b 39 2b 39 29 20 29 7b 0a  uf, 4+9+9+9) ){.
9130: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
9140: 35 50 75 74 33 32 28 62 75 66 2e 70 2c 20 69 43  5Put32(buf.p, iC
9150: 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 20 20 62 75  ookie);.      bu
9160: 66 2e 6e 20 3d 20 34 3b 0a 20 20 20 20 20 20 66  f.n = 4;.      f
9170: 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
9180: 65 6e 64 56 61 72 69 6e 74 28 26 62 75 66 2c 20  endVarint(&buf, 
9190: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29  pStruct->nLevel)
91a0: 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
91b0: 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
91c0: 6e 74 28 26 62 75 66 2c 20 70 53 74 72 75 63 74  nt(&buf, pStruct
91d0: 2d 3e 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ->nSegment);.   
91e0: 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
91f0: 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62  eAppendVarint(&b
9200: 75 66 2c 20 28 69 36 34 29 70 53 74 72 75 63 74  uf, (i64)pStruct
9210: 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29  ->nWriteCounter)
9220: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
9230: 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
9240: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
9250: 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  Lvl++){.      in
9260: 74 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20  t iSeg;         
9270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
9280: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
9290: 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20  hrough segments 
92a0: 2a 2f 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  */.      Fts5Str
92b0: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
92c0: 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
92d0: 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
92e0: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
92f0: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
9300: 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 4d 65   &buf, pLvl->nMe
9310: 72 67 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35  rge);.      fts5
9320: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
9330: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
9340: 20 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a 20 20   pLvl->nSeg);.  
9350: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c      assert( pLvl
9360: 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e  ->nMerge<=pLvl->
9370: 6e 53 65 67 20 29 3b 0a 0a 20 20 20 20 20 20 66  nSeg );..      f
9380: 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
9390: 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67  pLvl->nSeg; iSeg
93a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  ++){.        fts
93b0: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
93c0: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
93d0: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
93e0: 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20  g].iSegid);.    
93f0: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
9400: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
9410: 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61  c, &buf, pLvl->a
9420: 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69  Seg[iSeg].pgnoFi
9430: 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74  rst);.        ft
9440: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
9450: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
9460: 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  f, pLvl->aSeg[iS
9470: 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20  eg].pgnoLast);. 
9480: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
9490: 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
94a0: 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52  p, FTS5_STRUCTUR
94b0: 45 5f 52 4f 57 49 44 2c 20 62 75 66 2e 70 2c 20  E_ROWID, buf.p, 
94c0: 62 75 66 2e 6e 29 3b 0a 20 20 20 20 66 74 73 35  buf.n);.    fts5
94d0: 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29  BufferFree(&buf)
94e0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73  ;.  }.}..#if 0.s
94f0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
9500: 65 62 75 67 53 74 72 75 63 74 75 72 65 28 69 6e  ebugStructure(in
9510: 74 2a 2c 46 74 73 35 42 75 66 66 65 72 2a 2c 46  t*,Fts5Buffer*,F
9520: 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 3b 0a  ts5Structure*);.
9530: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
9540: 50 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 63  PrintStructure(c
9550: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 61 70 74  onst char *zCapt
9560: 69 6f 6e 2c 20 46 74 73 35 53 74 72 75 63 74 75  ion, Fts5Structu
9570: 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20  re *pStruct){.  
9580: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9590: 4f 4b 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72  OK;.  Fts5Buffer
95a0: 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26   buf;.  memset(&
95b0: 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62  buf, 0, sizeof(b
95c0: 75 66 29 29 3b 0a 20 20 66 74 73 35 44 65 62 75  uf));.  fts5Debu
95d0: 67 53 74 72 75 63 74 75 72 65 28 26 72 63 2c 20  gStructure(&rc, 
95e0: 26 62 75 66 2c 20 70 53 74 72 75 63 74 29 3b 0a  &buf, pStruct);.
95f0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74    fprintf(stdout
9600: 2c 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20 7a 43  , "%s: %s\n", zC
9610: 61 70 74 69 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a  aption, buf.p);.
9620: 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
9630: 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ;.  fts5BufferFr
9640: 65 65 28 26 62 75 66 29 3b 0a 7d 0a 23 65 6c 73  ee(&buf);.}.#els
9650: 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 50  e.# define fts5P
9660: 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 78 2c  rintStructure(x,
9670: 79 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  y).#endif..stati
9680: 63 20 69 6e 74 20 66 74 73 35 53 65 67 6d 65 6e  c int fts5Segmen
9690: 74 53 69 7a 65 28 46 74 73 35 53 74 72 75 63 74  tSize(Fts5Struct
96a0: 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
96b0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 31 20 2b 20  ){.  return 1 + 
96c0: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d  pSeg->pgnoLast -
96d0: 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
96e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
96f0: 6e 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 64 65  n a copy of inde
9700: 78 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72  x structure pStr
9710: 75 63 74 2e 20 45 78 63 65 70 74 2c 20 70 72 6f  uct. Except, pro
9720: 6d 6f 74 65 20 61 73 20 6d 61 6e 79 20 0a 2a 2a  mote as many .**
9730: 20 73 65 67 6d 65 6e 74 73 20 61 73 20 70 6f 73   segments as pos
9740: 73 69 62 6c 65 20 74 6f 20 6c 65 76 65 6c 20 69  sible to level i
9750: 50 72 6f 6d 6f 74 65 2e 20 49 66 20 61 6e 20 4f  Promote. If an O
9760: 4f 4d 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  OM occurs, NULL 
9770: 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  is .** returned.
9780: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9790: 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
97a0: 6d 6f 74 65 54 6f 28 0a 20 20 46 74 73 35 49 6e  moteTo(.  Fts5In
97b0: 64 65 78 20 2a 70 2c 0a 20 20 69 6e 74 20 69 50  dex *p,.  int iP
97c0: 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e 74 20 73 7a  romote,.  int sz
97d0: 50 72 6f 6d 6f 74 65 2c 0a 20 20 46 74 73 35 53  Promote,.  Fts5S
97e0: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
97f0: 74 0a 29 7b 0a 20 20 69 6e 74 20 69 6c 2c 20 69  t.){.  int il, i
9800: 73 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  s;.  Fts5Structu
9810: 72 65 4c 65 76 65 6c 20 2a 70 4f 75 74 20 3d 20  reLevel *pOut = 
9820: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
9830: 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a 0a 20 20 69  [iPromote];..  i
9840: 66 28 20 70 4f 75 74 2d 3e 6e 4d 65 72 67 65 3d  f( pOut->nMerge=
9850: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 6c  =0 ){.    for(il
9860: 3d 69 50 72 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c  =iPromote+1; il<
9870: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
9880: 20 69 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74   il++){.      Ft
9890: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
98a0: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
98b0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c 5d 3b 0a 20  t->aLevel[il];. 
98c0: 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e       if( pLvl->n
98d0: 4d 65 72 67 65 20 29 20 72 65 74 75 72 6e 3b 0a  Merge ) return;.
98e0: 20 20 20 20 20 20 66 6f 72 28 69 73 3d 70 4c 76        for(is=pLv
98f0: 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 73 3e 3d 30  l->nSeg-1; is>=0
9900: 3b 20 69 73 2d 2d 29 7b 0a 20 20 20 20 20 20 20  ; is--){.       
9910: 20 69 6e 74 20 73 7a 20 3d 20 66 74 73 35 53 65   int sz = fts5Se
9920: 67 6d 65 6e 74 53 69 7a 65 28 26 70 4c 76 6c 2d  gmentSize(&pLvl-
9930: 3e 61 53 65 67 5b 69 73 5d 29 3b 0a 20 20 20 20  >aSeg[is]);.    
9940: 20 20 20 20 69 66 28 20 73 7a 3e 73 7a 50 72 6f      if( sz>szPro
9950: 6d 6f 74 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  mote ) return;. 
9960: 20 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63         fts5Struc
9970: 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28  tureExtendLevel(
9980: 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c  &p->rc, pStruct,
9990: 20 69 50 72 6f 6d 6f 74 65 2c 20 31 2c 20 31 29   iPromote, 1, 1)
99a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
99b0: 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
99c0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75        memcpy(pOu
99d0: 74 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e  t->aSeg, &pLvl->
99e0: 61 53 65 67 5b 69 73 5d 2c 20 73 69 7a 65 6f 66  aSeg[is], sizeof
99f0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
9a00: 67 6d 65 6e 74 29 29 3b 0a 20 20 20 20 20 20 20  gment));.       
9a10: 20 70 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20   pOut->nSeg++;. 
9a20: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65         pLvl->nSe
9a30: 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  g--;.      }.   
9a40: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9a50: 41 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 68 61  A new segment ha
9a60: 73 20 6a 75 73 74 20 62 65 65 6e 20 77 72 69 74  s just been writ
9a70: 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 69 4c 76  ten to level iLv
9a80: 6c 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75 63  l of index struc
9a90: 74 75 72 65 0a 2a 2a 20 70 53 74 72 75 63 74 2e  ture.** pStruct.
9aa0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
9ab0: 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 6e 79  etermines if any
9ac0: 20 73 65 67 6d 65 6e 74 73 20 73 68 6f 75 6c 64   segments should
9ad0: 20 62 65 20 70 72 6f 6d 6f 74 65 64 0a 2a 2a 20   be promoted.** 
9ae0: 61 73 20 61 20 72 65 73 75 6c 74 2e 20 53 65 67  as a result. Seg
9af0: 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74  ments are promot
9b00: 65 64 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  ed in two scenar
9b10: 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
9b20: 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6a  If the segment j
9b30: 75 73 74 20 77 72 69 74 74 65 6e 20 69 73 20 73  ust written is s
9b40: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 6e 65 20  maller than one 
9b50: 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73  or more segments
9b60: 0a 2a 2a 20 20 20 20 20 20 77 69 74 68 69 6e 20  .**      within 
9b70: 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 6f 70  the previous pop
9b80: 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 69 74  ulated level, it
9b90: 20 69 73 20 70 72 6f 6d 6f 74 65 64 20 74 6f 20   is promoted to 
9ba0: 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20  the previous.** 
9bb0: 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 6c       populated l
9bc0: 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29  evel..**.**   b)
9bd0: 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20   If the segment 
9be0: 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69 73 20  just written is 
9bf0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
9c00: 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74 20 6f  newest segment o
9c10: 6e 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 6e 65  n.**      the ne
9c20: 78 74 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76  xt populated lev
9c30: 65 6c 2c 20 74 68 65 6e 20 74 68 61 74 20 73 65  el, then that se
9c40: 67 6d 65 6e 74 2c 20 61 6e 64 20 61 6e 79 20 6f  gment, and any o
9c50: 74 68 65 72 20 61 64 6a 61 63 65 6e 74 0a 2a 2a  ther adjacent.**
9c60: 20 20 20 20 20 20 73 65 67 6d 65 6e 74 73 20 74        segments t
9c70: 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73 6d 61  hat are also sma
9c80: 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ller than the on
9c90: 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20  e just written, 
9ca0: 61 72 65 20 0a 2a 2a 20 20 20 20 20 20 70 72 6f  are .**      pro
9cb0: 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  moted. .**.** If
9cc0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67   one or more seg
9cd0: 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74  ments are promot
9ce0: 65 64 2c 20 74 68 65 20 73 74 72 75 63 74 75 72  ed, the structur
9cf0: 65 20 6f 62 6a 65 63 74 20 69 73 20 75 70 64 61  e object is upda
9d00: 74 65 64 0a 2a 2a 20 74 6f 20 72 65 66 6c 65 63  ted.** to reflec
9d10: 74 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  t this..*/.stati
9d20: 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63  c void fts5Struc
9d30: 74 75 72 65 50 72 6f 6d 6f 74 65 28 0a 20 20 46  turePromote(.  F
9d40: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9d60: 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
9d70: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
9d80: 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Lvl,            
9d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9da0: 64 65 78 20 6c 65 76 65 6c 20 6a 75 73 74 20 75  dex level just u
9db0: 70 64 61 74 65 64 20 2a 2f 0a 20 20 46 74 73 35  pdated */.  Fts5
9dc0: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
9dd0: 63 74 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ct          /* I
9de0: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a  ndex structure *
9df0: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  /.){.  if( p->rc
9e00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
9e10: 20 20 20 69 6e 74 20 69 54 73 74 3b 0a 20 20 20     int iTst;.   
9e20: 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 20 3d 20   int iPromote = 
9e30: 2d 31 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 72  -1;.    int szPr
9e40: 6f 6d 6f 74 65 20 3d 20 30 3b 20 20 20 20 20 20  omote = 0;      
9e50: 20 20 20 20 20 20 2f 2a 20 50 72 6f 6d 6f 74 65        /* Promote
9e60: 20 61 6e 79 74 68 69 6e 67 20 74 68 69 73 20 73   anything this s
9e70: 69 7a 65 20 6f 72 20 73 6d 61 6c 6c 65 72 20 2a  ize or smaller *
9e80: 2f 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  /.    Fts5Struct
9e90: 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
9ea0: 3b 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 6a  ;   /* Segment j
9eb0: 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  ust written */. 
9ec0: 20 20 20 69 6e 74 20 73 7a 53 65 67 3b 20 20 20     int szSeg;   
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ee0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 65 67 6d   /* Size of segm
9ef0: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
9f00: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 67   */.    int nSeg
9f10: 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76   = pStruct->aLev
9f20: 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 0a  el[iLvl].nSeg;..
9f30: 20 20 20 20 69 66 28 20 6e 53 65 67 3d 3d 30 20      if( nSeg==0 
9f40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 53  ) return;.    pS
9f50: 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  eg = &pStruct->a
9f60: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67  Level[iLvl].aSeg
9f70: 5b 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  [pStruct->aLevel
9f80: 5b 69 4c 76 6c 5d 2e 6e 53 65 67 2d 31 5d 3b 0a  [iLvl].nSeg-1];.
9f90: 20 20 20 20 73 7a 53 65 67 20 3d 20 28 31 20 2b      szSeg = (1 +
9fa0: 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20   pSeg->pgnoLast 
9fb0: 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  - pSeg->pgnoFirs
9fc0: 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  t);..    /* Chec
9fd0: 6b 20 66 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20  k for condition 
9fe0: 28 61 29 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  (a) */.    for(i
9ff0: 54 73 74 3d 69 4c 76 6c 2d 31 3b 20 69 54 73 74  Tst=iLvl-1; iTst
a000: 3e 3d 30 20 26 26 20 70 53 74 72 75 63 74 2d 3e  >=0 && pStruct->
a010: 61 4c 65 76 65 6c 5b 69 54 73 74 5d 2e 6e 53 65  aLevel[iTst].nSe
a020: 67 3d 3d 30 3b 20 69 54 73 74 2d 2d 29 3b 0a 20  g==0; iTst--);. 
a030: 20 20 20 69 66 28 20 69 54 73 74 3e 3d 30 20 29     if( iTst>=0 )
a040: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
a050: 20 20 20 20 20 69 6e 74 20 73 7a 4d 61 78 20 3d       int szMax =
a060: 20 30 3b 0a 20 20 20 20 20 20 46 74 73 35 53 74   0;.      Fts5St
a070: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 54  ructureLevel *pT
a080: 73 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  st = &pStruct->a
a090: 4c 65 76 65 6c 5b 69 54 73 74 5d 3b 0a 20 20 20  Level[iTst];.   
a0a0: 20 20 20 61 73 73 65 72 74 28 20 70 54 73 74 2d     assert( pTst-
a0b0: 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 3b 0a 20 20  >nMerge==0 );.  
a0c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
a0d0: 54 73 74 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b  Tst->nSeg; i++){
a0e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20  .        int sz 
a0f0: 3d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e  = pTst->aSeg[i].
a100: 70 67 6e 6f 4c 61 73 74 20 2d 20 70 54 73 74 2d  pgnoLast - pTst-
a110: 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 46 69 72  >aSeg[i].pgnoFir
a120: 73 74 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  st + 1;.        
a130: 69 66 28 20 73 7a 3e 73 7a 4d 61 78 20 29 20 73  if( sz>szMax ) s
a140: 7a 4d 61 78 20 3d 20 73 7a 3b 0a 20 20 20 20 20  zMax = sz;.     
a150: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d   }.      if( szM
a160: 61 78 3e 3d 73 7a 53 65 67 20 29 7b 0a 20 20 20  ax>=szSeg ){.   
a170: 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f       /* Conditio
a180: 6e 20 28 61 29 20 69 73 20 74 72 75 65 2e 20 50  n (a) is true. P
a190: 72 6f 6d 6f 74 65 20 74 68 65 20 6e 65 77 65 73  romote the newes
a1a0: 74 20 73 65 67 6d 65 6e 74 20 6f 6e 20 6c 65 76  t segment on lev
a1b0: 65 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  el .        ** i
a1c0: 4c 76 6c 20 74 6f 20 6c 65 76 65 6c 20 69 54 73  Lvl to level iTs
a1d0: 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  t.  */.        i
a1e0: 50 72 6f 6d 6f 74 65 20 3d 20 69 54 73 74 3b 0a  Promote = iTst;.
a1f0: 20 20 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74          szPromot
a200: 65 20 3d 20 73 7a 4d 61 78 3b 0a 20 20 20 20 20  e = szMax;.     
a210: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
a220: 20 49 66 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61   If condition (a
a230: 29 20 69 73 20 6e 6f 74 20 6d 65 74 2c 20 61 73  ) is not met, as
a240: 73 75 6d 65 20 28 62 29 20 69 73 20 74 72 75 65  sume (b) is true
a250: 2e 20 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f  . StructurePromo
a260: 74 65 54 6f 28 29 0a 20 20 20 20 2a 2a 20 69 73  teTo().    ** is
a270: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 69 74 20 69   a no-op if it i
a280: 73 20 6e 6f 74 2e 20 20 2a 2f 0a 20 20 20 20 69  s not.  */.    i
a290: 66 28 20 69 50 72 6f 6d 6f 74 65 3c 30 20 29 7b  f( iPromote<0 ){
a2a0: 0a 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20  .      iPromote 
a2b0: 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 73 7a  = iLvl;.      sz
a2c0: 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 53 65 67 3b  Promote = szSeg;
a2d0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53  .    }.    fts5S
a2e0: 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54  tructurePromoteT
a2f0: 6f 28 70 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 73  o(p, iPromote, s
a300: 7a 50 72 6f 6d 6f 74 65 2c 20 70 53 74 72 75 63  zPromote, pStruc
a310: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  t);.  }.}.../*.*
a320: 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74  * Advance the it
a330: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
a340: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
a350: 6e 74 2e 20 49 66 20 74 68 65 20 65 6e 64 20 6f  nt. If the end o
a360: 66 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73  f the .** doclis
a370: 74 2d 69 6e 64 65 78 20 70 61 67 65 20 69 73 20  t-index page is 
a380: 72 65 61 63 68 65 64 2c 20 72 65 74 75 72 6e 20  reached, return 
a390: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  non-zero..*/.sta
a3a0: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
a3b0: 78 4c 76 6c 4e 65 78 74 28 46 74 73 35 44 6c 69  xLvlNext(Fts5Dli
a3c0: 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20  dxLvl *pLvl){.  
a3d0: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 20  Fts5Data *pData 
a3e0: 3d 20 70 4c 76 6c 2d 3e 70 44 61 74 61 3b 0a 0a  = pLvl->pData;..
a3f0: 20 20 69 66 28 20 70 4c 76 6c 2d 3e 69 4f 66 66    if( pLvl->iOff
a400: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
a410: 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30  t( pLvl->bEof==0
a420: 20 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f   );.    pLvl->iO
a430: 66 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c 76 6c  ff = 1;.    pLvl
a440: 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65  ->iOff += fts5Ge
a450: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
a460: 2d 3e 70 5b 31 5d 2c 20 70 4c 76 6c 2d 3e 69 4c  ->p[1], pLvl->iL
a470: 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 70 4c  eafPgno);.    pL
a480: 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35  vl->iOff += fts5
a490: 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61  GetVarint(&pData
a4a0: 2d 3e 70 5b 70 4c 76 6c 2d 3e 69 4f 66 66 5d 2c  ->p[pLvl->iOff],
a4b0: 20 28 75 36 34 2a 29 26 70 4c 76 6c 2d 3e 69 52   (u64*)&pLvl->iR
a4c0: 6f 77 69 64 29 3b 0a 20 20 20 20 70 4c 76 6c 2d  owid);.    pLvl-
a4d0: 3e 69 46 69 72 73 74 4f 66 66 20 3d 20 70 4c 76  >iFirstOff = pLv
a4e0: 6c 2d 3e 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65  l->iOff;.  }else
a4f0: 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a  {.    int iOff;.
a500: 20 20 20 20 66 6f 72 28 69 4f 66 66 3d 70 4c 76      for(iOff=pLv
a510: 6c 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70 44  l->iOff; iOff<pD
a520: 61 74 61 2d 3e 6e 6e 3b 20 69 4f 66 66 2b 2b 29  ata->nn; iOff++)
a530: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74  {.      if( pDat
a540: 61 2d 3e 70 5b 69 4f 66 66 5d 20 29 20 62 72 65  a->p[iOff] ) bre
a550: 61 6b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ak; .    }..    
a560: 69 66 28 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e  if( iOff<pData->
a570: 6e 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  nn ){.      i64 
a580: 69 56 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c  iVal;.      pLvl
a590: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20 28  ->iLeafPgno += (
a5a0: 69 4f 66 66 20 2d 20 70 4c 76 6c 2d 3e 69 4f 66  iOff - pLvl->iOf
a5b0: 66 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 69 4f  f) + 1;.      iO
a5c0: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
a5d0: 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 4f  int(&pData->p[iO
a5e0: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c  ff], (u64*)&iVal
a5f0: 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69  );.      pLvl->i
a600: 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20  Rowid += iVal;. 
a610: 20 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20       pLvl->iOff 
a620: 3d 20 69 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73  = iOff;.    }els
a630: 65 7b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62  e{.      pLvl->b
a640: 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Eof = 1;.    }. 
a650: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 76   }..  return pLv
a660: 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  l->bEof;.}../*.*
a670: 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74  * Advance the it
a680: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
a690: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
a6a0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
a6b0: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e  t fts5DlidxIterN
a6c0: 65 78 74 52 28 46 74 73 35 49 6e 64 65 78 20 2a  extR(Fts5Index *
a6d0: 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  p, Fts5DlidxIter
a6e0: 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4c 76   *pIter, int iLv
a6f0: 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c  l){.  Fts5DlidxL
a700: 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65  vl *pLvl = &pIte
a710: 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a  r->aLvl[iLvl];..
a720: 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70    assert( iLvl<p
a730: 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20  Iter->nLvl );.  
a740: 69 66 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  if( fts5DlidxLvl
a750: 4e 65 78 74 28 70 4c 76 6c 29 20 29 7b 0a 20 20  Next(pLvl) ){.  
a760: 20 20 69 66 28 20 28 69 4c 76 6c 2b 31 29 20 3c    if( (iLvl+1) <
a770: 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a   pIter->nLvl ){.
a780: 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
a790: 74 65 72 4e 65 78 74 52 28 70 2c 20 70 49 74 65  terNextR(p, pIte
a7a0: 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20 20  r, iLvl+1);.    
a7b0: 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62 45    if( pLvl[1].bE
a7c0: 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  of==0 ){.       
a7d0: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
a7e0: 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20  (pLvl->pData);. 
a7f0: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c         memset(pL
a800: 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  vl, 0, sizeof(Ft
a810: 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
a820: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74        pLvl->pDat
a830: 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
a840: 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  (p, .           
a850: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
a860: 44 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c  D(pIter->iSegid,
a870: 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69   iLvl, pLvl[1].i
a880: 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20  LeafPgno).      
a890: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
a8a0: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 20 66   pLvl->pData ) f
a8b0: 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
a8c0: 70 4c 76 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pLvl);.      }. 
a8d0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
a8e0: 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30  rn pIter->aLvl[0
a8f0: 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63  ].bEof;.}.static
a900: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
a910: 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78  erNext(Fts5Index
a920: 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74   *p, Fts5DlidxIt
a930: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
a940: 74 75 72 6e 20 66 74 73 35 44 6c 69 64 78 49 74  turn fts5DlidxIt
a950: 65 72 4e 65 78 74 52 28 70 2c 20 70 49 74 65 72  erNextR(p, pIter
a960: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , 0);.}../*.** T
a970: 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
a980: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
a990: 61 72 67 75 6d 65 6e 74 20 68 61 73 20 74 68 65  argument has the
a9a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
a9b0: 73 20 73 65 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c  s set.** as foll
a9c0: 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ows. This functi
a9d0: 6f 6e 20 73 65 74 73 20 75 70 20 74 68 65 20 72  on sets up the r
a9e0: 65 73 74 20 6f 66 20 74 68 65 20 69 74 65 72 61  est of the itera
a9f0: 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74 0a 2a  tor so that it.*
aa00: 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
aa10: 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74  first rowid in t
aa20: 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  he doclist-index
aa30: 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 44 61 74 61 3a  ..**.**   pData:
aa40: 0a 2a 2a 20 20 20 20 20 70 6f 69 6e 74 65 72 20  .**     pointer 
aa50: 74 6f 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  to doclist-index
aa60: 20 72 65 63 6f 72 64 2c 20 0a 2a 2a 0a 2a 2a 20   record, .**.** 
aa70: 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
aa80: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 70 49 74  on is called pIt
aa90: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 69 73  er->iLeafPgno is
aaa0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
aab0: 20 74 68 65 0a 2a 2a 20 64 6f 63 6c 69 73 74 20   the.** doclist 
aac0: 69 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  is associated wi
aad0: 74 68 20 28 74 68 65 20 6f 6e 65 20 66 65 61 74  th (the one feat
aae0: 75 72 69 6e 67 20 74 68 65 20 74 65 72 6d 29 2e  uring the term).
aaf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
ab00: 74 73 35 44 6c 69 64 78 49 74 65 72 46 69 72 73  ts5DlidxIterFirs
ab10: 74 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  t(Fts5DlidxIter 
ab20: 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69  *pIter){.  int i
ab30: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
ab40: 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29  Iter->nLvl; i++)
ab50: 7b 0a 20 20 20 20 66 74 73 35 44 6c 69 64 78 4c  {.    fts5DlidxL
ab60: 76 6c 4e 65 78 74 28 26 70 49 74 65 72 2d 3e 61  vlNext(&pIter->a
ab70: 4c 76 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  Lvl[i]);.  }.  r
ab80: 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76  eturn pIter->aLv
ab90: 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 0a 73  l[0].bEof;.}...s
aba0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
abb0: 69 64 78 49 74 65 72 45 6f 66 28 46 74 73 35 49  idxIterEof(Fts5I
abc0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69  ndex *p, Fts5Dli
abd0: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
abe0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 21 3d    return p->rc!=
abf0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74  SQLITE_OK || pIt
ac00: 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66  er->aLvl[0].bEof
ac10: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
ac20: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61   fts5DlidxIterLa
ac30: 73 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  st(Fts5Index *p,
ac40: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
ac50: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pIter){.  int i;
ac60: 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 65  ..  /* Advance e
ac70: 61 63 68 20 6c 65 76 65 6c 20 74 6f 20 74 68 65  ach level to the
ac80: 20 6c 61 73 74 20 65 6e 74 72 79 20 6f 6e 20 74   last entry on t
ac90: 68 65 20 6c 61 73 74 20 70 61 67 65 20 2a 2f 0a  he last page */.
aca0: 20 20 66 6f 72 28 69 3d 70 49 74 65 72 2d 3e 6e    for(i=pIter->n
acb0: 4c 76 6c 2d 31 3b 20 70 2d 3e 72 63 3d 3d 53 51  Lvl-1; p->rc==SQ
acc0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3e 3d 30 3b  LITE_OK && i>=0;
acd0: 20 69 2d 2d 29 7b 0a 20 20 20 20 46 74 73 35 44   i--){.    Fts5D
ace0: 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20  lidxLvl *pLvl = 
acf0: 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b  &pIter->aLvl[i];
ad00: 0a 20 20 20 20 77 68 69 6c 65 28 20 66 74 73 35  .    while( fts5
ad10: 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76  DlidxLvlNext(pLv
ad20: 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76  l)==0 );.    pLv
ad30: 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 0a 20 20  l->bEof = 0;..  
ad40: 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20    if( i>0 ){.   
ad50: 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20     Fts5DlidxLvl 
ad60: 2a 70 43 68 69 6c 64 20 3d 20 26 70 4c 76 6c 5b  *pChild = &pLvl[
ad70: 2d 31 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 44  -1];.      fts5D
ad80: 61 74 61 52 65 6c 65 61 73 65 28 70 43 68 69 6c  ataRelease(pChil
ad90: 64 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20  d->pData);.     
ada0: 20 6d 65 6d 73 65 74 28 70 43 68 69 6c 64 2c 20   memset(pChild, 
adb0: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  0, sizeof(Fts5Dl
adc0: 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20  idxLvl));.      
add0: 70 43 68 69 6c 64 2d 3e 70 44 61 74 61 20 3d 20  pChild->pData = 
ade0: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
adf0: 0a 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f  .          FTS5_
ae00: 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65  DLIDX_ROWID(pIte
ae10: 72 2d 3e 69 53 65 67 69 64 2c 20 69 2d 31 2c 20  r->iSegid, i-1, 
ae20: 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29  pLvl->iLeafPgno)
ae30: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
ae40: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76    }.}../*.** Mov
ae50: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  e the iterator p
ae60: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
ae70: 79 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  y argument to th
ae80: 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
ae90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
aea0: 66 74 73 35 44 6c 69 64 78 4c 76 6c 50 72 65 76  fts5DlidxLvlPrev
aeb0: 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70  (Fts5DlidxLvl *p
aec0: 4c 76 6c 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66  Lvl){.  int iOff
aed0: 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 0a   = pLvl->iOff;..
aee0: 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e    assert( pLvl->
aef0: 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 69 66 28  bEof==0 );.  if(
af00: 20 69 4f 66 66 3c 3d 70 4c 76 6c 2d 3e 69 46 69   iOff<=pLvl->iFi
af10: 72 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 70 4c  rstOff ){.    pL
af20: 76 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  vl->bEof = 1;.  
af30: 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a 61  }else{.    u8 *a
af40: 20 3d 20 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e   = pLvl->pData->
af50: 70 3b 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b  p;.    i64 iVal;
af60: 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b  .    int iLimit;
af70: 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
af80: 20 69 6e 74 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a   int nZero = 0;.
af90: 0a 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c  .    /* Currentl
afa0: 79 20 69 4f 66 66 20 70 6f 69 6e 74 73 20 74 6f  y iOff points to
afb0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
afc0: 6f 66 20 61 20 76 61 72 69 6e 74 2e 20 54 68 69  of a varint. Thi
afd0: 73 20 62 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20  s block .    ** 
afe0: 64 65 63 72 65 6d 65 6e 74 73 20 69 4f 66 66 20  decrements iOff 
aff0: 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20  until it points 
b000: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
b010: 65 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  e of the previou
b020: 73 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 6e 74  s .    ** varint
b030: 2e 20 54 61 6b 69 6e 67 20 63 61 72 65 20 6e 6f  . Taking care no
b040: 74 20 74 6f 20 72 65 61 64 20 61 6e 79 20 6d 65  t to read any me
b050: 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 74  mory locations t
b060: 68 61 74 20 6f 63 63 75 72 0a 20 20 20 20 2a 2a  hat occur.    **
b070: 20 62 65 66 6f 72 65 20 74 68 65 20 62 75 66 66   before the buff
b080: 65 72 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 2a  er in memory.  *
b090: 2f 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 28  /.    iLimit = (
b0a0: 69 4f 66 66 3e 39 20 3f 20 69 4f 66 66 2d 39 20  iOff>9 ? iOff-9 
b0b0: 3a 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 4f  : 0);.    for(iO
b0c0: 66 66 2d 2d 3b 20 69 4f 66 66 3e 69 4c 69 6d 69  ff--; iOff>iLimi
b0d0: 74 3b 20 69 4f 66 66 2d 2d 29 7b 0a 20 20 20 20  t; iOff--){.    
b0e0: 20 20 69 66 28 20 28 61 5b 69 4f 66 66 2d 31 5d    if( (a[iOff-1]
b0f0: 20 26 20 30 78 38 30 29 3d 3d 30 20 29 20 62 72   & 0x80)==0 ) br
b100: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
b110: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  fts5GetVarint(&a
b120: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
b130: 56 61 6c 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  Val);.    pLvl->
b140: 69 52 6f 77 69 64 20 2d 3d 20 69 56 61 6c 3b 0a  iRowid -= iVal;.
b150: 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50      pLvl->iLeafP
b160: 67 6e 6f 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 53  gno--;..    /* S
b170: 6b 69 70 20 62 61 63 6b 77 61 72 64 73 20 70 61  kip backwards pa
b180: 73 74 20 61 6e 79 20 30 78 30 30 20 76 61 72 69  st any 0x00 vari
b190: 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  nts. */.    for(
b1a0: 69 69 3d 69 4f 66 66 2d 31 3b 20 69 69 3e 3d 70  ii=iOff-1; ii>=p
b1b0: 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 26  Lvl->iFirstOff &
b1c0: 26 20 61 5b 69 69 5d 3d 3d 30 78 30 30 3b 20 69  & a[ii]==0x00; i
b1d0: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 6e 5a 65 72  i--){.      nZer
b1e0: 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  o++;.    }.    i
b1f0: 66 28 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69  f( ii>=pLvl->iFi
b200: 72 73 74 4f 66 66 20 26 26 20 28 61 5b 69 69 5d  rstOff && (a[ii]
b210: 20 26 20 30 78 38 30 29 20 29 7b 0a 20 20 20 20   & 0x80) ){.    
b220: 20 20 2f 2a 20 54 68 65 20 62 79 74 65 20 69 6d    /* The byte im
b230: 6d 65 64 69 61 74 65 6c 79 20 62 65 66 6f 72 65  mediately before
b240: 20 74 68 65 20 6c 61 73 74 20 30 78 30 30 20 62   the last 0x00 b
b250: 79 74 65 20 68 61 73 20 74 68 65 20 30 78 38 30  yte has the 0x80
b260: 20 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 73 65   bit.      ** se
b270: 74 2e 20 53 6f 20 74 68 65 20 6c 61 73 74 20 30  t. So the last 0
b280: 78 30 30 20 69 73 20 6f 6e 6c 79 20 61 20 76 61  x00 is only a va
b290: 72 69 6e 74 20 30 20 69 66 20 74 68 65 72 65 20  rint 0 if there 
b2a0: 61 72 65 20 38 20 6d 6f 72 65 20 30 78 38 30 0a  are 8 more 0x80.
b2b0: 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 62        ** bytes b
b2c0: 65 66 6f 72 65 20 61 5b 69 69 5d 2e 20 2a 2f 0a  efore a[ii]. */.
b2d0: 20 20 20 20 20 20 69 6e 74 20 62 5a 65 72 6f 20        int bZero 
b2e0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
b2f0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 61 73    /* True if las
b300: 74 20 30 78 30 30 20 63 6f 75 6e 74 73 20 2a 2f  t 0x00 counts */
b310: 0a 20 20 20 20 20 20 69 66 28 20 28 69 69 2d 38  .      if( (ii-8
b320: 29 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f  )>=pLvl->iFirstO
b330: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ff ){.        in
b340: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t j;.        for
b350: 28 6a 3d 31 3b 20 6a 3c 3d 38 20 26 26 20 28 61  (j=1; j<=8 && (a
b360: 5b 69 69 2d 6a 5d 20 26 20 30 78 38 30 29 3b 20  [ii-j] & 0x80); 
b370: 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 62 5a  j++);.        bZ
b380: 65 72 6f 20 3d 20 28 6a 3e 38 29 3b 0a 20 20 20  ero = (j>8);.   
b390: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62     }.      if( b
b3a0: 5a 65 72 6f 3d 3d 30 20 29 20 6e 5a 65 72 6f 2d  Zero==0 ) nZero-
b3b0: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 76  -;.    }.    pLv
b3c0: 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2d 3d 20  l->iLeafPgno -= 
b3d0: 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 4c 76 6c 2d  nZero;.    pLvl-
b3e0: 3e 69 4f 66 66 20 3d 20 69 4f 66 66 20 2d 20 6e  >iOff = iOff - n
b3f0: 5a 65 72 6f 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Zero;.  }..  ret
b400: 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a  urn pLvl->bEof;.
b410: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
b420: 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 52  s5DlidxIterPrevR
b430: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
b440: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
b450: 74 65 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a  ter, int iLvl){.
b460: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a    Fts5DlidxLvl *
b470: 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61  pLvl = &pIter->a
b480: 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73  Lvl[iLvl];..  as
b490: 73 65 72 74 28 20 69 4c 76 6c 3c 70 49 74 65 72  sert( iLvl<pIter
b4a0: 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20  ->nLvl );.  if( 
b4b0: 66 74 73 35 44 6c 69 64 78 4c 76 6c 50 72 65 76  fts5DlidxLvlPrev
b4c0: 28 70 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69 66  (pLvl) ){.    if
b4d0: 28 20 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74  ( (iLvl+1) < pIt
b4e0: 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20  er->nLvl ){.    
b4f0: 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50    fts5DlidxIterP
b500: 72 65 76 52 28 70 2c 20 70 49 74 65 72 2c 20 69  revR(p, pIter, i
b510: 4c 76 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  Lvl+1);.      if
b520: 28 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d  ( pLvl[1].bEof==
b530: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  0 ){.        fts
b540: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76  5DataRelease(pLv
b550: 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20  l->pData);.     
b560: 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20     memset(pLvl, 
b570: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  0, sizeof(Fts5Dl
b580: 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20  idxLvl));.      
b590: 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20    pLvl->pData = 
b5a0: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
b5b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 54 53  .            FTS
b5c0: 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49  5_DLIDX_ROWID(pI
b5d0: 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76  ter->iSegid, iLv
b5e0: 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66  l, pLvl[1].iLeaf
b5f0: 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b  Pgno).        );
b600: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76  .        if( pLv
b610: 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20 20 20  l->pData ){.    
b620: 20 20 20 20 20 20 77 68 69 6c 65 28 20 66 74 73        while( fts
b630: 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c  5DlidxLvlNext(pL
b640: 76 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  vl)==0 );.      
b650: 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d      pLvl->bEof =
b660: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
b670: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
b680: 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
b690: 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d  >aLvl[0].bEof;.}
b6a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
b6b0: 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 46 74  DlidxIterPrev(Ft
b6c0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
b6d0: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
b6e0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  ){.  return fts5
b6f0: 44 6c 69 64 78 49 74 65 72 50 72 65 76 52 28 70  DlidxIterPrevR(p
b700: 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a  , pIter, 0);.}..
b710: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 64 6f 63  /*.** Free a doc
b720: 6c 69 73 74 2d 69 6e 64 65 78 20 69 74 65 72 61  list-index itera
b730: 74 6f 72 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63  tor object alloc
b740: 61 74 65 64 20 62 79 20 66 74 73 35 44 6c 69 64  ated by fts5Dlid
b750: 78 49 74 65 72 49 6e 69 74 28 29 2e 0a 2a 2f 0a  xIterInit()..*/.
b760: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
b770: 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 46 74  DlidxIterFree(Ft
b780: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
b790: 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72  er){.  if( pIter
b7a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
b7b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
b7c0: 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b  ter->nLvl; i++){
b7d0: 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52  .      fts5DataR
b7e0: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 61 4c  elease(pIter->aL
b7f0: 76 6c 5b 69 5d 2e 70 44 61 74 61 29 3b 0a 20 20  vl[i].pData);.  
b800: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
b810: 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d  free(pIter);.  }
b820: 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 44  .}..static Fts5D
b830: 6c 69 64 78 49 74 65 72 20 2a 66 74 73 35 44 6c  lidxIter *fts5Dl
b840: 69 64 78 49 74 65 72 49 6e 69 74 28 0a 20 20 46  idxIterInit(.  F
b850: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
b860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b870: 2a 20 46 74 73 35 20 42 61 63 6b 65 6e 64 20 74  * Fts5 Backend t
b880: 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
b890: 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20   */.  int bRev, 
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8b0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
b8c0: 72 20 4f 52 44 45 52 20 42 59 20 41 53 43 20 2a  r ORDER BY ASC *
b8d0: 2f 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20  /.  int iSegid, 
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8f0: 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69      /* Segment i
b900: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  d */.  int iLeaf
b910: 50 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg              
b920: 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70         /* Leaf p
b930: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f  age number to lo
b940: 61 64 20 64 6c 69 64 78 20 66 6f 72 20 2a 2f 0a  ad dlidx for */.
b950: 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74  ){.  Fts5DlidxIt
b960: 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20  er *pIter = 0;. 
b970: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 44   int i;.  int bD
b980: 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  one = 0;..  for(
b990: 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  i=0; p->rc==SQLI
b9a0: 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d  TE_OK && bDone==
b9b0: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  0; i++){.    int
b9c0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
b9d0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 29 20 2b  Fts5DlidxIter) +
b9e0: 20 69 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35   i * sizeof(Fts5
b9f0: 44 6c 69 64 78 4c 76 6c 29 3b 0a 20 20 20 20 46  DlidxLvl);.    F
ba00: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 4e  ts5DlidxIter *pN
ba10: 65 77 3b 0a 0a 20 20 20 20 70 4e 65 77 20 3d 20  ew;..    pNew = 
ba20: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 2a 29  (Fts5DlidxIter*)
ba30: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
ba40: 70 49 74 65 72 2c 20 6e 42 79 74 65 29 3b 0a 20  pIter, nByte);. 
ba50: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
ba60: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
ba70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
ba80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
ba90: 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35  64 iRowid = FTS5
baa0: 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 69 53 65  _DLIDX_ROWID(iSe
bab0: 67 69 64 2c 20 69 2c 20 69 4c 65 61 66 50 67 29  gid, i, iLeafPg)
bac0: 3b 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64  ;.      Fts5Dlid
bad0: 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 4e  xLvl *pLvl = &pN
bae0: 65 77 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20  ew->aLvl[i];.   
baf0: 20 20 20 70 49 74 65 72 20 3d 20 70 4e 65 77 3b     pIter = pNew;
bb00: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c  .      memset(pL
bb10: 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  vl, 0, sizeof(Ft
bb20: 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
bb30: 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20      pLvl->pData 
bb40: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
bb50: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , iRowid);.     
bb60: 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61   if( pLvl->pData
bb70: 20 26 26 20 28 70 4c 76 6c 2d 3e 70 44 61 74 61   && (pLvl->pData
bb80: 2d 3e 70 5b 30 5d 20 26 20 30 78 30 30 30 31 29  ->p[0] & 0x0001)
bb90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ==0 ){.        b
bba0: 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Done = 1;.      
bbb0: 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  }.      pIter->n
bbc0: 4c 76 6c 20 3d 20 69 2b 31 3b 0a 20 20 20 20 7d  Lvl = i+1;.    }
bbd0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
bbe0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
bbf0: 20 20 20 20 70 49 74 65 72 2d 3e 69 53 65 67 69      pIter->iSegi
bc00: 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20  d = iSegid;.    
bc10: 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20  if( bRev==0 ){. 
bc20: 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
bc30: 65 72 46 69 72 73 74 28 70 49 74 65 72 29 3b 0a  erFirst(pIter);.
bc40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bc50: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61   fts5DlidxIterLa
bc60: 73 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  st(p, pIter);.  
bc70: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
bc80: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
bc90: 29 7b 0a 20 20 20 20 66 74 73 35 44 6c 69 64 78  ){.    fts5Dlidx
bca0: 49 74 65 72 46 72 65 65 28 70 49 74 65 72 29 3b  IterFree(pIter);
bcb0: 0a 20 20 20 20 70 49 74 65 72 20 3d 20 30 3b 0a  .    pIter = 0;.
bcc0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49    }..  return pI
bcd0: 74 65 72 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  ter;.}..static i
bce0: 36 34 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  64 fts5DlidxIter
bcf0: 52 6f 77 69 64 28 46 74 73 35 44 6c 69 64 78 49  Rowid(Fts5DlidxI
bd00: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72  ter *pIter){.  r
bd10: 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76  eturn pIter->aLv
bd20: 6c 5b 30 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 73  l[0].iRowid;.}.s
bd30: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
bd40: 69 64 78 49 74 65 72 50 67 6e 6f 28 46 74 73 35  idxIterPgno(Fts5
bd50: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
bd60: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65  ){.  return pIte
bd70: 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 4c 65 61 66  r->aLvl[0].iLeaf
bd80: 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  Pgno;.}../*.** L
bd90: 6f 61 64 20 74 68 65 20 6e 65 78 74 20 6c 65 61  oad the next lea
bda0: 66 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  f page into the 
bdb0: 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72  segment iterator
bdc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
bdd0: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
bde0: 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65  Page(.  Fts5Inde
bdf0: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
be00: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
be10: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
be20: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
be30: 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
be40: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
be50: 74 6f 20 61 64 76 61 6e 63 65 20 74 6f 20 6e 65  to advance to ne
be60: 78 74 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  xt page */.){.  
be70: 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b  Fts5Data *pLeaf;
be80: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
be90: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
bea0: 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 20 20 66  pIter->pSeg;.  f
beb0: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
bec0: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
bed0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
bee0: 2b 2b 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d  ++;.  if( pIter-
bef0: 3e 70 4e 65 78 74 4c 65 61 66 20 29 7b 0a 20 20  >pNextLeaf ){.  
bf00: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
bf10: 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61   pIter->pNextLea
bf20: 66 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4e  f;.    pIter->pN
bf30: 65 78 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d  extLeaf = 0;.  }
bf40: 65 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e  else if( pIter->
bf50: 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 53 65 67 2d  iLeafPgno<=pSeg-
bf60: 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20  >pgnoLast ){.   
bf70: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
bf80: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
bf90: 0a 20 20 20 20 20 20 20 20 46 54 53 35 5f 53 45  .        FTS5_SE
bfa0: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67  GMENT_ROWID(pSeg
bfb0: 2d 3e 69 53 65 67 69 64 2c 20 70 49 74 65 72 2d  ->iSegid, pIter-
bfc0: 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20  >iLeafPgno).    
bfd0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
bfe0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
bff0: 3b 0a 20 20 7d 0a 20 20 70 4c 65 61 66 20 3d 20  ;.  }.  pLeaf = 
c000: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 0a 20  pIter->pLeaf;.. 
c010: 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20   if( pLeaf ){.  
c020: 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f    pIter->iPgidxO
c030: 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65  ff = pLeaf->szLe
c040: 61 66 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35  af;.    if( fts5
c050: 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70  LeafIsTermless(p
c060: 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 70  Leaf) ){.      p
c070: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
c080: 69 73 74 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e 2b  ist = pLeaf->nn+
c090: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
c0a0: 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64      pIter->iPgid
c0b0: 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  xOff += fts5GetV
c0c0: 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e  arint32(&pLeaf->
c0d0: 70 5b 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f  p[pIter->iPgidxO
c0e0: 66 66 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 70  ff],.          p
c0f0: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
c100: 69 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ist.      );.   
c110: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
c120: 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74  Argument p point
c130: 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
c140: 6e 74 61 69 6e 69 6e 67 20 61 20 76 61 72 69 6e  ntaining a varin
c150: 74 20 74 6f 20 62 65 20 69 6e 74 65 72 70 72 65  t to be interpre
c160: 74 65 64 20 61 73 20 61 0a 2a 2a 20 70 6f 73 69  ted as a.** posi
c170: 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20 66  tion list size f
c180: 69 65 6c 64 2e 20 52 65 61 64 20 74 68 65 20 76  ield. Read the v
c190: 61 72 69 6e 74 20 61 6e 64 20 72 65 74 75 72 6e  arint and return
c1a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
c1b0: 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e 20 42 65  ytes.** read. Be
c1c0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
c1d0: 73 65 74 20 2a 70 6e 53 7a 20 74 6f 20 74 68 65  set *pnSz to the
c1e0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
c1f0: 20 69 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   in the position
c200: 0a 2a 2a 20 6c 69 73 74 2c 20 61 6e 64 20 2a 70  .** list, and *p
c210: 62 44 65 6c 20 74 6f 20 74 72 75 65 20 69 66 20  bDel to true if 
c220: 74 68 65 20 64 65 6c 65 74 65 20 66 6c 61 67 20  the delete flag 
c230: 69 73 20 73 65 74 2c 20 6f 72 20 66 61 6c 73 65  is set, or false
c240: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
c250: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 47 65  tatic int fts5Ge
c260: 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 63 6f 6e  tPoslistSize(con
c270: 73 74 20 75 38 20 2a 70 2c 20 69 6e 74 20 2a 70  st u8 *p, int *p
c280: 6e 53 7a 2c 20 69 6e 74 20 2a 70 62 44 65 6c 29  nSz, int *pbDel)
c290: 7b 0a 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 69  {.  int nSz;.  i
c2a0: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 66 74 73 35  nt n = 0;.  fts5
c2b0: 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28  FastGetVarint32(
c2c0: 70 2c 20 6e 2c 20 6e 53 7a 29 3b 0a 20 20 61 73  p, n, nSz);.  as
c2d0: 73 65 72 74 5f 6e 63 28 20 6e 53 7a 3e 3d 30 20  sert_nc( nSz>=0 
c2e0: 29 3b 0a 20 20 2a 70 6e 53 7a 20 3d 20 6e 53 7a  );.  *pnSz = nSz
c2f0: 2f 32 3b 0a 20 20 2a 70 62 44 65 6c 20 3d 20 6e  /2;.  *pbDel = n
c300: 53 7a 20 26 20 30 78 30 30 30 31 3b 0a 20 20 72  Sz & 0x0001;.  r
c310: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
c320: 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c  * Fts5SegIter.iL
c330: 65 61 66 4f 66 66 73 65 74 20 63 75 72 72 65 6e  eafOffset curren
c340: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  tly points to th
c350: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
c360: 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69  a.** position-li
c370: 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 52  st size field. R
c380: 65 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ead the value of
c390: 20 74 68 65 20 66 69 65 6c 64 20 61 6e 64 20 73   the field and s
c3a0: 74 6f 72 65 20 69 74 0a 2a 2a 20 69 6e 20 74 68  tore it.** in th
c3b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
c3c0: 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46  ables:.**.**   F
c3d0: 74 73 35 53 65 67 49 74 65 72 2e 6e 50 6f 73 0a  ts5SegIter.nPos.
c3e0: 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72  **   Fts5SegIter
c3f0: 2e 62 44 65 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61 76  .bDel.**.** Leav
c400: 65 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c  e Fts5SegIter.iL
c410: 65 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 69  eafOffset pointi
c420: 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ng to the first 
c430: 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  byte of the .** 
c440: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f  position list co
c450: 6e 74 65 6e 74 20 28 69 66 20 61 6e 79 29 2e 0a  ntent (if any)..
c460: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
c470: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
c480: 6f 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  os(Fts5Index *p,
c490: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
c4a0: 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  ter){.  if( p->r
c4b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
c4c0: 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70      int iOff = p
c4d0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
c4e0: 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f  t;  /* Offset to
c4f0: 20 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 20 20   read at */.    
c500: 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b  ASSERT_SZLEAF_OK
c510: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
c520: 20 20 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66      if( p->pConf
c530: 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
c540: 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b  5_DETAIL_NONE ){
c550: 0a 20 20 20 20 20 20 69 6e 74 20 69 45 6f 64 20  .      int iEod 
c560: 3d 20 4d 49 4e 28 70 49 74 65 72 2d 3e 69 45 6e  = MIN(pIter->iEn
c570: 64 6f 66 44 6f 63 6c 69 73 74 2c 20 70 49 74 65  dofDoclist, pIte
c580: 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  r->pLeaf->szLeaf
c590: 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
c5a0: 62 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  bDel = 0;.      
c5b0: 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 31 3b  pIter->nPos = 1;
c5c0: 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c  .      if( iOff<
c5d0: 69 45 6f 64 20 26 26 20 70 49 74 65 72 2d 3e 70  iEod && pIter->p
c5e0: 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 3d 3d 30  Leaf->p[iOff]==0
c5f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65   ){.        pIte
c600: 72 2d 3e 62 44 65 6c 20 3d 20 31 3b 0a 20 20 20  r->bDel = 1;.   
c610: 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20       iOff++;.   
c620: 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 69 45       if( iOff<iE
c630: 6f 64 20 26 26 20 70 49 74 65 72 2d 3e 70 4c 65  od && pIter->pLe
c640: 61 66 2d 3e 70 5b 69 4f 66 66 5d 3d 3d 30 20 29  af->p[iOff]==0 )
c650: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
c660: 72 2d 3e 6e 50 6f 73 20 3d 20 31 3b 0a 20 20 20  r->nPos = 1;.   
c670: 20 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20         iOff++;. 
c680: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
c690: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e          pIter->n
c6a0: 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Pos = 0;.       
c6b0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
c6c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
c6d0: 6e 53 7a 3b 0a 20 20 20 20 20 20 66 74 73 35 46  nSz;.      fts5F
c6e0: 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70  astGetVarint32(p
c6f0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 2c 20  Iter->pLeaf->p, 
c700: 69 4f 66 66 2c 20 6e 53 7a 29 3b 0a 20 20 20 20  iOff, nSz);.    
c710: 20 20 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20    pIter->bDel = 
c720: 28 6e 53 7a 20 26 20 30 78 30 30 30 31 29 3b 0a  (nSz & 0x0001);.
c730: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f        pIter->nPo
c740: 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a 20 20 20 20  s = nSz>>1;.    
c750: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 49 74    assert_nc( pIt
c760: 65 72 2d 3e 6e 50 6f 73 3e 3d 30 20 29 3b 0a 20  er->nPos>=0 );. 
c770: 20 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e     }.    pIter->
c780: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
c790: 66 66 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  ff;.  }.}..stati
c7a0: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
c7b0: 65 72 4c 6f 61 64 52 6f 77 69 64 28 46 74 73 35  erLoadRowid(Fts5
c7c0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
c7d0: 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
c7e0: 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e   u8 *a = pIter->
c7f0: 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20 20 20  pLeaf->p;       
c800: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65   /* Buffer to re
c810: 61 64 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a  ad data from */.
c820: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74    int iOff = pIt
c830: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
c840: 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41  ..  ASSERT_SZLEA
c850: 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61  F_OK(pIter->pLea
c860: 66 29 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e 3d  f);.  if( iOff>=
c870: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
c880: 4c 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35  Leaf ){.    fts5
c890: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
c8a0: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69  p, pIter);.    i
c8b0: 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  f( pIter->pLeaf=
c8c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
c8d0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
c8e0: 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
c8f0: 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 72  CORRUPT;.      r
c900: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
c910: 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20 20 20 61   iOff = 4;.    a
c920: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
c930: 3e 70 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 20 2b  >p;.  }.  iOff +
c940: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  = sqlite3Fts5Get
c950: 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
c960: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
c970: 52 6f 77 69 64 29 3b 0a 20 20 70 49 74 65 72 2d  Rowid);.  pIter-
c980: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
c990: 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74  Off;.}../*.** Ft
c9a0: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
c9b0: 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20  ffset currently 
c9c0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
c9d0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
c9e0: 0a 2a 2a 20 22 6e 53 75 66 66 69 78 22 20 66 69  .** "nSuffix" fi
c9f0: 65 6c 64 20 6f 66 20 61 20 74 65 72 6d 2e 20 46  eld of a term. F
ca00: 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
ca10: 72 20 6e 4b 65 65 70 20 63 6f 6e 74 61 69 6e 73  r nKeep contains
ca20: 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   the value.** of
ca30: 20 74 68 65 20 22 6e 50 72 65 66 69 78 22 20 66   the "nPrefix" f
ca40: 69 65 6c 64 20 28 69 66 20 74 68 65 72 65 20 77  ield (if there w
ca50: 61 73 20 6f 6e 65 20 2d 20 69 74 20 69 73 20 70  as one - it is p
ca60: 61 73 73 65 64 20 30 20 69 66 20 74 68 69 73 20  assed 0 if this 
ca70: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
ca80: 74 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d  term in the segm
ca90: 65 6e 74 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ent)..**.** This
caa0: 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61   function popula
cab0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73  tes:.**.**   Fts
cac0: 35 53 65 67 49 74 65 72 2e 74 65 72 6d 0a 2a 2a  5SegIter.term.**
cad0: 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 72     Fts5SegIter.r
cae0: 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 61 63 63 6f 72  owid.**.** accor
caf0: 64 69 6e 67 6c 79 20 61 6e 64 20 6c 65 61 76 65  dingly and leave
cb00: 73 20 28 46 74 73 35 53 65 67 49 74 65 72 2e 69  s (Fts5SegIter.i
cb10: 4c 65 61 66 4f 66 66 73 65 74 29 20 73 65 74 20  LeafOffset) set 
cb20: 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  to the content o
cb30: 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70  f.** the first p
cb40: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e 20 54 68  osition list. Th
cb50: 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
cb60: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 64 6f 63  belonging to doc
cb70: 75 6d 65 6e 74 20 0a 2a 2a 20 28 46 74 73 35 53  ument .** (Fts5S
cb80: 65 67 49 74 65 72 2e 69 52 6f 77 69 64 29 2e 0a  egIter.iRowid)..
cb90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
cba0: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65  ts5SegIterLoadTe
cbb0: 72 6d 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  rm(Fts5Index *p,
cbc0: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
cbd0: 74 65 72 2c 20 69 6e 74 20 6e 4b 65 65 70 29 7b  ter, int nKeep){
cbe0: 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72  .  u8 *a = pIter
cbf0: 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20  ->pLeaf->p;     
cc00: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
cc10: 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 2a  read data from *
cc20: 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70  /.  int iOff = p
cc30: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
cc40: 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f  t;  /* Offset to
cc50: 20 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 69 6e   read at */.  in
cc60: 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20  t nNew;         
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cc80: 20 42 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61   Bytes of new da
cc90: 74 61 20 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d  ta */..  iOff +=
cca0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
ccb0: 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29  (&a[iOff], nNew)
ccc0: 3b 0a 20 20 69 66 28 20 69 4f 66 66 2b 6e 4e 65  ;.  if( iOff+nNe
ccd0: 77 3e 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  w>pIter->pLeaf->
cce0: 6e 6e 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  nn ){.    p->rc 
ccf0: 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
cd00: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
cd10: 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20    pIter->term.n 
cd20: 3d 20 6e 4b 65 65 70 3b 0a 20 20 66 74 73 35 42  = nKeep;.  fts5B
cd30: 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
cd40: 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e  &p->rc, &pIter->
cd50: 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69  term, nNew, &a[i
cd60: 4f 66 66 5d 29 3b 0a 20 20 69 4f 66 66 20 2b 3d  Off]);.  iOff +=
cd70: 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e   nNew;.  pIter->
cd80: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20  iTermLeafOffset 
cd90: 3d 20 69 4f 66 66 3b 0a 20 20 70 49 74 65 72 2d  = iOff;.  pIter-
cda0: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d  >iTermLeafPgno =
cdb0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
cdc0: 6f 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  o;.  pIter->iLea
cdd0: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
cde0: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 50  .  if( pIter->iP
cdf0: 67 69 64 78 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  gidxOff>=pIter->
ce00: 70 4c 65 61 66 2d 3e 6e 6e 20 29 7b 0a 20 20 20  pLeaf->nn ){.   
ce10: 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
ce20: 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70  clist = pIter->p
ce30: 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65  Leaf->nn+1;.  }e
ce40: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
ce50: 74 72 61 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  tra;.    pIter->
ce60: 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73  iPgidxOff += fts
ce70: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
ce80: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
ce90: 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  ], nExtra);.    
cea0: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
ceb0: 6c 69 73 74 20 2b 3d 20 6e 45 78 74 72 61 3b 0a  list += nExtra;.
cec0: 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74    }..  fts5SegIt
ced0: 65 72 4c 6f 61 64 52 6f 77 69 64 28 70 2c 20 70  erLoadRowid(p, p
cee0: 49 74 65 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  Iter);.}..static
cef0: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
cf00: 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 2a  rNext(Fts5Index*
cf10: 2c 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c 20  , Fts5SegIter*, 
cf20: 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  int*);.static vo
cf30: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  id fts5SegIterNe
cf40: 78 74 5f 52 65 76 65 72 73 65 28 46 74 73 35 49  xt_Reverse(Fts5I
cf50: 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67 49 74  ndex*, Fts5SegIt
cf60: 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74  er*, int*);.stat
cf70: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
cf80: 74 65 72 4e 65 78 74 5f 4e 6f 6e 65 28 46 74 73  terNext_None(Fts
cf90: 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67  5Index*, Fts5Seg
cfa0: 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 73  Iter*, int*);..s
cfb0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
cfc0: 65 67 49 74 65 72 53 65 74 4e 65 78 74 28 46 74  egIterSetNext(Ft
cfd0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
cfe0: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
cff0: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c  .  if( pIter->fl
d000: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
d010: 45 52 5f 52 45 56 45 52 53 45 20 29 7b 0a 20 20  ER_REVERSE ){.  
d020: 20 20 70 49 74 65 72 2d 3e 78 4e 65 78 74 20 3d    pIter->xNext =
d030: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
d040: 5f 52 65 76 65 72 73 65 3b 0a 20 20 7d 65 6c 73  _Reverse;.  }els
d050: 65 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67  e if( p->pConfig
d060: 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
d070: 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
d080: 20 20 20 70 49 74 65 72 2d 3e 78 4e 65 78 74 20     pIter->xNext 
d090: 3d 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  = fts5SegIterNex
d0a0: 74 5f 4e 6f 6e 65 3b 0a 20 20 7d 65 6c 73 65 7b  t_None;.  }else{
d0b0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 78 4e 65 78  .    pIter->xNex
d0c0: 74 20 3d 20 66 74 73 35 53 65 67 49 74 65 72 4e  t = fts5SegIterN
d0d0: 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ext;.  }.}../*.*
d0e0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
d0f0: 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
d100: 20 70 49 74 65 72 20 74 6f 20 69 74 65 72 61 74   pIter to iterat
d110: 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 6e  e through the en
d120: 74 72 69 65 73 20 69 6e 0a 2a 2a 20 73 65 67 6d  tries in.** segm
d130: 65 6e 74 20 70 53 65 67 2e 20 54 68 65 20 69 74  ent pSeg. The it
d140: 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70  erator is left p
d150: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
d160: 69 72 73 74 20 65 6e 74 72 79 20 77 68 65 6e 20  irst entry when 
d170: 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
d180: 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a  n returns..**.**
d190: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
d1a0: 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72  urs, Fts5Index.r
d1b0: 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61  c is set to an a
d1c0: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
d1d0: 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e   code. If .** an
d1e0: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
d1f0: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
d200: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
d210: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
d220: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
d230: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
d240: 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49  terInit(.  Fts5I
d250: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
d260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
d270: 53 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  S index object *
d280: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
d290: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20  eSegment *pSeg, 
d2a0: 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
d2b0: 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f  on of segment */
d2c0: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
d2d0: 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20  pIter           
d2e0: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20     /* Object to 
d2f0: 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20  populate */.){. 
d300: 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46   if( pSeg->pgnoF
d310: 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  irst==0 ){.    /
d320: 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  * This happens i
d330: 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69 73  f the segment is
d340: 20 62 65 69 6e 67 20 75 73 65 64 20 61 73 20 61   being used as a
d350: 6e 20 69 6e 70 75 74 20 74 6f 20 61 6e 20 69 6e  n input to an in
d360: 63 72 65 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a  cremental.    **
d370: 20 6d 65 72 67 65 20 61 6e 64 20 61 6c 6c 20 64   merge and all d
d380: 61 74 61 20 68 61 73 20 61 6c 72 65 61 64 79 20  ata has already 
d390: 62 65 65 6e 20 22 74 72 69 6d 6d 65 64 22 2e 20  been "trimmed". 
d3a0: 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  See function.   
d3b0: 20 2a 2a 20 66 74 73 35 54 72 69 6d 53 65 67 6d   ** fts5TrimSegm
d3c0: 65 6e 74 73 28 29 20 66 6f 72 20 64 65 74 61 69  ents() for detai
d3d0: 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ls. In this case
d3e0: 20 6c 65 61 76 65 20 74 68 65 20 69 74 65 72 61   leave the itera
d3f0: 74 6f 72 20 65 6d 70 74 79 2e 0a 20 20 20 20 2a  tor empty..    *
d400: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  * The caller wil
d410: 6c 20 73 65 65 20 74 68 65 20 28 70 49 74 65 72  l see the (pIter
d420: 2d 3e 70 4c 65 61 66 3d 3d 30 29 20 61 6e 64 20  ->pLeaf==0) and 
d430: 61 73 73 75 6d 65 20 74 68 65 20 69 74 65 72 61  assume the itera
d440: 74 6f 72 20 69 73 0a 20 20 20 20 2a 2a 20 61 74  tor is.    ** at
d450: 20 45 4f 46 20 61 6c 72 65 61 64 79 2e 20 2a 2f   EOF already. */
d460: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
d470: 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a  er->pLeaf==0 );.
d480: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d490: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
d4a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d  LITE_OK ){.    m
d4b0: 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
d4c0: 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b  sizeof(*pIter));
d4d0: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
d4e0: 53 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72  SetNext(p, pIter
d4f0: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 53  );.    pIter->pS
d500: 65 67 20 3d 20 70 53 65 67 3b 0a 20 20 20 20 70  eg = pSeg;.    p
d510: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
d520: 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  = pSeg->pgnoFirs
d530: 74 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67  t-1;.    fts5Seg
d540: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
d550: 70 49 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  pIter);.  }..  i
d560: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
d570: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72  _OK ){.    pIter
d580: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
d590: 34 3b 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63  4;.    assert_nc
d5a0: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  ( pIter->pLeaf->
d5b0: 6e 6e 3e 34 20 29 3b 0a 20 20 20 20 61 73 73 65  nn>4 );.    asse
d5c0: 72 74 28 20 66 74 73 35 4c 65 61 66 46 69 72 73  rt( fts5LeafFirs
d5d0: 74 54 65 72 6d 4f 66 66 28 70 49 74 65 72 2d 3e  tTermOff(pIter->
d5e0: 70 4c 65 61 66 29 3d 3d 34 20 29 3b 0a 20 20 20  pLeaf)==4 );.   
d5f0: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
d600: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
d610: 2d 3e 73 7a 4c 65 61 66 2b 31 3b 0a 20 20 20 20  ->szLeaf+1;.    
d620: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54  fts5SegIterLoadT
d630: 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 30 29  erm(p, pIter, 0)
d640: 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  ;.    fts5SegIte
d650: 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
d660: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
d670: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d680: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c  is only ever cal
d690: 6c 65 64 20 6f 6e 20 69 74 65 72 61 74 6f 72 73  led on iterators
d6a0: 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c   created by call
d6b0: 73 20 74 6f 0a 2a 2a 20 46 74 73 35 49 6e 64 65  s to.** Fts5Inde
d6c0: 78 51 75 65 72 79 28 29 20 77 69 74 68 20 74 68  xQuery() with th
d6d0: 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
d6e0: 59 5f 44 45 53 43 20 66 6c 61 67 20 73 65 74 2e  Y_DESC flag set.
d6f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61  .**.** The itera
d700: 74 6f 72 20 69 73 20 69 6e 20 61 6e 20 75 6e 75  tor is in an unu
d710: 73 75 61 6c 20 73 74 61 74 65 20 77 68 65 6e 20  sual state when 
d720: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
d730: 20 63 61 6c 6c 65 64 3a 20 74 68 65 0a 2a 2a 20   called: the.** 
d740: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
d750: 66 4f 66 66 73 65 74 20 76 61 72 69 61 62 6c 65  fOffset variable
d760: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
d770: 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 74 61  ffset of the sta
d780: 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 70 6f 73  rt of.** the pos
d790: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
d7a0: 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20 66 69  field for the fi
d7b0: 72 73 74 20 72 65 6c 65 76 61 6e 74 20 72 6f 77  rst relevant row
d7c0: 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  id on the page..
d7d0: 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 72  ** Fts5SegIter.r
d7e0: 6f 77 69 64 20 69 73 20 73 65 74 2c 20 62 75 74  owid is set, but
d7f0: 20 6e 50 6f 73 20 61 6e 64 20 62 44 65 6c 20 61   nPos and bDel a
d800: 72 65 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  re not..**.** Th
d810: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64 76 61  is function adva
d820: 6e 63 65 73 20 74 68 65 20 69 74 65 72 61 74 6f  nces the iterato
d830: 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
d840: 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  nts to the last 
d850: 0a 2a 2a 20 72 65 6c 65 76 61 6e 74 20 72 6f 77  .** relevant row
d860: 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61  id on the page a
d870: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
d880: 2c 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  , initializes th
d890: 65 20 0a 2a 2a 20 61 52 6f 77 69 64 4f 66 66 73  e .** aRowidOffs
d8a0: 65 74 5b 5d 20 61 6e 64 20 69 52 6f 77 69 64 4f  et[] and iRowidO
d8b0: 66 66 73 65 74 20 76 61 72 69 61 62 6c 65 73 2e  ffset variables.
d8c0: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
d8d0: 68 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 69  he iterator.** i
d8e0: 73 20 69 6e 20 69 74 73 20 72 65 67 75 6c 61 72  s in its regular
d8f0: 20 73 74 61 74 65 20 2d 20 46 74 73 35 53 65 67   state - Fts5Seg
d900: 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74  Iter.iLeafOffset
d910: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
d920: 69 72 73 74 0a 2a 2a 20 62 79 74 65 20 6f 66 20  irst.** byte of 
d930: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
d940: 74 20 63 6f 6e 74 65 6e 74 20 61 73 73 6f 63 69  t content associ
d950: 61 74 65 64 20 77 69 74 68 20 73 61 69 64 20 72  ated with said r
d960: 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  owid..*/.static 
d970: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
d980: 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28  ReverseInitPage(
d990: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
d9a0: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
d9b0: 29 7b 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c  ){.  int eDetail
d9c0: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65   = p->pConfig->e
d9d0: 44 65 74 61 69 6c 3b 0a 20 20 69 6e 74 20 6e 20  Detail;.  int n 
d9e0: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
d9f0: 73 7a 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69 20  szLeaf;.  int i 
da00: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
da10: 66 73 65 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20  fset;.  u8 *a = 
da20: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
da30: 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66  .  int iRowidOff
da40: 73 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  set = 0;..  if( 
da50: 6e 3e 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44  n>pIter->iEndofD
da60: 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 6e 20  oclist ){.    n 
da70: 3d 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44  = pIter->iEndofD
da80: 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 41  oclist;.  }..  A
da90: 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28  SSERT_SZLEAF_OK(
daa0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
dab0: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
dac0: 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20 30 3b   i64 iDelta = 0;
dad0: 0a 0a 20 20 20 20 69 66 28 20 65 44 65 74 61 69  ..    if( eDetai
dae0: 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l==FTS5_DETAIL_N
daf0: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ONE ){.      /* 
db00: 74 6f 64 6f 20 2a 2f 0a 20 20 20 20 20 20 69 66  todo */.      if
db10: 28 20 69 3c 6e 20 26 26 20 61 5b 69 5d 3d 3d 30  ( i<n && a[i]==0
db20: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b   ){.        i++;
db30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e  .        if( i<n
db40: 20 26 26 20 61 5b 69 5d 3d 3d 30 20 29 20 69 2b   && a[i]==0 ) i+
db50: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
db60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
db70: 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69 6e 74 20  nPos;.      int 
db80: 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20 69 20  bDummy;.      i 
db90: 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73  += fts5GetPoslis
dba0: 74 53 69 7a 65 28 26 61 5b 69 5d 2c 20 26 6e 50  tSize(&a[i], &nP
dbb0: 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20  os, &bDummy);.  
dbc0: 20 20 20 20 69 20 2b 3d 20 6e 50 6f 73 3b 0a 20      i += nPos;. 
dbd0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d     }.    if( i>=
dbe0: 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  n ) break;.    i
dbf0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
dc00: 74 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26  t(&a[i], (u64*)&
dc10: 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74  iDelta);.    pIt
dc20: 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44  er->iRowid += iD
dc30: 65 6c 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  elta;..    /* If
dc40: 20 6e 65 63 65 73 73 61 72 79 2c 20 67 72 6f 77   necessary, grow
dc50: 20 74 68 65 20 70 49 74 65 72 2d 3e 61 52 6f 77   the pIter->aRow
dc60: 69 64 4f 66 66 73 65 74 5b 5d 20 61 72 72 61 79  idOffset[] array
dc70: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 52 6f  . */.    if( iRo
dc80: 77 69 64 4f 66 66 73 65 74 3e 3d 70 49 74 65 72  widOffset>=pIter
dc90: 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 29  ->nRowidOffset )
dca0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77  {.      int nNew
dcb0: 20 3d 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64   = pIter->nRowid
dcc0: 4f 66 66 73 65 74 20 2b 20 38 3b 0a 20 20 20 20  Offset + 8;.    
dcd0: 20 20 69 6e 74 20 2a 61 4e 65 77 20 3d 20 28 69    int *aNew = (i
dce0: 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  nt*)sqlite3_real
dcf0: 6c 6f 63 28 70 49 74 65 72 2d 3e 61 52 6f 77 69  loc(pIter->aRowi
dd00: 64 4f 66 66 73 65 74 2c 20 6e 4e 65 77 2a 73 69  dOffset, nNew*si
dd10: 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20  zeof(int));.    
dd20: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
dd30: 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
dd40: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
dd50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
dd60: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65      }.      pIte
dd70: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 20  r->aRowidOffset 
dd80: 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70 49  = aNew;.      pI
dd90: 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65  ter->nRowidOffse
dda0: 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a  t = nNew;.    }.
ddb0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77  .    pIter->aRow
ddc0: 69 64 4f 66 66 73 65 74 5b 69 52 6f 77 69 64 4f  idOffset[iRowidO
ddd0: 66 66 73 65 74 2b 2b 5d 20 3d 20 70 49 74 65 72  ffset++] = pIter
dde0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20  ->iLeafOffset;. 
ddf0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
de00: 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 7d 0a 20  ffset = i;.  }. 
de10: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66   pIter->iRowidOf
de20: 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66  fset = iRowidOff
de30: 73 65 74 3b 0a 20 20 66 74 73 35 53 65 67 49 74  set;.  fts5SegIt
de40: 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
de50: 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  ter);.}../*.**.*
de60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
de70: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
de80: 4e 65 77 50 61 67 65 28 46 74 73 35 49 6e 64 65  NewPage(Fts5Inde
de90: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
dea0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73  r *pIter){.  ass
deb0: 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67  ert( pIter->flag
dec0: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
ded0: 5f 52 45 56 45 52 53 45 20 29 3b 0a 20 20 61 73  _REVERSE );.  as
dee0: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
def0: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
df00: 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 0a 20 20  R_ONETERM );..  
df10: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
df20: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
df30: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
df40: 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  0;.  while( p->r
df50: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
df60: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
df70: 3e 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61  >pIter->iTermLea
df80: 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 46 74 73  fPgno ){.    Fts
df90: 35 44 61 74 61 20 2a 70 4e 65 77 3b 0a 20 20 20  5Data *pNew;.   
dfa0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
dfb0: 6f 2d 2d 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  o--;.    pNew = 
dfc0: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
dfd0: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
dfe0: 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70 49  ID(.          pI
dff0: 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  ter->pSeg->iSegi
e000: 64 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  d, pIter->iLeafP
e010: 67 6e 6f 0a 20 20 20 20 29 29 3b 0a 20 20 20 20  gno.    ));.    
e020: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
e030: 20 20 2f 2a 20 69 54 65 72 6d 4c 65 61 66 4f 66    /* iTermLeafOf
e040: 66 73 65 74 20 6d 61 79 20 62 65 20 65 71 75 61  fset may be equa
e050: 6c 20 74 6f 20 73 7a 4c 65 61 66 20 69 66 20 74  l to szLeaf if t
e060: 68 65 20 74 65 72 6d 20 69 73 20 74 68 65 20 6c  he term is the l
e070: 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  ast.      ** thi
e080: 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2d  ng on the page -
e090: 20 69 2e 65 2e 20 74 68 65 20 66 69 72 73 74 20   i.e. the first 
e0a0: 72 6f 77 69 64 20 69 73 20 6f 6e 20 74 68 65 20  rowid is on the 
e0b0: 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65 2e 0a  following page..
e0c0: 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
e0d0: 20 63 61 73 65 20 6c 65 61 76 65 20 70 49 74 65   case leave pIte
e0e0: 72 2d 3e 70 4c 65 61 66 3d 3d 30 2c 20 74 68 69  r->pLeaf==0, thi
e0f0: 73 20 69 74 65 72 61 74 6f 72 20 69 73 20 61 74  s iterator is at
e100: 20 45 4f 46 2e 20 2a 2f 0a 20 20 20 20 20 20 69   EOF. */.      i
e110: 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  f( pIter->iLeafP
e120: 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 54 65 72  gno==pIter->iTer
e130: 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20  mLeafPgno ){.   
e140: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
e150: 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a  er->pLeaf==0 );.
e160: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
e170: 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  r->iTermLeafOffs
e180: 65 74 3c 70 4e 65 77 2d 3e 73 7a 4c 65 61 66 20  et<pNew->szLeaf 
e190: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
e1a0: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77  er->pLeaf = pNew
e1b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
e1c0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
e1d0: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
e1e0: 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  fOffset;.       
e1f0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
e200: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77          int iRow
e210: 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69  idOff;.        i
e220: 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c  RowidOff = fts5L
e230: 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
e240: 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20  (pNew);.        
e250: 69 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b  if( iRowidOff ){
e260: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
e270: 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a  ->pLeaf = pNew;.
e280: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
e290: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
e2a0: 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20  RowidOff;.      
e2b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
e2c0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c     if( pIter->pL
e2d0: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 75  eaf ){.        u
e2e0: 38 20 2a 61 20 3d 20 26 70 49 74 65 72 2d 3e 70  8 *a = &pIter->p
e2f0: 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69  Leaf->p[pIter->i
e300: 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20  LeafOffset];.   
e310: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
e320: 66 4f 66 66 73 65 74 20 2b 3d 20 66 74 73 35 47  fOffset += fts5G
e330: 65 74 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34  etVarint(a, (u64
e340: 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
e350: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
e360: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e370: 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
e380: 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20  elease(pNew);.  
e390: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
e3a0: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c  .  if( pIter->pL
e3b0: 65 61 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72  eaf ){.    pIter
e3c0: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
e3d0: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
e3e0: 6e 6e 2b 31 3b 0a 20 20 20 20 66 74 73 35 53 65  nn+1;.    fts5Se
e3f0: 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
e400: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
e410: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
e420: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
e430: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
e440: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
e450: 67 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79  gument currently
e460: 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  .** points to a 
e470: 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 2e 20 41  delete marker. A
e480: 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 20 69   delete marker i
e490: 73 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20  s an entry with 
e4a0: 61 20 30 20 62 79 74 65 0a 2a 2a 20 70 6f 73 69  a 0 byte.** posi
e4b0: 74 69 6f 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74  tion-list..*/.st
e4c0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c  atic int fts5Mul
e4d0: 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 46 74  tiIterIsEmpty(Ft
e4e0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
e4f0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
e500: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
e510: 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
e520: 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31  [pIter->aFirst[1
e530: 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20 72 65 74  ].iFirst];.  ret
e540: 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49  urn (p->rc==SQLI
e550: 54 45 5f 4f 4b 20 26 26 20 70 53 65 67 2d 3e 70  TE_OK && pSeg->p
e560: 4c 65 61 66 20 26 26 20 70 53 65 67 2d 3e 6e 50  Leaf && pSeg->nP
e570: 6f 73 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  os==0);.}../*.**
e580: 20 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f   Advance iterato
e590: 72 20 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e  r pIter to the n
e5a0: 65 78 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a  ext entry..**.**
e5b0: 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   This version of
e5c0: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
e5d0: 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  () is only used 
e5e0: 62 79 20 72 65 76 65 72 73 65 20 69 74 65 72 61  by reverse itera
e5f0: 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tors..*/.static 
e600: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
e610: 4e 65 78 74 5f 52 65 76 65 72 73 65 28 0a 20 20  Next_Reverse(.  
e620: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e640: 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
e650: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
e660: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
e670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
e680: 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
e690: 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 55  ce */.  int *pbU
e6a0: 6e 75 73 65 64 20 20 20 20 20 20 20 20 20 20 20  nused           
e6b0: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65          /* Unuse
e6c0: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
e6d0: 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
e6e0: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
e6f0: 56 45 52 53 45 20 29 3b 0a 20 20 61 73 73 65 72  VERSE );.  asser
e700: 74 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c  t( pIter->pNextL
e710: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53  eaf==0 );.  UNUS
e720: 45 44 5f 50 41 52 41 4d 28 70 62 55 6e 75 73 65  ED_PARAM(pbUnuse
e730: 64 29 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72  d);..  if( pIter
e740: 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30  ->iRowidOffset>0
e750: 20 29 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20   ){.    u8 *a = 
e760: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
e770: 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20  .    int iOff;. 
e780: 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a     i64 iDelta;..
e790: 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
e7a0: 64 4f 66 66 73 65 74 2d 2d 3b 0a 20 20 20 20 70  dOffset--;.    p
e7b0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
e7c0: 74 20 3d 20 70 49 74 65 72 2d 3e 61 52 6f 77 69  t = pIter->aRowi
e7d0: 64 4f 66 66 73 65 74 5b 70 49 74 65 72 2d 3e 69  dOffset[pIter->i
e7e0: 52 6f 77 69 64 4f 66 66 73 65 74 5d 3b 0a 20 20  RowidOffset];.  
e7f0: 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
e800: 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
e810: 0a 20 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65  .    iOff = pIte
e820: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a  r->iLeafOffset;.
e830: 20 20 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66      if( p->pConf
e840: 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53  ig->eDetail!=FTS
e850: 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b  5_DETAIL_NONE ){
e860: 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 70  .      iOff += p
e870: 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20  Iter->nPos;.    
e880: 7d 0a 20 20 20 20 66 74 73 35 47 65 74 56 61 72  }.    fts5GetVar
e890: 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75  int(&a[iOff], (u
e8a0: 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
e8b0: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
e8c0: 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c  -= iDelta;.  }el
e8d0: 73 65 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49  se{.    fts5SegI
e8e0: 74 65 72 52 65 76 65 72 73 65 4e 65 77 50 61 67  terReverseNewPag
e8f0: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d  e(p, pIter);.  }
e900: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
e910: 65 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72  e iterator pIter
e920: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
e930: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76  ry..**.** This v
e940: 65 72 73 69 6f 6e 20 6f 66 20 66 74 73 35 53 65  ersion of fts5Se
e950: 67 49 74 65 72 4e 65 78 74 28 29 20 69 73 20 6f  gIterNext() is o
e960: 6e 6c 79 20 75 73 65 64 20 69 66 20 64 65 74 61  nly used if deta
e970: 69 6c 3d 6e 6f 6e 65 20 61 6e 64 20 74 68 65 0a  il=none and the.
e980: 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e  ** iterator is n
e990: 6f 74 20 61 20 72 65 76 65 72 73 65 20 64 69 72  ot a reverse dir
e9a0: 65 63 74 69 6f 6e 20 69 74 65 72 61 74 6f 72 2e  ection iterator.
e9b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e9c0: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f  fts5SegIterNext_
e9d0: 4e 6f 6e 65 28 0a 20 20 46 74 73 35 49 6e 64 65  None(.  Fts5Inde
e9e0: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
e9f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
ea00: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
ea10: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
ea20: 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
ea30: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
ea40: 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20  to advance */.  
ea50: 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20  int *pbNewTerm  
ea60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea70: 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66 6f 72 20  /* OUT: Set for 
ea80: 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20  new term */.){. 
ea90: 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 61 73   int iOff;..  as
eaa0: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
eab0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65  ITE_OK );.  asse
eac0: 72 74 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67  rt( (pIter->flag
ead0: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
eae0: 5f 52 45 56 45 52 53 45 29 3d 3d 30 20 29 3b 0a  _REVERSE)==0 );.
eaf0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f    assert( p->pCo
eb00: 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46  nfig->eDetail==F
eb10: 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
eb20: 29 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c  );..  ASSERT_SZL
eb30: 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c  EAF_OK(pIter->pL
eb40: 65 61 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 70  eaf);.  iOff = p
eb50: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
eb60: 74 3b 0a 0a 20 20 2f 2a 20 4e 65 78 74 20 65 6e  t;..  /* Next en
eb70: 74 72 79 20 69 73 20 6f 6e 20 74 68 65 20 6e 65  try is on the ne
eb80: 78 74 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28  xt page */.  if(
eb90: 20 70 49 74 65 72 2d 3e 70 53 65 67 20 26 26 20   pIter->pSeg && 
eba0: 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65  iOff>=pIter->pLe
ebb0: 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
ebc0: 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
ebd0: 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
ebe0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 7c  .    if( p->rc |
ebf0: 7c 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  | pIter->pLeaf==
ec00: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
ec10: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 3d 20  pIter->iRowid = 
ec20: 30 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b  0;.    iOff = 4;
ec30: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 4f 66 66  .  }..  if( iOff
ec40: 3c 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f  <pIter->iEndofDo
ec50: 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  clist ){.    /* 
ec60: 4e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e  Next entry is on
ec70: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
ec80: 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 44 65  e */.    i64 iDe
ec90: 6c 74 61 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  lta;.    iOff +=
eca0: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
ecb0: 61 72 69 6e 74 28 26 70 49 74 65 72 2d 3e 70 4c  arint(&pIter->pL
ecc0: 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  eaf->p[iOff], (u
ecd0: 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
ece0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
ecf0: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20  fset = iOff;.   
ed00: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b   pIter->iRowid +
ed10: 3d 20 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73  = iDelta;.  }els
ed20: 65 20 69 66 28 20 28 70 49 74 65 72 2d 3e 66 6c  e if( (pIter->fl
ed30: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
ed40: 45 52 5f 4f 4e 45 54 45 52 4d 29 3d 3d 30 20 29  ER_ONETERM)==0 )
ed50: 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  {.    if( pIter-
ed60: 3e 70 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69  >pSeg ){.      i
ed70: 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20  nt nKeep = 0;.  
ed80: 20 20 20 20 69 66 28 20 69 4f 66 66 21 3d 66 74      if( iOff!=ft
ed90: 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f  s5LeafFirstTermO
eda0: 66 66 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  ff(pIter->pLeaf)
edb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66   ){.        iOff
edc0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
edd0: 74 33 32 28 26 70 49 74 65 72 2d 3e 70 4c 65 61  t32(&pIter->pLea
ede0: 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65  f->p[iOff], nKee
edf0: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
ee00: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
ee10: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20  fset = iOff;.   
ee20: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
ee30: 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c  adTerm(p, pIter,
ee40: 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 7d 65 6c   nKeep);.    }el
ee50: 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  se{.      const 
ee60: 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20  u8 *pList = 0;. 
ee70: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
ee80: 2a 7a 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20  *zTerm = 0;.    
ee90: 20 20 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20 20    int nList;.   
eea0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
eeb0: 73 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48  shScanNext(p->pH
eec0: 61 73 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ash);.      sqli
eed0: 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
eee0: 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26  ntry(p->pHash, &
eef0: 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26  zTerm, &pList, &
ef00: 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66  nList);.      if
ef10: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
ef20: 6f 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b  o next_none_eof;
ef30: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  .      pIter->pL
ef40: 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c  eaf->p = (u8*)pL
ef50: 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72  ist;.      pIter
ef60: 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 6e 4c  ->pLeaf->nn = nL
ef70: 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72  ist;.      pIter
ef80: 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  ->pLeaf->szLeaf 
ef90: 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70  = nList;.      p
efa0: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
efb0: 69 73 74 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  ist = nList;.   
efc0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
efd0: 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 26  fferSet(&p->rc,&
efe0: 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 28 69 6e  pIter->term, (in
eff0: 74 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c  t)strlen(zTerm),
f000: 20 28 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20   (u8*)zTerm);.  
f010: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
f020: 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74  Offset = fts5Get
f030: 56 61 72 69 6e 74 28 70 4c 69 73 74 2c 20 28 75  Varint(pList, (u
f040: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
f050: 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  id);.    }..    
f060: 69 66 28 20 70 62 4e 65 77 54 65 72 6d 20 29 20  if( pbNewTerm ) 
f070: 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a  *pbNewTerm = 1;.
f080: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 6f 74    }else{.    got
f090: 6f 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b  o next_none_eof;
f0a0: 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49  .  }..  fts5SegI
f0b0: 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
f0c0: 49 74 65 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Iter);..  return
f0d0: 3b 0a 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66  ;. next_none_eof
f0e0: 3a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  :.  fts5DataRele
f0f0: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
f100: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  );.  pIter->pLea
f110: 66 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  f = 0;.}.../*.**
f120: 20 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f   Advance iterato
f130: 72 20 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e  r pIter to the n
f140: 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a  ext entry. .**.*
f150: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
f160: 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e  curs, Fts5Index.
f170: 72 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  rc is set to an 
f180: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
f190: 72 20 63 6f 64 65 2e 20 49 74 20 0a 2a 2a 20 69  r code. It .** i
f1a0: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
f1b0: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
f1c0: 20 69 74 65 72 61 74 6f 72 20 72 65 61 63 68 65   iterator reache
f1d0: 73 20 45 4f 46 2e 20 49 66 20 61 6e 20 65 72 72  s EOF. If an err
f1e0: 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61  or has .** alrea
f1f0: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
f200: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
f210: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
f220: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
f230: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
f240: 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49  terNext(.  Fts5I
f250: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
f260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
f270: 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
f280: 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
f290: 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
f2a0: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
f2b0: 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f  or to advance */
f2c0: 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72  .  int *pbNewTer
f2d0: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
f2e0: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66     /* OUT: Set f
f2f0: 6f 72 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29  or new term */.)
f300: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c  {.  Fts5Data *pL
f310: 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  eaf = pIter->pLe
f320: 61 66 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a  af;.  int iOff;.
f330: 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d    int bNewTerm =
f340: 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20   0;.  int nKeep 
f350: 3d 20 30 3b 0a 20 20 75 38 20 2a 61 3b 0a 20 20  = 0;.  u8 *a;.  
f360: 69 6e 74 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74  int n;..  assert
f370: 28 20 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 7c  ( pbNewTerm==0 |
f380: 7c 20 2a 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20  | *pbNewTerm==0 
f390: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
f3a0: 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
f3b0: 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  !=FTS5_DETAIL_NO
f3c0: 4e 45 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72  NE );..  /* Sear
f3d0: 63 68 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f  ch for the end o
f3e0: 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  f the position l
f3f0: 69 73 74 20 77 69 74 68 69 6e 20 74 68 65 20 63  ist within the c
f400: 75 72 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a  urrent page. */.
f410: 20 20 61 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a    a = pLeaf->p;.
f420: 20 20 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c    n = pLeaf->szL
f430: 65 61 66 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53  eaf;..  ASSERT_S
f440: 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b  ZLEAF_OK(pLeaf);
f450: 0a 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d  .  iOff = pIter-
f460: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 20 70  >iLeafOffset + p
f470: 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 69  Iter->nPos;..  i
f480: 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  f( iOff<n ){.   
f490: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 65 6e 74   /* The next ent
f4a0: 72 79 20 69 73 20 6f 6e 20 74 68 65 20 63 75 72  ry is on the cur
f4b0: 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20  rent page. */.  
f4c0: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66    assert_nc( iOf
f4d0: 66 3c 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66  f<=pIter->iEndof
f4e0: 44 6f 63 6c 69 73 74 20 29 3b 0a 20 20 20 20 69  Doclist );.    i
f4f0: 66 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  f( iOff>=pIter->
f500: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b  iEndofDoclist ){
f510: 0a 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20  .      bNewTerm 
f520: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = 1;.      if( i
f530: 4f 66 66 21 3d 66 74 73 35 4c 65 61 66 46 69 72  Off!=fts5LeafFir
f540: 73 74 54 65 72 6d 4f 66 66 28 70 4c 65 61 66 29  stTermOff(pLeaf)
f550: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66   ){.        iOff
f560: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
f570: 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b  t32(&a[iOff], nK
f580: 65 65 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eep);.      }.  
f590: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
f5a0: 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  64 iDelta;.     
f5b0: 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33   iOff += sqlite3
f5c0: 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  Fts5GetVarint(&a
f5d0: 5b 69 4f 66 66 5d 2c 20 26 69 44 65 6c 74 61 29  [iOff], &iDelta)
f5e0: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  ;.      pIter->i
f5f0: 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
f600: 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63  .      assert_nc
f610: 28 20 69 44 65 6c 74 61 3e 30 20 29 3b 0a 20 20  ( iDelta>0 );.  
f620: 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69    }.    pIter->i
f630: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
f640: 66 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  f;..  }else if( 
f650: 70 49 74 65 72 2d 3e 70 53 65 67 3d 3d 30 20 29  pIter->pSeg==0 )
f660: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a  {.    const u8 *
f670: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 63  pList = 0;.    c
f680: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
f690: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4c   = 0;.    int nL
f6a0: 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  ist = 0;.    ass
f6b0: 65 72 74 28 20 28 70 49 74 65 72 2d 3e 66 6c 61  ert( (pIter->fla
f6c0: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
f6d0: 52 5f 4f 4e 45 54 45 52 4d 29 20 7c 7c 20 70 62  R_ONETERM) || pb
f6e0: 4e 65 77 54 65 72 6d 20 29 3b 0a 20 20 20 20 69  NewTerm );.    i
f6f0: 66 28 20 30 3d 3d 28 70 49 74 65 72 2d 3e 66 6c  f( 0==(pIter->fl
f700: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
f710: 45 52 5f 4f 4e 45 54 45 52 4d 29 20 29 7b 0a 20  ER_ONETERM) ){. 
f720: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
f730: 48 61 73 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e  HashScanNext(p->
f740: 70 48 61 73 68 29 3b 0a 20 20 20 20 20 20 73 71  pHash);.      sq
f750: 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
f760: 6e 45 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c  nEntry(p->pHash,
f770: 20 26 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c   &zTerm, &pList,
f780: 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a   &nList);.    }.
f790: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
f7a0: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61   ){.      fts5Da
f7b0: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
f7c0: 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70  >pLeaf);.      p
f7d0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
f7e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f7f0: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e    pIter->pLeaf->
f800: 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a  p = (u8*)pList;.
f810: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
f820: 61 66 2d 3e 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a  af->nn = nList;.
f830: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
f840: 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69  af->szLeaf = nLi
f850: 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  st;.      pIter-
f860: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
f870: 20 6e 4c 69 73 74 2b 31 3b 0a 20 20 20 20 20 20   nList+1;.      
f880: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
f890: 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49  rSet(&p->rc, &pI
f8a0: 74 65 72 2d 3e 74 65 72 6d 2c 20 28 69 6e 74 29  ter->term, (int)
f8b0: 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 0a 20  strlen(zTerm),. 
f8c0: 20 20 20 20 20 20 20 20 20 28 75 38 2a 29 7a 54           (u8*)zT
f8d0: 65 72 6d 29 3b 0a 20 20 20 20 20 20 70 49 74 65  erm);.      pIte
f8e0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
f8f0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70   fts5GetVarint(p
f900: 4c 69 73 74 2c 20 28 75 36 34 2a 29 26 70 49 74  List, (u64*)&pIt
f910: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
f920: 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20     *pbNewTerm = 
f930: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
f940: 7b 0a 20 20 20 20 69 4f 66 66 20 3d 20 30 3b 0a  {.    iOff = 0;.
f950: 20 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72      /* Next entr
f960: 79 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20  y is not on the 
f970: 63 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a  current page */.
f980: 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3d      while( iOff=
f990: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  =0 ){.      fts5
f9a0: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
f9b0: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
f9c0: 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e   pLeaf = pIter->
f9d0: 70 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 66 28  pLeaf;.      if(
f9e0: 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61   pLeaf==0 ) brea
f9f0: 6b 3b 0a 20 20 20 20 20 20 41 53 53 45 52 54 5f  k;.      ASSERT_
fa00: 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29  SZLEAF_OK(pLeaf)
fa10: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 4f 66  ;.      if( (iOf
fa20: 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  f = fts5LeafFirs
fa30: 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29  tRowidOff(pLeaf)
fa40: 29 20 26 26 20 69 4f 66 66 3c 70 4c 65 61 66 2d  ) && iOff<pLeaf-
fa50: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
fa60: 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74     iOff += sqlit
fa70: 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
fa80: 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
fa90: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
faa0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
fab0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
fac0: 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20 20  et = iOff;..    
fad0: 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e      if( pLeaf->n
fae0: 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  n>pLeaf->szLeaf 
faf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
fb00: 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20  er->iPgidxOff = 
fb10: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2b 20  pLeaf->szLeaf + 
fb20: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
fb30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
fb40: 70 4c 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e  pLeaf->p[pLeaf->
fb50: 73 7a 4c 65 61 66 5d 2c 20 70 49 74 65 72 2d 3e  szLeaf], pIter->
fb60: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20  iEndofDoclist.  
fb70: 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
fb80: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
fb90: 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28  }.      else if(
fba0: 20 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66   pLeaf->nn>pLeaf
fbb0: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
fbc0: 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64      pIter->iPgid
fbd0: 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a  xOff = pLeaf->sz
fbe0: 4c 65 61 66 20 2b 20 66 74 73 35 47 65 74 56 61  Leaf + fts5GetVa
fbf0: 72 69 6e 74 33 32 28 0a 20 20 20 20 20 20 20 20  rint32(.        
fc00: 20 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70 4c      &pLeaf->p[pL
fc10: 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 69 4f  eaf->szLeaf], iO
fc20: 66 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  ff.            )
fc30: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
fc40: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
fc50: 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 70 49 74  Off;.        pIt
fc60: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
fc70: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
fc80: 20 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a    bNewTerm = 1;.
fc90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
fca0: 73 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c 70 4c  sert_nc( iOff<pL
fcb0: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 3b 0a 20  eaf->szLeaf );. 
fcc0: 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e 70 4c       if( iOff>pL
fcd0: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
fce0: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46         p->rc = F
fcf0: 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
fd00: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
fd10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
fd20: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
fd30: 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f  e iterator is no
fd40: 77 20 61 74 20 45 4f 46 2e 20 49 66 20 73 6f 2c  w at EOF. If so,
fd50: 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a   return early. *
fd60: 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  /.  if( pIter->p
fd70: 4c 65 61 66 20 29 7b 0a 20 20 20 20 69 66 28 20  Leaf ){.    if( 
fd80: 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20 20 20  bNewTerm ){.    
fd90: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c 61    if( pIter->fla
fda0: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
fdb0: 52 5f 4f 4e 45 54 45 52 4d 20 29 7b 0a 20 20 20  R_ONETERM ){.   
fdc0: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
fdd0: 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
fde0: 66 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  f);.        pIte
fdf0: 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r->pLeaf = 0;.  
fe00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fe10: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
fe20: 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c  adTerm(p, pIter,
fe30: 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 20   nKeep);.       
fe40: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
fe50: 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
fe60: 20 20 20 20 20 20 20 20 69 66 28 20 70 62 4e 65          if( pbNe
fe70: 77 54 65 72 6d 20 29 20 2a 70 62 4e 65 77 54 65  wTerm ) *pbNewTe
fe80: 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rm = 1;.      }.
fe90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fea0: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
feb0: 67 20 63 6f 75 6c 64 20 62 65 20 64 6f 6e 65 20  g could be done 
fec0: 62 79 20 63 61 6c 6c 69 6e 67 20 66 74 73 35 53  by calling fts5S
fed0: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 29  egIterLoadNPos()
fee0: 2e 20 42 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  . But.      ** t
fef0: 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 70 61 72  his block is par
ff00: 74 69 63 75 6c 61 72 6c 79 20 70 65 72 66 6f 72  ticularly perfor
ff10: 6d 61 6e 63 65 20 63 72 69 74 69 63 61 6c 2c 20  mance critical, 
ff20: 73 6f 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20  so equivalent.  
ff30: 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 69      ** code is i
ff40: 6e 6c 69 6e 65 64 2e 20 0a 20 20 20 20 20 20 2a  nlined. .      *
ff50: 2a 0a 20 20 20 20 20 20 2a 2a 20 4c 61 74 65 72  *.      ** Later
ff60: 3a 20 53 77 69 74 63 68 65 64 20 62 61 63 6b 20  : Switched back 
ff70: 74 6f 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  to fts5SegIterLo
ff80: 61 64 4e 50 6f 73 28 29 20 62 65 63 61 75 73 65  adNPos() because
ff90: 20 69 74 20 73 75 70 70 6f 72 74 73 0a 20 20 20   it supports.   
ffa0: 20 20 20 2a 2a 20 64 65 74 61 69 6c 3d 6e 6f 6e     ** detail=non
ffb0: 65 20 6d 6f 64 65 2e 20 4e 6f 74 20 69 64 65 61  e mode. Not idea
ffc0: 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
ffd0: 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 20 20 20    int nSz;.     
ffe0: 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
fff0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
10000 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61     fts5FastGetVa
10010 72 69 6e 74 33 32 28 70 49 74 65 72 2d 3e 70 4c  rint32(pIter->pL
10020 65 61 66 2d 3e 70 2c 20 70 49 74 65 72 2d 3e 69  eaf->p, pIter->i
10030 4c 65 61 66 4f 66 66 73 65 74 2c 20 6e 53 7a 29  LeafOffset, nSz)
10040 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62  ;.      pIter->b
10050 44 65 6c 20 3d 20 28 6e 53 7a 20 26 20 30 78 30  Del = (nSz & 0x0
10060 30 30 31 29 3b 0a 20 20 20 20 20 20 70 49 74 65  001);.      pIte
10070 72 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31  r->nPos = nSz>>1
10080 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e  ;.      assert_n
10090 63 28 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3e 3d  c( pIter->nPos>=
100a0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  0 );.    }.  }.}
100b0 0a 0a 23 64 65 66 69 6e 65 20 53 57 41 50 56 41  ..#define SWAPVA
100c0 4c 28 54 2c 20 61 2c 20 62 29 20 7b 20 54 20 74  L(T, a, b) { T t
100d0 6d 70 3b 20 74 6d 70 3d 61 3b 20 61 3d 62 3b 20  mp; tmp=a; a=b; 
100e0 62 3d 74 6d 70 3b 20 7d 0a 0a 23 64 65 66 69 6e  b=tmp; }..#defin
100f0 65 20 66 74 73 35 49 6e 64 65 78 53 6b 69 70 56  e fts5IndexSkipV
10100 61 72 69 6e 74 28 61 2c 20 69 4f 66 66 29 20 7b  arint(a, iOff) {
10110 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
10120 69 6e 74 20 69 45 6e 64 20 3d 20 69 4f 66 66 2b  int iEnd = iOff+
10130 39 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  9;              
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10150 5c 0a 20 20 77 68 69 6c 65 28 20 28 61 5b 69 4f  \.  while( (a[iO
10160 66 66 2b 2b 5d 20 26 20 30 78 38 30 29 20 26 26  ff++] & 0x80) &&
10170 20 69 4f 66 66 3c 69 45 6e 64 20 29 3b 20 20 20   iOff<iEnd );   
10180 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49      \.}../*.** I
10190 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75  terator pIter cu
101a0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
101b0 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69  o the first rowi
101c0 64 20 69 6e 20 61 20 64 6f 63 6c 69 73 74 2e 20  d in a doclist. 
101d0 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
101e0 20 73 65 74 73 20 74 68 65 20 69 74 65 72 61 74   sets the iterat
101f0 6f 72 20 75 70 20 73 6f 20 74 68 61 74 20 69 74  or up so that it
10200 65 72 61 74 65 73 20 69 6e 20 72 65 76 65 72 73  erates in revers
10210 65 20 6f 72 64 65 72 20 74 68 72 6f 75 67 68 0a  e order through.
10220 2a 2a 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 0a  ** the doclist..
10230 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
10240 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
10250 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
10260 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
10270 65 72 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78  er){.  Fts5Dlidx
10280 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 70  Iter *pDlidx = p
10290 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20  Iter->pDlidx;.  
102a0 46 74 73 35 44 61 74 61 20 2a 70 4c 61 73 74 20  Fts5Data *pLast 
102b0 3d 20 30 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c  = 0;.  int pgnoL
102c0 61 73 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ast = 0;..  if( 
102d0 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 69 6e  pDlidx ){.    in
102e0 74 20 69 53 65 67 69 64 20 3d 20 70 49 74 65 72  t iSegid = pIter
102f0 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  ->pSeg->iSegid;.
10300 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 66      pgnoLast = f
10310 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
10320 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 70 4c  (pDlidx);.    pL
10330 61 73 74 20 3d 20 66 74 73 35 44 61 74 61 52 65  ast = fts5DataRe
10340 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45  ad(p, FTS5_SEGME
10350 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c  NT_ROWID(iSegid,
10360 20 70 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20 7d   pgnoLast));.  }
10370 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 44 61  else{.    Fts5Da
10380 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65  ta *pLeaf = pIte
10390 72 2d 3e 70 4c 65 61 66 3b 20 20 20 20 20 20 20  r->pLeaf;       
103a0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61    /* Current lea
103b0 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20 20 20 2f  f data */..    /
103c0 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 46 74 73  * Currently, Fts
103d0 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
103e0 66 73 65 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  fset points to t
103f0 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
10400 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e  .    ** position
10410 2d 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 66 6f  -list content fo
10420 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  r the current ro
10430 77 69 64 2e 20 42 61 63 6b 20 69 74 20 75 70 20  wid. Back it up 
10440 73 6f 20 74 68 61 74 20 69 74 0a 20 20 20 20 2a  so that it.    *
10450 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
10460 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 6f 73  start of the pos
10470 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
10480 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20 20 69 6e  field. */.    in
10490 74 20 69 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20  t iPoslist;.    
104a0 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  if( pIter->iTerm
104b0 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d  LeafPgno==pIter-
104c0 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  >iLeafPgno ){.  
104d0 20 20 20 20 69 50 6f 73 6c 69 73 74 20 3d 20 70      iPoslist = p
104e0 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f  Iter->iTermLeafO
104f0 66 66 73 65 74 3b 0a 20 20 20 20 7d 65 6c 73 65  ffset;.    }else
10500 7b 0a 20 20 20 20 20 20 69 50 6f 73 6c 69 73 74  {.      iPoslist
10510 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 4;.    }.    
10520 66 74 73 35 49 6e 64 65 78 53 6b 69 70 56 61 72  fts5IndexSkipVar
10530 69 6e 74 28 70 4c 65 61 66 2d 3e 70 2c 20 69 50  int(pLeaf->p, iP
10540 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 70 49 74  oslist);.    pIt
10550 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
10560 3d 20 69 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 20  = iPoslist;..   
10570 20 2f 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 64   /* If this cond
10580 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 74 68  ition is true th
10590 65 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  en the largest r
105a0 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63 75 72  owid for the cur
105b0 72 65 6e 74 0a 20 20 20 20 2a 2a 20 74 65 72 6d  rent.    ** term
105c0 20 6d 61 79 20 6e 6f 74 20 62 65 20 73 74 6f 72   may not be stor
105d0 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ed on the curren
105e0 74 20 70 61 67 65 2e 20 53 6f 20 73 65 61 72 63  t page. So searc
105f0 68 20 66 6f 72 77 61 72 64 20 74 6f 0a 20 20 20  h forward to.   
10600 20 2a 2a 20 73 65 65 20 77 68 65 72 65 20 73 61   ** see where sa
10610 69 64 20 72 6f 77 69 64 20 72 65 61 6c 6c 79 20  id rowid really 
10620 69 73 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  is.  */.    if( 
10630 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
10640 6c 69 73 74 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c  list>=pLeaf->szL
10650 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  eaf ){.      int
10660 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 46 74 73   pgno;.      Fts
10670 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
10680 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d  t *pSeg = pIter-
10690 3e 70 53 65 67 3b 0a 0a 20 20 20 20 20 20 2f 2a  >pSeg;..      /*
106a0 20 54 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20   The last rowid 
106b0 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20 6d  in the doclist m
106c0 61 79 20 6e 6f 74 20 62 65 20 6f 6e 20 74 68 65  ay not be on the
106d0 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 53   current page. S
106e0 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2a 20 66  earch.      ** f
106f0 6f 72 77 61 72 64 20 74 6f 20 66 69 6e 64 20 74  orward to find t
10700 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69  he page containi
10710 6e 67 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69  ng the last rowi
10720 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  d.  */.      for
10730 28 70 67 6e 6f 3d 70 49 74 65 72 2d 3e 69 4c 65  (pgno=pIter->iLe
10740 61 66 50 67 6e 6f 2b 31 3b 20 21 70 2d 3e 72 63  afPgno+1; !p->rc
10750 20 26 26 20 70 67 6e 6f 3c 3d 70 53 65 67 2d 3e   && pgno<=pSeg->
10760 70 67 6e 6f 4c 61 73 74 3b 20 70 67 6e 6f 2b 2b  pgnoLast; pgno++
10770 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  ){.        i64 i
10780 41 62 73 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  Abs = FTS5_SEGME
10790 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69  NT_ROWID(pSeg->i
107a0 53 65 67 69 64 2c 20 70 67 6e 6f 29 3b 0a 20 20  Segid, pgno);.  
107b0 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a        Fts5Data *
107c0 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61 52  pNew = fts5DataR
107d0 65 61 64 28 70 2c 20 69 41 62 73 29 3b 0a 20 20  ead(p, iAbs);.  
107e0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
107f0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
10800 69 52 6f 77 69 64 2c 20 62 54 65 72 6d 6c 65 73  iRowid, bTermles
10810 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f  s;.          iRo
10820 77 69 64 20 3d 20 66 74 73 35 4c 65 61 66 46 69  wid = fts5LeafFi
10830 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4e 65 77  rstRowidOff(pNew
10840 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 54 65  );.          bTe
10850 72 6d 6c 65 73 73 20 3d 20 66 74 73 35 4c 65 61  rmless = fts5Lea
10860 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4e 65 77  fIsTermless(pNew
10870 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
10880 20 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20   iRowid ){.     
10890 20 20 20 20 20 20 20 53 57 41 50 56 41 4c 28 46         SWAPVAL(F
108a0 74 73 35 44 61 74 61 2a 2c 20 70 4e 65 77 2c 20  ts5Data*, pNew, 
108b0 70 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pLast);.        
108c0 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 70      pgnoLast = p
108d0 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  gno;.          }
108e0 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44  .          fts5D
108f0 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77 29  ataRelease(pNew)
10900 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
10910 62 54 65 72 6d 6c 65 73 73 3d 3d 30 20 29 20 62  bTermless==0 ) b
10920 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
10930 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10940 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 61 73 74  }..  /* If pLast
10950 20 69 73 20 4e 55 4c 4c 20 61 74 20 74 68 69 73   is NULL at this
10960 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 65   point, then the
10970 20 6c 61 73 74 20 72 6f 77 69 64 20 66 6f 72 20   last rowid for 
10980 74 68 69 73 20 64 6f 63 6c 69 73 74 0a 20 20 2a  this doclist.  *
10990 2a 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61  * lies on the pa
109a0 67 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 64  ge currently ind
109b0 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74  icated by the it
109c0 65 72 61 74 6f 72 2e 20 49 6e 20 74 68 69 73 20  erator. In this 
109d0 63 61 73 65 20 0a 20 20 2a 2a 20 70 49 74 65 72  case .  ** pIter
109e0 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 69 73  ->iLeafOffset is
109f0 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20   already set to 
10a00 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 6f 73  point to the pos
10a10 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a  ition-list size.
10a20 20 20 2a 2a 20 66 69 65 6c 64 20 61 73 73 6f 63    ** field assoc
10a30 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66  iated with the f
10a40 69 72 73 74 20 72 65 6c 65 76 61 6e 74 20 72 6f  irst relevant ro
10a50 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  wid on the page.
10a60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69  .  **.  ** Or, i
10a70 66 20 70 4c 61 73 74 20 69 73 20 6e 6f 6e 2d 4e  f pLast is non-N
10a80 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
10a90 74 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  the page that co
10aa0 6e 74 61 69 6e 73 20 74 68 65 20 6c 61 73 74 0a  ntains the last.
10ab0 20 20 2a 2a 20 72 6f 77 69 64 2e 20 49 6e 20 74    ** rowid. In t
10ac0 68 69 73 20 63 61 73 65 20 63 6f 6e 66 69 67 75  his case configu
10ad0 72 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  re the iterator 
10ae0 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
10af0 73 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69  s to the.  ** fi
10b00 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 69  rst rowid on thi
10b10 73 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  s page..  */.  i
10b20 66 28 20 70 4c 61 73 74 20 29 7b 0a 20 20 20 20  f( pLast ){.    
10b30 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 66 74  int iOff;.    ft
10b40 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
10b50 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
10b60 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
10b70 70 4c 61 73 74 3b 0a 20 20 20 20 70 49 74 65 72  pLast;.    pIter
10b80 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 67  ->iLeafPgno = pg
10b90 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 69 4f 66 66  noLast;.    iOff
10ba0 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
10bb0 52 6f 77 69 64 4f 66 66 28 70 4c 61 73 74 29 3b  RowidOff(pLast);
10bc0 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73  .    iOff += fts
10bd0 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 61 73  5GetVarint(&pLas
10be0 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t->p[iOff], (u64
10bf0 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
10c00 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  );.    pIter->iL
10c10 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
10c20 3b 0a 0a 20 20 20 20 69 66 28 20 66 74 73 35 4c  ;..    if( fts5L
10c30 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c  eafIsTermless(pL
10c40 61 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70 49  ast) ){.      pI
10c50 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
10c60 73 74 20 3d 20 70 4c 61 73 74 2d 3e 6e 6e 2b 31  st = pLast->nn+1
10c70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10c80 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
10c90 44 6f 63 6c 69 73 74 20 3d 20 66 74 73 35 4c 65  Doclist = fts5Le
10ca0 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70  afFirstTermOff(p
10cb0 4c 61 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Last);.    }..  
10cc0 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72  }..  fts5SegIter
10cd0 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28  ReverseInitPage(
10ce0 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  p, pIter);.}../*
10cf0 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
10d00 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  er currently poi
10d10 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
10d20 20 72 6f 77 69 64 20 6f 66 20 61 20 64 6f 63 6c   rowid of a docl
10d30 69 73 74 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73  ist..** There is
10d40 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
10d50 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
10d60 20 74 68 65 20 66 69 6e 61 6c 20 74 65 72 6d 20   the final term 
10d70 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a  on the current .
10d80 2a 2a 20 70 61 67 65 2e 20 49 66 20 74 68 65 20  ** page. If the 
10d90 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20  current term is 
10da0 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e  the last term on
10db0 20 74 68 65 20 70 61 67 65 2c 20 6c 6f 61 64 20   the page, load 
10dc0 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d  the .** doclist-
10dd0 69 6e 64 65 78 20 66 72 6f 6d 20 64 69 73 6b 20  index from disk 
10de0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  and initialize a
10df0 6e 20 69 74 65 72 61 74 6f 72 20 61 74 20 28 70  n iterator at (p
10e00 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 2e 0a 2a  Iter->pDlidx)..*
10e10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
10e20 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44 6c 69  s5SegIterLoadDli
10e30 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  dx(Fts5Index *p,
10e40 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
10e50 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 53 65 67  ter){.  int iSeg
10e60 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e   = pIter->pSeg->
10e70 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 62 52  iSegid;.  int bR
10e80 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61  ev = (pIter->fla
10e90 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
10ea0 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74  R_REVERSE);.  Ft
10eb0 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20  s5Data *pLeaf = 
10ec0 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20 2f 2a  pIter->pLeaf; /*
10ed0 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61   Current leaf da
10ee0 74 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ta */..  assert(
10ef0 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
10f00 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
10f10 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74  TERM );.  assert
10f20 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3d  ( pIter->pDlidx=
10f30 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  =0 );..  /* Chec
10f40 6b 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  k if the current
10f50 20 64 6f 63 6c 69 73 74 20 65 6e 64 73 20 6f 6e   doclist ends on
10f60 20 74 68 69 73 20 70 61 67 65 2e 20 49 66 20 69   this page. If i
10f70 74 20 64 6f 65 73 2c 20 72 65 74 75 72 6e 0a 20  t does, return. 
10f80 20 2a 2a 20 65 61 72 6c 79 20 77 69 74 68 6f 75   ** early withou
10f90 74 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 6f  t loading the do
10fa0 63 6c 69 73 74 2d 69 6e 64 65 78 20 28 61 73 20  clist-index (as 
10fb0 69 74 20 62 65 6c 6f 6e 67 73 20 74 6f 20 61 20  it belongs to a 
10fc0 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a 20 74  different.  ** t
10fd0 65 72 6d 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49  erm. */.  if( pI
10fe0 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
10ff0 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66  no==pIter->iLeaf
11000 50 67 6e 6f 20 0a 20 20 20 26 26 20 70 49 74 65  Pgno .   && pIte
11010 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
11020 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 0a  <pLeaf->szLeaf .
11030 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b    ){.    return;
11040 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 70  .  }..  pIter->p
11050 44 6c 69 64 78 20 3d 20 66 74 73 35 44 6c 69 64  Dlidx = fts5Dlid
11060 78 49 74 65 72 49 6e 69 74 28 70 2c 20 62 52 65  xIterInit(p, bRe
11070 76 2c 20 69 53 65 67 2c 20 70 49 74 65 72 2d 3e  v, iSeg, pIter->
11080 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a  iTermLeafPgno);.
11090 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65  }../*.** The ite
110a0 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73  rator object pas
110b0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
110c0 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65  d argument curre
110d0 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  ntly contains.**
110e0 20 6e 6f 20 76 61 6c 69 64 20 76 61 6c 75 65 73   no valid values
110f0 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20   except for the 
11100 46 74 73 35 53 65 67 49 74 65 72 2e 70 4c 65 61  Fts5SegIter.pLea
11110 66 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c  f member variabl
11120 65 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  e. This.** funct
11130 69 6f 6e 20 73 65 61 72 63 68 65 73 20 74 68 65  ion searches the
11140 20 6c 65 61 66 20 70 61 67 65 20 66 6f 72 20 61   leaf page for a
11150 20 74 65 72 6d 20 6d 61 74 63 68 69 6e 67 20 28   term matching (
11160 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 2a 2a  pTerm/nTerm)..**
11170 0a 2a 2a 20 49 66 20 74 68 65 20 73 70 65 63 69  .** If the speci
11180 66 69 65 64 20 74 65 72 6d 20 69 73 20 66 6f 75  fied term is fou
11190 6e 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  nd on the page, 
111a0 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 6f  then the iterato
111b0 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69  r is left.** poi
111c0 6e 74 69 6e 67 20 74 6f 20 69 74 2e 20 49 66 20  nting to it. If 
111d0 61 72 67 75 6d 65 6e 74 20 62 47 65 20 69 73 20  argument bGe is 
111e0 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 74 65 72  zero and the ter
111f0 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 0a  m is not found,.
11200 2a 2a 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ** the iterator 
11210 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
11220 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49   at EOF..**.** I
11230 66 20 62 47 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  f bGe is non-zer
11240 6f 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66  o and the specif
11250 69 65 64 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  ied term is not 
11260 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 0a  found, then the.
11270 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c  ** iterator is l
11280 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
11290 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 74 65 72  the smallest ter
112a0 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74  m in the segment
112b0 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67   that.** is larg
112c0 65 72 20 74 68 61 6e 20 74 68 65 20 73 70 65 63  er than the spec
112d0 69 66 69 65 64 20 74 65 72 6d 2c 20 65 76 65 6e  ified term, even
112e0 20 69 66 20 74 68 69 73 20 74 65 72 6d 20 69 73   if this term is
112f0 20 6e 6f 74 20 6f 6e 20 74 68 65 0a 2a 2a 20 63   not on the.** c
11300 75 72 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2f 0a  urrent page..*/.
11310 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
11320 4c 65 61 66 53 65 65 6b 28 0a 20 20 46 74 73 35  LeafSeek(.  Fts5
11330 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
11340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
11350 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 63  eave any error c
11360 6f 64 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ode here */.  in
11370 74 20 62 47 65 2c 20 20 20 20 20 20 20 20 20 20  t bGe,          
11380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11390 20 54 72 75 65 20 66 6f 72 20 61 20 3e 3d 20 73   True for a >= s
113a0 65 61 72 63 68 20 2a 2f 0a 20 20 46 74 73 35 53  earch */.  Fts5S
113b0 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  egIter *pIter,  
113c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
113d0 65 72 61 74 6f 72 20 74 6f 20 73 65 65 6b 20 2a  erator to seek *
113e0 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
113f0 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20  erm, int nTerm  
11400 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
11410 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 29 7b 0a  earch for */.){.
11420 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 63 6f    int iOff;.  co
11430 6e 73 74 20 75 38 20 2a 61 20 3d 20 70 49 74 65  nst u8 *a = pIte
11440 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 69  r->pLeaf->p;.  i
11450 6e 74 20 73 7a 4c 65 61 66 20 3d 20 70 49 74 65  nt szLeaf = pIte
11460 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  r->pLeaf->szLeaf
11470 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65  ;.  int n = pIte
11480 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a 20  r->pLeaf->nn;.. 
11490 20 69 6e 74 20 6e 4d 61 74 63 68 20 3d 20 30 3b   int nMatch = 0;
114a0 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30  .  int nKeep = 0
114b0 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30  ;.  int nNew = 0
114c0 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66  ;.  int iTermOff
114d0 3b 0a 20 20 69 6e 74 20 69 50 67 69 64 78 3b 20  ;.  int iPgidx; 
114e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114f0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
11500 66 66 73 65 74 20 69 6e 20 70 67 69 64 78 20 2a  ffset in pgidx *
11510 2f 0a 20 20 69 6e 74 20 62 45 6e 64 4f 66 50 61  /.  int bEndOfPa
11520 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
11530 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
11540 5f 4f 4b 20 29 3b 0a 0a 20 20 69 50 67 69 64 78  _OK );..  iPgidx
11550 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 69 50 67   = szLeaf;.  iPg
11560 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61  idx += fts5GetVa
11570 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78  rint32(&a[iPgidx
11580 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20  ], iTermOff);.  
11590 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
115a0 0a 20 20 69 66 28 20 69 4f 66 66 3e 6e 20 29 7b  .  if( iOff>n ){
115b0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53  .    p->rc = FTS
115c0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  5_CORRUPT;.    r
115d0 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 77 68  eturn;.  }..  wh
115e0 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f  ile( 1 ){..    /
115f0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
11600 20 6d 61 6e 79 20 6e 65 77 20 62 79 74 65 73 20   many new bytes 
11610 61 72 65 20 69 6e 20 74 68 69 73 20 74 65 72 6d  are in this term
11620 20 2a 2f 0a 20 20 20 20 66 74 73 35 46 61 73 74   */.    fts5Fast
11630 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20 69  GetVarint32(a, i
11640 4f 66 66 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20  Off, nNew);.    
11650 69 66 28 20 6e 4b 65 65 70 3c 6e 4d 61 74 63 68  if( nKeep<nMatch
11660 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
11670 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20  earch_failed;.  
11680 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
11690 20 6e 4b 65 65 70 3e 3d 6e 4d 61 74 63 68 20 29   nKeep>=nMatch )
116a0 3b 0a 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3d  ;.    if( nKeep=
116b0 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  =nMatch ){.     
116c0 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 20   int nCmp;.     
116d0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 6e 43   int i;.      nC
116e0 6d 70 20 3d 20 4d 49 4e 28 6e 4e 65 77 2c 20 6e  mp = MIN(nNew, n
116f0 54 65 72 6d 2d 6e 4d 61 74 63 68 29 3b 0a 20 20  Term-nMatch);.  
11700 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
11710 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cmp; i++){.     
11720 20 20 20 69 66 28 20 61 5b 69 4f 66 66 2b 69 5d     if( a[iOff+i]
11730 21 3d 70 54 65 72 6d 5b 6e 4d 61 74 63 68 2b 69  !=pTerm[nMatch+i
11740 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
11750 20 7d 0a 20 20 20 20 20 20 6e 4d 61 74 63 68 20   }.      nMatch 
11760 2b 3d 20 69 3b 0a 0a 20 20 20 20 20 20 69 66 28  += i;..      if(
11770 20 6e 54 65 72 6d 3d 3d 6e 4d 61 74 63 68 20 29   nTerm==nMatch )
11780 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d  {.        if( i=
11790 3d 6e 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20  =nNew ){.       
117a0 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 73     goto search_s
117b0 75 63 63 65 73 73 3b 0a 20 20 20 20 20 20 20 20  uccess;.        
117c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
117d0 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61 69   goto search_fai
117e0 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
117f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
11800 3c 6e 4e 65 77 20 26 26 20 61 5b 69 4f 66 66 2b  <nNew && a[iOff+
11810 69 5d 3e 70 54 65 72 6d 5b 6e 4d 61 74 63 68 5d  i]>pTerm[nMatch]
11820 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
11830 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a   search_failed;.
11840 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
11850 20 20 20 69 66 28 20 69 50 67 69 64 78 3e 3d 6e     if( iPgidx>=n
11860 20 29 7b 0a 20 20 20 20 20 20 62 45 6e 64 4f 66   ){.      bEndOf
11870 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Page = 1;.      
11880 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
11890 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35    iPgidx += fts5
118a0 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
118b0 50 67 69 64 78 5d 2c 20 6e 4b 65 65 70 29 3b 0a  Pgidx], nKeep);.
118c0 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20      iTermOff += 
118d0 6e 4b 65 65 70 3b 0a 20 20 20 20 69 4f 66 66 20  nKeep;.    iOff 
118e0 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20 20 20  = iTermOff;..   
118f0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 4b 65   /* Read the nKe
11900 65 70 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ep field of the 
11910 6e 65 78 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  next term. */.  
11920 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72    fts5FastGetVar
11930 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e  int32(a, iOff, n
11940 4b 65 65 70 29 3b 0a 20 20 7d 0a 0a 20 73 65 61  Keep);.  }.. sea
11950 72 63 68 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66  rch_failed:.  if
11960 28 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ( bGe==0 ){.    
11970 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
11980 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
11990 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
119a0 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  = 0;.    return;
119b0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 45 6e  .  }else if( bEn
119c0 64 4f 66 50 61 67 65 20 29 7b 0a 20 20 20 20 64  dOfPage ){.    d
119d0 6f 20 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65  o {.      fts5Se
119e0 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
119f0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 69   pIter);.      i
11a00 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  f( pIter->pLeaf=
11a10 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
11a20 20 20 20 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c     a = pIter->pL
11a30 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69 66  eaf->p;.      if
11a40 28 20 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d  ( fts5LeafIsTerm
11a50 6c 65 73 73 28 70 49 74 65 72 2d 3e 70 4c 65 61  less(pIter->pLea
11a60 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  f)==0 ){.       
11a70 20 69 50 67 69 64 78 20 3d 20 70 49 74 65 72 2d   iPgidx = pIter-
11a80 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a  >pLeaf->szLeaf;.
11a90 20 20 20 20 20 20 20 20 69 50 67 69 64 78 20 2b          iPgidx +
11aa0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
11ab0 32 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  2(&pIter->pLeaf-
11ac0 3e 70 5b 69 50 67 69 64 78 5d 2c 20 69 4f 66 66  >p[iPgidx], iOff
11ad0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
11ae0 4f 66 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 70  Off<4 || iOff>=p
11af0 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
11b00 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
11b10 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
11b20 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  RRUPT;.        }
11b30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
11b40 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20 20 20  nKeep = 0;.     
11b50 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20 3d 20       iTermOff = 
11b60 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20  iOff;.          
11b70 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  n = pIter->pLeaf
11b80 2d 3e 6e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  ->nn;.          
11b90 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
11ba0 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
11bb0 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , nNew);.       
11bc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
11bd0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11be0 7d 77 68 69 6c 65 28 20 31 20 29 3b 0a 20 20 7d  }while( 1 );.  }
11bf0 0a 0a 20 73 65 61 72 63 68 5f 73 75 63 63 65 73  .. search_succes
11c00 73 3a 0a 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65  s:..  pIter->iLe
11c10 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 20  afOffset = iOff 
11c20 2b 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d  + nNew;.  pIter-
11c30 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74  >iTermLeafOffset
11c40 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
11c50 66 66 73 65 74 3b 0a 20 20 70 49 74 65 72 2d 3e  ffset;.  pIter->
11c60 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d 20  iTermLeafPgno = 
11c70 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
11c80 3b 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 53  ;..  fts5BufferS
11c90 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65  et(&p->rc, &pIte
11ca0 72 2d 3e 74 65 72 6d 2c 20 6e 4b 65 65 70 2c 20  r->term, nKeep, 
11cb0 70 54 65 72 6d 29 3b 0a 20 20 66 74 73 35 42 75  pTerm);.  fts5Bu
11cc0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
11cd0 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74  p->rc, &pIter->t
11ce0 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69 4f  erm, nNew, &a[iO
11cf0 66 66 5d 29 3b 0a 0a 20 20 69 66 28 20 69 50 67  ff]);..  if( iPg
11d00 69 64 78 3e 3d 6e 20 29 7b 0a 20 20 20 20 70 49  idx>=n ){.    pI
11d10 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
11d20 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  st = pIter->pLea
11d30 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65  f->nn+1;.  }else
11d40 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61  {.    int nExtra
11d50 3b 0a 20 20 20 20 69 50 67 69 64 78 20 2b 3d 20  ;.    iPgidx += 
11d60 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
11d70 26 61 5b 69 50 67 69 64 78 5d 2c 20 6e 45 78 74  &a[iPgidx], nExt
11d80 72 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ra);.    pIter->
11d90 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
11da0 69 54 65 72 6d 4f 66 66 20 2b 20 6e 45 78 74 72  iTermOff + nExtr
11db0 61 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e  a;.  }.  pIter->
11dc0 69 50 67 69 64 78 4f 66 66 20 3d 20 69 50 67 69  iPgidxOff = iPgi
11dd0 64 78 3b 0a 0a 20 20 66 74 73 35 53 65 67 49 74  dx;..  fts5SegIt
11de0 65 72 4c 6f 61 64 52 6f 77 69 64 28 70 2c 20 70  erLoadRowid(p, p
11df0 49 74 65 72 29 3b 0a 20 20 66 74 73 35 53 65 67  Iter);.  fts5Seg
11e00 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20  IterLoadNPos(p, 
11e10 70 49 74 65 72 29 3b 0a 7d 0a 0a 73 74 61 74 69  pIter);.}..stati
11e20 63 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  c sqlite3_stmt *
11e30 66 74 73 35 49 64 78 53 65 6c 65 63 74 53 74 6d  fts5IdxSelectStm
11e40 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  t(Fts5Index *p){
11e50 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 78 53 65  .  if( p->pIdxSe
11e60 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 46  lect==0 ){.    F
11e70 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
11e80 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
11e90 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 50 72  .    fts5IndexPr
11ea0 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d  epareStmt(p, &p-
11eb0 3e 70 49 64 78 53 65 6c 65 63 74 2c 20 73 71 6c  >pIdxSelect, sql
11ec0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
11ed0 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
11ee0 70 67 6e 6f 20 46 52 4f 4d 20 27 25 71 27 2e 27  pgno FROM '%q'.'
11ef0 25 71 5f 69 64 78 27 20 57 48 45 52 45 20 22 0a  %q_idx' WHERE ".
11f00 20 20 20 20 20 20 20 20 20 20 22 73 65 67 69 64            "segid
11f10 3d 3f 20 41 4e 44 20 74 65 72 6d 3c 3d 3f 20 4f  =? AND term<=? O
11f20 52 44 45 52 20 42 59 20 74 65 72 6d 20 44 45 53  RDER BY term DES
11f30 43 20 4c 49 4d 49 54 20 31 22 2c 0a 20 20 20 20  C LIMIT 1",.    
11f40 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a        pConfig->z
11f50 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61  Db, pConfig->zNa
11f60 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20  me.    ));.  }. 
11f70 20 72 65 74 75 72 6e 20 70 2d 3e 70 49 64 78 53   return p->pIdxS
11f80 65 6c 65 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  elect;.}../*.** 
11f90 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  Initialize the o
11fa0 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 70  bject pIter to p
11fb0 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65  oint to term pTe
11fc0 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20  rm/nTerm within 
11fd0 73 65 67 6d 65 6e 74 0a 2a 2a 20 70 53 65 67 2e  segment.** pSeg.
11fe0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
11ff0 73 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65  such term in the
12000 20 69 6e 64 65 78 2c 20 74 68 65 20 69 74 65 72   index, the iter
12010 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45  ator is set to E
12020 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  OF..**.** If an 
12030 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74  error occurs, Ft
12040 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65  s5Index.rc is se
12050 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69  t to an appropri
12060 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ate error code. 
12070 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  If .** an error 
12080 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
12090 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
120a0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
120b0 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
120c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
120d0 20 66 74 73 35 53 65 67 49 74 65 72 53 65 65 6b   fts5SegIterSeek
120e0 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Init(.  Fts5Inde
120f0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
12100 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
12110 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e  backend */.  con
12120 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e  st u8 *pTerm, in
12130 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20  t nTerm,     /* 
12140 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20  Term to seek to 
12150 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
12160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12170 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
12180 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c  FTS5INDEX_XXX fl
12190 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ags */.  Fts5Str
121a0 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
121b0 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Seg,     /* Desc
121c0 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65  ription of segme
121d0 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  nt */.  Fts5SegI
121e0 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
121f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
12200 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f  t to populate */
12210 0a 29 7b 0a 20 20 69 6e 74 20 69 50 67 20 3d 20  .){.  int iPg = 
12220 31 3b 0a 20 20 69 6e 74 20 62 47 65 20 3d 20 28  1;.  int bGe = (
12230 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
12240 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3b 0a 20  X_QUERY_SCAN);. 
12250 20 69 6e 74 20 62 44 6c 69 64 78 20 3d 20 30 3b   int bDlidx = 0;
12260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12270 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72   /* True if ther
12280 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69  e is a doclist-i
12290 6e 64 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ndex */.  sqlite
122a0 33 5f 73 74 6d 74 20 2a 70 49 64 78 53 65 6c 65  3_stmt *pIdxSele
122b0 63 74 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ct = 0;..  asser
122c0 74 28 20 62 47 65 3d 3d 30 20 7c 7c 20 28 66 6c  t( bGe==0 || (fl
122d0 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
122e0 51 55 45 52 59 5f 44 45 53 43 29 3d 3d 30 20 29  QUERY_DESC)==0 )
122f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 65 72  ;.  assert( pTer
12300 6d 20 26 26 20 6e 54 65 72 6d 20 29 3b 0a 20 20  m && nTerm );.  
12310 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
12320 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29   sizeof(*pIter))
12330 3b 0a 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20  ;.  pIter->pSeg 
12340 3d 20 70 53 65 67 3b 0a 0a 20 20 2f 2a 20 54 68  = pSeg;..  /* Th
12350 69 73 20 62 6c 6f 63 6b 20 73 65 74 73 20 73 74  is block sets st
12360 61 63 6b 20 76 61 72 69 61 62 6c 65 20 69 50 67  ack variable iPg
12370 20 74 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67   to the leaf pag
12380 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20 6d 61  e number that ma
12390 79 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74  y.  ** contain t
123a0 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d  erm (pTerm/nTerm
123b0 29 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  ), if it is pres
123c0 65 6e 74 20 69 6e 20 74 68 65 20 73 65 67 6d 65  ent in the segme
123d0 6e 74 2e 20 2a 2f 0a 20 20 70 49 64 78 53 65 6c  nt. */.  pIdxSel
123e0 65 63 74 20 3d 20 66 74 73 35 49 64 78 53 65 6c  ect = fts5IdxSel
123f0 65 63 74 53 74 6d 74 28 70 29 3b 0a 20 20 69 66  ectStmt(p);.  if
12400 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
12410 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ;.  sqlite3_bind
12420 5f 69 6e 74 28 70 49 64 78 53 65 6c 65 63 74 2c  _int(pIdxSelect,
12430 20 31 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64   1, pSeg->iSegid
12440 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
12450 64 5f 62 6c 6f 62 28 70 49 64 78 53 65 6c 65 63  d_blob(pIdxSelec
12460 74 2c 20 32 2c 20 70 54 65 72 6d 2c 20 6e 54 65  t, 2, pTerm, nTe
12470 72 6d 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  rm, SQLITE_STATI
12480 43 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  C);.  if( SQLITE
12490 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
124a0 65 70 28 70 49 64 78 53 65 6c 65 63 74 29 20 29  ep(pIdxSelect) )
124b0 7b 0a 20 20 20 20 69 36 34 20 76 61 6c 20 3d 20  {.    i64 val = 
124c0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
124d0 6e 74 28 70 49 64 78 53 65 6c 65 63 74 2c 20 30  nt(pIdxSelect, 0
124e0 29 3b 0a 20 20 20 20 69 50 67 20 3d 20 28 69 6e  );.    iPg = (in
124f0 74 29 28 76 61 6c 3e 3e 31 29 3b 0a 20 20 20 20  t)(val>>1);.    
12500 62 44 6c 69 64 78 20 3d 20 28 76 61 6c 20 26 20  bDlidx = (val & 
12510 30 78 30 30 30 31 29 3b 0a 20 20 7d 0a 20 20 70  0x0001);.  }.  p
12520 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  ->rc = sqlite3_r
12530 65 73 65 74 28 70 49 64 78 53 65 6c 65 63 74 29  eset(pIdxSelect)
12540 3b 0a 0a 20 20 69 66 28 20 69 50 67 3c 70 53 65  ;..  if( iPg<pSe
12550 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a  g->pgnoFirst ){.
12560 20 20 20 20 69 50 67 20 3d 20 70 53 65 67 2d 3e      iPg = pSeg->
12570 70 67 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20 62  pgnoFirst;.    b
12580 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Dlidx = 0;.  }..
12590 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
125a0 6e 6f 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20  no = iPg - 1;.  
125b0 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
125c0 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a  age(p, pIter);..
125d0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
125e0 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 4c 65  af ){.    fts5Le
125f0 61 66 53 65 65 6b 28 70 2c 20 62 47 65 2c 20 70  afSeek(p, bGe, p
12600 49 74 65 72 2c 20 70 54 65 72 6d 2c 20 6e 54 65  Iter, pTerm, nTe
12610 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  rm);.  }..  if( 
12620 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
12630 20 26 26 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20   && bGe==0 ){.  
12640 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c    pIter->flags |
12650 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  = FTS5_SEGITER_O
12660 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20  NETERM;.    if( 
12670 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a  pIter->pLeaf ){.
12680 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20        if( flags 
12690 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
126a0 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20  Y_DESC ){.      
126b0 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c    pIter->flags |
126c0 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  = FTS5_SEGITER_R
126d0 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a  EVERSE;.      }.
126e0 20 20 20 20 20 20 69 66 28 20 62 44 6c 69 64 78        if( bDlidx
126f0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
12700 53 65 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78  SegIterLoadDlidx
12710 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
12720 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66 6c    }.      if( fl
12730 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
12740 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20  QUERY_DESC ){.  
12750 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
12760 72 52 65 76 65 72 73 65 28 70 2c 20 70 49 74 65  rReverse(p, pIte
12770 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
12780 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67  }.  }..  fts5Seg
12790 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20 70  IterSetNext(p, p
127a0 49 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 45 69 74  Iter);..  /* Eit
127b0 68 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  her:.  **.  **  
127c0 20 31 29 20 61 6e 20 65 72 72 6f 72 20 68 61 73   1) an error has
127d0 20 6f 63 63 75 72 72 65 64 2c 20 6f 72 0a 20 20   occurred, or.  
127e0 2a 2a 20 20 20 32 29 20 74 68 65 20 69 74 65 72  **   2) the iter
127f0 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45  ator points to E
12800 4f 46 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 33 29  OF, or.  **   3)
12810 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f   the iterator po
12820 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
12830 20 77 69 74 68 20 74 65 72 6d 20 28 70 54 65 72   with term (pTer
12840 6d 2f 6e 54 65 72 6d 29 2c 20 6f 72 0a 20 20 2a  m/nTerm), or.  *
12850 2a 20 20 20 34 29 20 74 68 65 20 46 54 53 35 49  *   4) the FTS5I
12860 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20  NDEX_QUERY_SCAN 
12870 66 6c 61 67 20 77 61 73 20 73 65 74 20 61 6e 64  flag was set and
12880 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f   the iterator po
12890 69 6e 74 73 0a 20 20 2a 2a 20 20 20 20 20 20 74  ints.  **      t
128a0 6f 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20  o an entry with 
128b0 61 20 74 65 72 6d 20 67 72 65 61 74 65 72 20 74  a term greater t
128c0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
128d0 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20  (pTerm/nTerm).. 
128e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
128f0 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 20  >rc!=SQLITE_OK  
12900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12920 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2a 2f 0a          /* 1 */.
12930 20 20 20 7c 7c 20 70 49 74 65 72 2d 3e 70 4c 65     || pIter->pLe
12940 61 66 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  af==0           
12950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12970 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 7c      /* 2 */.   |
12980 7c 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  | fts5BufferComp
12990 61 72 65 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e  areBlob(&pIter->
129a0 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65  term, pTerm, nTe
129b0 72 6d 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20  rm)==0          
129c0 2f 2a 20 33 20 2a 2f 0a 20 20 20 7c 7c 20 28 62  /* 3 */.   || (b
129d0 47 65 20 26 26 20 66 74 73 35 42 75 66 66 65 72  Ge && fts5Buffer
129e0 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70 49 74  CompareBlob(&pIt
129f0 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d 2c  er->term, pTerm,
12a00 20 6e 54 65 72 6d 29 3e 30 29 20 20 2f 2a 20 34   nTerm)>0)  /* 4
12a10 20 2a 2f 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   */.  );.}../*.*
12a20 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
12a30 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f   object pIter to
12a40 20 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20 70   point to term p
12a50 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69  Term/nTerm withi
12a60 6e 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  n the.** in-memo
12a70 72 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20 49  ry hash table. I
12a80 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  f there is no su
12a90 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 68  ch term in the h
12aa0 61 73 68 2d 74 61 62 6c 65 2c 20 74 68 65 20 0a  ash-table, the .
12ab0 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20 73  ** iterator is s
12ac0 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  et to EOF..**.**
12ad0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
12ae0 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72  urs, Fts5Index.r
12af0 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61  c is set to an a
12b00 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
12b10 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e   code. If .** an
12b20 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
12b30 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
12b40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
12b50 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
12b60 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
12b70 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
12b80 74 65 72 48 61 73 68 49 6e 69 74 28 0a 20 20 46  terHashInit(.  F
12b90 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
12ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12bb0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a  * FTS5 backend *
12bc0 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
12bd0 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20  erm, int nTerm, 
12be0 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
12bf0 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  eek to */.  int 
12c00 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
12c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
12c20 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58  ask of FTS5INDEX
12c30 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
12c40 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
12c50 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
12c60 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70  /* Object to pop
12c70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ulate */.){.  co
12c80 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20  nst u8 *pList = 
12c90 30 3b 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d  0;.  int nList =
12ca0 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   0;.  const u8 *
12cb0 7a 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d  z = 0;.  int n =
12cc0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
12cd0 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20 61 73 73  ->pHash );.  ass
12ce0 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
12cf0 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20  TE_OK );..  if( 
12d00 70 54 65 72 6d 3d 3d 30 20 7c 7c 20 28 66 6c 61  pTerm==0 || (fla
12d10 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
12d20 55 45 52 59 5f 53 43 41 4e 29 20 29 7b 0a 20 20  UERY_SCAN) ){.  
12d30 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
12d40 33 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69  3Fts5HashScanIni
12d50 74 28 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e  t(p->pHash, (con
12d60 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20  st char*)pTerm, 
12d70 6e 54 65 72 6d 29 3b 0a 20 20 20 20 73 71 6c 69  nTerm);.    sqli
12d80 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
12d90 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 28  ntry(p->pHash, (
12da0 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26 7a 2c  const char**)&z,
12db0 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29   &pList, &nList)
12dc0 3b 0a 20 20 20 20 6e 20 3d 20 28 7a 20 3f 20 28  ;.    n = (z ? (
12dd0 69 6e 74 29 73 74 72 6c 65 6e 28 28 63 6f 6e 73  int)strlen((cons
12de0 74 20 63 68 61 72 2a 29 7a 29 20 3a 20 30 29 3b  t char*)z) : 0);
12df0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
12e00 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54  ter->flags |= FT
12e10 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
12e20 52 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  RM;.    sqlite3F
12e30 74 73 35 48 61 73 68 51 75 65 72 79 28 70 2d 3e  ts5HashQuery(p->
12e40 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68  pHash, (const ch
12e50 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d  ar*)pTerm, nTerm
12e60 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
12e70 29 3b 0a 20 20 20 20 7a 20 3d 20 70 54 65 72 6d  );.    z = pTerm
12e80 3b 0a 20 20 20 20 6e 20 3d 20 6e 54 65 72 6d 3b  ;.    n = nTerm;
12e90 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69 73  .  }..  if( pLis
12ea0 74 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74  t ){.    Fts5Dat
12eb0 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20 20 73 71  a *pLeaf;.    sq
12ec0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
12ed0 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65  et(&p->rc, &pIte
12ee0 72 2d 3e 74 65 72 6d 2c 20 6e 2c 20 7a 29 3b 0a  r->term, n, z);.
12ef0 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35      pLeaf = fts5
12f00 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  IdxMalloc(p, siz
12f10 65 6f 66 28 46 74 73 35 44 61 74 61 29 29 3b 0a  eof(Fts5Data));.
12f20 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30      if( pLeaf==0
12f30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
12f40 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70  Leaf->p = (u8*)p
12f50 4c 69 73 74 3b 0a 20 20 20 20 70 4c 65 61 66 2d  List;.    pLeaf-
12f60 3e 6e 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c  >nn = pLeaf->szL
12f70 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  eaf = nList;.   
12f80 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
12f90 70 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72  pLeaf;.    pIter
12fa0 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
12fb0 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c  fts5GetVarint(pL
12fc0 65 61 66 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70  eaf->p, (u64*)&p
12fd0 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
12fe0 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
12ff0 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61 66 2d  Doclist = pLeaf-
13000 3e 6e 6e 3b 0a 0a 20 20 20 20 69 66 28 20 66 6c  >nn;..    if( fl
13010 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
13020 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20  QUERY_DESC ){.  
13030 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73      pIter->flags
13040 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52   |= FTS5_SEGITER
13050 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20  _REVERSE;.      
13060 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
13070 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49  seInitPage(p, pI
13080 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ter);.    }else{
13090 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
130a0 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
130b0 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ter);.    }.  }.
130c0 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 53 65  .  fts5SegIterSe
130d0 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b  tNext(p, pIter);
130e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74  .}../*.** Zero t
130f0 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
13100 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
13110 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
13120 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
13130 74 65 72 43 6c 65 61 72 28 46 74 73 35 53 65 67  terClear(Fts5Seg
13140 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
13150 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
13160 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 20 20  pIter->term);.  
13170 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
13180 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
13190 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
131a0 28 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61  (pIter->pNextLea
131b0 66 29 3b 0a 20 20 66 74 73 35 44 6c 69 64 78 49  f);.  fts5DlidxI
131c0 74 65 72 46 72 65 65 28 70 49 74 65 72 2d 3e 70  terFree(pIter->p
131d0 44 6c 69 64 78 29 3b 0a 20 20 73 71 6c 69 74 65  Dlidx);.  sqlite
131e0 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 52  3_free(pIter->aR
131f0 6f 77 69 64 4f 66 66 73 65 74 29 3b 0a 20 20 6d  owidOffset);.  m
13200 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
13210 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74  sizeof(Fts5SegIt
13220 65 72 29 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  er));.}..#ifdef 
13230 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 0a 2f 2a  SQLITE_DEBUG../*
13240 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
13250 6e 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72  n is used as par
13260 74 20 6f 66 20 74 68 65 20 62 69 67 20 61 73 73  t of the big ass
13270 65 72 74 28 29 20 70 72 6f 63 65 64 75 72 65 20  ert() procedure 
13280 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 0a 2a  implemented by.*
13290 2a 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74  * fts5AssertMult
132a0 69 49 74 65 72 53 65 74 75 70 28 29 2e 20 49 74  iIterSetup(). It
132b0 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
132c0 65 20 72 65 73 75 6c 74 20 63 75 72 72 65 6e 74  e result current
132d0 6c 79 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  ly stored.** in 
132e0 2a 70 52 65 73 20 69 73 20 74 68 65 20 63 6f 72  *pRes is the cor
132f0 72 65 63 74 20 72 65 73 75 6c 74 20 6f 66 20 63  rect result of c
13300 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 63 75 72  omparing the cur
13310 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 6f  rent positions o
13320 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 69 74 65  f the.** two ite
13330 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  rators..*/.stati
13340 63 20 76 6f 69 64 20 66 74 73 35 41 73 73 65 72  c void fts5Asser
13350 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c  tComparisonResul
13360 74 28 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  t(.  Fts5Iter *p
13370 49 74 65 72 2c 20 0a 20 20 46 74 73 35 53 65 67  Iter, .  Fts5Seg
13380 49 74 65 72 20 2a 70 31 2c 0a 20 20 46 74 73 35  Iter *p1,.  Fts5
13390 53 65 67 49 74 65 72 20 2a 70 32 2c 0a 20 20 46  SegIter *p2,.  F
133a0 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
133b0 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 70  .){.  int i1 = p
133c0 31 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b  1 - pIter->aSeg;
133d0 0a 20 20 69 6e 74 20 69 32 20 3d 20 70 32 20 2d  .  int i2 = p2 -
133e0 20 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a 0a 20   pIter->aSeg;.. 
133f0 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 20 7c   if( p1->pLeaf |
13400 7c 20 70 32 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  | p2->pLeaf ){. 
13410 20 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66     if( p1->pLeaf
13420 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
13430 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73  ert( pRes->iFirs
13440 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 7d 65 6c  t==i2 );.    }el
13450 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66  se if( p2->pLeaf
13460 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
13470 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73  ert( pRes->iFirs
13480 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 7d 65 6c  t==i1 );.    }el
13490 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d  se{.      int nM
134a0 69 6e 20 3d 20 4d 49 4e 28 70 31 2d 3e 74 65 72  in = MIN(p1->ter
134b0 6d 2e 6e 2c 20 70 32 2d 3e 74 65 72 6d 2e 6e 29  m.n, p2->term.n)
134c0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 20  ;.      int res 
134d0 3d 20 6d 65 6d 63 6d 70 28 70 31 2d 3e 74 65 72  = memcmp(p1->ter
134e0 6d 2e 70 2c 20 70 32 2d 3e 74 65 72 6d 2e 70 2c  m.p, p2->term.p,
134f0 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 20 20 69 66   nMin);.      if
13500 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d  ( res==0 ) res =
13510 20 70 31 2d 3e 74 65 72 6d 2e 6e 20 2d 20 70 32   p1->term.n - p2
13520 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a 20 20 20 20 20  ->term.n;..     
13530 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
13540 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13550 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 31 20  Res->bTermEq==1 
13560 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
13570 74 28 20 70 31 2d 3e 69 52 6f 77 69 64 21 3d 70  t( p1->iRowid!=p
13580 32 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20  2->iRowid );.   
13590 20 20 20 20 20 72 65 73 20 3d 20 28 28 70 31 2d       res = ((p1-
135a0 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52  >iRowid > p2->iR
135b0 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
135c0 65 76 29 20 3f 20 2d 31 20 3a 20 31 3b 0a 20 20  ev) ? -1 : 1;.  
135d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
135e0 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
135f0 3e 62 54 65 72 6d 45 71 3d 3d 30 20 29 3b 0a 20  >bTermEq==0 );. 
13600 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
13610 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20  ( res<0 ){.     
13620 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
13630 3e 69 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20  >iFirst==i1 );. 
13640 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13650 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
13660 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a  ->iFirst==i2 );.
13670 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13680 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
13690 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
136a0 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51 4c 49 54  -op unless SQLIT
136b0 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
136c0 65 64 20 77 68 65 6e 20 74 68 69 73 20 6d 6f 64  ed when this mod
136d0 75 6c 65 0a 2a 2a 20 69 73 20 63 6f 6d 70 69 6c  ule.** is compil
136e0 65 64 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ed. In that case
136f0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
13700 69 73 20 65 73 73 65 6e 74 69 61 6c 6c 79 20 61  is essentially a
13710 6e 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73  n assert() .** s
13720 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f  tatement used to
13730 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
13740 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
13750 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 5d   pIter->aFirst[]
13760 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 63 6f   array.** are co
13770 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrect..*/.static
13780 20 76 6f 69 64 20 66 74 73 35 41 73 73 65 72 74   void fts5Assert
13790 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 46  MultiIterSetup(F
137a0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
137b0 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  5Iter *pIter){. 
137c0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
137d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
137e0 35 53 65 67 49 74 65 72 20 2a 70 46 69 72 73 74  5SegIter *pFirst
137f0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
13800 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
13810 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
13820 69 6e 74 20 69 3b 0a 0a 20 20 20 20 61 73 73 65  int i;..    asse
13830 72 74 28 20 28 70 46 69 72 73 74 2d 3e 70 4c 65  rt( (pFirst->pLe
13840 61 66 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62  af==0)==pIter->b
13850 61 73 65 2e 62 45 6f 66 20 29 3b 0a 0a 20 20 20  ase.bEof );..   
13860 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 70   /* Check that p
13870 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
13880 69 64 20 69 73 20 73 65 74 20 63 6f 72 72 65 63  id is set correc
13890 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  tly. */.    for(
138a0 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53  i=0; i<pIter->nS
138b0 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  eg; i++){.      
138c0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 20  Fts5SegIter *p1 
138d0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
138e0 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
138f0 20 70 31 3d 3d 70 46 69 72 73 74 20 0a 20 20 20   p1==pFirst .   
13900 20 20 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e 70          || p1->p
13910 4c 65 61 66 3d 3d 30 20 0a 20 20 20 20 20 20 20  Leaf==0 .       
13920 20 20 20 20 7c 7c 20 66 74 73 35 42 75 66 66 65      || fts5Buffe
13930 72 43 6f 6d 70 61 72 65 28 26 70 46 69 72 73 74  rCompare(&pFirst
13940 2d 3e 74 65 72 6d 2c 20 26 70 31 2d 3e 74 65 72  ->term, &p1->ter
13950 6d 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  m) .           |
13960 7c 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 49  | p1->iRowid==pI
13970 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
13980 64 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  d.           || 
13990 28 70 31 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65  (p1->iRowid<pIte
139a0 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29  r->iSwitchRowid)
139b0 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 0a 20 20  ==pIter->bRev.  
139c0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
139d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
139e0 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 3d 32 29 7b  er->nSeg; i+=2){
139f0 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
13a00 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d  er *p1 = &pIter-
13a10 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20  >aSeg[i];.      
13a20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 20  Fts5SegIter *p2 
13a30 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
13a40 2b 31 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 43  +1];.      Fts5C
13a50 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26  Result *pRes = &
13a60 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 28 70  pIter->aFirst[(p
13a70 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69 29 20  Iter->nSeg + i) 
13a80 2f 20 32 5d 3b 0a 20 20 20 20 20 20 66 74 73 35  / 2];.      fts5
13a90 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e  AssertComparison
13aa0 52 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31  Result(pIter, p1
13ab0 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20  , p2, pRes);.   
13ac0 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   }..    for(i=1;
13ad0 20 69 3c 28 70 49 74 65 72 2d 3e 6e 53 65 67 20   i<(pIter->nSeg 
13ae0 2f 20 32 29 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  / 2); i+=2){.   
13af0 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
13b00 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p1 = &pIter->aSe
13b10 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
13b20 5b 69 2a 32 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  [i*2].iFirst ];.
13b30 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
13b40 72 20 2a 70 32 20 3d 20 26 70 49 74 65 72 2d 3e  r *p2 = &pIter->
13b50 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
13b60 72 73 74 5b 69 2a 32 2b 31 5d 2e 69 46 69 72 73  rst[i*2+1].iFirs
13b70 74 20 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 43  t ];.      Fts5C
13b80 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26  Result *pRes = &
13b90 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d  pIter->aFirst[i]
13ba0 3b 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65  ;.      fts5Asse
13bb0 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75  rtComparisonResu
13bc0 6c 74 28 70 49 74 65 72 2c 20 70 31 2c 20 70 32  lt(pIter, p1, p2
13bd0 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 20  , pRes);.    }. 
13be0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
13bf0 69 6e 65 20 66 74 73 35 41 73 73 65 72 74 4d 75  ine fts5AssertMu
13c00 6c 74 69 49 74 65 72 53 65 74 75 70 28 78 2c 79  ltiIterSetup(x,y
13c10 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
13c20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
13c30 6e 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 70  n necessary to p
13c40 6f 70 75 6c 61 74 65 20 70 49 74 65 72 2d 3e 61  opulate pIter->a
13c50 46 69 72 73 74 5b 69 4f 75 74 5d 2e 0a 2a 2a 0a  First[iOut]..**.
13c60 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
13c70 65 64 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d  ed value is non-
13c80 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73  zero, then it is
13c90 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 6e   the index of an
13ca0 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 74 68 65   entry.** in the
13cb0 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 5d 20 61   pIter->aSeg[] a
13cc0 72 72 61 79 20 74 68 61 74 20 69 73 20 28 61 29  rray that is (a)
13cd0 20 6e 6f 74 20 61 74 20 45 4f 46 2c 20 61 6e 64   not at EOF, and
13ce0 20 28 62 29 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   (b) pointing.**
13cf0 20 74 6f 20 61 20 6b 65 79 20 74 68 61 74 20 69   to a key that i
13d00 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66  s a duplicate of
13d10 20 61 6e 6f 74 68 65 72 2c 20 68 69 67 68 65 72   another, higher
13d20 20 70 72 69 6f 72 69 74 79 2c 20 0a 2a 2a 20 73   priority, .** s
13d30 65 67 6d 65 6e 74 2d 69 74 65 72 61 74 6f 72 20  egment-iterator 
13d40 69 6e 20 74 68 65 20 70 53 65 67 2d 3e 61 53 65  in the pSeg->aSe
13d50 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  g[] array..*/.st
13d60 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c  atic int fts5Mul
13d70 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28  tiIterDoCompare(
13d80 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c  Fts5Iter *pIter,
13d90 20 69 6e 74 20 69 4f 75 74 29 7b 0a 20 20 69 6e   int iOut){.  in
13da0 74 20 69 31 3b 20 20 20 20 20 20 20 20 20 20 20  t i1;           
13db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13dc0 20 49 6e 64 65 78 20 6f 66 20 6c 65 66 74 2d 68   Index of left-h
13dd0 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20  and Fts5SegIter 
13de0 2a 2f 0a 20 20 69 6e 74 20 69 32 3b 20 20 20 20  */.  int i2;    
13df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e00 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
13e10 20 72 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35   right-hand Fts5
13e20 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74  SegIter */.  int
13e30 20 69 52 65 73 3b 0a 20 20 46 74 73 35 53 65 67   iRes;.  Fts5Seg
13e40 49 74 65 72 20 2a 70 31 3b 20 20 20 20 20 20 20  Iter *p1;       
13e50 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
13e60 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65  -hand Fts5SegIte
13e70 72 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  r */.  Fts5SegIt
13e80 65 72 20 2a 70 32 3b 20 20 20 20 20 20 20 20 20  er *p2;         
13e90 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 2d         /* Right-
13ea0 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72  hand Fts5SegIter
13eb0 20 2a 2f 0a 20 20 46 74 73 35 43 52 65 73 75 6c   */.  Fts5CResul
13ec0 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72  t *pRes = &pIter
13ed0 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 3b 0a  ->aFirst[iOut];.
13ee0 0a 20 20 61 73 73 65 72 74 28 20 69 4f 75 74 3c  .  assert( iOut<
13ef0 70 49 74 65 72 2d 3e 6e 53 65 67 20 26 26 20 69  pIter->nSeg && i
13f00 4f 75 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Out>0 );.  asser
13f10 74 28 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d  t( pIter->bRev==
13f20 30 20 7c 7c 20 70 49 74 65 72 2d 3e 62 52 65 76  0 || pIter->bRev
13f30 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20 69 4f  ==1 );..  if( iO
13f40 75 74 3e 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67  ut>=(pIter->nSeg
13f50 2f 32 29 20 29 7b 0a 20 20 20 20 69 31 20 3d 20  /2) ){.    i1 = 
13f60 28 69 4f 75 74 20 2d 20 70 49 74 65 72 2d 3e 6e  (iOut - pIter->n
13f70 53 65 67 2f 32 29 20 2a 20 32 3b 0a 20 20 20 20  Seg/2) * 2;.    
13f80 69 32 20 3d 20 69 31 20 2b 20 31 3b 0a 20 20 7d  i2 = i1 + 1;.  }
13f90 65 6c 73 65 7b 0a 20 20 20 20 69 31 20 3d 20 70  else{.    i1 = p
13fa0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75  Iter->aFirst[iOu
13fb0 74 2a 32 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20  t*2].iFirst;.   
13fc0 20 69 32 20 3d 20 70 49 74 65 72 2d 3e 61 46 69   i2 = pIter->aFi
13fd0 72 73 74 5b 69 4f 75 74 2a 32 2b 31 5d 2e 69 46  rst[iOut*2+1].iF
13fe0 69 72 73 74 3b 0a 20 20 7d 0a 20 20 70 31 20 3d  irst;.  }.  p1 =
13ff0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 31   &pIter->aSeg[i1
14000 5d 3b 0a 20 20 70 32 20 3d 20 26 70 49 74 65 72  ];.  p2 = &pIter
14010 2d 3e 61 53 65 67 5b 69 32 5d 3b 0a 0a 20 20 70  ->aSeg[i2];..  p
14020 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 3d 20 30  Res->bTermEq = 0
14030 3b 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61  ;.  if( p1->pLea
14040 66 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  f==0 ){         
14050 20 20 2f 2a 20 49 66 20 70 31 20 69 73 20 61 74    /* If p1 is at
14060 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73   EOF */.    iRes
14070 20 3d 20 69 32 3b 0a 20 20 7d 65 6c 73 65 20 69   = i2;.  }else i
14080 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20  f( p2->pLeaf==0 
14090 29 7b 20 20 20 20 20 2f 2a 20 49 66 20 70 32 20  ){     /* If p2 
140a0 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20  is at EOF */.   
140b0 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 7d 65   iRes = i1;.  }e
140c0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  lse{.    int res
140d0 20 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d   = fts5BufferCom
140e0 70 61 72 65 28 26 70 31 2d 3e 74 65 72 6d 2c 20  pare(&p1->term, 
140f0 26 70 32 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20  &p2->term);.    
14100 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
14110 20 20 20 20 61 73 73 65 72 74 28 20 69 32 3e 69      assert( i2>i
14120 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  1 );.      asser
14130 74 28 20 69 32 21 3d 30 20 29 3b 0a 20 20 20 20  t( i2!=0 );.    
14140 20 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20    pRes->bTermEq 
14150 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 1;.      if( p
14160 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 32 2d 3e 69  1->iRowid==p2->i
14170 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
14180 20 70 31 2d 3e 62 44 65 6c 20 3d 20 70 32 2d 3e   p1->bDel = p2->
14190 62 44 65 6c 3b 0a 20 20 20 20 20 20 20 20 72 65  bDel;.        re
141a0 74 75 72 6e 20 69 32 3b 0a 20 20 20 20 20 20 7d  turn i2;.      }
141b0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 28 28 70  .      res = ((p
141c0 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e  1->iRowid > p2->
141d0 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e  iRowid)==pIter->
141e0 62 52 65 76 29 20 3f 20 2d 31 20 3a 20 2b 31 3b  bRev) ? -1 : +1;
141f0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
14200 74 28 20 72 65 73 21 3d 30 20 29 3b 0a 20 20 20  t( res!=0 );.   
14210 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
14220 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20      iRes = i1;. 
14230 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14240 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 20 20 7d  iRes = i2;.    }
14250 0a 20 20 7d 0a 0a 20 20 70 52 65 73 2d 3e 69 46  .  }..  pRes->iF
14260 69 72 73 74 20 3d 20 28 75 31 36 29 69 52 65 73  irst = (u16)iRes
14270 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
14280 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
14290 73 65 67 2d 69 74 65 72 20 73 6f 20 74 68 61 74  seg-iter so that
142a0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
142b0 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
142c0 20 70 61 67 65 20 69 4c 65 61 66 50 67 6e 6f 2e   page iLeafPgno.
142d0 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20 65 72 72  .** It is an err
142e0 6f 72 20 69 66 20 6c 65 61 66 20 69 4c 65 61 66  or if leaf iLeaf
142f0 50 67 6e 6f 20 64 6f 65 73 20 6e 6f 74 20 65 78  Pgno does not ex
14300 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 73 20  ist or contains 
14310 6e 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74  no rowids..*/.st
14320 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
14330 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28 0a 20  gIterGotoPage(. 
14340 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
14350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14360 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
14370 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
14380 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  5SegIter *pIter,
14390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
143a0 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61  Iterator to adva
143b0 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  nce */.  int iLe
143c0 61 66 50 67 6e 6f 0a 29 7b 0a 20 20 61 73 73 65  afPgno.){.  asse
143d0 72 74 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49  rt( iLeafPgno>pI
143e0 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29  ter->iLeafPgno )
143f0 3b 0a 0a 20 20 69 66 28 20 69 4c 65 61 66 50 67  ;..  if( iLeafPg
14400 6e 6f 3e 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e  no>pIter->pSeg->
14410 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20  pgnoLast ){.    
14420 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
14430 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RUPT;.  }else{. 
14440 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
14450 73 65 28 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c  se(pIter->pNextL
14460 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  eaf);.    pIter-
14470 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 30 3b 0a  >pNextLeaf = 0;.
14480 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
14490 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f  Pgno = iLeafPgno
144a0 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49  -1;.    fts5SegI
144b0 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
144c0 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  Iter);.    asser
144d0 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  t( p->rc!=SQLITE
144e0 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 69 4c  _OK || pIter->iL
144f0 65 61 66 50 67 6e 6f 3d 3d 69 4c 65 61 66 50 67  eafPgno==iLeafPg
14500 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  no );..    if( p
14510 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
14520 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66  ){.      int iOf
14530 66 3b 0a 20 20 20 20 20 20 75 38 20 2a 61 20 3d  f;.      u8 *a =
14540 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
14550 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
14560 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
14570 4c 65 61 66 3b 0a 0a 20 20 20 20 20 20 69 4f 66  Leaf;..      iOf
14580 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  f = fts5LeafFirs
14590 74 52 6f 77 69 64 4f 66 66 28 70 49 74 65 72 2d  tRowidOff(pIter-
145a0 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69  >pLeaf);.      i
145b0 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20 69 4f 66  f( iOff<4 || iOf
145c0 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  f>=n ){.        
145d0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
145e0 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RUPT;.      }els
145f0 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  e{.        iOff 
14600 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
14610 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
14620 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
14630 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
14640 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
14650 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 66 74 73  Off;.        fts
14660 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
14670 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
14680 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
14690 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
146a0 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
146b0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
146c0 20 61 72 67 75 6d 65 6e 74 20 75 6e 74 69 6c 20   argument until 
146d0 69 74 20 69 73 20 61 74 20 6f 72 20 0a 2a 2a 20  it is at or .** 
146e0 70 61 73 74 20 72 6f 77 69 64 20 69 46 72 6f 6d  past rowid iFrom
146f0 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
14700 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 46 72  the value of iFr
14710 6f 6d 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72  om, the iterator
14720 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 61 64   is.** always ad
14730 76 61 6e 63 65 64 20 61 74 20 6c 65 61 73 74 20  vanced at least 
14740 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  once..*/.static 
14750 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
14760 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74 73 35  NextFrom(.  Fts5
14770 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
14780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
14790 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
147a0 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ct */.  Fts5SegI
147b0 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
147c0 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
147d0 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a  tor to advance *
147e0 2f 0a 20 20 69 36 34 20 69 4d 61 74 63 68 20 20  /.  i64 iMatch  
147f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14800 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 69      /* Advance i
14810 74 65 72 61 74 6f 72 20 61 74 20 6c 65 61 73 74  terator at least
14820 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 29 7b 0a   this far */.){.
14830 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28 70 49    int bRev = (pI
14840 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
14850 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
14860 45 29 3b 0a 20 20 46 74 73 35 44 6c 69 64 78 49  E);.  Fts5DlidxI
14870 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 70 49  ter *pDlidx = pI
14880 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 69  ter->pDlidx;.  i
14890 6e 74 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70  nt iLeafPgno = p
148a0 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b  Iter->iLeafPgno;
148b0 0a 20 20 69 6e 74 20 62 4d 6f 76 65 20 3d 20 31  .  int bMove = 1
148c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ;..  assert( pIt
148d0 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
148e0 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
148f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
14900 74 65 72 2d 3e 70 44 6c 69 64 78 20 29 3b 0a 20  ter->pDlidx );. 
14910 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
14920 70 4c 65 61 66 20 29 3b 0a 0a 20 20 69 66 28 20  pLeaf );..  if( 
14930 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 77  bRev==0 ){.    w
14940 68 69 6c 65 28 20 21 66 74 73 35 44 6c 69 64 78  hile( !fts5Dlidx
14950 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
14960 78 29 20 26 26 20 69 4d 61 74 63 68 3e 66 74 73  x) && iMatch>fts
14970 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28  5DlidxIterRowid(
14980 70 44 6c 69 64 78 29 20 29 7b 0a 20 20 20 20 20  pDlidx) ){.     
14990 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 66 74 73   iLeafPgno = fts
149a0 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
149b0 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66 74  Dlidx);.      ft
149c0 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28  s5DlidxIterNext(
149d0 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  p, pDlidx);.    
149e0 7d 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28  }.    assert_nc(
149f0 20 69 4c 65 61 66 50 67 6e 6f 3e 3d 70 49 74 65   iLeafPgno>=pIte
14a00 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 7c 7c 20  r->iLeafPgno || 
14a10 70 2d 3e 72 63 20 29 3b 0a 20 20 20 20 69 66 28  p->rc );.    if(
14a20 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72   iLeafPgno>pIter
14a30 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20  ->iLeafPgno ){. 
14a40 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
14a50 47 6f 74 6f 50 61 67 65 28 70 2c 20 70 49 74 65  GotoPage(p, pIte
14a60 72 2c 20 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20  r, iLeafPgno);. 
14a70 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a       bMove = 0;.
14a80 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
14a90 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72     assert( pIter
14aa0 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29  ->pNextLeaf==0 )
14ab0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 4d  ;.    assert( iM
14ac0 61 74 63 68 3c 70 49 74 65 72 2d 3e 69 52 6f 77  atch<pIter->iRow
14ad0 69 64 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  id );.    while(
14ae0 20 21 66 74 73 35 44 6c 69 64 78 49 74 65 72 45   !fts5DlidxIterE
14af0 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 20 26 26  of(p, pDlidx) &&
14b00 20 69 4d 61 74 63 68 3c 66 74 73 35 44 6c 69 64   iMatch<fts5Dlid
14b10 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64  xIterRowid(pDlid
14b20 78 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  x) ){.      fts5
14b30 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 70 2c  DlidxIterPrev(p,
14b40 20 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a   pDlidx);.    }.
14b50 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20      iLeafPgno = 
14b60 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
14b70 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20 20 20 20  o(pDlidx);..    
14b80 61 73 73 65 72 74 28 20 66 74 73 35 44 6c 69 64  assert( fts5Dlid
14b90 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
14ba0 64 78 29 20 7c 7c 20 69 4c 65 61 66 50 67 6e 6f  dx) || iLeafPgno
14bb0 3c 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  <=pIter->iLeafPg
14bc0 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69  no );..    if( i
14bd0 4c 65 61 66 50 67 6e 6f 3c 70 49 74 65 72 2d 3e  LeafPgno<pIter->
14be0 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20  iLeafPgno ){.   
14bf0 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50     pIter->iLeafP
14c00 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2b  gno = iLeafPgno+
14c10 31 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  1;.      fts5Seg
14c20 49 74 65 72 52 65 76 65 72 73 65 4e 65 77 50 61  IterReverseNewPa
14c30 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
14c40 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20      bMove = 0;. 
14c50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a     }.  }..  do{.
14c60 20 20 20 20 69 66 28 20 62 4d 6f 76 65 20 26 26      if( bMove &&
14c70 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
14c80 4b 20 29 20 70 49 74 65 72 2d 3e 78 4e 65 78 74  K ) pIter->xNext
14c90 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20  (p, pIter, 0);. 
14ca0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c     if( pIter->pL
14cb0 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  eaf==0 ) break;.
14cc0 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20      if( bRev==0 
14cd0 26 26 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  && pIter->iRowid
14ce0 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b  >=iMatch ) break
14cf0 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 21 3d  ;.    if( bRev!=
14d00 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f 77  0 && pIter->iRow
14d10 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65  id<=iMatch ) bre
14d20 61 6b 3b 0a 20 20 20 20 62 4d 6f 76 65 20 3d 20  ak;.    bMove = 
14d30 31 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 2d 3e  1;.  }while( p->
14d40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
14d50 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  .}.../*.** Free 
14d60 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  the iterator obj
14d70 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
14d80 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
14d90 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
14da0 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46  d fts5MultiIterF
14db0 72 65 65 28 46 74 73 35 49 74 65 72 20 2a 70 49  ree(Fts5Iter *pI
14dc0 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65  ter){.  if( pIte
14dd0 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r ){.    int i;.
14de0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
14df0 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29  Iter->nSeg; i++)
14e00 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
14e10 74 65 72 43 6c 65 61 72 28 26 70 49 74 65 72 2d  terClear(&pIter-
14e20 3e 61 53 65 67 5b 69 5d 29 3b 0a 20 20 20 20 7d  >aSeg[i]);.    }
14e30 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
14e40 72 65 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  reRelease(pIter-
14e50 3e 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 66  >pStruct);.    f
14e60 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
14e70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a  Iter->poslist);.
14e80 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14e90 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  (pIter);.  }.}..
14ea0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
14eb0 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
14ec0 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  d(.  Fts5Index *
14ed0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
14ee0 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
14ef0 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20  kend to iterate 
14f00 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35  within */.  Fts5
14f10 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
14f20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14f30 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64 61 74  terator to updat
14f40 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79  e aFirst[] array
14f50 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43   for */.  int iC
14f60 68 61 6e 67 65 64 2c 20 20 20 20 20 20 20 20 20  hanged,         
14f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
14f80 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72 61 74  ex of sub-iterat
14f90 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63 65 64  or just advanced
14fa0 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 73 65   */.  int iMinse
14fb0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
14fc0 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d        /* Minimum
14fd0 20 65 6e 74 72 79 20 69 6e 20 61 46 69 72 73 74   entry in aFirst
14fe0 5b 5d 20 74 6f 20 73 65 74 20 2a 2f 0a 29 7b 0a  [] to set */.){.
14ff0 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
15000 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43  =(pIter->nSeg+iC
15010 68 61 6e 67 65 64 29 2f 32 3b 20 69 3e 3d 69 4d  hanged)/2; i>=iM
15020 69 6e 73 65 74 20 26 26 20 70 2d 3e 72 63 3d 3d  inset && p->rc==
15030 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 3d 69 2f 32  SQLITE_OK; i=i/2
15040 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 71 3b 0a  ){.    int iEq;.
15050 20 20 20 20 69 66 28 20 28 69 45 71 20 3d 20 66      if( (iEq = f
15060 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f  ts5MultiIterDoCo
15070 6d 70 61 72 65 28 70 49 74 65 72 2c 20 69 29 29  mpare(pIter, i))
15080 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65   ){.      Fts5Se
15090 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
150a0 49 74 65 72 2d 3e 61 53 65 67 5b 69 45 71 5d 3b  Iter->aSeg[iEq];
150b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
150c0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
150d0 29 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 78  );.      pSeg->x
150e0 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29  Next(p, pSeg, 0)
150f0 3b 0a 20 20 20 20 20 20 69 20 3d 20 70 49 74 65  ;.      i = pIte
15100 72 2d 3e 6e 53 65 67 20 2b 20 69 45 71 3b 0a 20  r->nSeg + iEq;. 
15110 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
15120 2a 20 53 75 62 2d 69 74 65 72 61 74 6f 72 20 69  * Sub-iterator i
15130 43 68 61 6e 67 65 64 20 6f 66 20 69 74 65 72 61  Changed of itera
15140 74 6f 72 20 70 49 74 65 72 20 68 61 73 20 6a 75  tor pIter has ju
15150 73 74 20 62 65 65 6e 20 61 64 76 61 6e 63 65 64  st been advanced
15160 2e 20 49 74 20 73 74 69 6c 6c 0a 2a 2a 20 70 6f  . It still.** po
15170 69 6e 74 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ints to the same
15180 20 74 65 72 6d 20 74 68 6f 75 67 68 20 2d 20 6a   term though - j
15190 75 73 74 20 61 20 64 69 66 66 65 72 65 6e 74 20  ust a different 
151a0 72 6f 77 69 64 2e 20 54 68 69 73 20 66 75 6e 63  rowid. This func
151b0 74 69 6f 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 73  tion.** attempts
151c0 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
151d0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
151e0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61  Iter->aFirst[] a
151f0 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 20 49  ccordingly..** I
15200 66 20 69 74 20 64 6f 65 73 20 73 6f 20 73 75 63  f it does so suc
15210 63 65 73 73 66 75 6c 6c 79 2c 20 30 20 69 73 20  cessfully, 0 is 
15220 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
15230 69 73 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ise 1..**.** If 
15240 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
15250 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72  rned, the caller
15260 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 66 74 73   should call fts
15270 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
15280 65 64 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 69  ed().** on the i
15290 74 65 72 61 74 6f 72 20 69 6e 73 74 65 61 64 2e  terator instead.
152a0 20 54 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 64   That function d
152b0 6f 65 73 20 74 68 65 20 73 61 6d 65 20 61 73 20  oes the same as 
152c0 74 68 69 73 20 6f 6e 65 2c 20 65 78 63 65 70 74  this one, except
152d0 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 65 61 6c  .** that it deal
152e0 73 20 77 69 74 68 20 6d 6f 72 65 20 63 6f 6d 70  s with more comp
152f0 6c 69 63 61 74 65 64 20 63 61 73 65 73 20 61 73  licated cases as
15300 20 77 65 6c 6c 2e 0a 2a 2f 20 0a 73 74 61 74 69   well..*/ .stati
15310 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49  c int fts5MultiI
15320 74 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28  terAdvanceRowid(
15330 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  .  Fts5Iter *pIt
15340 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
15350 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
15360 6f 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b  o update aFirst[
15370 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20  ] array for */. 
15380 20 69 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20   int iChanged,  
15390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153a0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62   /* Index of sub
153b0 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61  -iterator just a
153c0 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20 46 74 73  dvanced */.  Fts
153d0 35 53 65 67 49 74 65 72 20 2a 2a 70 70 46 69 72  5SegIter **ppFir
153e0 73 74 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 49  st.){.  Fts5SegI
153f0 74 65 72 20 2a 70 4e 65 77 20 3d 20 26 70 49 74  ter *pNew = &pIt
15400 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67 65  er->aSeg[iChange
15410 64 5d 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 2d  d];..  if( pNew-
15420 3e 69 52 6f 77 69 64 3d 3d 70 49 74 65 72 2d 3e  >iRowid==pIter->
15430 69 53 77 69 74 63 68 52 6f 77 69 64 0a 20 20 20  iSwitchRowid.   
15440 7c 7c 20 28 70 4e 65 77 2d 3e 69 52 6f 77 69 64  || (pNew->iRowid
15450 3c 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52  <pIter->iSwitchR
15460 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
15470 65 76 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  ev.  ){.    int 
15480 69 3b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  i;.    Fts5SegIt
15490 65 72 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 49  er *pOther = &pI
154a0 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67  ter->aSeg[iChang
154b0 65 64 20 5e 20 30 78 30 30 30 31 5d 3b 0a 20 20  ed ^ 0x0001];.  
154c0 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68    pIter->iSwitch
154d0 52 6f 77 69 64 20 3d 20 70 49 74 65 72 2d 3e 62  Rowid = pIter->b
154e0 52 65 76 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49  Rev ? SMALLEST_I
154f0 4e 54 36 34 20 3a 20 4c 41 52 47 45 53 54 5f 49  NT64 : LARGEST_I
15500 4e 54 36 34 3b 0a 20 20 20 20 66 6f 72 28 69 3d  NT64;.    for(i=
15510 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43 68  (pIter->nSeg+iCh
15520 61 6e 67 65 64 29 2f 32 3b 20 31 3b 20 69 3d 69  anged)/2; 1; i=i
15530 2f 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 43  /2){.      Fts5C
15540 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26  Result *pRes = &
15550 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d  pIter->aFirst[i]
15560 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
15570 20 70 4e 65 77 2d 3e 70 4c 65 61 66 20 29 3b 0a   pNew->pLeaf );.
15580 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
15590 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 7c  es->bTermEq==0 |
155a0 7c 20 70 4f 74 68 65 72 2d 3e 70 4c 65 61 66 20  | pOther->pLeaf 
155b0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 52  );..      if( pR
155c0 65 73 2d 3e 62 54 65 72 6d 45 71 20 29 7b 0a 20  es->bTermEq ){. 
155d0 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d         if( pNew-
155e0 3e 69 52 6f 77 69 64 3d 3d 70 4f 74 68 65 72 2d  >iRowid==pOther-
155f0 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  >iRowid ){.     
15600 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
15610 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
15620 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64   (pOther->iRowid
15630 3e 70 4e 65 77 2d 3e 69 52 6f 77 69 64 29 3d 3d  >pNew->iRowid)==
15640 70 49 74 65 72 2d 3e 62 52 65 76 20 29 7b 0a 20  pIter->bRev ){. 
15650 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
15660 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70  iSwitchRowid = p
15670 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20  Other->iRowid;. 
15680 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
15690 70 4f 74 68 65 72 3b 0a 20 20 20 20 20 20 20 20  pOther;.        
156a0 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65  }else if( (pOthe
156b0 72 2d 3e 69 52 6f 77 69 64 3e 70 49 74 65 72 2d  r->iRowid>pIter-
156c0 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d  >iSwitchRowid)==
156d0 70 49 74 65 72 2d 3e 62 52 65 76 20 29 7b 0a 20  pIter->bRev ){. 
156e0 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
156f0 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70  iSwitchRowid = p
15700 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20  Other->iRowid;. 
15710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15720 0a 20 20 20 20 20 20 70 52 65 73 2d 3e 69 46 69  .      pRes->iFi
15730 72 73 74 20 3d 20 28 75 31 36 29 28 70 4e 65 77  rst = (u16)(pNew
15740 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 29 3b   - pIter->aSeg);
15750 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20  .      if( i==1 
15760 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20  ) break;..      
15770 70 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d  pOther = &pIter-
15780 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
15790 69 72 73 74 5b 69 20 5e 20 30 78 30 30 30 31 5d  irst[i ^ 0x0001]
157a0 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 7d  .iFirst ];.    }
157b0 0a 20 20 7d 0a 0a 20 20 2a 70 70 46 69 72 73 74  .  }..  *ppFirst
157c0 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72   = pNew;.  retur
157d0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n 0;.}../*.** Se
157e0 74 20 74 68 65 20 70 49 74 65 72 2d 3e 62 45 6f  t the pIter->bEo
157f0 66 20 76 61 72 69 61 62 6c 65 20 62 61 73 65 64  f variable based
15800 20 6f 6e 20 74 68 65 20 73 74 61 74 65 20 6f 66   on the state of
15810 20 74 68 65 20 73 75 62 2d 69 74 65 72 61 74 6f   the sub-iterato
15820 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rs..*/.static vo
15830 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
15840 53 65 74 45 6f 66 28 46 74 73 35 49 74 65 72 20  SetEof(Fts5Iter 
15850 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53  *pIter){.  Fts5S
15860 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
15870 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
15880 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
15890 69 72 73 74 20 5d 3b 0a 20 20 70 49 74 65 72 2d  irst ];.  pIter-
158a0 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20 70 53 65  >base.bEof = pSe
158b0 67 2d 3e 70 4c 65 61 66 3d 3d 30 3b 0a 20 20 70  g->pLeaf==0;.  p
158c0 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
158d0 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69  id = pSeg->iRowi
158e0 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  d;.}../*.** Move
158f0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f   the iterator to
15900 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e   the next entry.
15910 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
15920 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
15930 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
15940 74 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72  t in Fts5Index.r
15950 63 2e 20 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a  c. It is not .**
15960 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65   considered an e
15970 72 72 6f 72 20 69 66 20 74 68 65 20 69 74 65 72  rror if the iter
15980 61 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46  ator reaches EOF
15990 2c 20 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c  , or if it is al
159a0 72 65 61 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46  ready at .** EOF
159b0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
159c0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
159d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
159e0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
159f0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
15a00 20 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49   .  Fts5Iter *pI
15a10 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d  ter,.  int bFrom
15a20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15a30 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
15a40 66 20 61 72 67 75 6d 65 6e 74 20 69 46 72 6f 6d  f argument iFrom
15a50 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 69   is valid */.  i
15a60 36 34 20 69 46 72 6f 6d 20 20 20 20 20 20 20 20  64 iFrom        
15a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15a80 2a 20 41 64 76 61 6e 63 65 20 61 74 20 6c 65 61  * Advance at lea
15a90 73 74 20 61 73 20 66 61 72 20 61 73 20 74 68 69  st as far as thi
15aa0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 55  s */.){.  int bU
15ab0 73 65 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b 0a  seFrom = bFrom;.
15ac0 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
15ad0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15ae0 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70 49   int iFirst = pI
15af0 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
15b00 46 69 72 73 74 3b 0a 20 20 20 20 69 6e 74 20 62  First;.    int b
15b10 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20  NewTerm = 0;.   
15b20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
15b30 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
15b40 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 61  g[iFirst];.    a
15b50 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
15b60 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 69  LITE_OK );.    i
15b70 66 28 20 62 55 73 65 46 72 6f 6d 20 26 26 20 70  f( bUseFrom && p
15b80 53 65 67 2d 3e 70 44 6c 69 64 78 20 29 7b 0a 20  Seg->pDlidx ){. 
15b90 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
15ba0 4e 65 78 74 46 72 6f 6d 28 70 2c 20 70 53 65 67  NextFrom(p, pSeg
15bb0 2c 20 69 46 72 6f 6d 29 3b 0a 20 20 20 20 7d 65  , iFrom);.    }e
15bc0 6c 73 65 7b 0a 20 20 20 20 20 20 70 53 65 67 2d  lse{.      pSeg-
15bd0 3e 78 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20  >xNext(p, pSeg, 
15be0 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20  &bNewTerm);.    
15bf0 7d 0a 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d  }..    if( pSeg-
15c00 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e 65  >pLeaf==0 || bNe
15c10 77 54 65 72 6d 20 0a 20 20 20 20 20 7c 7c 20 66  wTerm .     || f
15c20 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
15c30 6e 63 65 52 6f 77 69 64 28 70 49 74 65 72 2c 20  nceRowid(pIter, 
15c40 69 46 69 72 73 74 2c 20 26 70 53 65 67 29 0a 20  iFirst, &pSeg). 
15c50 20 20 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35     ){.      fts5
15c60 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
15c70 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72  d(p, pIter, iFir
15c80 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 66 74  st, 1);.      ft
15c90 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f  s5MultiIterSetEo
15ca0 66 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  f(pIter);.      
15cb0 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
15cc0 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73  Seg[pIter->aFirs
15cd0 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20  t[1].iFirst];.  
15ce0 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c      if( pSeg->pL
15cf0 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  eaf==0 ) return;
15d00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
15d10 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53  AssertMultiIterS
15d20 65 74 75 70 28 70 2c 20 70 49 74 65 72 29 3b 0a  etup(p, pIter);.
15d30 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 67      assert( pSeg
15d40 3d 3d 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70  ==&pIter->aSeg[p
15d50 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
15d60 69 46 69 72 73 74 5d 20 26 26 20 70 53 65 67 2d  iFirst] && pSeg-
15d70 3e 70 4c 65 61 66 20 29 3b 0a 20 20 20 20 69 66  >pLeaf );.    if
15d80 28 20 70 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d  ( pIter->bSkipEm
15d90 70 74 79 3d 3d 30 20 7c 7c 20 70 53 65 67 2d 3e  pty==0 || pSeg->
15da0 6e 50 6f 73 20 29 7b 0a 20 20 20 20 20 20 70 49  nPos ){.      pI
15db0 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73  ter->xSetOutputs
15dc0 28 70 49 74 65 72 2c 20 70 53 65 67 29 3b 0a 20  (pIter, pSeg);. 
15dd0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
15de0 20 7d 0a 20 20 20 20 62 55 73 65 46 72 6f 6d 20   }.    bUseFrom 
15df0 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  = 0;.  }.}..stat
15e00 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
15e10 69 49 74 65 72 4e 65 78 74 32 28 0a 20 20 46 74  iIterNext2(.  Ft
15e20 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
15e30 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 0a  ts5Iter *pIter,.
15e40 20 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d    int *pbNewTerm
15e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e60 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 69    /* OUT: True i
15e70 66 20 2a 6d 69 67 68 74 2a 20 62 65 20 6e 65 77  f *might* be new
15e80 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 61 73   term */.){.  as
15e90 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 53 6b  sert( pIter->bSk
15ea0 69 70 45 6d 70 74 79 20 29 3b 0a 20 20 69 66 28  ipEmpty );.  if(
15eb0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
15ec0 4b 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  K ){.    do {.  
15ed0 20 20 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d      int iFirst =
15ee0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
15ef0 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20 20 20 20  ].iFirst;.      
15f00 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
15f10 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
15f20 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20  [iFirst];.      
15f30 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30  int bNewTerm = 0
15f40 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
15f50 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
15f60 4b 20 29 3b 0a 20 20 20 20 20 20 70 53 65 67 2d  K );.      pSeg-
15f70 3e 78 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20  >xNext(p, pSeg, 
15f80 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20  &bNewTerm);.    
15f90 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61    if( pSeg->pLea
15fa0 66 3d 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d  f==0 || bNewTerm
15fb0 20 0a 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35   .       || fts5
15fc0 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
15fd0 52 6f 77 69 64 28 70 49 74 65 72 2c 20 69 46 69  Rowid(pIter, iFi
15fe0 72 73 74 2c 20 26 70 53 65 67 29 0a 20 20 20 20  rst, &pSeg).    
15ff0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73    ){.        fts
16000 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
16010 65 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69  ed(p, pIter, iFi
16020 72 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  rst, 1);.       
16030 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65   fts5MultiIterSe
16040 74 45 6f 66 28 70 49 74 65 72 29 3b 0a 20 20 20  tEof(pIter);.   
16050 20 20 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20       *pbNewTerm 
16060 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
16070 7b 0a 20 20 20 20 20 20 20 20 2a 70 62 4e 65 77  {.        *pbNew
16080 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Term = 0;.      
16090 7d 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65  }.      fts5Asse
160a0 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70  rtMultiIterSetup
160b0 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 20  (p, pIter);..   
160c0 20 7d 77 68 69 6c 65 28 20 66 74 73 35 4d 75 6c   }while( fts5Mul
160d0 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c  tiIterIsEmpty(p,
160e0 20 70 49 74 65 72 29 20 29 3b 0a 20 20 7d 0a 7d   pIter) );.  }.}
160f0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
16100 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
16110 5f 4e 6f 6f 70 28 46 74 73 35 49 74 65 72 20 2a  _Noop(Fts5Iter *
16120 70 55 6e 75 73 65 64 31 2c 20 46 74 73 35 53 65  pUnused1, Fts5Se
16130 67 49 74 65 72 20 2a 70 55 6e 75 73 65 64 32 29  gIter *pUnused2)
16140 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
16150 32 28 70 55 6e 75 73 65 64 31 2c 20 70 55 6e 75  2(pUnused1, pUnu
16160 73 65 64 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  sed2);.}..static
16170 20 46 74 73 35 49 74 65 72 20 2a 66 74 73 35 4d   Fts5Iter *fts5M
16180 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 0a 20  ultiIterAlloc(. 
16190 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161b0 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
161c0 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68   to iterate with
161d0 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67  in */.  int nSeg
161e0 0a 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a  .){.  Fts5Iter *
161f0 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 53 6c 6f  pNew;.  int nSlo
16200 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
16210 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 77 65 72          /* Power
16220 20 6f 66 20 74 77 6f 20 3e 3d 20 6e 53 65 67 20   of two >= nSeg 
16230 2a 2f 0a 0a 20 20 66 6f 72 28 6e 53 6c 6f 74 3d  */..  for(nSlot=
16240 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65 67 3b 20 6e  2; nSlot<nSeg; n
16250 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32 29 3b 0a 20  Slot=nSlot*2);. 
16260 20 70 4e 65 77 20 3d 20 66 74 73 35 49 64 78 4d   pNew = fts5IdxM
16270 61 6c 6c 6f 63 28 70 2c 20 0a 20 20 20 20 20 20  alloc(p, .      
16280 73 69 7a 65 6f 66 28 46 74 73 35 49 74 65 72 29  sizeof(Fts5Iter)
16290 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
162a0 20 20 20 20 2f 2a 20 70 4e 65 77 20 2a 2f 0a 20      /* pNew */. 
162b0 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
162c0 53 65 67 49 74 65 72 29 20 2a 20 28 6e 53 6c 6f  SegIter) * (nSlo
162d0 74 2d 31 29 20 2b 20 20 20 2f 2a 20 70 4e 65 77  t-1) +   /* pNew
162e0 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a 20 20 20 20  ->aSeg[] */.    
162f0 20 20 73 69 7a 65 6f 66 28 46 74 73 35 43 52 65    sizeof(Fts5CRe
16300 73 75 6c 74 29 20 2a 20 6e 53 6c 6f 74 20 20 20  sult) * nSlot   
16310 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61        /* pNew->a
16320 46 69 72 73 74 5b 5d 20 2a 2f 0a 20 20 29 3b 0a  First[] */.  );.
16330 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
16340 20 20 70 4e 65 77 2d 3e 6e 53 65 67 20 3d 20 6e    pNew->nSeg = n
16350 53 6c 6f 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Slot;.    pNew->
16360 61 46 69 72 73 74 20 3d 20 28 46 74 73 35 43 52  aFirst = (Fts5CR
16370 65 73 75 6c 74 2a 29 26 70 4e 65 77 2d 3e 61 53  esult*)&pNew->aS
16380 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 20 20 70  eg[nSlot];.    p
16390 4e 65 77 2d 3e 70 49 6e 64 65 78 20 3d 20 70 3b  New->pIndex = p;
163a0 0a 20 20 20 20 70 4e 65 77 2d 3e 78 53 65 74 4f  .    pNew->xSetO
163b0 75 74 70 75 74 73 20 3d 20 66 74 73 35 49 74 65  utputs = fts5Ite
163c0 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6f 70  rSetOutputs_Noop
163d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
163e0 4e 65 77 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  New;.}..static v
163f0 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73 74 43  oid fts5PoslistC
16400 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49  allback(.  Fts5I
16410 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c 20 0a  ndex *pUnused, .
16420 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74    void *pContext
16430 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  , .  const u8 *p
16440 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e  Chunk, int nChun
16450 6b 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  k.){.  UNUSED_PA
16460 52 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20 20  RAM(pUnused);.  
16470 61 73 73 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e  assert_nc( nChun
16480 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 43  k>=0 );.  if( nC
16490 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 66 74  hunk>0 ){.    ft
164a0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
164b0 6e 64 42 6c 6f 62 28 28 46 74 73 35 42 75 66 66  ndBlob((Fts5Buff
164c0 65 72 2a 29 70 43 6f 6e 74 65 78 74 2c 20 70 43  er*)pContext, pC
164d0 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20  hunk, nChunk);. 
164e0 20 7d 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74   }.}..typedef st
164f0 72 75 63 74 20 50 6f 73 6c 69 73 74 43 61 6c 6c  ruct PoslistCall
16500 62 61 63 6b 43 74 78 20 50 6f 73 6c 69 73 74 43  backCtx PoslistC
16510 61 6c 6c 62 61 63 6b 43 74 78 3b 0a 73 74 72 75  allbackCtx;.stru
16520 63 74 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61  ct PoslistCallba
16530 63 6b 43 74 78 20 7b 0a 20 20 46 74 73 35 42 75  ckCtx {.  Fts5Bu
16540 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20 20 20  ffer *pBuf;     
16550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70            /* App
16560 65 6e 64 20 74 6f 20 74 68 69 73 20 62 75 66 66  end to this buff
16570 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73  er */.  Fts5Cols
16580 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20  et *pColset;    
16590 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
165a0 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74  ict matches to t
165b0 68 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  his column */.  
165c0 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20 20  int eState;     
165d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165e0 2f 2a 20 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a  /* See above */.
165f0 7d 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  };..typedef stru
16600 63 74 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74  ct PoslistOffset
16610 73 43 74 78 20 50 6f 73 6c 69 73 74 4f 66 66 73  sCtx PoslistOffs
16620 65 74 73 43 74 78 3b 0a 73 74 72 75 63 74 20 50  etsCtx;.struct P
16630 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78  oslistOffsetsCtx
16640 20 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20   {.  Fts5Buffer 
16650 2a 70 42 75 66 3b 20 20 20 20 20 20 20 20 20 20  *pBuf;          
16660 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74       /* Append t
16670 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
16680 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
16690 43 6f 6c 73 65 74 3b 20 20 20 20 20 20 20 20 20  Colset;         
166a0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d     /* Restrict m
166b0 61 74 63 68 65 73 20 74 6f 20 74 68 69 73 20 63  atches to this c
166c0 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  olumn */.  int i
166d0 52 65 61 64 3b 0a 20 20 69 6e 74 20 69 57 72 69  Read;.  int iWri
166e0 74 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 4f  te;.};../*.** TO
166f0 44 4f 3a 20 4d 61 6b 65 20 74 68 69 73 20 6d 6f  DO: Make this mo
16700 72 65 20 65 66 66 69 63 69 65 6e 74 21 0a 2a 2f  re efficient!.*/
16710 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
16720 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28  IndexColsetTest(
16730 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
16740 73 65 74 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a  set, int iCol){.
16750 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
16760 3d 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e  =0; i<pColset->n
16770 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
16780 66 28 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f  f( pColset->aiCo
16790 6c 5b 69 5d 3d 3d 69 43 6f 6c 20 29 20 72 65 74  l[i]==iCol ) ret
167a0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
167b0 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63  urn 0;.}..static
167c0 20 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73   void fts5Poslis
167d0 74 4f 66 66 73 65 74 73 43 61 6c 6c 62 61 63 6b  tOffsetsCallback
167e0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
167f0 55 6e 75 73 65 64 2c 20 0a 20 20 76 6f 69 64 20  Unused, .  void 
16800 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f  *pContext, .  co
16810 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20  nst u8 *pChunk, 
16820 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20  int nChunk.){.  
16830 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74  PoslistOffsetsCt
16840 78 20 2a 70 43 74 78 20 3d 20 28 50 6f 73 6c 69  x *pCtx = (Posli
16850 73 74 4f 66 66 73 65 74 73 43 74 78 2a 29 70 43  stOffsetsCtx*)pC
16860 6f 6e 74 65 78 74 3b 0a 20 20 55 4e 55 53 45 44  ontext;.  UNUSED
16870 5f 50 41 52 41 4d 28 70 55 6e 75 73 65 64 29 3b  _PARAM(pUnused);
16880 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43  .  assert_nc( nC
16890 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28  hunk>=0 );.  if(
168a0 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20   nChunk>0 ){.   
168b0 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20   int i = 0;.    
168c0 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20  while( i<nChunk 
168d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 56 61  ){.      int iVa
168e0 6c 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74  l;.      i += ft
168f0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
16900 43 68 75 6e 6b 5b 69 5d 2c 20 69 56 61 6c 29 3b  Chunk[i], iVal);
16910 0a 20 20 20 20 20 20 69 56 61 6c 20 2b 3d 20 70  .      iVal += p
16920 43 74 78 2d 3e 69 52 65 61 64 20 2d 20 32 3b 0a  Ctx->iRead - 2;.
16930 20 20 20 20 20 20 70 43 74 78 2d 3e 69 52 65 61        pCtx->iRea
16940 64 20 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20  d = iVal;.      
16950 69 66 28 20 66 74 73 35 49 6e 64 65 78 43 6f 6c  if( fts5IndexCol
16960 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e 70 43  setTest(pCtx->pC
16970 6f 6c 73 65 74 2c 20 69 56 61 6c 29 20 29 7b 0a  olset, iVal) ){.
16980 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
16990 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
169a0 6e 74 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 69  nt(pCtx->pBuf, i
169b0 56 61 6c 20 2b 20 32 20 2d 20 70 43 74 78 2d 3e  Val + 2 - pCtx->
169c0 69 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20  iWrite);.       
169d0 20 70 43 74 78 2d 3e 69 57 72 69 74 65 20 3d 20   pCtx->iWrite = 
169e0 69 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iVal;.      }.  
169f0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69    }.  }.}..stati
16a00 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69  c void fts5Posli
16a10 73 74 46 69 6c 74 65 72 43 61 6c 6c 62 61 63 6b  stFilterCallback
16a20 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
16a30 55 6e 75 73 65 64 2c 0a 20 20 76 6f 69 64 20 2a  Unused,.  void *
16a40 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e  pContext, .  con
16a50 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69  st u8 *pChunk, i
16a60 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 50  nt nChunk.){.  P
16a70 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74  oslistCallbackCt
16a80 78 20 2a 70 43 74 78 20 3d 20 28 50 6f 73 6c 69  x *pCtx = (Posli
16a90 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 2a 29 70  stCallbackCtx*)p
16aa0 43 6f 6e 74 65 78 74 3b 0a 20 20 55 4e 55 53 45  Context;.  UNUSE
16ab0 44 5f 50 41 52 41 4d 28 70 55 6e 75 73 65 64 29  D_PARAM(pUnused)
16ac0 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e  ;.  assert_nc( n
16ad0 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66  Chunk>=0 );.  if
16ae0 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20  ( nChunk>0 ){.  
16af0 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 72 6f    /* Search thro
16b00 75 67 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ugh to find the 
16b10 66 69 72 73 74 20 76 61 72 69 6e 74 20 77 69 74  first varint wit
16b20 68 20 76 61 6c 75 65 20 31 2e 20 54 68 69 73 20  h value 1. This 
16b30 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74  is the.    ** st
16b40 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20  art of the next 
16b50 63 6f 6c 75 6d 6e 73 20 68 69 74 73 2e 20 2a 2f  columns hits. */
16b60 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  .    int i = 0;.
16b70 20 20 20 20 69 6e 74 20 69 53 74 61 72 74 20 3d      int iStart =
16b80 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 74   0;..    if( pCt
16b90 78 2d 3e 65 53 74 61 74 65 3d 3d 32 20 29 7b 0a  x->eState==2 ){.
16ba0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a        int iCol;.
16bb0 20 20 20 20 20 20 66 74 73 35 46 61 73 74 47 65        fts5FastGe
16bc0 74 56 61 72 69 6e 74 33 32 28 70 43 68 75 6e 6b  tVarint32(pChunk
16bd0 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20  , i, iCol);.    
16be0 20 20 69 66 28 20 66 74 73 35 49 6e 64 65 78 43    if( fts5IndexC
16bf0 6f 6c 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e  olsetTest(pCtx->
16c00 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 20 29  pColset, iCol) )
16c10 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e  {.        pCtx->
16c20 65 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  eState = 1;.    
16c30 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
16c40 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70  feAppendVarint(p
16c50 43 74 78 2d 3e 70 42 75 66 2c 20 31 29 3b 0a 20  Ctx->pBuf, 1);. 
16c60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16c70 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65      pCtx->eState
16c80 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
16c90 20 20 7d 0a 0a 20 20 20 20 64 6f 20 7b 0a 20 20    }..    do {.  
16ca0 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 43 68      while( i<nCh
16cb0 75 6e 6b 20 26 26 20 70 43 68 75 6e 6b 5b 69 5d  unk && pChunk[i]
16cc0 21 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20  !=0x01 ){.      
16cd0 20 20 77 68 69 6c 65 28 20 70 43 68 75 6e 6b 5b    while( pChunk[
16ce0 69 5d 20 26 20 30 78 38 30 20 29 20 69 2b 2b 3b  i] & 0x80 ) i++;
16cf0 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
16d00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16d10 70 43 74 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCtx->eState ){.
16d20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
16d30 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
16d40 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 26 70 43  (pCtx->pBuf, &pC
16d50 68 75 6e 6b 5b 69 53 74 61 72 74 5d 2c 20 69 2d  hunk[iStart], i-
16d60 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 7d  iStart);.      }
16d70 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43 68  .      if( i<nCh
16d80 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unk ){.        i
16d90 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt iCol;.       
16da0 20 69 53 74 61 72 74 20 3d 20 69 3b 0a 20 20 20   iStart = i;.   
16db0 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
16dc0 20 20 69 66 28 20 69 3e 3d 6e 43 68 75 6e 6b 20    if( i>=nChunk 
16dd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 74  ){.          pCt
16de0 78 2d 3e 65 53 74 61 74 65 20 3d 20 32 3b 0a 20  x->eState = 2;. 
16df0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
16e00 20 20 20 20 20 20 20 20 66 74 73 35 46 61 73 74          fts5Fast
16e10 47 65 74 56 61 72 69 6e 74 33 32 28 70 43 68 75  GetVarint32(pChu
16e20 6e 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a 20 20  nk, i, iCol);.  
16e30 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53          pCtx->eS
16e40 74 61 74 65 20 3d 20 66 74 73 35 49 6e 64 65 78  tate = fts5Index
16e50 43 6f 6c 73 65 74 54 65 73 74 28 70 43 74 78 2d  ColsetTest(pCtx-
16e60 3e 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 3b  >pColset, iCol);
16e70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
16e80 43 74 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Ctx->eState ){. 
16e90 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
16ea0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
16eb0 6c 6f 62 28 70 43 74 78 2d 3e 70 42 75 66 2c 20  lob(pCtx->pBuf, 
16ec0 26 70 43 68 75 6e 6b 5b 69 53 74 61 72 74 5d 2c  &pChunk[iStart],
16ed0 20 69 2d 69 53 74 61 72 74 29 3b 0a 20 20 20 20   i-iStart);.    
16ee0 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
16ef0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   i;.          }.
16f00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16f10 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 3c  }.    }while( i<
16f20 6e 43 68 75 6e 6b 20 29 3b 0a 20 20 7d 0a 7d 0a  nChunk );.  }.}.
16f30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
16f40 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 0a 20  5ChunkIterate(. 
16f50 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
16f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f70 20 2f 2a 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   /* Index object
16f80 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
16f90 72 20 2a 70 53 65 67 2c 20 20 20 20 20 20 20 20  r *pSeg,        
16fa0 20 20 20 20 20 20 2f 2a 20 50 6f 73 6c 69 73 74        /* Poslist
16fb0 20 6f 66 20 74 68 69 73 20 69 74 65 72 61 74 6f   of this iterato
16fc0 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 74  r */.  void *pCt
16fd0 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
16fe0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
16ff0 74 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 78 43  t pointer for xC
17000 68 75 6e 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f  hunk callback */
17010 0a 20 20 76 6f 69 64 20 28 2a 78 43 68 75 6e 6b  .  void (*xChunk
17020 29 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 76 6f  )(Fts5Index*, vo
17030 69 64 2a 2c 20 63 6f 6e 73 74 20 75 38 2a 2c 20  id*, const u8*, 
17040 69 6e 74 29 0a 29 7b 0a 20 20 69 6e 74 20 6e 52  int).){.  int nR
17050 65 6d 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b  em = pSeg->nPos;
17060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
17070 62 65 72 20 6f 66 20 62 79 74 65 73 20 73 74 69  ber of bytes sti
17080 6c 6c 20 74 6f 20 63 6f 6d 65 20 2a 2f 0a 20 20  ll to come */.  
17090 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 20  Fts5Data *pData 
170a0 3d 20 30 3b 0a 20 20 75 38 20 2a 70 43 68 75 6e  = 0;.  u8 *pChun
170b0 6b 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66  k = &pSeg->pLeaf
170c0 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f  ->p[pSeg->iLeafO
170d0 66 66 73 65 74 5d 3b 0a 20 20 69 6e 74 20 6e 43  ffset];.  int nC
170e0 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c  hunk = MIN(nRem,
170f0 20 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a   pSeg->pLeaf->sz
17100 4c 65 61 66 20 2d 20 70 53 65 67 2d 3e 69 4c 65  Leaf - pSeg->iLe
17110 61 66 4f 66 66 73 65 74 29 3b 0a 20 20 69 6e 74  afOffset);.  int
17120 20 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 69 4c   pgno = pSeg->iL
17130 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 70  eafPgno;.  int p
17140 67 6e 6f 53 61 76 65 20 3d 20 30 3b 0a 0a 20 20  gnoSave = 0;..  
17150 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
17160 20 64 6f 65 73 20 6e 6f 74 6d 77 6f 72 6b 20 77   does notmwork w
17170 69 74 68 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20  ith detail=none 
17180 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20  databases. */.  
17190 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66  assert( p->pConf
171a0 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53  ig->eDetail!=FTS
171b0 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b  5_DETAIL_NONE );
171c0 0a 0a 20 20 69 66 28 20 28 70 53 65 67 2d 3e 66  ..  if( (pSeg->f
171d0 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
171e0 54 45 52 5f 52 45 56 45 52 53 45 29 3d 3d 30 20  TER_REVERSE)==0 
171f0 29 7b 0a 20 20 20 20 70 67 6e 6f 53 61 76 65 20  ){.    pgnoSave 
17200 3d 20 70 67 6e 6f 2b 31 3b 0a 20 20 7d 0a 0a 20  = pgno+1;.  }.. 
17210 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
17220 20 78 43 68 75 6e 6b 28 70 2c 20 70 43 74 78 2c   xChunk(p, pCtx,
17230 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29   pChunk, nChunk)
17240 3b 0a 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 43  ;.    nRem -= nC
17250 68 75 6e 6b 3b 0a 20 20 20 20 66 74 73 35 44 61  hunk;.    fts5Da
17260 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29  taRelease(pData)
17270 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3c 3d  ;.    if( nRem<=
17280 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 ){.      break
17290 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
172a0 20 20 20 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 20     pgno++;.     
172b0 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74   pData = fts5Dat
172c0 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45  aRead(p, FTS5_SE
172d0 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67  GMENT_ROWID(pSeg
172e0 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  ->pSeg->iSegid, 
172f0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 69 66  pgno));.      if
17300 28 20 70 44 61 74 61 3d 3d 30 20 29 20 62 72 65  ( pData==0 ) bre
17310 61 6b 3b 0a 20 20 20 20 20 20 70 43 68 75 6e 6b  ak;.      pChunk
17320 20 3d 20 26 70 44 61 74 61 2d 3e 70 5b 34 5d 3b   = &pData->p[4];
17330 0a 20 20 20 20 20 20 6e 43 68 75 6e 6b 20 3d 20  .      nChunk = 
17340 4d 49 4e 28 6e 52 65 6d 2c 20 70 44 61 74 61 2d  MIN(nRem, pData-
17350 3e 73 7a 4c 65 61 66 20 2d 20 34 29 3b 0a 20 20  >szLeaf - 4);.  
17360 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 70 67      if( pgno==pg
17370 6e 6f 53 61 76 65 20 29 7b 0a 20 20 20 20 20 20  noSave ){.      
17380 20 20 61 73 73 65 72 74 28 20 70 53 65 67 2d 3e    assert( pSeg->
17390 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a  pNextLeaf==0 );.
173a0 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70 4e          pSeg->pN
173b0 65 78 74 4c 65 61 66 20 3d 20 70 44 61 74 61 3b  extLeaf = pData;
173c0 0a 20 20 20 20 20 20 20 20 70 44 61 74 61 20 3d  .        pData =
173d0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
173e0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
173f0 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75  terator pIter cu
17400 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
17410 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20  o a valid entry 
17420 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69 73 0a  (not EOF). This.
17430 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65  ** function appe
17440 6e 64 73 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  nds the position
17450 20 6c 69 73 74 20 64 61 74 61 20 66 6f 72 20 74   list data for t
17460 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
17470 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42   to.** buffer pB
17480 75 66 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  uf. It does not 
17490 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
174a0 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
174b0 20 73 69 7a 65 0a 2a 2a 20 66 69 65 6c 64 2e 0a   size.** field..
174c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
174d0 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
174e0 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
174f0 70 2c 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  p,.  Fts5SegIter
17500 20 2a 70 53 65 67 2c 0a 20 20 46 74 73 35 43 6f   *pSeg,.  Fts5Co
17510 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 0a 20  lset *pColset,. 
17520 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
17530 66 0a 29 7b 0a 20 20 69 66 28 20 30 3d 3d 66 74  f.){.  if( 0==ft
17540 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d  s5BufferGrow(&p-
17550 3e 72 63 2c 20 70 42 75 66 2c 20 70 53 65 67 2d  >rc, pBuf, pSeg-
17560 3e 6e 50 6f 73 29 20 29 7b 0a 20 20 20 20 69 66  >nPos) ){.    if
17570 28 20 70 43 6f 6c 73 65 74 3d 3d 30 20 29 7b 0a  ( pColset==0 ){.
17580 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49        fts5ChunkI
17590 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20  terate(p, pSeg, 
175a0 28 76 6f 69 64 2a 29 70 42 75 66 2c 20 66 74 73  (void*)pBuf, fts
175b0 35 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b  5PoslistCallback
175c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
175d0 20 20 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66      if( p->pConf
175e0 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
175f0 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 7b  5_DETAIL_FULL ){
17600 0a 20 20 20 20 20 20 20 20 50 6f 73 6c 69 73 74  .        Poslist
17610 43 61 6c 6c 62 61 63 6b 43 74 78 20 73 43 74 78  CallbackCtx sCtx
17620 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 70  ;.        sCtx.p
17630 42 75 66 20 3d 20 70 42 75 66 3b 0a 20 20 20 20  Buf = pBuf;.    
17640 20 20 20 20 73 43 74 78 2e 70 43 6f 6c 73 65 74      sCtx.pColset
17650 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20   = pColset;.    
17660 20 20 20 20 73 43 74 78 2e 65 53 74 61 74 65 20      sCtx.eState 
17670 3d 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65  = fts5IndexColse
17680 74 54 65 73 74 28 70 43 6f 6c 73 65 74 2c 20 30  tTest(pColset, 0
17690 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
176a0 74 28 20 73 43 74 78 2e 65 53 74 61 74 65 3d 3d  t( sCtx.eState==
176b0 30 20 7c 7c 20 73 43 74 78 2e 65 53 74 61 74 65  0 || sCtx.eState
176c0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 66  ==1 );.        f
176d0 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28  ts5ChunkIterate(
176e0 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29  p, pSeg, (void*)
176f0 26 73 43 74 78 2c 20 66 74 73 35 50 6f 73 6c 69  &sCtx, fts5Posli
17700 73 74 46 69 6c 74 65 72 43 61 6c 6c 62 61 63 6b  stFilterCallback
17710 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
17720 20 20 20 20 20 20 20 20 50 6f 73 6c 69 73 74 4f          PoslistO
17730 66 66 73 65 74 73 43 74 78 20 73 43 74 78 3b 0a  ffsetsCtx sCtx;.
17740 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
17750 73 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sCtx, 0, sizeof(
17760 73 43 74 78 29 29 3b 0a 20 20 20 20 20 20 20 20  sCtx));.        
17770 73 43 74 78 2e 70 42 75 66 20 3d 20 70 42 75 66  sCtx.pBuf = pBuf
17780 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 70  ;.        sCtx.p
17790 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65 74  Colset = pColset
177a0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 43 68  ;.        fts5Ch
177b0 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53  unkIterate(p, pS
177c0 65 67 2c 20 28 76 6f 69 64 2a 29 26 73 43 74 78  eg, (void*)&sCtx
177d0 2c 20 66 74 73 35 50 6f 73 6c 69 73 74 4f 66 66  , fts5PoslistOff
177e0 73 65 74 73 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  setsCallback);. 
177f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
17800 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 4e 2f 4f 55 54  .}../*.** IN/OUT
17810 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 61 29   parameter (*pa)
17820 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 70 6f 73   points to a pos
17830 69 74 69 6f 6e 20 6c 69 73 74 20 6e 20 62 79 74  ition list n byt
17840 65 73 20 69 6e 20 73 69 7a 65 2e 20 49 66 0a 2a  es in size. If.*
17850 2a 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  * the position l
17860 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74  ist contains ent
17870 72 69 65 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20  ries for column 
17880 69 43 6f 6c 2c 20 74 68 65 6e 20 28 2a 70 61 29  iCol, then (*pa)
17890 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20 70 6f   is set.** to po
178a0 69 6e 74 20 74 6f 20 74 68 65 20 73 75 62 2d 70  int to the sub-p
178b0 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 66 6f 72  osition-list for
178c0 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 6e 64   that column and
178d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
178e0 2a 20 62 79 74 65 73 20 69 6e 20 69 74 20 72 65  * bytes in it re
178f0 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74  turned. Or, if t
17900 68 65 20 61 72 67 75 6d 65 6e 74 20 70 6f 73 69  he argument posi
17910 74 69 6f 6e 20 6c 69 73 74 20 64 6f 65 73 20 6e  tion list does n
17920 6f 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 6e  ot.** contain an
17930 79 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63 6f  y entries for co
17940 6c 75 6d 6e 20 69 43 6f 6c 2c 20 72 65 74 75 72  lumn iCol, retur
17950 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 0..*/.static i
17960 6e 74 20 66 74 73 35 49 6e 64 65 78 45 78 74 72  nt fts5IndexExtr
17970 61 63 74 43 6f 6c 28 0a 20 20 63 6f 6e 73 74 20  actCol(.  const 
17980 75 38 20 2a 2a 70 61 2c 20 20 20 20 20 20 20 20  u8 **pa,        
17990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
179a0 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20  OUT: Pointer to 
179b0 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  poslist */.  int
179c0 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
179e0 49 4e 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73 6c  IN: Size of posl
179f0 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ist in bytes */.
17a00 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20    int iCol      
17a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 65    /* Column to e
17a30 78 74 72 61 63 74 20 66 72 6f 6d 20 70 6f 73 6c  xtract from posl
17a40 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ist */.){.  int 
17a50 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20  iCurrent = 0;   
17a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
17a70 6e 79 74 68 69 6e 67 20 62 65 66 6f 72 65 20 74  nything before t
17a80 68 65 20 66 69 72 73 74 20 30 78 30 31 20 69 73  he first 0x01 is
17a90 20 63 6f 6c 20 30 20 2a 2f 0a 20 20 63 6f 6e 73   col 0 */.  cons
17aa0 74 20 75 38 20 2a 70 20 3d 20 2a 70 61 3b 0a 20  t u8 *p = *pa;. 
17ab0 20 63 6f 6e 73 74 20 75 38 20 2a 70 45 6e 64 20   const u8 *pEnd 
17ac0 3d 20 26 70 5b 6e 5d 3b 20 20 20 20 20 20 20 20  = &p[n];        
17ad0 20 2f 2a 20 4f 6e 65 20 62 79 74 65 20 70 61 73   /* One byte pas
17ae0 74 20 65 6e 64 20 6f 66 20 70 6f 73 69 74 69 6f  t end of positio
17af0 6e 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 77 68 69  n list */..  whi
17b00 6c 65 28 20 69 43 6f 6c 3e 69 43 75 72 72 65 6e  le( iCol>iCurren
17b10 74 20 29 7b 0a 20 20 20 20 2f 2a 20 41 64 76 61  t ){.    /* Adva
17b20 6e 63 65 20 70 6f 69 6e 74 65 72 20 70 20 75 6e  nce pointer p un
17b30 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  til it points to
17b40 20 70 45 6e 64 20 6f 72 20 61 6e 20 30 78 30 31   pEnd or an 0x01
17b50 20 62 79 74 65 20 74 68 61 74 20 69 73 0a 20 20   byte that is.  
17b60 20 20 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f 66    ** not part of
17b70 20 61 20 76 61 72 69 6e 74 2e 20 4e 6f 74 65 20   a varint. Note 
17b80 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 70  that it is not p
17b90 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 6e 65  ossible for a ne
17ba0 67 61 74 69 76 65 0a 20 20 20 20 2a 2a 20 6f 72  gative.    ** or
17bb0 20 65 78 74 72 65 6d 65 6c 79 20 6c 61 72 67 65   extremely large
17bc0 20 76 61 72 69 6e 74 20 74 6f 20 6f 63 63 75 72   varint to occur
17bd0 20 77 69 74 68 69 6e 20 61 6e 20 75 6e 63 6f 72   within an uncor
17be0 72 75 70 74 65 64 20 70 6f 73 69 74 69 6f 6e 20  rupted position 
17bf0 0a 20 20 20 20 2a 2a 20 6c 69 73 74 2e 20 53 6f  .    ** list. So
17c00 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f   the last byte o
17c10 66 20 65 61 63 68 20 76 61 72 69 6e 74 20 6d 61  f each varint ma
17c20 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 6f 20  y be assumed to 
17c30 68 61 76 65 20 61 20 63 6c 65 61 72 0a 20 20 20  have a clear.   
17c40 20 2a 2a 20 30 78 38 30 20 62 69 74 2e 20 20 2a   ** 0x80 bit.  *
17c50 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70 21  /.    while( *p!
17c60 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 77  =0x01 ){.      w
17c70 68 69 6c 65 28 20 2a 70 2b 2b 20 26 20 30 78 38  hile( *p++ & 0x8
17c80 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
17c90 3e 3d 70 45 6e 64 20 29 20 72 65 74 75 72 6e 20  >=pEnd ) return 
17ca0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 61  0;.    }.    *pa
17cb0 20 3d 20 70 2b 2b 3b 0a 20 20 20 20 69 43 75 72   = p++;.    iCur
17cc0 72 65 6e 74 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20  rent = *p++;.   
17cd0 20 69 66 28 20 69 43 75 72 72 65 6e 74 20 26 20   if( iCurrent & 
17ce0 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  0x80 ){.      p-
17cf0 2d 3b 0a 20 20 20 20 20 20 70 20 2b 3d 20 66 74  -;.      p += ft
17d00 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c  s5GetVarint32(p,
17d10 20 69 43 75 72 72 65 6e 74 29 3b 0a 20 20 20 20   iCurrent);.    
17d20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  }.  }.  if( iCol
17d30 21 3d 69 43 75 72 72 65 6e 74 20 29 20 72 65 74  !=iCurrent ) ret
17d40 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 64 76  urn 0;..  /* Adv
17d50 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 70 20 75  ance pointer p u
17d60 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74  ntil it points t
17d70 6f 20 70 45 6e 64 20 6f 72 20 61 6e 20 30 78 30  o pEnd or an 0x0
17d80 31 20 62 79 74 65 20 74 68 61 74 20 69 73 0a 20  1 byte that is. 
17d90 20 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   ** not part of 
17da0 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 77 68  a varint */.  wh
17db0 69 6c 65 28 20 70 3c 70 45 6e 64 20 26 26 20 2a  ile( p<pEnd && *
17dc0 70 21 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 77  p!=0x01 ){.    w
17dd0 68 69 6c 65 28 20 2a 70 2b 2b 20 26 20 30 78 38  hile( *p++ & 0x8
17de0 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  0 );.  }..  retu
17df0 72 6e 20 70 20 2d 20 28 2a 70 61 29 3b 0a 7d 0a  rn p - (*pa);.}.
17e00 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
17e10 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 73  IndexExtractCols
17e20 65 74 20 28 0a 20 20 46 74 73 35 43 6f 6c 73 65  et (.  Fts5Colse
17e30 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20  t *pColset,     
17e40 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 73 65 74         /* Colset
17e50 20 74 6f 20 66 69 6c 74 65 72 20 6f 6e 20 2a 2f   to filter on */
17e60 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f  .  const u8 *pPo
17e70 73 2c 20 69 6e 74 20 6e 50 6f 73 2c 20 20 20 20  s, int nPos,    
17e80 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6c     /* Position l
17e90 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ist */.  Fts5Buf
17ea0 66 65 72 20 2a 70 42 75 66 20 20 20 20 20 20 20  fer *pBuf       
17eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
17ec0 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
17ed0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17ee0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  E_OK;.  int i;..
17ef0 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
17f00 28 70 42 75 66 29 3b 0a 20 20 66 6f 72 28 69 3d  (pBuf);.  for(i=
17f10 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43  0; i<pColset->nC
17f20 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  ol; i++){.    co
17f30 6e 73 74 20 75 38 20 2a 70 53 75 62 20 3d 20 70  nst u8 *pSub = p
17f40 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20 6e 53 75  Pos;.    int nSu
17f50 62 20 3d 20 66 74 73 35 49 6e 64 65 78 45 78 74  b = fts5IndexExt
17f60 72 61 63 74 43 6f 6c 28 26 70 53 75 62 2c 20 6e  ractCol(&pSub, n
17f70 50 6f 73 2c 20 70 43 6f 6c 73 65 74 2d 3e 61 69  Pos, pColset->ai
17f80 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  Col[i]);.    if(
17f90 20 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 66   nSub ){.      f
17fa0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
17fb0 6c 6f 62 28 26 72 63 2c 20 70 42 75 66 2c 20 6e  lob(&rc, pBuf, n
17fc0 53 75 62 2c 20 70 53 75 62 29 3b 0a 20 20 20 20  Sub, pSub);.    
17fd0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
17fe0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74  c;.}../*.** xSet
17ff0 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b  Outputs callback
18000 20 75 73 65 64 20 62 79 20 64 65 74 61 69 6c 3d   used by detail=
18010 6e 6f 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  none tables..*/.
18020 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
18030 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e  IterSetOutputs_N
18040 6f 6e 65 28 46 74 73 35 49 74 65 72 20 2a 70 49  one(Fts5Iter *pI
18050 74 65 72 2c 20 46 74 73 35 53 65 67 49 74 65 72  ter, Fts5SegIter
18060 20 2a 70 53 65 67 29 7b 0a 20 20 61 73 73 65 72   *pSeg){.  asser
18070 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  t( pIter->pIndex
18080 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
18090 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
180a0 4e 4f 4e 45 20 29 3b 0a 20 20 70 49 74 65 72 2d  NONE );.  pIter-
180b0 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70  >base.iRowid = p
180c0 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70  Seg->iRowid;.  p
180d0 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61  Iter->base.nData
180e0 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 7d   = pSeg->nPos;.}
180f0 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70  ../*.** xSetOutp
18100 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65  uts callback use
18110 64 20 62 79 20 64 65 74 61 69 6c 3d 66 75 6c 6c  d by detail=full
18120 20 61 6e 64 20 64 65 74 61 69 6c 3d 63 6f 6c 20   and detail=col 
18130 74 61 62 6c 65 73 20 77 68 65 6e 20 6e 6f 0a 2a  tables when no.*
18140 2a 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 73  * column filters
18150 20 61 72 65 20 73 70 65 63 69 66 69 65 64 2e 0a   are specified..
18160 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
18170 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
18180 73 5f 4e 6f 63 6f 6c 73 65 74 28 46 74 73 35 49  s_Nocolset(Fts5I
18190 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35  ter *pIter, Fts5
181a0 53 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a  SegIter *pSeg){.
181b0 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52    pIter->base.iR
181c0 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f  owid = pSeg->iRo
181d0 77 69 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61  wid;.  pIter->ba
181e0 73 65 2e 6e 44 61 74 61 20 3d 20 70 53 65 67 2d  se.nData = pSeg-
181f0 3e 6e 50 6f 73 3b 0a 0a 20 20 61 73 73 65 72 74  >nPos;..  assert
18200 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d  ( pIter->pIndex-
18210 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
18220 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l!=FTS5_DETAIL_N
18230 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
18240 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 3d   pIter->pColset=
18250 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 65  =0 );..  if( pSe
18260 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70  g->iLeafOffset+p
18270 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d  Seg->nPos<=pSeg-
18280 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
18290 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 64 61 74  {.    /* All dat
182a0 61 20 69 73 20 73 74 6f 72 65 64 20 6f 6e 20 74  a is stored on t
182b0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
182c0 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 75   Populate the ou
182d0 74 70 75 74 20 0a 20 20 20 20 2a 2a 20 76 61 72  tput .    ** var
182e0 69 61 62 6c 65 73 20 74 6f 20 70 6f 69 6e 74 20  iables to point 
182f0 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66  into the body of
18300 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74   the page object
18310 2e 20 2a 2f 0a 20 20 20 20 70 49 74 65 72 2d 3e  . */.    pIter->
18320 62 61 73 65 2e 70 44 61 74 61 20 3d 20 26 70 53  base.pData = &pS
18330 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65  eg->pLeaf->p[pSe
18340 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b  g->iLeafOffset];
18350 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
18360 20 54 68 65 20 64 61 74 61 20 69 73 20 64 69 73   The data is dis
18370 74 72 69 62 75 74 65 64 20 6f 76 65 72 20 74 77  tributed over tw
18380 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 2e  o or more pages.
18390 20 43 6f 70 79 20 69 74 20 69 6e 74 6f 20 74 68   Copy it into th
183a0 65 0a 20 20 20 20 2a 2a 20 46 74 73 35 49 74 65  e.    ** Fts5Ite
183b0 72 2e 70 6f 73 6c 69 73 74 20 62 75 66 66 65 72  r.poslist buffer
183c0 20 61 6e 64 20 74 68 65 6e 20 73 65 74 20 74 68   and then set th
183d0 65 20 6f 75 74 70 75 74 20 70 6f 69 6e 74 65 72  e output pointer
183e0 20 74 6f 20 70 6f 69 6e 74 0a 20 20 20 20 2a 2a   to point.    **
183f0 20 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 2e   to this buffer.
18400 20 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75 66    */.    fts5Buf
18410 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e  ferZero(&pIter->
18420 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 66 74  poslist);.    ft
18430 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74  s5SegiterPoslist
18440 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
18450 70 53 65 67 2c 20 30 2c 20 26 70 49 74 65 72 2d  pSeg, 0, &pIter-
18460 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 70  >poslist);.    p
18470 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61  Iter->base.pData
18480 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73   = pIter->poslis
18490 74 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  t.p;.  }.}../*.*
184a0 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20 63 61  * xSetOutputs ca
184b0 6c 6c 62 61 63 6b 20 75 73 65 64 20 77 68 65 6e  llback used when
184c0 20 74 68 65 20 46 74 73 35 43 6f 6c 73 65 74 20   the Fts5Colset 
184d0 6f 62 6a 65 63 74 20 68 61 73 20 6e 43 6f 6c 3d  object has nCol=
184e0 3d 30 20 28 6d 61 74 63 68 0a 2a 2a 20 61 67 61  =0 (match.** aga
184f0 69 6e 73 74 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20  inst no columns 
18500 61 74 20 61 6c 6c 29 2e 0a 2a 2f 0a 73 74 61 74  at all)..*/.stat
18510 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72  ic void fts5Iter
18520 53 65 74 4f 75 74 70 75 74 73 5f 5a 65 72 6f 43  SetOutputs_ZeroC
18530 6f 6c 73 65 74 28 46 74 73 35 49 74 65 72 20 2a  olset(Fts5Iter *
18540 70 49 74 65 72 2c 20 46 74 73 35 53 65 67 49 74  pIter, Fts5SegIt
18550 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 70 49 74  er *pSeg){.  pIt
18560 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d  er->base.nData =
18570 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65   0;.}../*.** xSe
18580 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63  tOutputs callbac
18590 6b 20 75 73 65 64 20 62 79 20 64 65 74 61 69 6c  k used by detail
185a0 3d 63 6f 6c 20 77 68 65 6e 20 74 68 65 72 65 20  =col when there 
185b0 69 73 20 61 20 63 6f 6c 75 6d 6e 20 66 69 6c 74  is a column filt
185c0 65 72 0a 2a 2a 20 61 6e 64 20 74 68 65 72 65 20  er.** and there 
185d0 61 72 65 20 31 30 30 20 6f 72 20 6d 6f 72 65 20  are 100 or more 
185e0 63 6f 6c 75 6d 6e 73 2e 20 41 6c 73 6f 20 63 61  columns. Also ca
185f0 6c 6c 65 64 20 61 73 20 61 20 66 61 6c 6c 62 61  lled as a fallba
18600 63 6b 20 66 72 6f 6d 0a 2a 2a 20 66 74 73 35 49  ck from.** fts5I
18610 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f  terSetOutputs_Co
18620 6c 31 30 30 20 69 66 20 74 68 65 20 63 6f 6c 75  l100 if the colu
18630 6d 6e 2d 6c 69 73 74 20 73 70 61 6e 73 20 6d 6f  mn-list spans mo
18640 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 61 67 65  re than one page
18650 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18660 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
18670 75 74 73 5f 43 6f 6c 28 46 74 73 35 49 74 65 72  uts_Col(Fts5Iter
18680 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65 67   *pIter, Fts5Seg
18690 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 66  Iter *pSeg){.  f
186a0 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
186b0 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a  Iter->poslist);.
186c0 20 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73    fts5SegiterPos
186d0 6c 69 73 74 28 70 49 74 65 72 2d 3e 70 49 6e 64  list(pIter->pInd
186e0 65 78 2c 20 70 53 65 67 2c 20 70 49 74 65 72 2d  ex, pSeg, pIter-
186f0 3e 70 43 6f 6c 73 65 74 2c 20 26 70 49 74 65 72  >pColset, &pIter
18700 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 70 49  ->poslist);.  pI
18710 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64  ter->base.iRowid
18720 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b   = pSeg->iRowid;
18730 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70  .  pIter->base.p
18740 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f  Data = pIter->po
18750 73 6c 69 73 74 2e 70 3b 0a 20 20 70 49 74 65 72  slist.p;.  pIter
18760 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 70  ->base.nData = p
18770 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b  Iter->poslist.n;
18780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75  .}../*.** xSetOu
18790 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75  tputs callback u
187a0 73 65 64 20 77 68 65 6e 3a 20 0a 2a 2a 0a 2a 2a  sed when: .**.**
187b0 20 20 20 2a 20 64 65 74 61 69 6c 3d 63 6f 6c 2c     * detail=col,
187c0 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 69 73  .**   * there is
187d0 20 61 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72   a column filter
187e0 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65  , and.**   * the
187f0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
18800 31 30 30 20 6f 72 20 66 65 77 65 72 20 63 6f 6c  100 or fewer col
18810 75 6d 6e 73 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  umns. .**.** The
18820 20 6c 61 73 74 20 70 6f 69 6e 74 20 69 73 20 74   last point is t
18830 6f 20 65 6e 73 75 72 65 20 61 6c 6c 20 63 6f 6c  o ensure all col
18840 75 6d 6e 20 6e 75 6d 62 65 72 73 20 61 72 65 20  umn numbers are 
18850 73 74 6f 72 65 64 20 61 73 20 0a 2a 2a 20 73 69  stored as .** si
18860 6e 67 6c 65 2d 62 79 74 65 20 76 61 72 69 6e 74  ngle-byte varint
18870 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
18880 64 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  d fts5IterSetOut
18890 70 75 74 73 5f 43 6f 6c 31 30 30 28 46 74 73 35  puts_Col100(Fts5
188a0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73  Iter *pIter, Fts
188b0 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b  5SegIter *pSeg){
188c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
188d0 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66  r->pIndex->pConf
188e0 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
188f0 35 5f 44 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53  5_DETAIL_COLUMNS
18900 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
18910 74 65 72 2d 3e 70 43 6f 6c 73 65 74 20 29 3b 0a  ter->pColset );.
18920 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c 65  .  if( pSeg->iLe
18930 61 66 4f 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e  afOffset+pSeg->n
18940 50 6f 73 3e 70 53 65 67 2d 3e 70 4c 65 61 66 2d  Pos>pSeg->pLeaf-
18950 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 66  >szLeaf ){.    f
18960 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
18970 73 5f 43 6f 6c 28 70 49 74 65 72 2c 20 70 53 65  s_Col(pIter, pSe
18980 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  g);.  }else{.   
18990 20 75 38 20 2a 61 20 3d 20 28 75 38 2a 29 26 70   u8 *a = (u8*)&p
189a0 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53  Seg->pLeaf->p[pS
189b0 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d  eg->iLeafOffset]
189c0 3b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d  ;.    u8 *pEnd =
189d0 20 28 75 38 2a 29 26 61 5b 70 53 65 67 2d 3e 6e   (u8*)&a[pSeg->n
189e0 50 6f 73 5d 3b 20 0a 20 20 20 20 69 6e 74 20 69  Pos]; .    int i
189f0 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Prev = 0;.    in
18a00 74 20 2a 61 69 43 6f 6c 20 3d 20 70 49 74 65 72  t *aiCol = pIter
18a10 2d 3e 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c  ->pColset->aiCol
18a20 3b 0a 20 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c  ;.    int *aiCol
18a30 45 6e 64 20 3d 20 26 61 69 43 6f 6c 5b 70 49 74  End = &aiCol[pIt
18a40 65 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f  er->pColset->nCo
18a50 6c 5d 3b 0a 0a 20 20 20 20 75 38 20 2a 61 4f 75  l];..    u8 *aOu
18a60 74 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  t = pIter->posli
18a70 73 74 2e 70 3b 0a 20 20 20 20 69 6e 74 20 69 50  st.p;.    int iP
18a80 72 65 76 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 20  revOut = 0;..   
18a90 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f   pIter->base.iRo
18aa0 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77  wid = pSeg->iRow
18ab0 69 64 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  id;..    while( 
18ac0 61 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  a<pEnd ){.      
18ad0 69 50 72 65 76 20 2b 3d 20 28 69 6e 74 29 61 2b  iPrev += (int)a+
18ae0 2b 5b 30 5d 20 2d 20 32 3b 0a 20 20 20 20 20 20  +[0] - 2;.      
18af0 77 68 69 6c 65 28 20 2a 61 69 43 6f 6c 3c 69 50  while( *aiCol<iP
18b00 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rev ){.        a
18b10 69 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  iCol++;.        
18b20 69 66 28 20 61 69 43 6f 6c 3d 3d 61 69 43 6f 6c  if( aiCol==aiCol
18b30 45 6e 64 20 29 20 67 6f 74 6f 20 73 65 74 6f 75  End ) goto setou
18b40 74 70 75 74 73 5f 63 6f 6c 5f 6f 75 74 3b 0a 20  tputs_col_out;. 
18b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18b60 20 2a 61 69 43 6f 6c 3d 3d 69 50 72 65 76 20 29   *aiCol==iPrev )
18b70 7b 0a 20 20 20 20 20 20 20 20 2a 61 4f 75 74 2b  {.        *aOut+
18b80 2b 20 3d 20 28 75 38 29 28 28 69 50 72 65 76 20  + = (u8)((iPrev 
18b90 2d 20 69 50 72 65 76 4f 75 74 29 20 2b 20 32 29  - iPrevOut) + 2)
18ba0 3b 0a 20 20 20 20 20 20 20 20 69 50 72 65 76 4f  ;.        iPrevO
18bb0 75 74 20 3d 20 69 50 72 65 76 3b 0a 20 20 20 20  ut = iPrev;.    
18bc0 20 20 7d 0a 20 20 20 20 7d 0a 0a 73 65 74 6f 75    }.    }..setou
18bd0 74 70 75 74 73 5f 63 6f 6c 5f 6f 75 74 3a 0a 20  tputs_col_out:. 
18be0 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70     pIter->base.p
18bf0 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f  Data = pIter->po
18c00 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 70 49 74  slist.p;.    pIt
18c10 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d  er->base.nData =
18c20 20 61 4f 75 74 20 2d 20 70 49 74 65 72 2d 3e 70   aOut - pIter->p
18c30 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 7d 0a 7d 0a  oslist.p;.  }.}.
18c40 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75  ./*.** xSetOutpu
18c50 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64  ts callback used
18c60 20 62 79 20 64 65 74 61 69 6c 3d 66 75 6c 6c 20   by detail=full 
18c70 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20  when there is a 
18c80 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 2e 0a 2a  column filter..*
18c90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
18ca0 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
18cb0 5f 46 75 6c 6c 28 46 74 73 35 49 74 65 72 20 2a  _Full(Fts5Iter *
18cc0 70 49 74 65 72 2c 20 46 74 73 35 53 65 67 49 74  pIter, Fts5SegIt
18cd0 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 46 74 73  er *pSeg){.  Fts
18ce0 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
18cf0 20 3d 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65   = pIter->pColse
18d00 74 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65  t;.  pIter->base
18d10 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e  .iRowid = pSeg->
18d20 69 52 6f 77 69 64 3b 0a 0a 20 20 61 73 73 65 72  iRowid;..  asser
18d30 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  t( pIter->pIndex
18d40 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
18d50 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
18d60 46 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  FULL );.  assert
18d70 28 20 70 43 6f 6c 73 65 74 20 29 3b 0a 0a 20 20  ( pColset );..  
18d80 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f  if( pSeg->iLeafO
18d90 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73  ffset+pSeg->nPos
18da0 3c 3d 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73  <=pSeg->pLeaf->s
18db0 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20  zLeaf ){.    /* 
18dc0 41 6c 6c 20 64 61 74 61 20 69 73 20 73 74 6f 72  All data is stor
18dd0 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ed on the curren
18de0 74 20 70 61 67 65 2e 20 50 6f 70 75 6c 61 74 65  t page. Populate
18df0 20 74 68 65 20 6f 75 74 70 75 74 20 0a 20 20 20   the output .   
18e00 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 74 6f   ** variables to
18e10 20 70 6f 69 6e 74 20 69 6e 74 6f 20 74 68 65 20   point into the 
18e20 62 6f 64 79 20 6f 66 20 74 68 65 20 70 61 67 65  body of the page
18e30 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20   object. */.    
18e40 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 26 70  const u8 *a = &p
18e50 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53  Seg->pLeaf->p[pS
18e60 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d  eg->iLeafOffset]
18e70 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65  ;.    if( pColse
18e80 74 2d 3e 6e 43 6f 6c 3d 3d 31 20 29 7b 0a 20 20  t->nCol==1 ){.  
18e90 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e      pIter->base.
18ea0 6e 44 61 74 61 20 3d 20 66 74 73 35 49 6e 64 65  nData = fts5Inde
18eb0 78 45 78 74 72 61 63 74 43 6f 6c 28 26 61 2c 20  xExtractCol(&a, 
18ec0 70 53 65 67 2d 3e 6e 50 6f 73 2c 70 43 6f 6c 73  pSeg->nPos,pCols
18ed0 65 74 2d 3e 61 69 43 6f 6c 5b 30 5d 29 3b 0a 20  et->aiCol[0]);. 
18ee0 20 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65       pIter->base
18ef0 2e 70 44 61 74 61 20 3d 20 61 3b 0a 20 20 20 20  .pData = a;.    
18f00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73  }else{.      fts
18f10 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74  5BufferZero(&pIt
18f20 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20  er->poslist);.  
18f30 20 20 20 20 66 74 73 35 49 6e 64 65 78 45 78 74      fts5IndexExt
18f40 72 61 63 74 43 6f 6c 73 65 74 28 70 43 6f 6c 73  ractColset(pCols
18f50 65 74 2c 20 61 2c 20 70 53 65 67 2d 3e 6e 50 6f  et, a, pSeg->nPo
18f60 73 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  s, &pIter->posli
18f70 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  st);.      pIter
18f80 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70  ->base.pData = p
18f90 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b  Iter->poslist.p;
18fa0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 61  .      pIter->ba
18fb0 73 65 2e 6e 44 61 74 61 20 3d 20 70 49 74 65 72  se.nData = pIter
18fc0 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 20  ->poslist.n;.   
18fd0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
18fe0 2f 2a 20 54 68 65 20 64 61 74 61 20 69 73 20 64  /* The data is d
18ff0 69 73 74 72 69 62 75 74 65 64 20 6f 76 65 72 20  istributed over 
19000 74 77 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  two or more page
19010 73 2e 20 43 6f 70 79 20 69 74 20 69 6e 74 6f 20  s. Copy it into 
19020 74 68 65 0a 20 20 20 20 2a 2a 20 46 74 73 35 49  the.    ** Fts5I
19030 74 65 72 2e 70 6f 73 6c 69 73 74 20 62 75 66 66  ter.poslist buff
19040 65 72 20 61 6e 64 20 74 68 65 6e 20 73 65 74 20  er and then set 
19050 74 68 65 20 6f 75 74 70 75 74 20 70 6f 69 6e 74  the output point
19060 65 72 20 74 6f 20 70 6f 69 6e 74 0a 20 20 20 20  er to point.    
19070 2a 2a 20 74 6f 20 74 68 69 73 20 62 75 66 66 65  ** to this buffe
19080 72 2e 20 20 2a 2f 0a 20 20 20 20 66 74 73 35 42  r.  */.    fts5B
19090 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72  ufferZero(&pIter
190a0 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  ->poslist);.    
190b0 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69  fts5SegiterPosli
190c0 73 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  st(pIter->pIndex
190d0 2c 20 70 53 65 67 2c 20 70 43 6f 6c 73 65 74 2c  , pSeg, pColset,
190e0 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74   &pIter->poslist
190f0 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61  );.    pIter->ba
19100 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65 72  se.pData = pIter
19110 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20  ->poslist.p;.   
19120 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61   pIter->base.nDa
19130 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c  ta = pIter->posl
19140 69 73 74 2e 6e 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  ist.n;.  }.}..st
19150 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74  atic void fts5It
19160 65 72 53 65 74 4f 75 74 70 75 74 43 62 28 69 6e  erSetOutputCb(in
19170 74 20 2a 70 52 63 2c 20 46 74 73 35 49 74 65 72  t *pRc, Fts5Iter
19180 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
19190 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
191a0 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69  ){.    Fts5Confi
191b0 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 49 74  g *pConfig = pIt
191c0 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e  er->pIndex->pCon
191d0 66 69 67 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  fig;.    if( pCo
191e0 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46  nfig->eDetail==F
191f0 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
19200 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
19210 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74  xSetOutputs = ft
19220 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
19230 5f 4e 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  _None;.    }..  
19240 20 20 65 6c 73 65 20 69 66 28 20 70 49 74 65 72    else if( pIter
19250 2d 3e 70 43 6f 6c 73 65 74 3d 3d 30 20 29 7b 0a  ->pColset==0 ){.
19260 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65        pIter->xSe
19270 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35 49  tOutputs = fts5I
19280 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f  terSetOutputs_No
19290 63 6f 6c 73 65 74 3b 0a 20 20 20 20 7d 0a 0a 20  colset;.    }.. 
192a0 20 20 20 65 6c 73 65 20 69 66 28 20 70 49 74 65     else if( pIte
192b0 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c  r->pColset->nCol
192c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 74  ==0 ){.      pIt
192d0 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20  er->xSetOutputs 
192e0 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  = fts5IterSetOut
192f0 70 75 74 73 5f 5a 65 72 6f 43 6f 6c 73 65 74 3b  puts_ZeroColset;
19300 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65  .    }..    else
19310 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44   if( pConfig->eD
19320 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
19330 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20  IL_FULL ){.     
19340 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70   pIter->xSetOutp
19350 75 74 73 20 3d 20 66 74 73 35 49 74 65 72 53 65  uts = fts5IterSe
19360 74 4f 75 74 70 75 74 73 5f 46 75 6c 6c 3b 0a 20  tOutputs_Full;. 
19370 20 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65 7b 0a     }..    else{.
19380 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
19390 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
193a0 46 54 53 35 5f 44 45 54 41 49 4c 5f 43 4f 4c 55  FTS5_DETAIL_COLU
193b0 4d 4e 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28  MNS );.      if(
193c0 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3c 3d   pConfig->nCol<=
193d0 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  100 ){.        p
193e0 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74  Iter->xSetOutput
193f0 73 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f  s = fts5IterSetO
19400 75 74 70 75 74 73 5f 43 6f 6c 31 30 30 3b 0a 20  utputs_Col100;. 
19410 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
19420 73 35 42 75 66 66 65 72 53 69 7a 65 28 70 52 63  s5BufferSize(pRc
19430 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  , &pIter->poslis
19440 74 2c 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c  t, pConfig->nCol
19450 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
19460 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78          pIter->x
19470 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73  SetOutputs = fts
19480 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
19490 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Col;.      }.   
194a0 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   }.  }.}.../*.**
194b0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
194c0 46 74 73 35 49 74 65 72 20 6f 62 6a 65 63 74 2e  Fts5Iter object.
194d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f  .**.** The new o
194e0 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 75 73  bject will be us
194f0 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
19500 72 6f 75 67 68 20 64 61 74 61 20 69 6e 20 73 74  rough data in st
19510 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e  ructure pStruct.
19520 0a 2a 2a 20 49 66 20 69 4c 65 76 65 6c 20 69 73  .** If iLevel is
19530 20 2d 76 65 2c 20 74 68 65 6e 20 61 6c 6c 20 64   -ve, then all d
19540 61 74 61 20 69 6e 20 61 6c 6c 20 73 65 67 6d 65  ata in all segme
19550 6e 74 73 20 69 73 20 6d 65 72 67 65 64 2e 20 4f  nts is merged. O
19560 72 2c 20 69 66 20 69 4c 65 76 65 6c 0a 2a 2a 20  r, if iLevel.** 
19570 69 73 20 7a 65 72 6f 20 6f 72 20 67 72 65 61 74  is zero or great
19580 65 72 2c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  er, data from th
19590 65 20 66 69 72 73 74 20 6e 53 65 67 6d 65 6e 74  e first nSegment
195a0 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76   segments on lev
195b0 65 6c 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20  el iLevel.** is 
195c0 6d 65 72 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  merged..**.** Th
195d0 65 20 69 74 65 72 61 74 6f 72 20 69 6e 69 74 69  e iterator initi
195e0 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ally points to t
195f0 68 65 20 66 69 72 73 74 20 74 65 72 6d 2f 72 6f  he first term/ro
19600 77 69 64 20 65 6e 74 72 79 20 69 6e 20 74 68 65  wid entry in the
19610 20 0a 2a 2a 20 69 74 65 72 61 74 65 64 20 64 61   .** iterated da
19620 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
19630 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
19640 4e 65 77 28 0a 20 20 46 74 73 35 49 6e 64 65 78  New(.  Fts5Index
19650 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
19660 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
19670 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74  ackend to iterat
19680 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74  e within */.  Ft
19690 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
196a0 72 75 63 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  ruct,         /*
196b0 20 53 74 72 75 63 74 75 72 65 20 6f 66 20 73 70   Structure of sp
196c0 65 63 69 66 69 63 20 69 6e 64 65 78 20 2a 2f 0a  ecific index */.
196d0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
196e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196f0 20 20 2f 2a 20 46 54 53 35 49 4e 44 45 58 5f 51    /* FTS5INDEX_Q
19700 55 45 52 59 5f 58 58 58 20 66 6c 61 67 73 20 2a  UERY_XXX flags *
19710 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  /.  Fts5Colset *
19720 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20  pColset,        
19730 20 20 20 20 2f 2a 20 43 6f 6c 73 65 74 20 74 6f      /* Colset to
19740 20 66 69 6c 74 65 72 20 6f 6e 20 28 6f 72 20 4e   filter on (or N
19750 55 4c 4c 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ULL) */.  const 
19760 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e  u8 *pTerm, int n
19770 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72  Term,     /* Ter
19780 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f 72  m to seek to (or
19790 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69 6e   NULL/0) */.  in
197a0 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  t iLevel,       
197b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
197c0 20 4c 65 76 65 6c 20 74 6f 20 69 74 65 72 61 74   Level to iterat
197d0 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20 2a  e (-1 for all) *
197e0 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74  /.  int nSegment
197f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19800 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19810 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72   segments to mer
19820 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20 2a  ge (iLevel>=0) *
19830 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a 2a 70  /.  Fts5Iter **p
19840 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  pOut            
19850 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63      /* New objec
19860 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53  t */.){.  int nS
19870 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
19880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
19890 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 2d 69  ber of segment-i
198a0 74 65 72 73 20 69 6e 20 75 73 65 20 2a 2f 0a 20  ters in use */. 
198b0 20 69 6e 74 20 69 49 74 65 72 20 3d 20 30 3b 20   int iIter = 0; 
198c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198d0 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65   /* */.  int iSe
198e0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
198f0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
19900 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
19910 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  ugh segments */.
19920 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
19930 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46 74  evel *pLvl;.  Ft
19940 73 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20  s5Iter *pNew;.. 
19950 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 3d   assert( (pTerm=
19960 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30 29 20  =0 && nTerm==0) 
19970 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b 0a 0a  || iLevel<0 );..
19980 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
19990 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ace for the new 
199a0 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65 72 61 74  multi-seg-iterat
199b0 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  or. */.  if( p->
199c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
199d0 0a 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3c  .    if( iLevel<
199e0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
199f0 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67  t( pStruct->nSeg
19a00 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74  ment==fts5Struct
19a10 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73  ureCountSegments
19a20 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20  (pStruct) );.   
19a30 20 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63     nSeg = pStruc
19a40 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20  t->nSegment;.   
19a50 20 20 20 6e 53 65 67 20 2b 3d 20 28 70 2d 3e 70     nSeg += (p->p
19a60 48 61 73 68 20 3f 20 31 20 3a 20 30 29 3b 0a 20  Hash ? 1 : 0);. 
19a70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19a80 6e 53 65 67 20 3d 20 4d 49 4e 28 70 53 74 72 75  nSeg = MIN(pStru
19a90 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65  ct->aLevel[iLeve
19aa0 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65 67 6d 65 6e  l].nSeg, nSegmen
19ab0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
19ac0 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77 20 3d 20  *ppOut = pNew = 
19ad0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c  fts5MultiIterAll
19ae0 6f 63 28 70 2c 20 6e 53 65 67 29 3b 0a 20 20 69  oc(p, nSeg);.  i
19af0 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
19b00 75 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e 62 52 65  urn;.  pNew->bRe
19b10 76 20 3d 20 28 30 21 3d 28 66 6c 61 67 73 20 26  v = (0!=(flags &
19b20 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
19b30 5f 44 45 53 43 29 29 3b 0a 20 20 70 4e 65 77 2d  _DESC));.  pNew-
19b40 3e 62 53 6b 69 70 45 6d 70 74 79 20 3d 20 28 30  >bSkipEmpty = (0
19b50 21 3d 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  !=(flags & FTS5I
19b60 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b 49 50 45  NDEX_QUERY_SKIPE
19b70 4d 50 54 59 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  MPTY));.  pNew->
19b80 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63  pStruct = pStruc
19b90 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 73  t;.  pNew->pCols
19ba0 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20  et = pColset;.  
19bb0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 66  fts5StructureRef
19bc0 28 70 53 74 72 75 63 74 29 3b 0a 20 20 69 66 28  (pStruct);.  if(
19bd0 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e   (flags & FTS5IN
19be0 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50  DEX_QUERY_NOOUTP
19bf0 55 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74  UT)==0 ){.    ft
19c00 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 43  s5IterSetOutputC
19c10 62 28 26 70 2d 3e 72 63 2c 20 70 4e 65 77 29 3b  b(&p->rc, pNew);
19c20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
19c30 61 6c 69 7a 65 20 65 61 63 68 20 6f 66 20 74 68  alize each of th
19c40 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 73 65 67 6d  e component segm
19c50 65 6e 74 20 69 74 65 72 61 74 6f 72 73 2e 20 2a  ent iterators. *
19c60 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  /.  if( p->rc==S
19c70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19c80 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a  if( iLevel<0 ){.
19c90 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
19ca0 75 72 65 4c 65 76 65 6c 20 2a 70 45 6e 64 20 3d  ureLevel *pEnd =
19cb0 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
19cc0 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l[pStruct->nLeve
19cd0 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  l];.      if( p-
19ce0 3e 70 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  >pHash ){.      
19cf0 20 20 2f 2a 20 41 64 64 20 61 20 73 65 67 6d 65    /* Add a segme
19d00 6e 74 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20  nt iterator for 
19d10 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
19d20 65 6e 74 73 20 6f 66 20 74 68 65 20 68 61 73 68  ents of the hash
19d30 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20   table. */.     
19d40 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
19d50 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61  pIter = &pNew->a
19d60 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20  Seg[iIter++];.  
19d70 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
19d80 72 48 61 73 68 49 6e 69 74 28 70 2c 20 70 54 65  rHashInit(p, pTe
19d90 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73  rm, nTerm, flags
19da0 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
19db0 7d 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 76 6c  }.      for(pLvl
19dc0 3d 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  =&pStruct->aLeve
19dd0 6c 5b 30 5d 3b 20 70 4c 76 6c 3c 70 45 6e 64 3b  l[0]; pLvl<pEnd;
19de0 20 70 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pLvl++){.      
19df0 20 20 66 6f 72 28 69 53 65 67 3d 70 4c 76 6c 2d    for(iSeg=pLvl-
19e00 3e 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30  >nSeg-1; iSeg>=0
19e10 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20  ; iSeg--){.     
19e20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
19e30 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
19e40 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  = &pLvl->aSeg[iS
19e50 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 46  eg];.          F
19e60 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
19e70 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b  r = &pNew->aSeg[
19e80 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20  iIter++];.      
19e90 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30      if( pTerm==0
19ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
19eb0 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28  fts5SegIterInit(
19ec0 70 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b  p, pSeg, pIter);
19ed0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
19ee0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
19ef0 73 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69  s5SegIterSeekIni
19f00 74 28 70 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  t(p, pTerm, nTer
19f10 6d 2c 20 66 6c 61 67 73 2c 20 70 53 65 67 2c 20  m, flags, pSeg, 
19f20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pIter);.        
19f30 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
19f40 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
19f50 0a 20 20 20 20 20 20 70 4c 76 6c 20 3d 20 26 70  .      pLvl = &p
19f60 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
19f70 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 20 20 66 6f  Level];.      fo
19f80 72 28 69 53 65 67 3d 6e 53 65 67 2d 31 3b 20 69  r(iSeg=nSeg-1; i
19f90 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b  Seg>=0; iSeg--){
19fa0 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
19fb0 49 74 65 72 49 6e 69 74 28 70 2c 20 26 70 4c 76  IterInit(p, &pLv
19fc0 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2c 20 26  l->aSeg[iSeg], &
19fd0 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72  pNew->aSeg[iIter
19fe0 2b 2b 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ++]);.      }.  
19ff0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1a000 69 49 74 65 72 3d 3d 6e 53 65 67 20 29 3b 0a 20  iIter==nSeg );. 
1a010 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1a020 61 62 6f 76 65 20 77 61 73 20 73 75 63 63 65 73  above was succes
1a030 73 66 75 6c 2c 20 65 61 63 68 20 63 6f 6d 70 6f  sful, each compo
1a040 6e 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 6e  nent iterators n
1a050 6f 77 20 70 6f 69 6e 74 73 20 0a 20 20 2a 2a 20  ow points .  ** 
1a060 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
1a070 72 79 20 69 6e 20 69 74 73 20 73 65 67 6d 65 6e  ry in its segmen
1a080 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
1a090 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 0a  initialize the .
1a0a0 20 20 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72    ** aFirst[] ar
1a0b0 72 61 79 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65  ray. Or, if an e
1a0c0 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
1a0d0 64 2c 20 66 72 65 65 20 74 68 65 20 69 74 65 72  d, free the iter
1a0e0 61 74 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  ator.  ** object
1a0f0 20 61 6e 64 20 73 65 74 20 74 68 65 20 6f 75 74   and set the out
1a100 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
1a110 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20  NULL.  */.  if( 
1a120 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1a130 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 49 74 65   ){.    for(iIte
1a140 72 3d 70 4e 65 77 2d 3e 6e 53 65 67 2d 31 3b 20  r=pNew->nSeg-1; 
1a150 69 49 74 65 72 3e 30 3b 20 69 49 74 65 72 2d 2d  iIter>0; iIter--
1a160 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 45 71  ){.      int iEq
1a170 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 45 71  ;.      if( (iEq
1a180 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
1a190 44 6f 43 6f 6d 70 61 72 65 28 70 4e 65 77 2c 20  DoCompare(pNew, 
1a1a0 69 49 74 65 72 29 29 20 29 7b 0a 20 20 20 20 20  iIter)) ){.     
1a1b0 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
1a1c0 70 53 65 67 20 3d 20 26 70 4e 65 77 2d 3e 61 53  pSeg = &pNew->aS
1a1d0 65 67 5b 69 45 71 5d 3b 0a 20 20 20 20 20 20 20  eg[iEq];.       
1a1e0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1a1f0 54 45 5f 4f 4b 20 29 20 70 53 65 67 2d 3e 78 4e  TE_OK ) pSeg->xN
1a200 65 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29 3b  ext(p, pSeg, 0);
1a210 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c  .        fts5Mul
1a220 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 70  tiIterAdvanced(p
1a230 2c 20 70 4e 65 77 2c 20 69 45 71 2c 20 69 49 74  , pNew, iEq, iIt
1a240 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
1a250 20 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69   }.    fts5Multi
1a260 49 74 65 72 53 65 74 45 6f 66 28 70 4e 65 77 29  IterSetEof(pNew)
1a270 3b 0a 20 20 20 20 66 74 73 35 41 73 73 65 72 74  ;.    fts5Assert
1a280 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 70  MultiIterSetup(p
1a290 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66  , pNew);..    if
1a2a0 28 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70  ( pNew->bSkipEmp
1a2b0 74 79 20 26 26 20 66 74 73 35 4d 75 6c 74 69 49  ty && fts5MultiI
1a2c0 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70 4e  terIsEmpty(p, pN
1a2d0 65 77 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ew) ){.      fts
1a2e0 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
1a2f0 2c 20 70 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20  , pNew, 0, 0);. 
1a300 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 65     }else if( pNe
1a310 77 2d 3e 62 61 73 65 2e 62 45 6f 66 3d 3d 30 20  w->base.bEof==0 
1a320 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ){.      Fts5Seg
1a330 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 4e  Iter *pSeg = &pN
1a340 65 77 2d 3e 61 53 65 67 5b 70 4e 65 77 2d 3e 61  ew->aSeg[pNew->a
1a350 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d  First[1].iFirst]
1a360 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 53  ;.      pNew->xS
1a370 65 74 4f 75 74 70 75 74 73 28 70 4e 65 77 2c 20  etOutputs(pNew, 
1a380 70 53 65 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  pSeg);.    }..  
1a390 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 4d  }else{.    fts5M
1a3a0 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 4e 65  ultiIterFree(pNe
1a3b0 77 29 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d  w);.    *ppOut =
1a3c0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
1a3d0 20 43 72 65 61 74 65 20 61 6e 20 46 74 73 35 49   Create an Fts5I
1a3e0 74 65 72 20 74 68 61 74 20 69 74 65 72 61 74 65  ter that iterate
1a3f0 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 6f  s through the do
1a400 63 6c 69 73 74 20 70 72 6f 76 69 64 65 64 0a 2a  clist provided.*
1a410 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  * as the second 
1a420 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
1a430 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
1a440 74 69 49 74 65 72 4e 65 77 32 28 0a 20 20 46 74  tiIterNew2(.  Ft
1a450 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
1a460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a470 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f   FTS5 backend to
1a480 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20   iterate within 
1a490 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  */.  Fts5Data *p
1a4a0 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20  Data,           
1a4b0 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20       /* Doclist 
1a4c0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1a4d0 67 68 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73  gh */.  int bDes
1a4e0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1a4f0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1a500 66 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 72  for descending r
1a510 6f 77 69 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20  owid order */.  
1a520 46 74 73 35 49 74 65 72 20 2a 2a 70 70 4f 75 74  Fts5Iter **ppOut
1a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a540 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f  /* New object */
1a550 0a 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a  .){.  Fts5Iter *
1a560 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 66  pNew;.  pNew = f
1a570 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f  ts5MultiIterAllo
1a580 63 28 70 2c 20 32 29 3b 0a 20 20 69 66 28 20 70  c(p, 2);.  if( p
1a590 4e 65 77 20 29 7b 0a 20 20 20 20 46 74 73 35 53  New ){.    Fts5S
1a5a0 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  egIter *pIter = 
1a5b0 26 70 4e 65 77 2d 3e 61 53 65 67 5b 31 5d 3b 0a  &pNew->aSeg[1];.
1a5c0 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67  .    pIter->flag
1a5d0 73 20 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52  s = FTS5_SEGITER
1a5e0 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69 66  _ONETERM;.    if
1a5f0 28 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 3e  ( pData->szLeaf>
1a600 30 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72  0 ){.      pIter
1a610 2d 3e 70 4c 65 61 66 20 3d 20 70 44 61 74 61 3b  ->pLeaf = pData;
1a620 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  .      pIter->iL
1a630 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35  eafOffset = fts5
1a640 47 65 74 56 61 72 69 6e 74 28 70 44 61 74 61 2d  GetVarint(pData-
1a650 3e 70 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  >p, (u64*)&pIter
1a660 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
1a670 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
1a680 63 6c 69 73 74 20 3d 20 70 44 61 74 61 2d 3e 6e  clist = pData->n
1a690 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  n;.      pNew->a
1a6a0 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
1a6b0 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 62  = 1;.      if( b
1a6c0 44 65 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Desc ){.        
1a6d0 70 4e 65 77 2d 3e 62 52 65 76 20 3d 20 31 3b 0a  pNew->bRev = 1;.
1a6e0 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66          pIter->f
1a6f0 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47  lags |= FTS5_SEG
1a700 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20  ITER_REVERSE;.  
1a710 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
1a720 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65  rReverseInitPage
1a730 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
1a740 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a750 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
1a760 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
1a770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44        }.      pD
1a780 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ata = 0;.    }el
1a790 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
1a7a0 62 61 73 65 2e 62 45 6f 66 20 3d 20 31 3b 0a 20  base.bEof = 1;. 
1a7b0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 65 67     }.    fts5Seg
1a7c0 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20 70  IterSetNext(p, p
1a7d0 49 74 65 72 29 3b 0a 0a 20 20 20 20 2a 70 70 4f  Iter);..    *ppO
1a7e0 75 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a  ut = pNew;.  }..
1a7f0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
1a800 65 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pData);.}../*.
1a810 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1a820 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  f the iterator i
1a830 73 20 61 74 20 45 4f 46 20 6f 72 20 69 66 20 61  s at EOF or if a
1a840 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
1a850 72 72 65 64 2e 20 0a 2a 2a 20 46 61 6c 73 65 20  rred. .** False 
1a860 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
1a870 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c  atic int fts5Mul
1a880 74 69 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e  tiIterEof(Fts5In
1a890 64 65 78 20 2a 70 2c 20 46 74 73 35 49 74 65 72  dex *p, Fts5Iter
1a8a0 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65   *pIter){.  asse
1a8b0 72 74 28 20 70 2d 3e 72 63 20 0a 20 20 20 20 20  rt( p->rc .     
1a8c0 20 7c 7c 20 28 70 49 74 65 72 2d 3e 61 53 65 67   || (pIter->aSeg
1a8d0 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
1a8e0 31 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61  1].iFirst ].pLea
1a8f0 66 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62 61  f==0)==pIter->ba
1a900 73 65 2e 62 45 6f 66 20 0a 20 20 29 3b 0a 20 20  se.bEof .  );.  
1a910 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c  return (p->rc ||
1a920 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f   pIter->base.bEo
1a930 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  f);.}../*.** Ret
1a940 75 72 6e 20 74 68 65 20 72 6f 77 69 64 20 6f 66  urn the rowid of
1a950 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
1a960 74 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72  the iterator cur
1a970 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a  rently points.**
1a980 20 74 6f 2e 20 49 66 20 74 68 65 20 69 74 65 72   to. If the iter
1a990 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45  ator points to E
1a9a0 4f 46 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  OF when this fun
1a9b0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1a9c0 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 61  the.** results a
1a9d0 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  re undefined..*/
1a9e0 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35  .static i64 fts5
1a9f0 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 46  MultiIterRowid(F
1aa00 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ts5Iter *pIter){
1aa10 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
1aa20 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
1aa30 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
1aa40 5d 2e 70 4c 65 61 66 20 29 3b 0a 20 20 72 65 74  ].pLeaf );.  ret
1aa50 75 72 6e 20 70 49 74 65 72 2d 3e 61 53 65 67 5b  urn pIter->aSeg[
1aa60 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
1aa70 5d 2e 69 46 69 72 73 74 20 5d 2e 69 52 6f 77 69  ].iFirst ].iRowi
1aa80 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  d;.}../*.** Move
1aa90 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f   the iterator to
1aaa0 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
1aab0 61 74 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  at or following 
1aac0 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69  iMatch..*/.stati
1aad0 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
1aae0 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20  IterNextFrom(.  
1aaf0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
1ab00 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
1ab10 2c 20 0a 20 20 69 36 34 20 69 4d 61 74 63 68 0a  , .  i64 iMatch.
1ab20 29 7b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ){.  while( 1 ){
1ab30 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b  .    i64 iRowid;
1ab40 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74  .    fts5MultiIt
1ab50 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c  erNext(p, pIter,
1ab60 20 31 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 20   1, iMatch);.   
1ab70 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74   if( fts5MultiIt
1ab80 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20  erEof(p, pIter) 
1ab90 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 52 6f  ) break;.    iRo
1aba0 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  wid = fts5MultiI
1abb0 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b  terRowid(pIter);
1abc0 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
1abd0 62 52 65 76 3d 3d 30 20 26 26 20 69 52 6f 77 69  bRev==0 && iRowi
1abe0 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61  d>=iMatch ) brea
1abf0 6b 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  k;.    if( pIter
1ac00 2d 3e 62 52 65 76 21 3d 30 20 26 26 20 69 52 6f  ->bRev!=0 && iRo
1ac10 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72  wid<=iMatch ) br
1ac20 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  eak;.  }.}../*.*
1ac30 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1ac40 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  er to a buffer c
1ac50 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65  ontaining the te
1ac60 72 6d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rm associated wi
1ac70 74 68 20 74 68 65 20 0a 2a 2a 20 65 6e 74 72 79  th the .** entry
1ac80 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74   that the iterat
1ac90 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
1aca0 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69  nts to..*/.stati
1acb0 63 20 63 6f 6e 73 74 20 75 38 20 2a 66 74 73 35  c const u8 *fts5
1acc0 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 46 74  MultiIterTerm(Ft
1acd0 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  s5Iter *pIter, i
1ace0 6e 74 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35 53  nt *pn){.  Fts5S
1acf0 65 67 49 74 65 72 20 2a 70 20 3d 20 26 70 49 74  egIter *p = &pIt
1ad00 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
1ad10 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
1ad20 74 20 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d 3e  t ];.  *pn = p->
1ad30 74 65 72 6d 2e 6e 3b 0a 20 20 72 65 74 75 72 6e  term.n;.  return
1ad40 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a 2f   p->term.p;.}../
1ad50 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
1ad60 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64 20 66  new segment-id f
1ad70 6f 72 20 74 68 65 20 73 74 72 75 63 74 75 72 65  or the structure
1ad80 20 70 53 74 72 75 63 74 2e 20 54 68 65 20 6e 65   pStruct. The ne
1ad90 77 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 69 64 20  w segment.** id 
1ada0 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
1adb0 31 20 61 6e 64 20 36 35 33 33 35 20 69 6e 63 6c  1 and 65335 incl
1adc0 75 73 69 76 65 2c 20 61 6e 64 20 6d 75 73 74 20  usive, and must 
1add0 6e 6f 74 20 62 65 20 75 73 65 64 20 62 79 20 0a  not be used by .
1ade0 2a 2a 20 61 6e 79 20 63 75 72 72 65 6e 74 6c 79  ** any currently
1adf0 20 65 78 69 73 74 69 6e 67 20 73 65 67 6d 65 6e   existing segmen
1ae00 74 2e 20 49 66 20 61 20 66 72 65 65 20 73 65 67  t. If a free seg
1ae10 6d 65 6e 74 20 69 64 20 63 61 6e 6e 6f 74 20 62  ment id cannot b
1ae20 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49  e found,.** SQLI
1ae30 54 45 5f 46 55 4c 4c 20 69 73 20 72 65 74 75 72  TE_FULL is retur
1ae40 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ned..**.** If an
1ae50 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
1ae60 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
1ae70 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1ae80 6e 6f 2d 6f 70 2e 20 30 20 69 73 20 0a 2a 2a 20  no-op. 0 is .** 
1ae90 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73  returned in this
1aea0 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   case..*/.static
1aeb0 20 69 6e 74 20 66 74 73 35 41 6c 6c 6f 63 61 74   int fts5Allocat
1aec0 65 53 65 67 69 64 28 46 74 73 35 49 6e 64 65 78  eSegid(Fts5Index
1aed0 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74 75   *p, Fts5Structu
1aee0 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20  re *pStruct){.  
1aef0 69 6e 74 20 69 53 65 67 69 64 20 3d 20 30 3b 0a  int iSegid = 0;.
1af00 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1af10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1af20 66 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67  f( pStruct->nSeg
1af30 6d 65 6e 74 3e 3d 46 54 53 35 5f 4d 41 58 5f 53  ment>=FTS5_MAX_S
1af40 45 47 4d 45 4e 54 20 29 7b 0a 20 20 20 20 20 20  EGMENT ){.      
1af50 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 46  p->rc = SQLITE_F
1af60 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ULL;.    }else{.
1af70 20 20 20 20 20 20 2f 2a 20 46 54 53 35 5f 4d 41        /* FTS5_MA
1af80 58 5f 53 45 47 4d 45 4e 54 20 69 73 20 63 75 72  X_SEGMENT is cur
1af90 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 61  rently defined a
1afa0 73 20 32 30 30 30 2e 20 53 6f 20 74 68 65 20 66  s 2000. So the f
1afb0 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a  ollowing.      *
1afc0 2a 20 61 72 72 61 79 20 69 73 20 36 33 20 65 6c  * array is 63 el
1afd0 65 6d 65 6e 74 73 2c 20 6f 72 20 32 35 32 20 62  ements, or 252 b
1afe0 79 74 65 73 2c 20 69 6e 20 73 69 7a 65 2e 20 20  ytes, in size.  
1aff0 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 61 55 73  */.      u32 aUs
1b000 65 64 5b 28 46 54 53 35 5f 4d 41 58 5f 53 45 47  ed[(FTS5_MAX_SEG
1b010 4d 45 4e 54 2b 33 31 29 20 2f 20 33 32 5d 3b 0a  MENT+31) / 32];.
1b020 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20        int iLvl, 
1b030 69 53 65 67 3b 0a 20 20 20 20 20 20 69 6e 74 20  iSeg;.      int 
1b040 69 3b 0a 20 20 20 20 20 20 75 33 32 20 6d 61 73  i;.      u32 mas
1b050 6b 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  k;.      memset(
1b060 61 55 73 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66  aUsed, 0, sizeof
1b070 28 61 55 73 65 64 29 29 3b 0a 20 20 20 20 20 20  (aUsed));.      
1b080 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
1b090 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
1b0a0 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
1b0b0 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
1b0c0 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65  Seg<pStruct->aLe
1b0d0 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20  vel[iLvl].nSeg; 
1b0e0 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
1b0f0 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53 74     int iId = pSt
1b100 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1b110 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53  l].aSeg[iSeg].iS
1b120 65 67 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20  egid;.          
1b130 69 66 28 20 69 49 64 3c 3d 46 54 53 35 5f 4d 41  if( iId<=FTS5_MA
1b140 58 5f 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20 20  X_SEGMENT ){.   
1b150 20 20 20 20 20 20 20 20 20 61 55 73 65 64 5b 28           aUsed[(
1b160 69 49 64 2d 31 29 20 2f 20 33 32 5d 20 7c 3d 20  iId-1) / 32] |= 
1b170 31 20 3c 3c 20 28 28 69 49 64 2d 31 29 20 25 20  1 << ((iId-1) % 
1b180 33 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  32);.          }
1b190 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b1a0 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   }..      for(i=
1b1b0 30 3b 20 61 55 73 65 64 5b 69 5d 3d 3d 30 78 46  0; aUsed[i]==0xF
1b1c0 46 46 46 46 46 46 46 3b 20 69 2b 2b 29 3b 0a 20  FFFFFFF; i++);. 
1b1d0 20 20 20 20 20 6d 61 73 6b 20 3d 20 61 55 73 65       mask = aUse
1b1e0 64 5b 69 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28  d[i];.      for(
1b1f0 69 53 65 67 69 64 3d 30 3b 20 6d 61 73 6b 20 26  iSegid=0; mask &
1b200 20 28 31 20 3c 3c 20 69 53 65 67 69 64 29 3b 20   (1 << iSegid); 
1b210 69 53 65 67 69 64 2b 2b 29 3b 0a 20 20 20 20 20  iSegid++);.     
1b220 20 69 53 65 67 69 64 20 2b 3d 20 31 20 2b 20 69   iSegid += 1 + i
1b230 2a 33 32 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  *32;..#ifdef SQL
1b240 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
1b250 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
1b260 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
1b270 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
1b280 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
1b290 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65  Seg<pStruct->aLe
1b2a0 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20  vel[iLvl].nSeg; 
1b2b0 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
1b2c0 20 20 20 61 73 73 65 72 74 28 20 69 53 65 67 69     assert( iSegi
1b2d0 64 21 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  d!=pStruct->aLev
1b2e0 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53  el[iLvl].aSeg[iS
1b2f0 65 67 5d 2e 69 53 65 67 69 64 20 29 3b 0a 20 20  eg].iSegid );.  
1b300 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1b310 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
1b320 65 67 69 64 3e 30 20 26 26 20 69 53 65 67 69 64  egid>0 && iSegid
1b330 3c 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45  <=FTS5_MAX_SEGME
1b340 4e 54 20 29 3b 0a 0a 20 20 20 20 20 20 7b 0a 20  NT );..      {. 
1b350 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
1b360 74 6d 74 20 2a 70 49 64 78 53 65 6c 65 63 74 20  tmt *pIdxSelect 
1b370 3d 20 66 74 73 35 49 64 78 53 65 6c 65 63 74 53  = fts5IdxSelectS
1b380 74 6d 74 28 70 29 3b 0a 20 20 20 20 20 20 20 20  tmt(p);.        
1b390 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1b3a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b3b0 20 20 75 38 20 61 42 6c 6f 62 5b 32 5d 20 3d 20    u8 aBlob[2] = 
1b3c0 7b 30 78 66 66 2c 20 30 78 66 66 7d 3b 0a 20 20  {0xff, 0xff};.  
1b3d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1b3e0 62 69 6e 64 5f 69 6e 74 28 70 49 64 78 53 65 6c  bind_int(pIdxSel
1b3f0 65 63 74 2c 20 31 2c 20 69 53 65 67 69 64 29 3b  ect, 1, iSegid);
1b400 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1b410 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 49 64  e3_bind_blob(pId
1b420 78 53 65 6c 65 63 74 2c 20 32 2c 20 61 42 6c 6f  xSelect, 2, aBlo
1b430 62 2c 20 32 2c 20 53 51 4c 49 54 45 5f 53 54 41  b, 2, SQLITE_STA
1b440 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TIC);.          
1b450 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1b460 73 74 65 70 28 70 49 64 78 53 65 6c 65 63 74 29  step(pIdxSelect)
1b470 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 3b 0a  !=SQLITE_ROW );.
1b480 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
1b490 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
1b4a0 70 49 64 78 53 65 6c 65 63 74 29 3b 0a 20 20 20  pIdxSelect);.   
1b4b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
1b4c0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
1b4d0 0a 20 20 72 65 74 75 72 6e 20 69 53 65 67 69 64  .  return iSegid
1b4e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61  ;.}../*.** Disca
1b4f0 72 64 20 61 6c 6c 20 64 61 74 61 20 63 75 72 72  rd all data curr
1b500 65 6e 74 6c 79 20 63 61 63 68 65 64 20 69 6e 20  ently cached in 
1b510 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65 73 2e  the hash-tables.
1b520 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b530 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64  fts5IndexDiscard
1b540 44 61 74 61 28 46 74 73 35 49 6e 64 65 78 20 2a  Data(Fts5Index *
1b550 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
1b560 3e 70 48 61 73 68 20 7c 7c 20 70 2d 3e 6e 50 65  >pHash || p->nPe
1b570 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b 0a  ndingData==0 );.
1b580 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68 20 29    if( p->pHash )
1b590 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
1b5a0 35 48 61 73 68 43 6c 65 61 72 28 70 2d 3e 70 48  5HashClear(p->pH
1b5b0 61 73 68 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65  ash);.    p->nPe
1b5c0 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20  ndingData = 0;. 
1b5d0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
1b5e0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
1b5f0 68 65 20 70 72 65 66 69 78 2c 20 69 6e 20 62 79  he prefix, in by
1b600 74 65 73 2c 20 74 68 61 74 20 62 75 66 66 65 72  tes, that buffer
1b610 20 0a 2a 2a 20 28 70 4e 65 77 2f 3c 6c 65 6e 67   .** (pNew/<leng
1b620 74 68 2d 75 6e 6b 6e 6f 77 6e 3e 29 20 73 68 61  th-unknown>) sha
1b630 72 65 73 20 77 69 74 68 20 62 75 66 66 65 72 20  res with buffer 
1b640 28 70 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a 2a 2a 0a  (pOld/nOld)..**.
1b650 2a 2a 20 42 75 66 66 65 72 20 28 70 4e 65 77 2f  ** Buffer (pNew/
1b660 3c 6c 65 6e 67 74 68 2d 75 6e 6b 6e 6f 77 6e 3e  <length-unknown>
1b670 29 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  ) is guaranteed 
1b680 74 6f 20 62 65 20 67 72 65 61 74 65 72 20 0a 2a  to be greater .*
1b690 2a 20 74 68 61 6e 20 62 75 66 66 65 72 20 28 70  * than buffer (p
1b6a0 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a 2a 2f 0a 73 74  Old/nOld)..*/.st
1b6b0 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 72 65  atic int fts5Pre
1b6c0 66 69 78 43 6f 6d 70 72 65 73 73 28 69 6e 74 20  fixCompress(int 
1b6d0 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a  nOld, const u8 *
1b6e0 70 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a  pOld, const u8 *
1b6f0 70 4e 65 77 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pNew){.  int i;.
1b700 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
1b710 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
1b720 20 70 4f 6c 64 5b 69 5d 21 3d 70 4e 65 77 5b 69   pOld[i]!=pNew[i
1b730 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ] ) break;.  }. 
1b740 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 73 74   return i;.}..st
1b750 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1b760 69 74 65 44 6c 69 64 78 43 6c 65 61 72 28 0a 20  iteDlidxClear(. 
1b770 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1b780 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1b790 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20  *pWriter,.  int 
1b7a0 62 46 6c 75 73 68 20 20 20 20 20 20 20 20 20 20  bFlush          
1b7b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1b7c0 66 20 74 72 75 65 2c 20 77 72 69 74 65 20 64 6c  f true, write dl
1b7d0 69 64 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 29  idx to disk */.)
1b7e0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
1b7f0 65 72 74 28 20 62 46 6c 75 73 68 3d 3d 30 20 7c  ert( bFlush==0 |
1b800 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69  | (pWriter->nDli
1b810 64 78 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d  dx>0 && pWriter-
1b820 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e  >aDlidx[0].buf.n
1b830 3e 30 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  >0) );.  for(i=0
1b840 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c  ; i<pWriter->nDl
1b850 69 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  idx; i++){.    F
1b860 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a  ts5DlidxWriter *
1b870 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65  pDlidx = &pWrite
1b880 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20  r->aDlidx[i];.  
1b890 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75    if( pDlidx->bu
1b8a0 66 2e 6e 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  f.n==0 ) break;.
1b8b0 20 20 20 20 69 66 28 20 62 46 6c 75 73 68 20 29      if( bFlush )
1b8c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1b8d0 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 21 3d 30 20  pDlidx->pgno!=0 
1b8e0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  );.      fts5Dat
1b8f0 61 57 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20  aWrite(p, .     
1b900 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f       FTS5_DLIDX_
1b910 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69  ROWID(pWriter->i
1b920 53 65 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78  Segid, i, pDlidx
1b930 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20  ->pgno),.       
1b940 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70     pDlidx->buf.p
1b950 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a  , pDlidx->buf.n.
1b960 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
1b970 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1b980 66 66 65 72 5a 65 72 6f 28 26 70 44 6c 69 64 78  fferZero(&pDlidx
1b990 2d 3e 62 75 66 29 3b 0a 20 20 20 20 70 44 6c 69  ->buf);.    pDli
1b9a0 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d  dx->bPrevValid =
1b9b0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
1b9c0 20 47 72 6f 77 20 74 68 65 20 70 57 72 69 74 65   Grow the pWrite
1b9d0 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 61 72 72 61  r->aDlidx[] arra
1b9e0 79 20 74 6f 20 61 74 20 6c 65 61 73 74 20 6e 4c  y to at least nL
1b9f0 76 6c 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 73  vl elements in s
1ba00 69 7a 65 2e 0a 2a 2a 20 41 6e 79 20 6e 65 77 20  ize..** Any new 
1ba10 61 72 72 61 79 20 65 6c 65 6d 65 6e 74 73 20 61  array elements a
1ba20 72 65 20 7a 65 72 6f 65 64 20 62 65 66 6f 72 65  re zeroed before
1ba30 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
1ba40 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 57 72  tatic int fts5Wr
1ba50 69 74 65 44 6c 69 64 78 47 72 6f 77 28 0a 20 20  iteDlidxGrow(.  
1ba60 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20  Fts5Index *p,.  
1ba70 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1ba80 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 4c  Writer,.  int nL
1ba90 76 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  vl.){.  if( p->r
1baa0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1bab0 6e 4c 76 6c 3e 3d 70 57 72 69 74 65 72 2d 3e 6e  nLvl>=pWriter->n
1bac0 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73  Dlidx ){.    Fts
1bad0 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44  5DlidxWriter *aD
1bae0 6c 69 64 78 20 3d 20 28 46 74 73 35 44 6c 69 64  lidx = (Fts5Dlid
1baf0 78 57 72 69 74 65 72 2a 29 73 71 6c 69 74 65 33  xWriter*)sqlite3
1bb00 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  _realloc(.      
1bb10 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64    pWriter->aDlid
1bb20 78 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  x, sizeof(Fts5Dl
1bb30 69 64 78 57 72 69 74 65 72 29 20 2a 20 6e 4c 76  idxWriter) * nLv
1bb40 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  l.    );.    if(
1bb50 20 61 44 6c 69 64 78 3d 3d 30 20 29 7b 0a 20 20   aDlidx==0 ){.  
1bb60 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
1bb70 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
1bb80 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
1bb90 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
1bba0 73 35 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a  s5DlidxWriter) *
1bbb0 20 28 6e 4c 76 6c 20 2d 20 70 57 72 69 74 65 72   (nLvl - pWriter
1bbc0 2d 3e 6e 44 6c 69 64 78 29 3b 0a 20 20 20 20 20  ->nDlidx);.     
1bbd0 20 6d 65 6d 73 65 74 28 26 61 44 6c 69 64 78 5b   memset(&aDlidx[
1bbe0 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 5d  pWriter->nDlidx]
1bbf0 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  , 0, nByte);.   
1bc00 20 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69     pWriter->aDli
1bc10 64 78 20 3d 20 61 44 6c 69 64 78 3b 0a 20 20 20  dx = aDlidx;.   
1bc20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69     pWriter->nDli
1bc30 64 78 20 3d 20 6e 4c 76 6c 3b 0a 20 20 20 20 7d  dx = nLvl;.    }
1bc40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d  .  }.  return p-
1bc50 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  >rc;.}../*.** If
1bc60 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63   the current doc
1bc70 6c 69 73 74 2d 69 6e 64 65 78 20 61 63 63 75 6d  list-index accum
1bc80 75 6c 61 74 69 6e 67 20 69 6e 20 70 57 72 69 74  ulating in pWrit
1bc90 65 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 69 73 20  er->aDlidx[] is 
1bca0 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 2c  large.** enough,
1bcb0 20 66 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73   flush it to dis
1bcc0 6b 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20  k and return 1. 
1bcd0 4f 74 68 65 72 77 69 73 65 20 64 69 73 63 61 72  Otherwise discar
1bce0 64 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e 0a  d it and return.
1bcf0 2a 2a 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  ** zero..*/.stat
1bd00 69 63 20 69 6e 74 20 66 74 73 35 57 72 69 74 65  ic int fts5Write
1bd10 46 6c 75 73 68 44 6c 69 64 78 28 46 74 73 35 49  FlushDlidx(Fts5I
1bd20 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
1bd30 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
1bd40 7b 0a 20 20 69 6e 74 20 62 46 6c 61 67 20 3d 20  {.  int bFlag = 
1bd50 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  0;..  /* If ther
1bd60 65 20 77 65 72 65 20 46 54 53 35 5f 4d 49 4e 5f  e were FTS5_MIN_
1bd70 44 4c 49 44 58 5f 53 49 5a 45 20 6f 72 20 6d 6f  DLIDX_SIZE or mo
1bd80 72 65 20 65 6d 70 74 79 20 6c 65 61 66 20 70 61  re empty leaf pa
1bd90 67 65 73 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  ges written.  **
1bda0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1bdb0 2c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65  , also write the
1bdc0 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 74   doclist-index t
1bdd0 6f 20 64 69 73 6b 2e 20 20 2a 2f 0a 20 20 69 66  o disk.  */.  if
1bde0 28 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  ( pWriter->aDlid
1bdf0 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 26 26 20  x[0].buf.n>0 && 
1be00 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e  pWriter->nEmpty>
1be10 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f  =FTS5_MIN_DLIDX_
1be20 53 49 5a 45 20 29 7b 0a 20 20 20 20 62 46 6c 61  SIZE ){.    bFla
1be30 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 74 73  g = 1;.  }.  fts
1be40 35 57 72 69 74 65 44 6c 69 64 78 43 6c 65 61 72  5WriteDlidxClear
1be50 28 70 2c 20 70 57 72 69 74 65 72 2c 20 62 46 6c  (p, pWriter, bFl
1be60 61 67 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  ag);.  pWriter->
1be70 6e 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20 72 65  nEmpty = 0;.  re
1be80 74 75 72 6e 20 62 46 6c 61 67 3b 0a 7d 0a 0a 2f  turn bFlag;.}../
1be90 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1bea0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
1beb0 6e 65 76 65 72 20 70 72 6f 63 65 73 73 69 6e 67  never processing
1bec0 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20   of the doclist 
1bed0 66 6f 72 20 74 68 65 20 0a 2a 2a 20 6c 61 73 74  for the .** last
1bee0 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 70 61   term on leaf pa
1bef0 67 65 20 28 70 57 72 69 74 65 72 2d 3e 69 42 74  ge (pWriter->iBt
1bf00 50 61 67 65 29 20 69 73 20 63 6f 6d 70 6c 65 74  Page) is complet
1bf10 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ed. .**.** The d
1bf20 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6f 72  oclist-index for
1bf30 20 74 68 61 74 20 74 65 72 6d 20 69 73 20 63 75   that term is cu
1bf40 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
1bf50 6e 2d 6d 65 6d 6f 72 79 20 77 69 74 68 69 6e 20  n-memory within 
1bf60 74 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 57 72  the.** Fts5SegWr
1bf70 69 74 65 72 2e 61 44 6c 69 64 78 5b 5d 20 61 72  iter.aDlidx[] ar
1bf80 72 61 79 2e 20 49 66 20 69 74 20 69 73 20 6c 61  ray. If it is la
1bf90 72 67 65 20 65 6e 6f 75 67 68 2c 20 74 68 69 73  rge enough, this
1bfa0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 77 72 69   function.** wri
1bfb0 74 65 73 20 69 74 20 6f 75 74 20 74 6f 20 64 69  tes it out to di
1bfc0 73 6b 2e 20 4f 72 2c 20 69 66 20 69 74 20 69 73  sk. Or, if it is
1bfd0 20 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 62 6f   too small to bo
1bfe0 74 68 65 72 20 77 69 74 68 2c 20 64 69 73 63 61  ther with, disca
1bff0 72 64 73 0a 2a 2a 20 69 74 2e 0a 2a 2a 0a 2a 2a  rds.** it..**.**
1c000 20 46 74 73 35 53 65 67 57 72 69 74 65 72 2e 62   Fts5SegWriter.b
1c010 74 74 65 72 6d 20 63 75 72 72 65 6e 74 6c 79 20  tterm currently 
1c020 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 72  contains the fir
1c030 73 74 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20  st term on page 
1c040 69 42 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  iBtPage..*/.stat
1c050 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
1c060 65 46 6c 75 73 68 42 74 72 65 65 28 46 74 73 35  eFlushBtree(Fts5
1c070 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
1c080 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
1c090 29 7b 0a 20 20 69 6e 74 20 62 46 6c 61 67 3b 0a  ){.  int bFlag;.
1c0a0 0a 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74  .  assert( pWrit
1c0b0 65 72 2d 3e 69 42 74 50 61 67 65 20 7c 7c 20 70  er->iBtPage || p
1c0c0 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3d 3d  Writer->nEmpty==
1c0d0 30 20 29 3b 0a 20 20 69 66 28 20 70 57 72 69 74  0 );.  if( pWrit
1c0e0 65 72 2d 3e 69 42 74 50 61 67 65 3d 3d 30 20 29  er->iBtPage==0 )
1c0f0 20 72 65 74 75 72 6e 3b 0a 20 20 62 46 6c 61 67   return;.  bFlag
1c100 20 3d 20 66 74 73 35 57 72 69 74 65 46 6c 75 73   = fts5WriteFlus
1c110 68 44 6c 69 64 78 28 70 2c 20 70 57 72 69 74 65  hDlidx(p, pWrite
1c120 72 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63  r);..  if( p->rc
1c130 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c140 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1c150 20 3d 20 28 70 57 72 69 74 65 72 2d 3e 62 74 74   = (pWriter->btt
1c160 65 72 6d 2e 6e 3e 30 3f 28 63 6f 6e 73 74 20 63  erm.n>0?(const c
1c170 68 61 72 2a 29 70 57 72 69 74 65 72 2d 3e 62 74  har*)pWriter->bt
1c180 74 65 72 6d 2e 70 3a 22 22 29 3b 0a 20 20 20 20  term.p:"");.    
1c190 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1c1a0 20 77 61 73 20 61 6c 72 65 61 64 79 20 64 6f 6e   was already don
1c1b0 65 20 69 6e 20 66 74 73 35 57 72 69 74 65 49 6e  e in fts5WriteIn
1c1c0 69 74 28 29 3a 20 2a 2f 0a 20 20 20 20 2f 2a 20  it(): */.    /* 
1c1d0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
1c1e0 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20  (p->pIdxWriter, 
1c1f0 31 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67  1, pWriter->iSeg
1c200 69 64 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  id); */.    sqli
1c210 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d  te3_bind_blob(p-
1c220 3e 70 49 64 78 57 72 69 74 65 72 2c 20 32 2c 20  >pIdxWriter, 2, 
1c230 7a 2c 20 70 57 72 69 74 65 72 2d 3e 62 74 74 65  z, pWriter->btte
1c240 72 6d 2e 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41  rm.n, SQLITE_STA
1c250 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
1c260 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e  3_bind_int64(p->
1c270 70 49 64 78 57 72 69 74 65 72 2c 20 33 2c 20 62  pIdxWriter, 3, b
1c280 46 6c 61 67 20 2b 20 28 28 69 36 34 29 70 57 72  Flag + ((i64)pWr
1c290 69 74 65 72 2d 3e 69 42 74 50 61 67 65 3c 3c 31  iter->iBtPage<<1
1c2a0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ));.    sqlite3_
1c2b0 73 74 65 70 28 70 2d 3e 70 49 64 78 57 72 69 74  step(p->pIdxWrit
1c2c0 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  er);.    p->rc =
1c2d0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
1c2e0 2d 3e 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20  ->pIdxWriter);. 
1c2f0 20 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42   }.  pWriter->iB
1c300 74 50 61 67 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  tPage = 0;.}../*
1c310 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
1c320 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
1c330 20 6c 65 61 66 20 70 61 67 65 20 65 78 63 65 70   leaf page excep
1c340 74 20 74 68 65 20 66 69 72 73 74 20 74 68 61 74  t the first that
1c350 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74 20   contains.** at 
1c360 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 20  least one term. 
1c370 41 72 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d 2f  Argument (nTerm/
1c380 70 54 65 72 6d 29 20 69 73 20 74 68 65 20 73 70  pTerm) is the sp
1c390 6c 69 74 2d 6b 65 79 20 2d 20 61 20 74 65 72 6d  lit-key - a term
1c3a0 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67   that.** is larg
1c3b0 65 72 20 74 68 61 6e 20 61 6c 6c 20 74 65 72 6d  er than all term
1c3c0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 65 61 72  s written to ear
1c3d0 6c 69 65 72 20 6c 65 61 76 65 73 2c 20 61 6e 64  lier leaves, and
1c3e0 20 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20   equal to or.** 
1c3f0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
1c400 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74   first term on t
1c410 68 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a  he new leaf..**.
1c420 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1c430 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
1c440 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20  code is left in 
1c450 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 66  Fts5Index.rc. If
1c460 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61 73   an error.** has
1c470 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
1c480 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
1c490 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
1c4a0 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
1c4b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1c4c0 73 35 57 72 69 74 65 42 74 72 65 65 54 65 72 6d  s5WriteBtreeTerm
1c4d0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1c4e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c4f0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
1c500 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
1c510 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1c520 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20  Writer,         
1c530 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74  /* Writer object
1c540 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c   */.  int nTerm,
1c550 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
1c560 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74        /* First t
1c570 65 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65 20  erm on new page 
1c580 2a 2f 0a 29 7b 0a 20 20 66 74 73 35 57 72 69 74  */.){.  fts5Writ
1c590 65 46 6c 75 73 68 42 74 72 65 65 28 70 2c 20 70  eFlushBtree(p, p
1c5a0 57 72 69 74 65 72 29 3b 0a 20 20 66 74 73 35 42  Writer);.  fts5B
1c5b0 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
1c5c0 20 26 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72   &pWriter->btter
1c5d0 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29  m, nTerm, pTerm)
1c5e0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74  ;.  pWriter->iBt
1c5f0 50 61 67 65 20 3d 20 70 57 72 69 74 65 72 2d 3e  Page = pWriter->
1c600 77 72 69 74 65 72 2e 70 67 6e 6f 3b 0a 7d 0a 0a  writer.pgno;.}..
1c610 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1c620 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
1c630 65 6e 20 66 6c 75 73 68 69 6e 67 20 61 20 6c 65  en flushing a le
1c640 61 66 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  af page that con
1c650 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 74 65 72 6d  tains no.** term
1c660 73 20 61 74 20 61 6c 6c 20 74 6f 20 64 69 73 6b  s at all to disk
1c670 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1c680 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 4e   fts5WriteBtreeN
1c690 6f 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64  oTerm(.  Fts5Ind
1c6a0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
1c6b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
1c6c0 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
1c6d0 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  */.  Fts5SegWrit
1c6e0 65 72 20 2a 70 57 72 69 74 65 72 20 20 20 20 20  er *pWriter     
1c6f0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f       /* Writer o
1c700 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 2f 2a  bject */.){.  /*
1c710 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e   If there were n
1c720 6f 20 72 6f 77 69 64 73 20 6f 6e 20 74 68 65 20  o rowids on the 
1c730 6c 65 61 66 20 70 61 67 65 20 65 69 74 68 65 72  leaf page either
1c740 20 61 6e 64 20 74 68 65 20 64 6f 63 6c 69 73 74   and the doclist
1c750 2d 69 6e 64 65 78 0a 20 20 2a 2a 20 68 61 73 20  -index.  ** has 
1c760 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 74 61  already been sta
1c770 72 74 65 64 2c 20 61 70 70 65 6e 64 20 61 6e 20  rted, append an 
1c780 30 78 30 30 20 62 79 74 65 20 74 6f 20 69 74 2e  0x00 byte to it.
1c790 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74    */.  if( pWrit
1c7a0 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
1c7b0 6e 50 61 67 65 20 26 26 20 70 57 72 69 74 65 72  nPage && pWriter
1c7c0 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e  ->aDlidx[0].buf.
1c7d0 6e 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35 44  n>0 ){.    Fts5D
1c7e0 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69  lidxWriter *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 30 5d 3b 0a 20 20 20 20 61 73  Dlidx[0];.    as
1c810 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 62 50  sert( pDlidx->bP
1c820 72 65 76 56 61 6c 69 64 20 29 3b 0a 20 20 20 20  revValid );.    
1c830 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1c840 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1c850 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62  ->rc, &pDlidx->b
1c860 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  uf, 0);.  }..  /
1c870 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
1c880 22 6e 75 6d 62 65 72 20 6f 66 20 73 65 71 75 65  "number of seque
1c890 6e 74 69 61 6c 20 6c 65 61 76 65 73 20 77 69 74  ntial leaves wit
1c8a0 68 6f 75 74 20 61 20 74 65 72 6d 22 20 63 6f 75  hout a term" cou
1c8b0 6e 74 65 72 2e 20 2a 2f 0a 20 20 70 57 72 69 74  nter. */.  pWrit
1c8c0 65 72 2d 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a  er->nEmpty++;.}.
1c8d0 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35  .static i64 fts5
1c8e0 44 6c 69 64 78 45 78 74 72 61 63 74 46 69 72 73  DlidxExtractFirs
1c8f0 74 52 6f 77 69 64 28 46 74 73 35 42 75 66 66 65  tRowid(Fts5Buffe
1c900 72 20 2a 70 42 75 66 29 7b 0a 20 20 69 36 34 20  r *pBuf){.  i64 
1c910 69 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 69 4f  iRowid;.  int iO
1c920 66 66 3b 0a 0a 20 20 69 4f 66 66 20 3d 20 31 20  ff;..  iOff = 1 
1c930 2b 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  + fts5GetVarint(
1c940 26 70 42 75 66 2d 3e 70 5b 31 5d 2c 20 28 75 36  &pBuf->p[1], (u6
1c950 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 66  4*)&iRowid);.  f
1c960 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 42  ts5GetVarint(&pB
1c970 75 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  uf->p[iOff], (u6
1c980 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 72  4*)&iRowid);.  r
1c990 65 74 75 72 6e 20 69 52 6f 77 69 64 3b 0a 7d 0a  eturn iRowid;.}.
1c9a0 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64 20 69 52 6f  ./*.** Rowid iRo
1c9b0 77 69 64 20 68 61 73 20 6a 75 73 74 20 62 65 65  wid has just bee
1c9c0 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  n appended to th
1c9d0 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70  e current leaf p
1c9e0 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 0a 2a  age. It is the.*
1c9f0 2a 20 66 69 72 73 74 20 6f 6e 20 74 68 65 20 70  * first on the p
1ca00 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
1ca10 6f 6e 20 61 70 70 65 6e 64 73 20 61 6e 20 61 70  on appends an ap
1ca20 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 79 20  propriate entry 
1ca30 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  to the current.*
1ca40 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e  * doclist-index.
1ca50 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ca60 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70  fts5WriteDlidxAp
1ca70 70 65 6e 64 28 0a 20 20 46 74 73 35 49 6e 64 65  pend(.  Fts5Inde
1ca80 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
1ca90 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
1caa0 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29   .  i64 iRowid.)
1cab0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
1cac0 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66   bDone = 0;..  f
1cad0 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53  or(i=0; p->rc==S
1cae0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e  QLITE_OK && bDon
1caf0 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  e==0; i++){.    
1cb00 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 46 74  i64 iVal;.    Ft
1cb10 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70  s5DlidxWriter *p
1cb20 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72  Dlidx = &pWriter
1cb30 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 0a 20 20  ->aDlidx[i];..  
1cb40 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75    if( pDlidx->bu
1cb50 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d  f.n>=p->pConfig-
1cb60 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 2f  >pgsz ){.      /
1cb70 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 64 6f  * The current do
1cb80 63 6c 69 73 74 2d 69 6e 64 65 78 20 70 61 67 65  clist-index page
1cb90 20 69 73 20 66 75 6c 6c 2e 20 57 72 69 74 65 20   is full. Write 
1cba0 69 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 70  it to disk and p
1cbb0 75 73 68 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  ush.      ** a c
1cbc0 6f 70 79 20 6f 66 20 69 52 6f 77 69 64 20 28 77  opy of iRowid (w
1cbd0 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65  hich will become
1cbe0 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
1cbf0 20 6f 6e 20 74 68 65 20 6e 65 78 74 0a 20 20 20   on the next.   
1cc00 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e     ** doclist-in
1cc10 64 65 78 20 6c 65 61 66 20 70 61 67 65 29 20 75  dex leaf page) u
1cc20 70 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74 20  p into the next 
1cc30 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 62 2d 74  level of the b-t
1cc40 72 65 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 69  ree .      ** hi
1cc50 65 72 61 72 63 68 79 2e 20 49 66 20 74 68 65 20  erarchy. If the 
1cc60 6e 6f 64 65 20 62 65 69 6e 67 20 66 6c 75 73 68  node being flush
1cc70 65 64 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ed is currently 
1cc80 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2c 0a 20  the root node,. 
1cc90 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 70 75 73       ** also pus
1cca0 68 20 69 74 73 20 66 69 72 73 74 20 72 6f 77 69  h its first rowi
1ccb0 64 20 75 70 77 61 72 64 73 2e 20 2a 2f 0a 20 20  d upwards. */.  
1ccc0 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e      pDlidx->buf.
1ccd0 70 5b 30 5d 20 3d 20 30 78 30 31 3b 20 20 20 20  p[0] = 0x01;    
1cce0 2f 2a 20 4e 6f 74 20 74 68 65 20 72 6f 6f 74 20  /* Not the root 
1ccf0 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 66 74  node */.      ft
1cd00 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a  s5DataWrite(p, .
1cd10 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44            FTS5_D
1cd20 4c 49 44 58 5f 52 4f 57 49 44 28 70 57 72 69 74  LIDX_ROWID(pWrit
1cd30 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70  er->iSegid, i, p
1cd40 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20  Dlidx->pgno),.  
1cd50 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e          pDlidx->
1cd60 62 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62  buf.p, pDlidx->b
1cd70 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20  uf.n.      );.  
1cd80 20 20 20 20 66 74 73 35 57 72 69 74 65 44 6c 69      fts5WriteDli
1cd90 64 78 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65  dxGrow(p, pWrite
1cda0 72 2c 20 69 2b 32 29 3b 0a 20 20 20 20 20 20 70  r, i+2);.      p
1cdb0 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72  Dlidx = &pWriter
1cdc0 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20  ->aDlidx[i];.   
1cdd0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1cde0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 6c 69 64  LITE_OK && pDlid
1cdf0 78 5b 31 5d 2e 62 75 66 2e 6e 3d 3d 30 20 29 7b  x[1].buf.n==0 ){
1ce00 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 46 69  .        i64 iFi
1ce10 72 73 74 20 3d 20 66 74 73 35 44 6c 69 64 78 45  rst = fts5DlidxE
1ce20 78 74 72 61 63 74 46 69 72 73 74 52 6f 77 69 64  xtractFirstRowid
1ce30 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a  (&pDlidx->buf);.
1ce40 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
1ce50 20 77 61 73 20 74 68 65 20 72 6f 6f 74 20 6e 6f   was the root no
1ce60 64 65 2e 20 50 75 73 68 20 69 74 73 20 66 69 72  de. Push its fir
1ce70 73 74 20 72 6f 77 69 64 20 75 70 20 74 6f 20 74  st rowid up to t
1ce80 68 65 20 6e 65 77 20 72 6f 6f 74 2e 20 2a 2f 0a  he new root. */.
1ce90 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31          pDlidx[1
1cea0 5d 2e 70 67 6e 6f 20 3d 20 70 44 6c 69 64 78 2d  ].pgno = pDlidx-
1ceb0 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73  >pgno;.        s
1cec0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1ced0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1cee0 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e  >rc, &pDlidx[1].
1cef0 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  buf, 0);.       
1cf00 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1cf10 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1cf20 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31  p->rc, &pDlidx[1
1cf30 5d 2e 62 75 66 2c 20 70 44 6c 69 64 78 2d 3e 70  ].buf, pDlidx->p
1cf40 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71  gno);.        sq
1cf50 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1cf60 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1cf70 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62  rc, &pDlidx[1].b
1cf80 75 66 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20  uf, iFirst);.   
1cf90 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 62       pDlidx[1].b
1cfa0 50 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20  PrevValid = 1;. 
1cfb0 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d         pDlidx[1]
1cfc0 2e 69 50 72 65 76 20 3d 20 69 46 69 72 73 74 3b  .iPrev = iFirst;
1cfd0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1cfe0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1cff0 72 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62  rZero(&pDlidx->b
1d000 75 66 29 3b 0a 20 20 20 20 20 20 70 44 6c 69 64  uf);.      pDlid
1d010 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20  x->bPrevValid = 
1d020 30 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d  0;.      pDlidx-
1d030 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c  >pgno++;.    }el
1d040 73 65 7b 0a 20 20 20 20 20 20 62 44 6f 6e 65 20  se{.      bDone 
1d050 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
1d060 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 50 72 65  if( pDlidx->bPre
1d070 76 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20  vValid ){.      
1d080 69 56 61 6c 20 3d 20 69 52 6f 77 69 64 20 2d 20  iVal = iRowid - 
1d090 70 44 6c 69 64 78 2d 3e 69 50 72 65 76 3b 0a 20  pDlidx->iPrev;. 
1d0a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d0b0 69 36 34 20 69 50 67 6e 6f 20 3d 20 28 69 3d 3d  i64 iPgno = (i==
1d0c0 30 20 3f 20 70 57 72 69 74 65 72 2d 3e 77 72 69  0 ? pWriter->wri
1d0d0 74 65 72 2e 70 67 6e 6f 20 3a 20 70 44 6c 69 64  ter.pgno : pDlid
1d0e0 78 5b 2d 31 5d 2e 70 67 6e 6f 29 3b 0a 20 20 20  x[-1].pgno);.   
1d0f0 20 20 20 61 73 73 65 72 74 28 20 70 44 6c 69 64     assert( pDlid
1d100 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20  x->buf.n==0 );. 
1d110 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1d120 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1d130 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69  nt(&p->rc, &pDli
1d140 64 78 2d 3e 62 75 66 2c 20 21 62 44 6f 6e 65 29  dx->buf, !bDone)
1d150 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
1d160 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1d170 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
1d180 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69 50 67 6e  Dlidx->buf, iPgn
1d190 6f 29 3b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d  o);.      iVal =
1d1a0 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 0a   iRowid;.    }..
1d1b0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
1d1c0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1d1d0 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
1d1e0 78 2d 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20  x->buf, iVal);. 
1d1f0 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76     pDlidx->bPrev
1d200 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 70  Valid = 1;.    p
1d210 44 6c 69 64 78 2d 3e 69 50 72 65 76 20 3d 20 69  Dlidx->iPrev = i
1d220 52 6f 77 69 64 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  Rowid;.  }.}..st
1d230 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1d240 69 74 65 46 6c 75 73 68 4c 65 61 66 28 46 74 73  iteFlushLeaf(Fts
1d250 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
1d260 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
1d270 72 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  r){.  static con
1d280 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b  st u8 zero[] = {
1d290 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
1d2a0 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20 46 74 73  0, 0x00 };.  Fts
1d2b0 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61  5PageWriter *pPa
1d2c0 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77  ge = &pWriter->w
1d2d0 72 69 74 65 72 3b 0a 20 20 69 36 34 20 69 52 6f  riter;.  i64 iRo
1d2e0 77 69 64 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74  wid;..static int
1d2f0 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a 6e 43 61 6c   nCall = 0;.nCal
1d300 6c 2b 2b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  l++;..  assert( 
1d310 28 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d  (pPage->pgidx.n=
1d320 3d 30 29 3d 3d 28 70 57 72 69 74 65 72 2d 3e 62  =0)==(pWriter->b
1d330 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 29  FirstTermInPage)
1d340 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
1d350 65 20 73 7a 4c 65 61 66 20 68 65 61 64 65 72 20  e szLeaf header 
1d360 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 61 73 73 65  field. */.  asse
1d370 72 74 28 20 30 3d 3d 66 74 73 35 47 65 74 55 31  rt( 0==fts5GetU1
1d380 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b  6(&pPage->buf.p[
1d390 32 5d 29 20 29 3b 0a 20 20 66 74 73 35 50 75 74  2]) );.  fts5Put
1d3a0 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e  U16(&pPage->buf.
1d3b0 70 5b 32 5d 2c 20 28 75 31 36 29 70 50 61 67 65  p[2], (u16)pPage
1d3c0 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 69 66 28  ->buf.n);..  if(
1d3d0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1d3e0 54 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20 20  TermInPage ){.  
1d3f0 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77 61 73    /* No term was
1d400 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73   written to this
1d410 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
1d420 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 69  sert( pPage->pgi
1d430 64 78 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 66  dx.n==0 );.    f
1d440 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54  ts5WriteBtreeNoT
1d450 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 29 3b  erm(p, pWriter);
1d460 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1d470 20 41 70 70 65 6e 64 20 74 68 65 20 70 67 69 64   Append the pgid
1d480 78 20 74 6f 20 74 68 65 20 70 61 67 65 20 62 75  x to the page bu
1d490 66 66 65 72 2e 20 53 65 74 20 74 68 65 20 73 7a  ffer. Set the sz
1d4a0 4c 65 61 66 20 68 65 61 64 65 72 20 66 69 65 6c  Leaf header fiel
1d4b0 64 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75  d. */.    fts5Bu
1d4c0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1d4d0 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
1d4e0 75 66 2c 20 70 50 61 67 65 2d 3e 70 67 69 64 78  uf, pPage->pgidx
1d4f0 2e 6e 2c 20 70 50 61 67 65 2d 3e 70 67 69 64 78  .n, pPage->pgidx
1d500 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  .p);.  }..  /* W
1d510 72 69 74 65 20 74 68 65 20 70 61 67 65 20 6f 75  rite the page ou
1d520 74 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69  t to disk */.  i
1d530 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47  Rowid = FTS5_SEG
1d540 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57 72 69 74  MENT_ROWID(pWrit
1d550 65 72 2d 3e 69 53 65 67 69 64 2c 20 70 50 61 67  er->iSegid, pPag
1d560 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 66 74 73 35  e->pgno);.  fts5
1d570 44 61 74 61 57 72 69 74 65 28 70 2c 20 69 52 6f  DataWrite(p, iRo
1d580 77 69 64 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  wid, pPage->buf.
1d590 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29  p, pPage->buf.n)
1d5a0 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
1d5b0 7a 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ze the next page
1d5c0 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65  . */.  fts5Buffe
1d5d0 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 62 75  rZero(&pPage->bu
1d5e0 66 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  f);.  fts5Buffer
1d5f0 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 70 67 69  Zero(&pPage->pgi
1d600 64 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  dx);.  fts5Buffe
1d610 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
1d620 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
1d630 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 70 50 61   4, zero);.  pPa
1d640 67 65 2d 3e 69 50 72 65 76 50 67 69 64 78 20 3d  ge->iPrevPgidx =
1d650 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e   0;.  pPage->pgn
1d660 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  o++;..  /* Incre
1d670 61 73 65 20 74 68 65 20 6c 65 61 76 65 73 20 77  ase the leaves w
1d680 72 69 74 74 65 6e 20 63 6f 75 6e 74 65 72 20 2a  ritten counter *
1d690 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65  /.  pWriter->nLe
1d6a0 61 66 57 72 69 74 74 65 6e 2b 2b 3b 0a 0a 20 20  afWritten++;..  
1d6b0 2f 2a 20 54 68 65 20 6e 65 77 20 6c 65 61 66 20  /* The new leaf 
1d6c0 68 6f 6c 64 73 20 6e 6f 20 74 65 72 6d 73 20 6f  holds no terms o
1d6d0 72 20 72 6f 77 69 64 73 20 2a 2f 0a 20 20 70 57  r rowids */.  pW
1d6e0 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
1d6f0 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 70  mInPage = 1;.  p
1d700 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
1d710 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a 7d  widInPage = 1;.}
1d720 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74  ../*.** Append t
1d730 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20  erm pTerm/nTerm 
1d740 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62  to the segment b
1d750 65 69 6e 67 20 77 72 69 74 74 65 6e 20 62 79 20  eing written by 
1d760 74 68 65 20 77 72 69 74 65 72 20 70 61 73 73 65  the writer passe
1d770 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f  d.** as the seco
1d780 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
1d790 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1d7a0 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46  ccurs, set the F
1d7b0 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f  ts5Index.rc erro
1d7c0 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72  r code. If an er
1d7d0 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65  ror has .** alre
1d7e0 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
1d7f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1d800 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
1d810 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
1d820 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 46 74  AppendTerm(.  Ft
1d830 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
1d840 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
1d850 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 54 65  riter,.  int nTe
1d860 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  rm, const u8 *pT
1d870 65 72 6d 20 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  erm .){.  int nP
1d880 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  refix;          
1d890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
1d8a0 65 73 20 6f 66 20 70 72 65 66 69 78 20 63 6f 6d  es of prefix com
1d8b0 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 65 72  pression for ter
1d8c0 6d 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57  m */.  Fts5PageW
1d8d0 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26  riter *pPage = &
1d8e0 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b  pWriter->writer;
1d8f0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
1d900 50 67 69 64 78 20 3d 20 26 70 57 72 69 74 65 72  Pgidx = &pWriter
1d910 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78 3b 0a  ->writer.pgidx;.
1d920 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
1d930 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
1d940 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
1d950 62 75 66 2e 6e 3e 3d 34 20 29 3b 0a 20 20 61 73  buf.n>=4 );.  as
1d960 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75 66  sert( pPage->buf
1d970 2e 6e 3e 34 20 7c 7c 20 70 57 72 69 74 65 72 2d  .n>4 || pWriter-
1d980 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  >bFirstTermInPag
1d990 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e );..  /* If th
1d9a0 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70  e current leaf p
1d9b0 61 67 65 20 69 73 20 66 75 6c 6c 2c 20 66 6c 75  age is full, flu
1d9c0 73 68 20 69 74 20 74 6f 20 64 69 73 6b 2e 20 2a  sh it to disk. *
1d9d0 2f 0a 20 20 69 66 28 20 28 70 50 61 67 65 2d 3e  /.  if( (pPage->
1d9e0 62 75 66 2e 6e 20 2b 20 70 50 67 69 64 78 2d 3e  buf.n + pPgidx->
1d9f0 6e 20 2b 20 6e 54 65 72 6d 20 2b 20 32 29 3e 3d  n + nTerm + 2)>=
1da00 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a  p->pConfig->pgsz
1da10 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
1da20 65 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20  e->buf.n>4 ){.  
1da30 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
1da40 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65  shLeaf(p, pWrite
1da50 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  r);.    }.    ft
1da60 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d  s5BufferGrow(&p-
1da70 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
1da80 2c 20 6e 54 65 72 6d 2b 46 54 53 35 5f 44 41 54  , nTerm+FTS5_DAT
1da90 41 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 7d 0a  A_PADDING);.  }.
1daa0 20 20 0a 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 55    .  /* TODO1: U
1dab0 70 64 61 74 69 6e 67 20 70 67 69 64 78 20 68 65  pdating pgidx he
1dac0 72 65 2e 20 2a 2f 0a 20 20 70 50 67 69 64 78 2d  re. */.  pPgidx-
1dad0 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  >n += sqlite3Fts
1dae0 35 50 75 74 56 61 72 69 6e 74 28 0a 20 20 20 20  5PutVarint(.    
1daf0 20 20 26 70 50 67 69 64 78 2d 3e 70 5b 70 50 67    &pPgidx->p[pPg
1db00 69 64 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e  idx->n], pPage->
1db10 62 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 69  buf.n - pPage->i
1db20 50 72 65 76 50 67 69 64 78 0a 20 20 29 3b 0a 20  PrevPgidx.  );. 
1db30 20 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69   pPage->iPrevPgi
1db40 64 78 20 3d 20 70 50 61 67 65 2d 3e 62 75 66 2e  dx = pPage->buf.
1db50 6e 3b 0a 23 69 66 20 30 0a 20 20 66 74 73 35 50  n;.#if 0.  fts5P
1db60 75 74 55 31 36 28 26 70 50 67 69 64 78 2d 3e 70  utU16(&pPgidx->p
1db70 5b 70 50 67 69 64 78 2d 3e 6e 5d 2c 20 70 50 61  [pPgidx->n], pPa
1db80 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 70 50  ge->buf.n);.  pP
1db90 67 69 64 78 2d 3e 6e 20 2b 3d 20 32 3b 0a 23 65  gidx->n += 2;.#e
1dba0 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 57 72 69  ndif..  if( pWri
1dbb0 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49  ter->bFirstTermI
1dbc0 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 6e 50 72  nPage ){.    nPr
1dbd0 65 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 69 66  efix = 0;.    if
1dbe0 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 31  ( pPage->pgno!=1
1dbf0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
1dc00 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  s is the first t
1dc10 65 72 6d 20 6f 6e 20 61 20 6c 65 61 66 20 74 68  erm on a leaf th
1dc20 61 74 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 65  at is not the le
1dc30 66 74 6d 6f 73 74 20 6c 65 61 66 20 69 6e 0a 20  ftmost leaf in. 
1dc40 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 67 6d       ** the segm
1dc50 65 6e 74 20 62 2d 74 72 65 65 2e 20 49 6e 20 74  ent b-tree. In t
1dc60 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
1dc70 65 63 65 73 73 61 72 79 20 74 6f 20 61 64 64 20  ecessary to add 
1dc80 61 20 74 65 72 6d 20 74 6f 0a 20 20 20 20 20 20  a term to.      
1dc90 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 68 69  ** the b-tree hi
1dca0 65 72 61 72 63 68 79 20 74 68 61 74 20 69 73 20  erarchy that is 
1dcb0 28 61 29 20 6c 61 72 67 65 72 20 74 68 61 6e 20  (a) larger than 
1dcc0 74 68 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d  the largest term
1dcd0 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61   .      ** alrea
1dce0 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  dy written to th
1dcf0 65 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 28 62  e segment and (b
1dd00 29 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f  ) smaller than o
1dd10 72 20 65 71 75 61 6c 20 74 6f 0a 20 20 20 20 20  r equal to.     
1dd20 20 2a 2a 20 74 68 69 73 20 74 65 72 6d 2e 20 49   ** this term. I
1dd30 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61  n other words, a
1dd40 20 70 72 65 66 69 78 20 6f 66 20 28 70 54 65 72   prefix of (pTer
1dd50 6d 2f 6e 54 65 72 6d 29 20 74 68 61 74 20 69 73  m/nTerm) that is
1dd60 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 62 79   one.      ** by
1dd70 74 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74  te longer than t
1dd80 68 65 20 6c 6f 6e 67 65 73 74 20 70 72 65 66 69  he longest prefi
1dd90 78 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20  x (pTerm/nTerm) 
1dda0 73 68 61 72 65 73 20 77 69 74 68 20 74 68 65 0a  shares with the.
1ddb0 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
1ddc0 73 20 74 65 72 6d 2e 20 0a 20 20 20 20 20 20 2a  s term. .      *
1ddd0 2a 0a 20 20 20 20 20 20 2a 2a 20 55 73 75 61 6c  *.      ** Usual
1dde0 6c 79 2c 20 74 68 65 20 70 72 65 76 69 6f 75 73  ly, the previous
1ddf0 20 74 65 72 6d 20 69 73 20 61 76 61 69 6c 61 62   term is availab
1de00 6c 65 20 69 6e 20 70 50 61 67 65 2d 3e 74 65 72  le in pPage->ter
1de10 6d 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  m. The exception
1de20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 69 66 20  .      ** is if 
1de30 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1de40 74 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20 69  t term written i
1de50 6e 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  n an incremental
1de60 2d 6d 65 72 67 65 20 73 74 65 70 2e 0a 20 20 20  -merge step..   
1de70 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
1de80 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
1de90 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 76 61 69  term is not avai
1dea0 6c 61 62 6c 65 2c 20 73 6f 20 6a 75 73 74 20 77  lable, so just w
1deb0 72 69 74 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  rite a.      ** 
1dec0 63 6f 70 79 20 6f 66 20 28 70 54 65 72 6d 2f 6e  copy of (pTerm/n
1ded0 54 65 72 6d 29 20 69 6e 74 6f 20 74 68 65 20 70  Term) into the p
1dee0 61 72 65 6e 74 20 6e 6f 64 65 2e 20 54 68 69 73  arent node. This
1def0 20 69 73 20 73 6c 69 67 68 74 6c 79 0a 20 20 20   is slightly.   
1df00 20 20 20 2a 2a 20 69 6e 65 66 66 69 63 69 65 6e     ** inefficien
1df10 74 2c 20 62 75 74 20 73 74 69 6c 6c 20 63 6f 72  t, but still cor
1df20 72 65 63 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20  rect.  */.      
1df30 69 6e 74 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20  int n = nTerm;. 
1df40 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
1df50 74 65 72 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20  term.n ){.      
1df60 20 20 6e 20 3d 20 31 20 2b 20 66 74 73 35 50 72    n = 1 + fts5Pr
1df70 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50 61  efixCompress(pPa
1df80 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67  ge->term.n, pPag
1df90 65 2d 3e 74 65 72 6d 2e 70 2c 20 70 54 65 72 6d  e->term.p, pTerm
1dfa0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1dfb0 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 54   fts5WriteBtreeT
1dfc0 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 2c 20  erm(p, pWriter, 
1dfd0 6e 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  n, pTerm);.     
1dfe0 20 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65   pPage = &pWrite
1dff0 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 20 20 7d  r->writer;.    }
1e000 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50  .  }else{.    nP
1e010 72 65 66 69 78 20 3d 20 66 74 73 35 50 72 65 66  refix = fts5Pref
1e020 69 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65  ixCompress(pPage
1e030 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d  ->term.n, pPage-
1e040 3e 74 65 72 6d 2e 70 2c 20 70 54 65 72 6d 29 3b  >term.p, pTerm);
1e050 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
1e060 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1e070 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
1e080 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a 0a   nPrefix);.  }..
1e090 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
1e0a0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1e0b0 6f 66 20 6e 65 77 20 64 61 74 61 2c 20 74 68 65  of new data, the
1e0c0 6e 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 20  n the term data 
1e0d0 69 74 73 65 6c 66 0a 20 20 2a 2a 20 74 6f 20 74  itself.  ** to t
1e0e0 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74  he page. */.  ft
1e0f0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1e100 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
1e110 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20  age->buf, nTerm 
1e120 2d 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 66 74  - nPrefix);.  ft
1e130 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1e140 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  ob(&p->rc, &pPag
1e150 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20  e->buf, nTerm - 
1e160 6e 50 72 65 66 69 78 2c 20 26 70 54 65 72 6d 5b  nPrefix, &pTerm[
1e170 6e 50 72 65 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a  nPrefix]);..  /*
1e180 20 55 70 64 61 74 65 20 74 68 65 20 46 74 73 35   Update the Fts5
1e190 50 61 67 65 57 72 69 74 65 72 2e 74 65 72 6d 20  PageWriter.term 
1e1a0 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 66 74 73 35  field. */.  fts5
1e1b0 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
1e1c0 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20  , &pPage->term, 
1e1d0 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
1e1e0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1e1f0 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 30 3b 0a  TermInPage = 0;.
1e200 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  .  pWriter->bFir
1e210 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20  stRowidInPage = 
1e220 30 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46  0;.  pWriter->bF
1e230 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69  irstRowidInDocli
1e240 73 74 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72  st = 1;..  asser
1e250 74 28 20 70 2d 3e 72 63 20 7c 7c 20 28 70 57 72  t( p->rc || (pWr
1e260 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26  iter->nDlidx>0 &
1e270 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  & pWriter->aDlid
1e280 78 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30 29 20 29  x[0].buf.n==0) )
1e290 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c  ;.  pWriter->aDl
1e2a0 69 64 78 5b 30 5d 2e 70 67 6e 6f 20 3d 20 70 50  idx[0].pgno = pP
1e2b0 61 67 65 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  age->pgno;.}../*
1e2c0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 6f 77  .** Append a row
1e2d0 69 64 20 61 6e 64 20 70 6f 73 69 74 69 6f 6e 2d  id and position-
1e2e0 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20  list size field 
1e2f0 74 6f 20 74 68 65 20 77 72 69 74 65 72 73 20 6f  to the writers o
1e300 75 74 70 75 74 2e 20 0a 2a 2f 0a 73 74 61 74 69  utput. .*/.stati
1e310 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
1e320 41 70 70 65 6e 64 52 6f 77 69 64 28 0a 20 20 46  AppendRowid(.  F
1e330 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1e340 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1e350 57 72 69 74 65 72 2c 0a 20 20 69 36 34 20 69 52  Writer,.  i64 iR
1e360 6f 77 69 64 0a 29 7b 0a 20 20 69 66 28 20 70 2d  owid.){.  if( p-
1e370 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1e380 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65 57 72  {.    Fts5PageWr
1e390 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70  iter *pPage = &p
1e3a0 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a  Writer->writer;.
1e3b0 0a 20 20 20 20 69 66 28 20 28 70 50 61 67 65 2d  .    if( (pPage-
1e3c0 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e  >buf.n + pPage->
1e3d0 70 67 69 64 78 2e 6e 29 3e 3d 70 2d 3e 70 43 6f  pgidx.n)>=p->pCo
1e3e0 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20  nfig->pgsz ){.  
1e3f0 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
1e400 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65  shLeaf(p, pWrite
1e410 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
1e420 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 6f 20  * If this is to 
1e430 62 65 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  be the first row
1e440 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  id written to th
1e450 65 20 70 61 67 65 2c 20 73 65 74 20 74 68 65 20  e page, set the 
1e460 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64 2d 70 6f  .    ** rowid-po
1e470 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67  inter in the pag
1e480 65 2d 68 65 61 64 65 72 2e 20 41 6c 73 6f 20 61  e-header. Also a
1e490 70 70 65 6e 64 20 61 20 76 61 6c 75 65 20 74 6f  ppend a value to
1e4a0 20 74 68 65 20 64 6c 69 64 78 0a 20 20 20 20 2a   the dlidx.    *
1e4b0 2a 20 62 75 66 66 65 72 2c 20 69 6e 20 63 61 73  * buffer, in cas
1e4c0 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  e a doclist-inde
1e4d0 78 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20  x is required.  
1e4e0 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72 69 74  */.    if( pWrit
1e4f0 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
1e500 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66  nPage ){.      f
1e510 74 73 35 50 75 74 55 31 36 28 70 50 61 67 65 2d  ts5PutU16(pPage-
1e520 3e 62 75 66 2e 70 2c 20 28 75 31 36 29 70 50 61  >buf.p, (u16)pPa
1e530 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20  ge->buf.n);.    
1e540 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78    fts5WriteDlidx
1e550 41 70 70 65 6e 64 28 70 2c 20 70 57 72 69 74 65  Append(p, pWrite
1e560 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r, iRowid);.    
1e570 7d 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  }..    /* Write 
1e580 74 68 65 20 72 6f 77 69 64 2e 20 2a 2f 0a 20 20  the rowid. */.  
1e590 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
1e5a0 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c  FirstRowidInDocl
1e5b0 69 73 74 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e  ist || pWriter->
1e5c0 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
1e5d0 65 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42  e ){.      fts5B
1e5e0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1e5f0 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
1e600 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a  ->buf, iRowid);.
1e610 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e620 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c   assert( p->rc |
1e630 7c 20 69 52 6f 77 69 64 3e 70 57 72 69 74 65 72  | iRowid>pWriter
1e640 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 29 3b 0a  ->iPrevRowid );.
1e650 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1e660 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1e670 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
1e680 2c 20 69 52 6f 77 69 64 20 2d 20 70 57 72 69 74  , iRowid - pWrit
1e690 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 29 3b  er->iPrevRowid);
1e6a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 72 69 74  .    }.    pWrit
1e6b0 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 3d  er->iPrevRowid =
1e6c0 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 70 57 72   iRowid;.    pWr
1e6d0 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
1e6e0 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b 0a  dInDoclist = 0;.
1e6f0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69      pWriter->bFi
1e700 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d  rstRowidInPage =
1e710 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   0;.  }.}..stati
1e720 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
1e730 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 44 61 74  AppendPoslistDat
1e740 61 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  a(.  Fts5Index *
1e750 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
1e760 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20  ter *pWriter, . 
1e770 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
1e780 2c 20 0a 20 20 69 6e 74 20 6e 44 61 74 61 0a 29  , .  int nData.)
1e790 7b 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74  {.  Fts5PageWrit
1e7a0 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72  er *pPage = &pWr
1e7b0 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20  iter->writer;.  
1e7c0 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 61 44  const u8 *a = aD
1e7d0 61 74 61 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 6e  ata;.  int n = n
1e7e0 44 61 74 61 3b 0a 20 20 0a 20 20 61 73 73 65 72  Data;.  .  asser
1e7f0 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  t( p->pConfig->p
1e800 67 73 7a 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65  gsz>0 );.  while
1e810 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1e820 4f 4b 20 0a 20 20 20 20 20 26 26 20 28 70 50 61  OK .     && (pPa
1e830 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67  ge->buf.n + pPag
1e840 65 2d 3e 70 67 69 64 78 2e 6e 20 2b 20 6e 29 3e  e->pgidx.n + n)>
1e850 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73  =p->pConfig->pgs
1e860 7a 20 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  z .  ){.    int 
1e870 6e 52 65 71 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nReq = p->pConfi
1e880 67 2d 3e 70 67 73 7a 20 2d 20 70 50 61 67 65 2d  g->pgsz - pPage-
1e890 3e 62 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e  >buf.n - pPage->
1e8a0 70 67 69 64 78 2e 6e 3b 0a 20 20 20 20 69 6e 74  pgidx.n;.    int
1e8b0 20 6e 43 6f 70 79 20 3d 20 30 3b 0a 20 20 20 20   nCopy = 0;.    
1e8c0 77 68 69 6c 65 28 20 6e 43 6f 70 79 3c 6e 52 65  while( nCopy<nRe
1e8d0 71 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 64  q ){.      i64 d
1e8e0 75 6d 6d 79 3b 0a 20 20 20 20 20 20 6e 43 6f 70  ummy;.      nCop
1e8f0 79 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  y += fts5GetVari
1e900 6e 74 28 26 61 5b 6e 43 6f 70 79 5d 2c 20 28 75  nt(&a[nCopy], (u
1e910 36 34 2a 29 26 64 75 6d 6d 79 29 3b 0a 20 20 20  64*)&dummy);.   
1e920 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65   }.    fts5Buffe
1e930 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
1e940 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
1e950 20 6e 43 6f 70 79 2c 20 61 29 3b 0a 20 20 20 20   nCopy, a);.    
1e960 61 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  a += nCopy;.    
1e970 6e 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  n -= nCopy;.    
1e980 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
1e990 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  af(p, pWriter);.
1e9a0 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b    }.  if( n>0 ){
1e9b0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
1e9c0 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1e9d0 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
1e9e0 2c 20 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , a);.  }.}../*.
1e9f0 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74  ** Flush any dat
1ea00 61 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20  a cached by the 
1ea10 77 72 69 74 65 72 20 6f 62 6a 65 63 74 20 74 6f  writer object to
1ea20 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 46   the database. F
1ea30 72 65 65 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63  ree any.** alloc
1ea40 61 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65  ations associate
1ea50 64 20 77 69 74 68 20 74 68 65 20 77 72 69 74 65  d with the write
1ea60 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
1ea70 64 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73  d fts5WriteFinis
1ea80 68 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  h(.  Fts5Index *
1ea90 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
1eaa0 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20  ter *pWriter,   
1eab0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20        /* Writer 
1eac0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
1ead0 2a 70 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20  *pnLeaf         
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1eaf0 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65  UT: Number of le
1eb00 61 66 20 70 61 67 65 73 20 69 6e 20 62 2d 74 72  af pages in b-tr
1eb10 65 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ee */.){.  int i
1eb20 3b 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74  ;.  Fts5PageWrit
1eb30 65 72 20 2a 70 4c 65 61 66 20 3d 20 26 70 57 72  er *pLeaf = &pWr
1eb40 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20  iter->writer;.  
1eb50 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1eb60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
1eb70 72 74 28 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 3e  rt( pLeaf->pgno>
1eb80 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  =1 );.    if( pL
1eb90 65 61 66 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a  eaf->buf.n>4 ){.
1eba0 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46        fts5WriteF
1ebb0 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69  lushLeaf(p, pWri
1ebc0 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ter);.    }.    
1ebd0 2a 70 6e 4c 65 61 66 20 3d 20 70 4c 65 61 66 2d  *pnLeaf = pLeaf-
1ebe0 3e 70 67 6e 6f 2d 31 3b 0a 20 20 20 20 69 66 28  >pgno-1;.    if(
1ebf0 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 3e 31 20 29   pLeaf->pgno>1 )
1ec00 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  {.      fts5Writ
1ec10 65 46 6c 75 73 68 42 74 72 65 65 28 70 2c 20 70  eFlushBtree(p, p
1ec20 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Writer);.    }. 
1ec30 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72 46   }.  fts5BufferF
1ec40 72 65 65 28 26 70 4c 65 61 66 2d 3e 74 65 72 6d  ree(&pLeaf->term
1ec50 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  );.  fts5BufferF
1ec60 72 65 65 28 26 70 4c 65 61 66 2d 3e 62 75 66 29  ree(&pLeaf->buf)
1ec70 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ;.  fts5BufferFr
1ec80 65 65 28 26 70 4c 65 61 66 2d 3e 70 67 69 64 78  ee(&pLeaf->pgidx
1ec90 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  );.  fts5BufferF
1eca0 72 65 65 28 26 70 57 72 69 74 65 72 2d 3e 62 74  ree(&pWriter->bt
1ecb0 74 65 72 6d 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  term);..  for(i=
1ecc0 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44  0; i<pWriter->nD
1ecd0 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lidx; i++){.    
1ece0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1ecf0 72 46 72 65 65 28 26 70 57 72 69 74 65 72 2d 3e  rFree(&pWriter->
1ed00 61 44 6c 69 64 78 5b 69 5d 2e 62 75 66 29 3b 0a  aDlidx[i].buf);.
1ed10 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
1ed20 65 65 28 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  ee(pWriter->aDli
1ed30 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  dx);.}..static v
1ed40 6f 69 64 20 66 74 73 35 57 72 69 74 65 49 6e 69  oid fts5WriteIni
1ed50 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
1ed60 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
1ed70 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20  ter *pWriter, . 
1ed80 20 69 6e 74 20 69 53 65 67 69 64 0a 29 7b 0a 20   int iSegid.){. 
1ed90 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66 66   const int nBuff
1eda0 65 72 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  er = p->pConfig-
1edb0 3e 70 67 73 7a 20 2b 20 46 54 53 35 5f 44 41 54  >pgsz + FTS5_DAT
1edc0 41 5f 50 41 44 44 49 4e 47 3b 0a 0a 20 20 6d 65  A_PADDING;..  me
1edd0 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20 30 2c  mset(pWriter, 0,
1ede0 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57   sizeof(Fts5SegW
1edf0 72 69 74 65 72 29 29 3b 0a 20 20 70 57 72 69 74  riter));.  pWrit
1ee00 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65  er->iSegid = iSe
1ee10 67 69 64 3b 0a 0a 20 20 66 74 73 35 57 72 69 74  gid;..  fts5Writ
1ee20 65 44 6c 69 64 78 47 72 6f 77 28 70 2c 20 70 57  eDlidxGrow(p, pW
1ee30 72 69 74 65 72 2c 20 31 29 3b 0a 20 20 70 57 72  riter, 1);.  pWr
1ee40 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e  iter->writer.pgn
1ee50 6f 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72  o = 1;.  pWriter
1ee60 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
1ee70 67 65 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65  ge = 1;.  pWrite
1ee80 72 2d 3e 69 42 74 50 61 67 65 20 3d 20 31 3b 0a  r->iBtPage = 1;.
1ee90 0a 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74  .  assert( pWrit
1eea0 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e 6e  er->writer.buf.n
1eeb0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1eec0 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72   pWriter->writer
1eed0 2e 70 67 69 64 78 2e 6e 3d 3d 30 20 29 3b 0a 0a  .pgidx.n==0 );..
1eee0 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 74 77    /* Grow the tw
1eef0 6f 20 62 75 66 66 65 72 73 20 74 6f 20 70 67 73  o buffers to pgs
1ef00 7a 20 2b 20 70 61 64 64 69 6e 67 20 62 79 74 65  z + padding byte
1ef10 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20  s in size. */.  
1ef20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1ef30 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 70  rSize(&p->rc, &p
1ef40 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70  Writer->writer.p
1ef50 67 69 64 78 2c 20 6e 42 75 66 66 65 72 29 3b 0a  gidx, nBuffer);.
1ef60 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1ef70 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20  ferSize(&p->rc, 
1ef80 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  &pWriter->writer
1ef90 2e 62 75 66 2c 20 6e 42 75 66 66 65 72 29 3b 0a  .buf, nBuffer);.
1efa0 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 78 57 72  .  if( p->pIdxWr
1efb0 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46  iter==0 ){.    F
1efc0 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
1efd0 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
1efe0 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 50 72  .    fts5IndexPr
1eff0 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d  epareStmt(p, &p-
1f000 3e 70 49 64 78 57 72 69 74 65 72 2c 20 73 71 6c  >pIdxWriter, sql
1f010 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
1f020 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20          "INSERT 
1f030 49 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f 69 64  INTO '%q'.'%q_id
1f040 78 27 28 73 65 67 69 64 2c 74 65 72 6d 2c 70 67  x'(segid,term,pg
1f050 6e 6f 29 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f  no) VALUES(?,?,?
1f060 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  )", .          p
1f070 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f  Config->zDb, pCo
1f080 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  nfig->zName.    
1f090 29 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  ));.  }..  if( p
1f0a0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1f0b0 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  ){.    /* Initia
1f0c0 6c 69 7a 65 20 74 68 65 20 34 2d 62 79 74 65 20  lize the 4-byte 
1f0d0 6c 65 61 66 2d 70 61 67 65 20 68 65 61 64 65 72  leaf-page header
1f0e0 20 74 6f 20 30 78 30 30 2e 20 2a 2f 0a 20 20 20   to 0x00. */.   
1f0f0 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72 2d   memset(pWriter-
1f100 3e 77 72 69 74 65 72 2e 62 75 66 2e 70 2c 20 30  >writer.buf.p, 0
1f110 2c 20 34 29 3b 0a 20 20 20 20 70 57 72 69 74 65  , 4);.    pWrite
1f120 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e 6e 20  r->writer.buf.n 
1f130 3d 20 34 3b 0a 0a 20 20 20 20 2f 2a 20 42 69 6e  = 4;..    /* Bin
1f140 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 75  d the current ou
1f150 74 70 75 74 20 73 65 67 6d 65 6e 74 20 69 64 20  tput segment id 
1f160 74 6f 20 74 68 65 20 69 6e 64 65 78 2d 77 72 69  to the index-wri
1f170 74 65 72 2e 20 54 68 69 73 20 69 73 20 61 6e 0a  ter. This is an.
1f180 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74      ** optimizat
1f190 69 6f 6e 20 6f 76 65 72 20 62 69 6e 64 69 6e 67  ion over binding
1f1a0 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20   the same value 
1f1b0 6f 76 65 72 20 61 6e 64 20 6f 76 65 72 20 61 73  over and over as
1f1c0 20 72 6f 77 73 20 61 72 65 0a 20 20 20 20 2a 2a   rows are.    **
1f1d0 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 25   inserted into %
1f1e0 5f 69 64 78 20 62 79 20 74 68 65 20 63 75 72 72  _idx by the curr
1f1f0 65 6e 74 20 77 72 69 74 65 72 2e 20 20 2a 2f 0a  ent writer.  */.
1f200 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1f210 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57 72 69 74  _int(p->pIdxWrit
1f220 65 72 2c 20 31 2c 20 70 57 72 69 74 65 72 2d 3e  er, 1, pWriter->
1f230 69 53 65 67 69 64 29 3b 0a 20 20 7d 0a 7d 0a 0a  iSegid);.  }.}..
1f240 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70  /*.** Iterator p
1f250 49 74 65 72 20 77 61 73 20 75 73 65 64 20 74 6f  Iter was used to
1f260 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1f270 20 74 68 65 20 69 6e 70 75 74 20 73 65 67 6d 65   the input segme
1f280 6e 74 73 20 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20  nts of on an.** 
1f290 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67  incremental merg
1f2a0 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69  e operation. Thi
1f2b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1f2c0 6c 6c 65 64 20 69 66 20 74 68 65 20 69 6e 63 72  lled if the incr
1f2d0 65 6d 65 6e 74 61 6c 0a 2a 2a 20 6d 65 72 67 65  emental.** merge
1f2e0 20 73 74 65 70 20 68 61 73 20 66 69 6e 69 73 68   step has finish
1f2f0 65 64 20 62 75 74 20 74 68 65 20 69 6e 70 75 74  ed but the input
1f300 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f   has not been co
1f310 6d 70 6c 65 74 65 6c 79 20 65 78 68 61 75 73 74  mpletely exhaust
1f320 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
1f330 69 64 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65  id fts5TrimSegme
1f340 6e 74 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70  nts(Fts5Index *p
1f350 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  , Fts5Iter *pIte
1f360 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46  r){.  int i;.  F
1f370 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20  ts5Buffer buf;. 
1f380 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c   memset(&buf, 0,
1f390 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
1f3a0 65 72 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  er));.  for(i=0;
1f3b0 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20   i<pIter->nSeg; 
1f3c0 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 65  i++){.    Fts5Se
1f3d0 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
1f3e0 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20  Iter->aSeg[i];. 
1f3f0 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 53 65     if( pSeg->pSe
1f400 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  g==0 ){.      /*
1f410 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65   no-op */.    }e
1f420 6c 73 65 20 69 66 28 20 70 53 65 67 2d 3e 70 4c  lse if( pSeg->pL
1f430 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eaf==0 ){.      
1f440 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 66 72 6f 6d  /* All keys from
1f450 20 74 68 69 73 20 69 6e 70 75 74 20 73 65 67 6d   this input segm
1f460 65 6e 74 20 68 61 76 65 20 62 65 65 6e 20 74 72  ent have been tr
1f470 61 6e 73 66 65 72 65 64 20 74 6f 20 74 68 65 20  ansfered to the 
1f480 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2a  output..      **
1f490 20 53 65 74 20 62 6f 74 68 20 74 68 65 20 66 69   Set both the fi
1f4a0 72 73 74 20 61 6e 64 20 6c 61 73 74 20 70 61 67  rst and last pag
1f4b0 65 2d 6e 75 6d 62 65 72 73 20 74 6f 20 30 20 74  e-numbers to 0 t
1f4c0 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
1f4d0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67  the.      ** seg
1f4e0 6d 65 6e 74 20 69 73 20 6e 6f 77 20 65 6d 70 74  ment is now empt
1f4f0 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 53 65 67  y. */.      pSeg
1f500 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  ->pSeg->pgnoLast
1f510 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 67   = 0;.      pSeg
1f520 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  ->pSeg->pgnoFirs
1f530 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
1f540 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66  {.      int iOff
1f550 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65   = pSeg->iTermLe
1f560 61 66 4f 66 66 73 65 74 3b 20 20 20 20 20 2f 2a  afOffset;     /*
1f570 20 4f 66 66 73 65 74 20 6f 6e 20 6e 65 77 20 66   Offset on new f
1f580 69 72 73 74 20 6c 65 61 66 20 70 61 67 65 20 2a  irst leaf page *
1f590 2f 0a 20 20 20 20 20 20 69 36 34 20 69 4c 65 61  /.      i64 iLea
1f5a0 66 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 46 74  fRowid;.      Ft
1f5b0 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20  s5Data *pData;. 
1f5c0 20 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70       int iId = p
1f5d0 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  Seg->pSeg->iSegi
1f5e0 64 3b 0a 20 20 20 20 20 20 75 38 20 61 48 64 72  d;.      u8 aHdr
1f5f0 5b 34 5d 20 3d 20 7b 30 78 30 30 2c 20 30 78 30  [4] = {0x00, 0x0
1f600 30 2c 20 30 78 30 30 2c 20 30 78 30 30 7d 3b 0a  0, 0x00, 0x00};.
1f610 0a 20 20 20 20 20 20 69 4c 65 61 66 52 6f 77 69  .      iLeafRowi
1f620 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  d = FTS5_SEGMENT
1f630 5f 52 4f 57 49 44 28 69 49 64 2c 20 70 53 65 67  _ROWID(iId, pSeg
1f640 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29  ->iTermLeafPgno)
1f650 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20  ;.      pData = 
1f660 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
1f670 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20  iLeafRowid);.   
1f680 20 20 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a     if( pData ){.
1f690 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1f6a0 65 72 5a 65 72 6f 28 26 62 75 66 29 3b 0a 20 20  erZero(&buf);.  
1f6b0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1f6c0 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 62 75  Grow(&p->rc, &bu
1f6d0 66 2c 20 70 44 61 74 61 2d 3e 6e 6e 29 3b 0a 20  f, pData->nn);. 
1f6e0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1f6f0 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
1f700 72 63 2c 20 26 62 75 66 2c 20 73 69 7a 65 6f 66  rc, &buf, sizeof
1f710 28 61 48 64 72 29 2c 20 61 48 64 72 29 3b 0a 20  (aHdr), aHdr);. 
1f720 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1f730 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1f740 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67  ->rc, &buf, pSeg
1f750 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20  ->term.n);.     
1f760 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1f770 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1f780 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d  &buf, pSeg->term
1f790 2e 6e 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70  .n, pSeg->term.p
1f7a0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
1f7b0 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
1f7c0 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44  &p->rc, &buf, pD
1f7d0 61 74 61 2d 3e 73 7a 4c 65 61 66 2d 69 4f 66 66  ata->szLeaf-iOff
1f7e0 2c 20 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66  , &pData->p[iOff
1f7f0 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
1f800 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1f810 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1f820 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20   Set the szLeaf 
1f830 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20 20 20 20  field */.       
1f840 20 20 20 66 74 73 35 50 75 74 55 31 36 28 26 62     fts5PutU16(&b
1f850 75 66 2e 70 5b 32 5d 2c 20 28 75 31 36 29 62 75  uf.p[2], (u16)bu
1f860 66 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  f.n);.        }.
1f870 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  .        /* Set 
1f880 75 70 20 74 68 65 20 6e 65 77 20 70 61 67 65 2d  up the new page-
1f890 69 6e 64 65 78 20 61 72 72 61 79 20 2a 2f 0a 20  index array */. 
1f8a0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1f8b0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1f8c0 2d 3e 72 63 2c 20 26 62 75 66 2c 20 34 29 3b 0a  ->rc, &buf, 4);.
1f8d0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65 67          if( pSeg
1f8e0 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 53 65  ->iLeafPgno==pSe
1f8f0 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  g->iTermLeafPgno
1f900 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 53   .         && pS
1f910 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  eg->iEndofDoclis
1f920 74 3c 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20  t<pData->szLeaf 
1f930 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1f940 20 20 20 20 20 20 69 6e 74 20 6e 44 69 66 66 20        int nDiff 
1f950 3d 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20  = pData->szLeaf 
1f960 2d 20 70 53 65 67 2d 3e 69 45 6e 64 6f 66 44 6f  - pSeg->iEndofDo
1f970 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20  clist;.         
1f980 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1f990 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1f9a0 26 62 75 66 2c 20 62 75 66 2e 6e 20 2d 20 31 20  &buf, buf.n - 1 
1f9b0 2d 20 6e 44 69 66 66 20 2d 20 34 29 3b 0a 20 20  - nDiff - 4);.  
1f9c0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1f9d0 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1f9e0 3e 72 63 2c 20 26 62 75 66 2c 20 0a 20 20 20 20  >rc, &buf, .    
1f9f0 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61 2d            pData-
1fa00 3e 6e 6e 20 2d 20 70 53 65 67 2d 3e 69 50 67 69  >nn - pSeg->iPgi
1fa10 64 78 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70  dxOff, &pData->p
1fa20 5b 70 53 65 67 2d 3e 69 50 67 69 64 78 4f 66 66  [pSeg->iPgidxOff
1fa30 5d 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ].          );. 
1fa40 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1fa50 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
1fa60 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  e(pData);.      
1fa70 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67    pSeg->pSeg->pg
1fa80 6e 6f 46 69 72 73 74 20 3d 20 70 53 65 67 2d 3e  noFirst = pSeg->
1fa90 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20  iTermLeafPgno;. 
1faa0 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 44         fts5DataD
1fab0 65 6c 65 74 65 28 70 2c 20 46 54 53 35 5f 53 45  elete(p, FTS5_SE
1fac0 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c  GMENT_ROWID(iId,
1fad0 20 31 29 2c 20 69 4c 65 61 66 52 6f 77 69 64 29   1), iLeafRowid)
1fae0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61  ;.        fts5Da
1faf0 74 61 57 72 69 74 65 28 70 2c 20 69 4c 65 61 66  taWrite(p, iLeaf
1fb00 52 6f 77 69 64 2c 20 62 75 66 2e 70 2c 20 62 75  Rowid, buf.p, bu
1fb10 66 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  f.n);.      }.  
1fb20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42 75    }.  }.  fts5Bu
1fb30 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a  fferFree(&buf);.
1fb40 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
1fb50 74 73 35 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c  ts5MergeChunkCal
1fb60 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64  lback(.  Fts5Ind
1fb70 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a  ex *p, .  void *
1fb80 70 43 74 78 2c 20 0a 20 20 63 6f 6e 73 74 20 75  pCtx, .  const u
1fb90 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e  8 *pChunk, int n
1fba0 43 68 75 6e 6b 0a 29 7b 0a 20 20 46 74 73 35 53  Chunk.){.  Fts5S
1fbb0 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
1fbc0 72 20 3d 20 28 46 74 73 35 53 65 67 57 72 69 74  r = (Fts5SegWrit
1fbd0 65 72 2a 29 70 43 74 78 3b 0a 20 20 66 74 73 35  er*)pCtx;.  fts5
1fbe0 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69  WriteAppendPosli
1fbf0 73 74 44 61 74 61 28 70 2c 20 70 57 72 69 74 65  stData(p, pWrite
1fc00 72 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e  r, pChunk, nChun
1fc10 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a  k);.}../*.**.*/.
1fc20 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1fc30 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28  IndexMergeLevel(
1fc40 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1fc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc60 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
1fc70 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
1fc80 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
1fc90 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f  pStruct,       /
1fca0 2a 20 49 4e 2f 4f 55 54 3a 20 53 74 75 63 74 75  * IN/OUT: Stuctu
1fcb0 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  re of index */. 
1fcc0 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20   int iLvl,      
1fcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fce0 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 72 65 61   /* Level to rea
1fcf0 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a 2f 0a  d input from */.
1fd00 20 20 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20 20    int *pnRem    
1fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd20 20 20 2f 2a 20 57 72 69 74 65 20 75 70 20 74 6f    /* Write up to
1fd30 20 74 68 69 73 20 6d 61 6e 79 20 6f 75 74 70 75   this many outpu
1fd40 74 20 6c 65 61 76 65 73 20 2a 2f 0a 29 7b 0a 20  t leaves */.){. 
1fd50 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1fd60 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72  pStruct = *ppStr
1fd70 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75 63  uct;.  Fts5Struc
1fd80 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
1fd90 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
1fda0 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74 73 35  el[iLvl];.  Fts5
1fdb0 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
1fdc0 70 4c 76 6c 4f 75 74 3b 0a 20 20 46 74 73 35 49  pLvlOut;.  Fts5I
1fdd0 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 20  ter *pIter = 0; 
1fde0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
1fdf0 72 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20  r to read input 
1fe00 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  data */.  int nR
1fe10 65 6d 20 3d 20 70 6e 52 65 6d 20 3f 20 2a 70 6e  em = pnRem ? *pn
1fe20 52 65 6d 20 3a 20 30 3b 20 20 2f 2a 20 4f 75 74  Rem : 0;  /* Out
1fe30 70 75 74 20 6c 65 61 66 20 70 61 67 65 73 20 6c  put leaf pages l
1fe40 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  eft to write */.
1fe50 20 20 69 6e 74 20 6e 49 6e 70 75 74 3b 20 20 20    int nInput;   
1fe60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe70 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
1fe80 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f  nput segments */
1fe90 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1fea0 20 77 72 69 74 65 72 3b 20 20 20 20 20 20 20 20   writer;        
1feb0 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a     /* Writer obj
1fec0 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
1fed0 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
1fee0 53 65 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74 70  Seg;     /* Outp
1fef0 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ut segment */.  
1ff00 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b  Fts5Buffer term;
1ff10 0a 20 20 69 6e 74 20 62 4f 6c 64 65 73 74 3b 20  .  int bOldest; 
1ff20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff30 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1ff40 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  e output segment
1ff50 20 69 73 20 74 68 65 20 6f 6c 64 65 73 74 20 2a   is the oldest *
1ff60 2f 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20  /.  int eDetail 
1ff70 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  = p->pConfig->eD
1ff80 65 74 61 69 6c 3b 0a 20 20 63 6f 6e 73 74 20 69  etail;.  const i
1ff90 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35 49  nt flags = FTS5I
1ffa0 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54  NDEX_QUERY_NOOUT
1ffb0 50 55 54 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  PUT;..  assert( 
1ffc0 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
1ffd0 65 76 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  evel );.  assert
1ffe0 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d  ( pLvl->nMerge<=
1fff0 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20  pLvl->nSeg );.. 
20000 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c   memset(&writer,
20010 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
20020 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20 6d 65  egWriter));.  me
20030 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73  mset(&term, 0, s
20040 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
20050 29 29 3b 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e  ));.  if( pLvl->
20060 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 70 4c  nMerge ){.    pL
20070 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74  vlOut = &pStruct
20080 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d  ->aLevel[iLvl+1]
20090 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
200a0 76 6c 4f 75 74 2d 3e 6e 53 65 67 3e 30 20 29 3b  vlOut->nSeg>0 );
200b0 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c  .    nInput = pL
200c0 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20  vl->nMerge;.    
200d0 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d  pSeg = &pLvlOut-
200e0 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e  >aSeg[pLvlOut->n
200f0 53 65 67 2d 31 5d 3b 0a 0a 20 20 20 20 66 74 73  Seg-1];..    fts
20100 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77  5WriteInit(p, &w
20110 72 69 74 65 72 2c 20 70 53 65 67 2d 3e 69 53 65  riter, pSeg->iSe
20120 67 69 64 29 3b 0a 20 20 20 20 77 72 69 74 65 72  gid);.    writer
20130 2e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20 70  .writer.pgno = p
20140 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b 31 3b  Seg->pgnoLast+1;
20150 0a 20 20 20 20 77 72 69 74 65 72 2e 69 42 74 50  .    writer.iBtP
20160 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  age = 0;.  }else
20170 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69 64  {.    int iSegid
20180 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53   = fts5AllocateS
20190 65 67 69 64 28 70 2c 20 70 53 74 72 75 63 74 29  egid(p, pStruct)
201a0 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e 64  ;..    /* Extend
201b0 20 74 68 65 20 46 74 73 35 53 74 72 75 63 74 75   the Fts5Structu
201c0 72 65 20 6f 62 6a 65 63 74 20 61 73 20 72 65 71  re object as req
201d0 75 69 72 65 64 20 74 6f 20 65 6e 73 75 72 65 20  uired to ensure 
201e0 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 2a  the output.    *
201f0 2a 20 73 65 67 6d 65 6e 74 20 65 78 69 73 74 73  * segment exists
20200 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4c 76  . */.    if( iLv
20210 6c 3d 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  l==pStruct->nLev
20220 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 74  el-1 ){.      ft
20230 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65  s5StructureAddLe
20240 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 70 53 74  vel(&p->rc, ppSt
20250 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70 53 74  ruct);.      pSt
20260 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74  ruct = *ppStruct
20270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
20280 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c  StructureExtendL
20290 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74  evel(&p->rc, pSt
202a0 72 75 63 74 2c 20 69 4c 76 6c 2b 31 2c 20 31 2c  ruct, iLvl+1, 1,
202b0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   0);.    if( p->
202c0 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  rc ) return;.   
202d0 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74   pLvl = &pStruct
202e0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
202f0 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70      pLvlOut = &p
20300 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
20310 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66 74 73  Lvl+1];..    fts
20320 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77  5WriteInit(p, &w
20330 72 69 74 65 72 2c 20 69 53 65 67 69 64 29 3b 0a  riter, iSegid);.
20340 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
20350 6e 65 77 20 73 65 67 6d 65 6e 74 20 74 6f 20 74  new segment to t
20360 68 65 20 6f 75 74 70 75 74 20 6c 65 76 65 6c 20  he output level 
20370 2a 2f 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70  */.    pSeg = &p
20380 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76  LvlOut->aSeg[pLv
20390 6c 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20  lOut->nSeg];.   
203a0 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b   pLvlOut->nSeg++
203b0 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f  ;.    pSeg->pgno
203c0 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 70  First = 1;.    p
203d0 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53  Seg->iSegid = iS
203e0 65 67 69 64 3b 0a 20 20 20 20 70 53 74 72 75 63  egid;.    pStruc
203f0 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 0a  t->nSegment++;..
20400 20 20 20 20 2f 2a 20 52 65 61 64 20 69 6e 70 75      /* Read inpu
20410 74 20 66 72 6f 6d 20 61 6c 6c 20 73 65 67 6d 65  t from all segme
20420 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74  nts in the input
20430 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 6e 49   level */.    nI
20440 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65  nput = pLvl->nSe
20450 67 3b 0a 20 20 7d 0a 20 20 62 4f 6c 64 65 73 74  g;.  }.  bOldest
20460 20 3d 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65   = (pLvlOut->nSe
20470 67 3d 3d 31 20 26 26 20 70 53 74 72 75 63 74 2d  g==1 && pStruct-
20480 3e 6e 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29  >nLevel==iLvl+2)
20490 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76  ;..  assert( iLv
204a0 6c 3e 3d 30 20 29 3b 0a 20 20 66 6f 72 28 66 74  l>=0 );.  for(ft
204b0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
204c0 2c 20 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73  , pStruct, flags
204d0 2c 20 30 2c 20 30 2c 20 30 2c 20 69 4c 76 6c 2c  , 0, 0, 0, iLvl,
204e0 20 6e 49 6e 70 75 74 2c 20 26 70 49 74 65 72 29   nInput, &pIter)
204f0 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  ;.      fts5Mult
20500 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65  iIterEof(p, pIte
20510 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73  r)==0;.      fts
20520 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
20530 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20  , pIter, 0, 0). 
20540 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49   ){.    Fts5SegI
20550 74 65 72 20 2a 70 53 65 67 49 74 65 72 20 3d 20  ter *pSegIter = 
20560 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
20570 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
20580 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 69 6e 74  First ];.    int
20590 20 6e 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20   nPos;          
205a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 6f             /* po
205b0 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
205c0 20 66 69 65 6c 64 20 76 61 6c 75 65 20 2a 2f 0a   field value */.
205d0 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20      int nTerm;. 
205e0 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65     const u8 *pTe
205f0 72 6d 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  rm;..    /* Chec
20600 6b 20 66 6f 72 20 6b 65 79 20 61 6e 6e 69 68 69  k for key annihi
20610 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  lation. */.    i
20620 66 28 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f  f( pSegIter->nPo
20630 73 3d 3d 30 20 26 26 20 28 62 4f 6c 64 65 73 74  s==0 && (bOldest
20640 20 7c 7c 20 70 53 65 67 49 74 65 72 2d 3e 62 44   || pSegIter->bD
20650 65 6c 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75  el==0) ) continu
20660 65 3b 0a 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  e;..    pTerm = 
20670 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72  fts5MultiIterTer
20680 6d 28 70 49 74 65 72 2c 20 26 6e 54 65 72 6d 29  m(pIter, &nTerm)
20690 3b 0a 20 20 20 20 69 66 28 20 6e 54 65 72 6d 21  ;.    if( nTerm!
206a0 3d 74 65 72 6d 2e 6e 20 7c 7c 20 6d 65 6d 63 6d  =term.n || memcm
206b0 70 28 70 54 65 72 6d 2c 20 74 65 72 6d 2e 70 2c  p(pTerm, term.p,
206c0 20 6e 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 20   nTerm) ){.     
206d0 20 69 66 28 20 70 6e 52 65 6d 20 26 26 20 77 72   if( pnRem && wr
206e0 69 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65  iter.nLeafWritte
206f0 6e 3e 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20 20  n>nRem ){.      
20700 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
20710 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ..      /* This 
20720 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2e 20 41  is a new term. A
20730 70 70 65 6e 64 20 61 20 74 65 72 6d 20 74 6f 20  ppend a term to 
20740 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65  the output segme
20750 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 66 74 73  nt. */.      fts
20760 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d  5WriteAppendTerm
20770 28 70 2c 20 26 77 72 69 74 65 72 2c 20 6e 54 65  (p, &writer, nTe
20780 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  rm, pTerm);.    
20790 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
207a0 26 70 2d 3e 72 63 2c 20 26 74 65 72 6d 2c 20 6e  &p->rc, &term, n
207b0 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
207c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65    }..    /* Appe
207d0 6e 64 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20  nd the rowid to 
207e0 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  the output */.  
207f0 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53    /* WRITEPOSLIS
20800 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 66 74 73  TSIZE */.    fts
20810 35 57 72 69 74 65 41 70 70 65 6e 64 52 6f 77 69  5WriteAppendRowi
20820 64 28 70 2c 20 26 77 72 69 74 65 72 2c 20 66 74  d(p, &writer, ft
20830 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64  s5MultiIterRowid
20840 28 70 49 74 65 72 29 29 3b 0a 0a 20 20 20 20 69  (pIter));..    i
20850 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  f( eDetail==FTS5
20860 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a  _DETAIL_NONE ){.
20870 20 20 20 20 20 20 69 66 28 20 70 53 65 67 49 74        if( pSegIt
20880 65 72 2d 3e 62 44 65 6c 20 29 7b 0a 20 20 20 20  er->bDel ){.    
20890 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
208a0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
208b0 63 2c 20 26 77 72 69 74 65 72 2e 77 72 69 74 65  c, &writer.write
208c0 72 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20  r.buf, 0);.     
208d0 20 20 20 69 66 28 20 70 53 65 67 49 74 65 72 2d     if( pSegIter-
208e0 3e 6e 50 6f 73 3e 30 20 29 7b 0a 20 20 20 20 20  >nPos>0 ){.     
208f0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
20900 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
20910 72 63 2c 20 26 77 72 69 74 65 72 2e 77 72 69 74  rc, &writer.writ
20920 65 72 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20 20  er.buf, 0);.    
20930 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
20940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
20950 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70 6f 73  * Append the pos
20960 69 74 69 6f 6e 2d 6c 69 73 74 20 64 61 74 61 20  ition-list data 
20970 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f  to the output */
20980 0a 20 20 20 20 20 20 6e 50 6f 73 20 3d 20 70 53  .      nPos = pS
20990 65 67 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 20 2b  egIter->nPos*2 +
209a0 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 3b   pSegIter->bDel;
209b0 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
209c0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
209d0 2d 3e 72 63 2c 20 26 77 72 69 74 65 72 2e 77 72  ->rc, &writer.wr
209e0 69 74 65 72 2e 62 75 66 2c 20 6e 50 6f 73 29 3b  iter.buf, nPos);
209f0 0a 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b  .      fts5Chunk
20a00 49 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 49  Iterate(p, pSegI
20a10 74 65 72 2c 20 28 76 6f 69 64 2a 29 26 77 72 69  ter, (void*)&wri
20a20 74 65 72 2c 20 66 74 73 35 4d 65 72 67 65 43 68  ter, fts5MergeCh
20a30 75 6e 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  unkCallback);.  
20a40 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c    }.  }..  /* Fl
20a50 75 73 68 20 74 68 65 20 6c 61 73 74 20 6c 65 61  ush the last lea
20a60 66 20 70 61 67 65 20 74 6f 20 64 69 73 6b 2e 20  f page to disk. 
20a70 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 73  Set the output s
20a80 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 68 65  egment b-tree he
20a90 69 67 68 74 0a 20 20 2a 2a 20 61 6e 64 20 6c 61  ight.  ** and la
20aa0 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  st leaf page num
20ab0 62 65 72 20 61 74 20 74 68 65 20 73 61 6d 65 20  ber at the same 
20ac0 74 69 6d 65 2e 20 20 2a 2f 0a 20 20 66 74 73 35  time.  */.  fts5
20ad0 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26  WriteFinish(p, &
20ae0 77 72 69 74 65 72 2c 20 26 70 53 65 67 2d 3e 70  writer, &pSeg->p
20af0 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 69 66 28  gnoLast);..  if(
20b00 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
20b10 66 28 70 2c 20 70 49 74 65 72 29 20 29 7b 0a 20  f(p, pIter) ){. 
20b20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f     int i;..    /
20b30 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64  * Remove the red
20b40 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20  undant segments 
20b50 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20  from the %_data 
20b60 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72  table */.    for
20b70 28 69 3d 30 3b 20 69 3c 6e 49 6e 70 75 74 3b 20  (i=0; i<nInput; 
20b80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35  i++){.      fts5
20b90 44 61 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e  DataRemoveSegmen
20ba0 74 28 70 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  t(p, pLvl->aSeg[
20bb0 69 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20  i].iSegid);.    
20bc0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  }..    /* Remove
20bd0 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73   the redundant s
20be0 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  egments from the
20bf0 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a   input level */.
20c00 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53      if( pLvl->nS
20c10 65 67 21 3d 6e 49 6e 70 75 74 20 29 7b 0a 20 20  eg!=nInput ){.  
20c20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20      int nMove = 
20c30 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 20 6e 49  (pLvl->nSeg - nI
20c40 6e 70 75 74 29 20 2a 20 73 69 7a 65 6f 66 28 46  nput) * sizeof(F
20c50 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
20c60 65 6e 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 6d  ent);.      memm
20c70 6f 76 65 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20  ove(pLvl->aSeg, 
20c80 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 6e 49 6e 70  &pLvl->aSeg[nInp
20c90 75 74 5d 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20  ut], nMove);.   
20ca0 20 7d 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e   }.    pStruct->
20cb0 6e 53 65 67 6d 65 6e 74 20 2d 3d 20 6e 49 6e 70  nSegment -= nInp
20cc0 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 53  ut;.    pLvl->nS
20cd0 65 67 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20  eg -= nInput;.  
20ce0 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d    pLvl->nMerge =
20cf0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67   0;.    if( pSeg
20d00 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d 30 20 29 7b  ->pgnoLast==0 ){
20d10 0a 20 20 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e  .      pLvlOut->
20d20 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20 70 53  nSeg--;.      pS
20d30 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2d  truct->nSegment-
20d40 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  -;.    }.  }else
20d50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  {.    assert( pS
20d60 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3e 30 20 29  eg->pgnoLast>0 )
20d70 3b 0a 20 20 20 20 66 74 73 35 54 72 69 6d 53 65  ;.    fts5TrimSe
20d80 67 6d 65 6e 74 73 28 70 2c 20 70 49 74 65 72 29  gments(p, pIter)
20d90 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72  ;.    pLvl->nMer
20da0 67 65 20 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 7d  ge = nInput;.  }
20db0 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65  ..  fts5MultiIte
20dc0 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  rFree(pIter);.  
20dd0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
20de0 74 65 72 6d 29 3b 0a 20 20 69 66 28 20 70 6e 52  term);.  if( pnR
20df0 65 6d 20 29 20 2a 70 6e 52 65 6d 20 2d 3d 20 77  em ) *pnRem -= w
20e00 72 69 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74  riter.nLeafWritt
20e10 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  en;.}../*.** Do 
20e20 75 70 20 74 6f 20 6e 50 67 20 70 61 67 65 73 20  up to nPg pages 
20e30 6f 66 20 61 75 74 6f 6d 65 72 67 65 20 77 6f 72  of automerge wor
20e40 6b 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  k on the index..
20e50 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  **.** Return tru
20e60 65 20 69 66 20 61 6e 79 20 63 68 61 6e 67 65 73  e if any changes
20e70 20 77 65 72 65 20 61 63 74 75 61 6c 6c 79 20 6d   were actually m
20e80 61 64 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  ade, or false ot
20e90 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
20ea0 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78  ic int fts5Index
20eb0 4d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64  Merge(.  Fts5Ind
20ec0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
20ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
20ee0 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
20ef0 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
20f00 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20  re **ppStruct,  
20f10 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
20f20 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75 72  Current structur
20f30 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e of index */.  
20f40 69 6e 74 20 6e 50 67 2c 20 20 20 20 20 20 20 20  int nPg,        
20f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f60 2f 2a 20 50 61 67 65 73 20 6f 66 20 77 6f 72 6b  /* Pages of work
20f70 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 69 6e 74 20   to do */.  int 
20f80 6e 4d 69 6e 20 20 20 20 20 20 20 20 20 20 20 20  nMin            
20f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
20fa0 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  inimum number of
20fb0 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72   segments to mer
20fc0 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ge */.){.  int n
20fd0 52 65 6d 20 3d 20 6e 50 67 3b 0a 20 20 69 6e 74  Rem = nPg;.  int
20fe0 20 62 52 65 74 20 3d 20 30 3b 0a 20 20 46 74 73   bRet = 0;.  Fts
20ff0 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
21000 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b  uct = *ppStruct;
21010 0a 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30  .  while( nRem>0
21020 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   && p->rc==SQLIT
21030 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
21040 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iLvl;           
21050 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74          /* To it
21060 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65  erate through le
21070 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  vels */.    int 
21080 69 42 65 73 74 4c 76 6c 20 3d 20 30 3b 20 20 20  iBestLvl = 0;   
21090 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c          /* Level
210a0 20 6f 66 66 65 72 69 6e 67 20 74 68 65 20 6d 6f   offering the mo
210b0 73 74 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  st input segment
210c0 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 65  s */.    int nBe
210d0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
210e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
210f0 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73  f input segments
21100 20 6f 6e 20 62 65 73 74 20 6c 65 76 65 6c 20 2a   on best level *
21110 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 69 42  /..    /* Set iB
21120 65 73 74 4c 76 6c 20 74 6f 20 74 68 65 20 6c 65  estLvl to the le
21130 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75  vel to read inpu
21140 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 2e  t segments from.
21150 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
21160 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e  pStruct->nLevel>
21170 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76  0 );.    for(iLv
21180 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63  l=0; iLvl<pStruc
21190 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  t->nLevel; iLvl+
211a0 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74  +){.      Fts5St
211b0 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
211c0 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
211d0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20  Level[iLvl];.   
211e0 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65     if( pLvl->nMe
211f0 72 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  rge ){.        i
21200 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3e  f( pLvl->nMerge>
21210 6e 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  nBest ){.       
21220 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c     iBestLvl = iL
21230 76 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 42  vl;.          nB
21240 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72  est = pLvl->nMer
21250 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
21260 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21270 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
21280 4c 76 6c 2d 3e 6e 53 65 67 3e 6e 42 65 73 74 20  Lvl->nSeg>nBest 
21290 29 7b 0a 20 20 20 20 20 20 20 20 6e 42 65 73 74  ){.        nBest
212a0 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20   = pLvl->nSeg;. 
212b0 20 20 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20         iBestLvl 
212c0 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 7d 0a  = iLvl;.      }.
212d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
212e0 20 6e 42 65 73 74 20 69 73 20 73 74 69 6c 6c 20   nBest is still 
212f0 30 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65  0, then the inde
21300 78 20 6d 75 73 74 20 62 65 20 65 6d 70 74 79 2e  x must be empty.
21310 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
21320 45 5f 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28  E_DEBUG.    for(
21330 69 4c 76 6c 3d 30 3b 20 6e 42 65 73 74 3d 3d 30  iLvl=0; nBest==0
21340 20 26 26 20 69 4c 76 6c 3c 70 53 74 72 75 63 74   && iLvl<pStruct
21350 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b  ->nLevel; iLvl++
21360 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
21370 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
21380 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 20 29  [iLvl].nSeg==0 )
21390 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
213a0 20 20 20 20 69 66 28 20 6e 42 65 73 74 3c 6e 4d      if( nBest<nM
213b0 69 6e 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61  in && pStruct->a
213c0 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e  Level[iBestLvl].
213d0 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20  nMerge==0 ){.   
213e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
213f0 20 20 20 20 62 52 65 74 20 3d 20 31 3b 0a 20 20      bRet = 1;.  
21400 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65    fts5IndexMerge
21410 4c 65 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63  Level(p, &pStruc
21420 74 2c 20 69 42 65 73 74 4c 76 6c 2c 20 26 6e 52  t, iBestLvl, &nR
21430 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  em);.    if( p->
21440 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21450 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
21460 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67  [iBestLvl].nMerg
21470 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74  e==0 ){.      ft
21480 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f  s5StructurePromo
21490 74 65 28 70 2c 20 69 42 65 73 74 4c 76 6c 2b 31  te(p, iBestLvl+1
214a0 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20  , pStruct);.    
214b0 7d 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63  }.  }.  *ppStruc
214c0 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 72  t = pStruct;.  r
214d0 65 74 75 72 6e 20 62 52 65 74 3b 0a 7d 0a 0a 2f  eturn bRet;.}../
214e0 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
214f0 6e 4c 65 61 66 20 6c 65 61 66 20 70 61 67 65 73  nLeaf leaf pages
21500 20 6f 66 20 64 61 74 61 20 68 61 73 20 6a 75 73   of data has jus
21510 74 20 62 65 65 6e 20 66 6c 75 73 68 65 64 20 74  t been flushed t
21520 6f 20 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73  o a level-0.** s
21530 65 67 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e  egment. This fun
21540 63 74 69 6f 6e 20 75 70 64 61 74 65 73 20 74 68  ction updates th
21550 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20  e write-counter 
21560 61 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c  accordingly and,
21570 20 69 66 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79   if.** necessary
21580 2c 20 70 65 72 66 6f 72 6d 73 20 69 6e 63 72 65  , performs incre
21590 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 77 6f 72  mental merge wor
215a0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  k..**.** If an e
215b0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
215c0 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72   the Fts5Index.r
215d0 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  c error code. If
215e0 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a   an error has .*
215f0 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  * already occurr
21600 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
21610 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  n is a no-op..*/
21620 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
21630 35 49 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28  5IndexAutomerge(
21640 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
21650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21660 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
21670 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
21680 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
21690 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f  pStruct,       /
216a0 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e  * IN/OUT: Curren
216b0 74 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69  t structure of i
216c0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  ndex */.  int nL
216d0 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20  eaf             
216e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
216f0 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 6c 65  ber of output le
21700 61 76 65 73 20 6a 75 73 74 20 77 72 69 74 74 65  aves just writte
21710 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d  n */.){.  if( p-
21720 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
21730 26 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41  & p->pConfig->nA
21740 75 74 6f 6d 65 72 67 65 3e 30 20 29 7b 0a 20 20  utomerge>0 ){.  
21750 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
21760 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74  *pStruct = *ppSt
21770 72 75 63 74 3b 0a 20 20 20 20 75 36 34 20 6e 57  ruct;.    u64 nW
21780 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
21790 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
217a0 61 6c 20 76 61 6c 75 65 20 6f 66 20 77 72 69 74  al value of writ
217b0 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  e-counter */.   
217c0 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20   int nWork;     
217d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
217e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b  * Number of work
217f0 2d 71 75 61 6e 74 61 20 74 6f 20 70 65 72 66 6f  -quanta to perfo
21800 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52  rm */.    int nR
21810 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
21820 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21830 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20  r of leaf pages 
21840 6c 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  left to write */
21850 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
21860 74 68 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65  the write-counte
21870 72 2e 20 57 68 69 6c 65 20 64 6f 69 6e 67 20 73  r. While doing s
21880 6f 2c 20 73 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f  o, set nWork. */
21890 0a 20 20 20 20 6e 57 72 69 74 65 20 3d 20 70 53  .    nWrite = pS
218a0 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75  truct->nWriteCou
218b0 6e 74 65 72 3b 0a 20 20 20 20 6e 57 6f 72 6b 20  nter;.    nWork 
218c0 3d 20 28 69 6e 74 29 28 28 28 6e 57 72 69 74 65  = (int)(((nWrite
218d0 20 2b 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e   + nLeaf) / p->n
218e0 57 6f 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72  WorkUnit) - (nWr
218f0 69 74 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e  ite / p->nWorkUn
21900 69 74 29 29 3b 0a 20 20 20 20 70 53 74 72 75 63  it));.    pStruc
21910 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  t->nWriteCounter
21920 20 2b 3d 20 6e 4c 65 61 66 3b 0a 20 20 20 20 6e   += nLeaf;.    n
21930 52 65 6d 20 3d 20 28 69 6e 74 29 28 70 2d 3e 6e  Rem = (int)(p->n
21940 57 6f 72 6b 55 6e 69 74 20 2a 20 6e 57 6f 72 6b  WorkUnit * nWork
21950 20 2a 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76   * pStruct->nLev
21960 65 6c 29 3b 0a 0a 20 20 20 20 66 74 73 35 49 6e  el);..    fts5In
21970 64 65 78 4d 65 72 67 65 28 70 2c 20 70 70 53 74  dexMerge(p, ppSt
21980 72 75 63 74 2c 20 6e 52 65 6d 2c 20 70 2d 3e 70  ruct, nRem, p->p
21990 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72  Config->nAutomer
219a0 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ge);.  }.}..stat
219b0 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
219c0 78 43 72 69 73 69 73 6d 65 72 67 65 28 0a 20 20  xCrisismerge(.  
219d0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
219e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219f0 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
21a00 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
21a10 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74  Structure **ppSt
21a20 72 75 63 74 20 20 20 20 20 20 20 20 2f 2a 20 49  ruct        /* I
21a30 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73  N/OUT: Current s
21a40 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65  tructure of inde
21a50 78 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  x */.){.  const 
21a60 69 6e 74 20 6e 43 72 69 73 69 73 20 3d 20 70 2d  int nCrisis = p-
21a70 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 72 69 73 69  >pConfig->nCrisi
21a80 73 4d 65 72 67 65 3b 0a 20 20 46 74 73 35 53 74  sMerge;.  Fts5St
21a90 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
21aa0 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20   = *ppStruct;.  
21ab0 69 6e 74 20 69 4c 76 6c 20 3d 20 30 3b 0a 0a 20  int iLvl = 0;.. 
21ac0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d   assert( p->rc!=
21ad0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74  SQLITE_OK || pSt
21ae0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29  ruct->nLevel>0 )
21af0 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63  ;.  while( p->rc
21b00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
21b10 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
21b20 4c 76 6c 5d 2e 6e 53 65 67 3e 3d 6e 43 72 69 73  Lvl].nSeg>=nCris
21b30 69 73 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e  is ){.    fts5In
21b40 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c  dexMergeLevel(p,
21b50 20 26 70 53 74 72 75 63 74 2c 20 69 4c 76 6c 2c   &pStruct, iLvl,
21b60 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
21b70 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
21b80 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c  K || pStruct->nL
21b90 65 76 65 6c 3e 28 69 4c 76 6c 2b 31 29 20 29 3b  evel>(iLvl+1) );
21ba0 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
21bb0 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 4c 76  rePromote(p, iLv
21bc0 6c 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  l+1, pStruct);. 
21bd0 20 20 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a 20     iLvl++;.  }. 
21be0 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74   *ppStruct = pSt
21bf0 72 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ruct;.}..static 
21c00 69 6e 74 20 66 74 73 35 49 6e 64 65 78 52 65 74  int fts5IndexRet
21c10 75 72 6e 28 46 74 73 35 49 6e 64 65 78 20 2a 70  urn(Fts5Index *p
21c20 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d  ){.  int rc = p-
21c30 3e 72 63 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53  >rc;.  p->rc = S
21c40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75  QLITE_OK;.  retu
21c50 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65  rn rc;.}..typede
21c60 66 20 73 74 72 75 63 74 20 46 74 73 35 46 6c 75  f struct Fts5Flu
21c70 73 68 43 74 78 20 46 74 73 35 46 6c 75 73 68 43  shCtx Fts5FlushC
21c80 74 78 3b 0a 73 74 72 75 63 74 20 46 74 73 35 46  tx;.struct Fts5F
21c90 6c 75 73 68 43 74 78 20 7b 0a 20 20 46 74 73 35  lushCtx {.  Fts5
21ca0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 46  Index *pIdx;.  F
21cb0 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69  ts5SegWriter wri
21cc0 74 65 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ter; .};../*.** 
21cd0 42 75 66 66 65 72 20 61 42 75 66 5b 5d 20 63 6f  Buffer aBuf[] co
21ce0 6e 74 61 69 6e 73 20 61 20 6c 69 73 74 20 6f 66  ntains a list of
21cf0 20 76 61 72 69 6e 74 73 2c 20 61 6c 6c 20 73 6d   varints, all sm
21d00 61 6c 6c 20 65 6e 6f 75 67 68 20 74 6f 20 66 69  all enough to fi
21d10 74 0a 2a 2a 20 69 6e 20 61 20 33 32 2d 62 69 74  t.** in a 32-bit
21d20 20 69 6e 74 65 67 65 72 2e 20 52 65 74 75 72 6e   integer. Return
21d30 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
21d40 20 6c 61 72 67 65 73 74 20 70 72 65 66 69 78 20   largest prefix 
21d50 6f 66 20 74 68 69 73 20 0a 2a 2a 20 6c 69 73 74  of this .** list
21d60 20 6e 4d 61 78 20 62 79 74 65 73 20 6f 72 20 6c   nMax bytes or l
21d70 65 73 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a  ess in size..*/.
21d80 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50  static int fts5P
21d90 6f 73 6c 69 73 74 50 72 65 66 69 78 28 63 6f 6e  oslistPrefix(con
21da0 73 74 20 75 38 20 2a 61 42 75 66 2c 20 69 6e 74  st u8 *aBuf, int
21db0 20 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72 65   nMax){.  int re
21dc0 74 3b 0a 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  t;.  u32 dummy;.
21dd0 20 20 72 65 74 20 3d 20 66 74 73 35 47 65 74 56    ret = fts5GetV
21de0 61 72 69 6e 74 33 32 28 61 42 75 66 2c 20 64 75  arint32(aBuf, du
21df0 6d 6d 79 29 3b 0a 20 20 69 66 28 20 72 65 74 3c  mmy);.  if( ret<
21e00 6e 4d 61 78 20 29 7b 0a 20 20 20 20 77 68 69 6c  nMax ){.    whil
21e10 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  e( 1 ){.      in
21e20 74 20 69 20 3d 20 66 74 73 35 47 65 74 56 61 72  t i = fts5GetVar
21e30 69 6e 74 33 32 28 26 61 42 75 66 5b 72 65 74 5d  int32(&aBuf[ret]
21e40 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20  , dummy);.      
21e50 69 66 28 20 28 72 65 74 20 2b 20 69 29 20 3e 20  if( (ret + i) > 
21e60 6e 4d 61 78 20 29 20 62 72 65 61 6b 3b 0a 20 20  nMax ) break;.  
21e70 20 20 20 20 72 65 74 20 2b 3d 20 69 3b 0a 20 20      ret += i;.  
21e80 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
21e90 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46   ret;.}../*.** F
21ea0 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  lush the content
21eb0 73 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 68  s of in-memory h
21ec0 61 73 68 20 74 61 62 6c 65 20 69 48 61 73 68 20  ash table iHash 
21ed0 74 6f 20 61 20 6e 65 77 20 6c 65 76 65 6c 2d 30  to a new level-0
21ee0 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6f 6e 20   .** segment on 
21ef0 64 69 73 6b 2e 20 41 6c 73 6f 20 75 70 64 61 74  disk. Also updat
21f00 65 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  e the correspond
21f10 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 72 65  ing structure re
21f20 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  cord..**.** If a
21f30 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
21f40 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
21f50 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
21f60 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
21f70 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
21f80 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
21f90 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
21fa0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21fb0 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61 73 68  fts5FlushOneHash
21fc0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
21fd0 20 20 46 74 73 35 48 61 73 68 20 2a 70 48 61 73    Fts5Hash *pHas
21fe0 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20  h = p->pHash;.  
21ff0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
22000 53 74 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 53  Struct;.  int iS
22010 65 67 69 64 3b 0a 20 20 69 6e 74 20 70 67 6e 6f  egid;.  int pgno
22020 4c 61 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Last = 0;       
22030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73            /* Las
22040 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
22050 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f  er in segment */
22060 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20  ..  /* Obtain a 
22070 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
22080 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
22090 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20   and allocate a 
220a0 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64 0a 20  new segment-id. 
220b0 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20   ** for the new 
220c0 6c 65 76 65 6c 2d 30 20 73 65 67 6d 65 6e 74 2e  level-0 segment.
220d0 20 20 2a 2f 0a 20 20 70 53 74 72 75 63 74 20 3d    */.  pStruct =
220e0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
220f0 61 64 28 70 29 3b 0a 20 20 69 53 65 67 69 64 20  ad(p);.  iSegid 
22100 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65  = fts5AllocateSe
22110 67 69 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b  gid(p, pStruct);
22120 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
22130 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 0a  Invalidate(p);..
22140 20 20 69 66 28 20 69 53 65 67 69 64 20 29 7b 0a    if( iSegid ){.
22150 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67      const int pg
22160 73 7a 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  sz = p->pConfig-
22170 3e 70 67 73 7a 3b 0a 20 20 20 20 69 6e 74 20 65  >pgsz;.    int e
22180 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e  Detail = p->pCon
22190 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20  fig->eDetail;.  
221a0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
221b0 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20  egment *pSeg;   
221c0 2f 2a 20 4e 65 77 20 73 65 67 6d 65 6e 74 20 77  /* New segment w
221d0 69 74 68 69 6e 20 70 53 74 72 75 63 74 20 2a 2f  ithin pStruct */
221e0 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
221f0 2a 70 42 75 66 3b 20 20 20 20 20 20 20 20 20 20  *pBuf;          
22200 20 20 20 2f 2a 20 42 75 66 66 65 72 20 69 6e 20     /* Buffer in 
22210 77 68 69 63 68 20 74 6f 20 61 73 73 65 6d 62 6c  which to assembl
22220 65 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20  e leaf page */. 
22230 20 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70     Fts5Buffer *p
22240 50 67 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  Pgidx;          
22250 20 2f 2a 20 42 75 66 66 65 72 20 69 6e 20 77 68   /* Buffer in wh
22260 69 63 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20  ich to assemble 
22270 70 67 69 64 78 20 2a 2f 0a 0a 20 20 20 20 46 74  pgidx */..    Ft
22280 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74  s5SegWriter writ
22290 65 72 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74  er;.    fts5Writ
222a0 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72  eInit(p, &writer
222b0 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20  , iSegid);..    
222c0 70 42 75 66 20 3d 20 26 77 72 69 74 65 72 2e 77  pBuf = &writer.w
222d0 72 69 74 65 72 2e 62 75 66 3b 0a 20 20 20 20 70  riter.buf;.    p
222e0 50 67 69 64 78 20 3d 20 26 77 72 69 74 65 72 2e  Pgidx = &writer.
222f0 77 72 69 74 65 72 2e 70 67 69 64 78 3b 0a 0a 20  writer.pgidx;.. 
22300 20 20 20 2f 2a 20 66 74 73 35 57 72 69 74 65 49     /* fts5WriteI
22310 6e 69 74 28 29 20 73 68 6f 75 6c 64 20 68 61 76  nit() should hav
22320 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 68  e initialized th
22330 65 20 62 75 66 66 65 72 73 20 74 6f 20 28 6d 6f  e buffers to (mo
22340 73 74 20 6c 69 6b 65 6c 79 29 0a 20 20 20 20 2a  st likely).    *
22350 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70  * the maximum sp
22360 61 63 65 20 72 65 71 75 69 72 65 64 2e 20 2a 2f  ace required. */
22370 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
22380 72 63 20 7c 7c 20 70 42 75 66 2d 3e 6e 53 70 61  rc || pBuf->nSpa
22390 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46 54 53 35  ce>=(pgsz + FTS5
223a0 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29 20 29  _DATA_PADDING) )
223b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
223c0 3e 72 63 20 7c 7c 20 70 50 67 69 64 78 2d 3e 6e  >rc || pPgidx->n
223d0 53 70 61 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46  Space>=(pgsz + F
223e0 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
223f0 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67  ) );..    /* Beg
22400 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  in scanning thro
22410 75 67 68 20 68 61 73 68 20 74 61 62 6c 65 20 65  ugh hash table e
22420 6e 74 72 69 65 73 2e 20 54 68 69 73 20 6c 6f 6f  ntries. This loo
22430 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  p runs once for 
22440 65 61 63 68 0a 20 20 20 20 2a 2a 20 74 65 72 6d  each.    ** term
22450 2f 64 6f 63 6c 69 73 74 20 63 75 72 72 65 6e 74  /doclist current
22460 6c 79 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e  ly stored within
22470 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
22480 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
22490 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
224a0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
224b0 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
224c0 6e 49 6e 69 74 28 70 48 61 73 68 2c 20 30 2c 20  nInit(pHash, 0, 
224d0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  0);.    }.    wh
224e0 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
224f0 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69  TE_OK && 0==sqli
22500 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
22510 6f 66 28 70 48 61 73 68 29 20 29 7b 0a 20 20 20  of(pHash) ){.   
22520 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
22530 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  Term;          /
22540 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
22550 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  ing term */.    
22560 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 6f 63    const u8 *pDoc
22570 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  list;         /*
22580 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c   Pointer to docl
22590 69 73 74 20 66 6f 72 20 74 68 69 73 20 74 65 72  ist for this ter
225a0 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  m */.      int n
225b0 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
225c0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
225d0 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62 79 74  f doclist in byt
225e0 65 73 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  es */..      /* 
225f0 57 72 69 74 65 20 74 68 65 20 74 65 72 6d 20 66  Write the term f
22600 6f 72 20 74 68 69 73 20 65 6e 74 72 79 20 74 6f  or this entry to
22610 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   disk. */.      
22620 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
22630 63 61 6e 45 6e 74 72 79 28 70 48 61 73 68 2c 20  canEntry(pHash, 
22640 26 7a 54 65 72 6d 2c 20 26 70 44 6f 63 6c 69 73  &zTerm, &pDoclis
22650 74 2c 20 26 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  t, &nDoclist);. 
22660 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70       fts5WriteAp
22670 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72 69  pendTerm(p, &wri
22680 74 65 72 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e  ter, (int)strlen
22690 28 7a 54 65 72 6d 29 2c 20 28 63 6f 6e 73 74 20  (zTerm), (const 
226a0 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 0a 20 20 20  u8*)zTerm);..   
226b0 20 20 20 61 73 73 65 72 74 28 20 77 72 69 74 65     assert( write
226c0 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  r.bFirstRowidInP
226d0 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  age==0 );.      
226e0 69 66 28 20 70 67 73 7a 3e 3d 28 70 42 75 66 2d  if( pgsz>=(pBuf-
226f0 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b  >n + pPgidx->n +
22700 20 6e 44 6f 63 6c 69 73 74 20 2b 20 31 29 20 29   nDoclist + 1) )
22710 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
22720 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20   entire doclist 
22730 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
22740 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f  current leaf. */
22750 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
22760 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
22770 62 28 70 42 75 66 2c 20 70 44 6f 63 6c 69 73 74  b(pBuf, pDoclist
22780 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20  , nDoclist);.   
22790 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
227a0 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 30    i64 iRowid = 0
227b0 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 44  ;.        i64 iD
227c0 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20 20 20  elta = 0;.      
227d0 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a    int iOff = 0;.
227e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
227f0 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20 77  entire doclist w
22800 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74  ill not fit on t
22810 68 69 73 20 6c 65 61 66 2e 20 54 68 65 20 66 6f  his leaf. The fo
22820 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 20 20 20  llowing .       
22830 20 2a 2a 20 6c 6f 6f 70 20 69 74 65 72 61 74 65   ** loop iterate
22840 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 6f  s through the po
22850 73 6c 69 73 74 73 20 74 68 61 74 20 6d 61 6b 65  slists that make
22860 20 75 70 20 74 68 65 20 63 75 72 72 65 6e 74 20   up the current 
22870 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c  .        ** docl
22880 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ist.  */.       
22890 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
228a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66  QLITE_OK && iOff
228b0 3c 6e 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  <nDoclist ){.   
228c0 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
228d0 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
228e0 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 28 75  oclist[iOff], (u
228f0 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
22900 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 2b          iRowid +
22910 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
22920 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 69      .          i
22930 66 28 20 77 72 69 74 65 72 2e 62 46 69 72 73 74  f( writer.bFirst
22940 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20  RowidInPage ){. 
22950 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 50             fts5P
22960 75 74 55 31 36 28 26 70 42 75 66 2d 3e 70 5b 30  utU16(&pBuf->p[0
22970 5d 2c 20 28 75 31 36 29 70 42 75 66 2d 3e 6e 29  ], (u16)pBuf->n)
22980 3b 20 20 20 2f 2a 20 66 69 72 73 74 20 72 6f 77  ;   /* first row
22990 69 64 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20  id on page */.  
229a0 20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e            pBuf->
229b0 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  n += sqlite3Fts5
229c0 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d  PutVarint(&pBuf-
229d0 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 52 6f  >p[pBuf->n], iRo
229e0 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wid);.          
229f0 20 20 77 72 69 74 65 72 2e 62 46 69 72 73 74 52    writer.bFirstR
22a00 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a  owidInPage = 0;.
22a10 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
22a20 57 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64  WriteDlidxAppend
22a30 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 52 6f  (p, &writer, iRo
22a40 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wid);.          
22a50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
22a60 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71     pBuf->n += sq
22a70 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72 69  lite3Fts5PutVari
22a80 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66  nt(&pBuf->p[pBuf
22a90 2d 3e 6e 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20  ->n], iDelta);. 
22aa0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22ab0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 75       assert( pBu
22ac0 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61  f->n<=pBuf->nSpa
22ad0 63 65 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  ce );..         
22ae0 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54   if( eDetail==FT
22af0 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29  S5_DETAIL_NONE )
22b00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
22b10 28 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20  ( iOff<nDoclist 
22b20 26 26 20 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66  && pDoclist[iOff
22b30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
22b40 20 20 20 20 20 20 70 42 75 66 2d 3e 70 5b 70 42        pBuf->p[pB
22b50 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a 20 20  uf->n++] = 0;.  
22b60 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66              iOff
22b70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
22b80 20 20 69 66 28 20 69 4f 66 66 3c 6e 44 6f 63 6c    if( iOff<nDocl
22b90 69 73 74 20 26 26 20 70 44 6f 63 6c 69 73 74 5b  ist && pDoclist[
22ba0 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  iOff]==0 ){.    
22bb0 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66              pBuf
22bc0 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d  ->p[pBuf->n++] =
22bd0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
22be0 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20      iOff++;.    
22bf0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22c00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22c10 20 20 20 20 20 20 69 66 28 20 28 70 42 75 66 2d        if( (pBuf-
22c20 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 29 3e  >n + pPgidx->n)>
22c30 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20  =pgsz ){.       
22c40 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65         fts5Write
22c50 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77 72  FlushLeaf(p, &wr
22c60 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  iter);.         
22c70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
22c80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
22c90 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20    int bDummy;.  
22ca0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50            int nP
22cb0 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  os;.            
22cc0 69 6e 74 20 6e 43 6f 70 79 20 3d 20 66 74 73 35  int nCopy = fts5
22cd0 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26  GetPoslistSize(&
22ce0 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20  pDoclist[iOff], 
22cf0 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b  &nPos, &bDummy);
22d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f  .            nCo
22d10 70 79 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20  py += nPos;.    
22d20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 42 75          if( (pBu
22d30 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e  f->n + pPgidx->n
22d40 20 2b 20 6e 43 6f 70 79 29 20 3c 3d 20 70 67 73   + nCopy) <= pgs
22d50 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  z ){.           
22d60 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65     /* The entire
22d70 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20 66 69   poslist will fi
22d80 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  t on the current
22d90 20 6c 65 61 66 2e 20 53 6f 20 63 6f 70 79 0a 20   leaf. So copy. 
22da0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
22db0 69 74 20 69 6e 20 6f 6e 65 20 67 6f 2e 20 2a 2f  it in one go. */
22dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
22dd0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
22de0 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70  endBlob(pBuf, &p
22df0 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 6e  Doclist[iOff], n
22e00 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20 20  Copy);.         
22e10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22e20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
22e30 6e 74 69 72 65 20 70 6f 73 6c 69 73 74 20 77 69  ntire poslist wi
22e40 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68  ll not fit on th
22e50 69 73 20 6c 65 61 66 2e 20 53 6f 20 69 74 20 6e  is leaf. So it n
22e60 65 65 64 73 0a 20 20 20 20 20 20 20 20 20 20 20  eeds.           
22e70 20 20 20 2a 2a 20 74 6f 20 62 65 20 62 72 6f 6b     ** to be brok
22e80 65 6e 20 69 6e 74 6f 20 73 65 63 74 69 6f 6e 73  en into sections
22e90 2e 20 54 68 65 20 6f 6e 6c 79 20 71 75 61 6c 69  . The only quali
22ea0 66 69 63 61 74 69 6f 6e 20 62 65 69 6e 67 0a 20  fication being. 
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
22ec0 74 68 61 74 20 65 61 63 68 20 76 61 72 69 6e 74  that each varint
22ed0 20 6d 75 73 74 20 62 65 20 73 74 6f 72 65 64 20   must be stored 
22ee0 63 6f 6e 74 69 67 75 6f 75 73 6c 79 2e 20 20 2a  contiguously.  *
22ef0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
22f00 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 6c 69  const u8 *pPosli
22f10 73 74 20 3d 20 26 70 44 6f 63 6c 69 73 74 5b 69  st = &pDoclist[i
22f20 4f 66 66 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Off];.          
22f30 20 20 20 20 69 6e 74 20 69 50 6f 73 20 3d 20 30      int iPos = 0
22f40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22f50 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
22f60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22f70 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
22f80 53 70 61 63 65 20 3d 20 70 67 73 7a 20 2d 20 70  Space = pgsz - p
22f90 42 75 66 2d 3e 6e 20 2d 20 70 50 67 69 64 78 2d  Buf->n - pPgidx-
22fa0 3e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  >n;.            
22fb0 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20      int n = 0;. 
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
22fd0 66 28 20 28 6e 43 6f 70 79 20 2d 20 69 50 6f 73  f( (nCopy - iPos
22fe0 29 3c 3d 6e 53 70 61 63 65 20 29 7b 0a 20 20 20  )<=nSpace ){.   
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
23000 20 3d 20 6e 43 6f 70 79 20 2d 20 69 50 6f 73 3b   = nCopy - iPos;
23010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23020 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23030 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 66 74            n = ft
23040 73 35 50 6f 73 6c 69 73 74 50 72 65 66 69 78 28  s5PoslistPrefix(
23050 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c  &pPoslist[iPos],
23060 20 6e 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20   nSpace);.      
23070 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23080 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
23090 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 20 20 20  rt( n>0 );.     
230a0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
230b0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
230c0 6c 6f 62 28 70 42 75 66 2c 20 26 70 50 6f 73 6c  lob(pBuf, &pPosl
230d0 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20  ist[iPos], n);. 
230e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
230f0 50 6f 73 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20  Pos += n;.      
23100 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
23110 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d  Buf->n + pPgidx-
23120 3e 6e 29 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20  >n)>=pgsz ){.   
23130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
23140 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
23150 66 28 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20  f(p, &writer);. 
23160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
23170 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23180 20 69 66 28 20 69 50 6f 73 3e 3d 6e 43 6f 70 79   if( iPos>=nCopy
23190 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
231a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
231b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
231c0 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70      iOff += nCop
231d0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  y;.          }. 
231e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
231f0 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 32  ..      /* TODO2
23200 3a 20 44 6f 63 6c 69 73 74 20 74 65 72 6d 69 6e  : Doclist termin
23210 61 74 6f 72 20 77 72 69 74 74 65 6e 20 68 65 72  ator written her
23220 65 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 70  e. */.      /* p
23230 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b  Buf->p[pBuf->n++
23240 5d 20 3d 20 27 5c 30 27 3b 20 2a 2f 0a 20 20 20  ] = '\0'; */.   
23250 20 20 20 61 73 73 65 72 74 28 20 70 42 75 66 2d     assert( pBuf-
23260 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65  >n<=pBuf->nSpace
23270 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
23280 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78  3Fts5HashScanNex
23290 74 28 70 48 61 73 68 29 3b 0a 20 20 20 20 7d 0a  t(pHash);.    }.
232a0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
232b0 61 73 68 43 6c 65 61 72 28 70 48 61 73 68 29 3b  ashClear(pHash);
232c0 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46 69  .    fts5WriteFi
232d0 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c  nish(p, &writer,
232e0 20 26 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20   &pgnoLast);..  
232f0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
23300 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 20 49  Fts5Structure. I
23310 74 20 69 73 20 77 72 69 74 74 65 6e 20 62 61 63  t is written bac
23320 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  k to the databas
23330 65 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20  e by the.    ** 
23340 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
23350 65 61 73 65 28 29 20 63 61 6c 6c 20 62 65 6c 6f  ease() call belo
23360 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  w.  */.    if( p
23370 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d  Struct->nLevel==
23380 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  0 ){.      fts5S
23390 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c  tructureAddLevel
233a0 28 26 70 2d 3e 72 63 2c 20 26 70 53 74 72 75 63  (&p->rc, &pStruc
233b0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  t);.    }.    ft
233c0 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e  s5StructureExten
233d0 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70  dLevel(&p->rc, p
233e0 53 74 72 75 63 74 2c 20 30 2c 20 31 2c 20 30 29  Struct, 0, 1, 0)
233f0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ;.    if( p->rc=
23400 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23410 20 20 20 20 70 53 65 67 20 3d 20 26 70 53 74 72      pSeg = &pStr
23420 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 61  uct->aLevel[0].a
23430 53 65 67 5b 20 70 53 74 72 75 63 74 2d 3e 61 4c  Seg[ pStruct->aL
23440 65 76 65 6c 5b 30 5d 2e 6e 53 65 67 2b 2b 20 5d  evel[0].nSeg++ ]
23450 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 69 53  ;.      pSeg->iS
23460 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 20  egid = iSegid;. 
23470 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46       pSeg->pgnoF
23480 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  irst = 1;.      
23490 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d  pSeg->pgnoLast =
234a0 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 20   pgnoLast;.     
234b0 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
234c0 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt++;.    }.    
234d0 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
234e0 6d 6f 74 65 28 70 2c 20 30 2c 20 70 53 74 72 75  mote(p, 0, pStru
234f0 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  ct);.  }..  fts5
23500 49 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28 70  IndexAutomerge(p
23510 2c 20 26 70 53 74 72 75 63 74 2c 20 70 67 6e 6f  , &pStruct, pgno
23520 4c 61 73 74 29 3b 0a 20 20 66 74 73 35 49 6e 64  Last);.  fts5Ind
23530 65 78 43 72 69 73 69 73 6d 65 72 67 65 28 70 2c  exCrisismerge(p,
23540 20 26 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74   &pStruct);.  ft
23550 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65  s5StructureWrite
23560 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  (p, pStruct);.  
23570 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
23580 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 7d  ease(pStruct);.}
23590 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e  ../*.** Flush an
235a0 79 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  y data stored in
235b0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68   the in-memory h
235c0 61 73 68 20 74 61 62 6c 65 73 20 74 6f 20 74 68  ash tables to th
235d0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
235e0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
235f0 6e 64 65 78 46 6c 75 73 68 28 46 74 73 35 49 6e  ndexFlush(Fts5In
23600 64 65 78 20 2a 70 29 7b 0a 20 20 2f 2a 20 55 6e  dex *p){.  /* Un
23610 6c 65 73 73 20 69 74 20 69 73 20 65 6d 70 74 79  less it is empty
23620 2c 20 66 6c 75 73 68 20 74 68 65 20 68 61 73 68  , flush the hash
23630 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b 20 2a   table to disk *
23640 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64  /.  if( p->nPend
23650 69 6e 67 44 61 74 61 20 29 7b 0a 20 20 20 20 61  ingData ){.    a
23660 73 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20  ssert( p->pHash 
23670 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69  );.    p->nPendi
23680 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  ngData = 0;.    
23690 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61 73 68  fts5FlushOneHash
236a0 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  (p);.  }.}..stat
236b0 69 63 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ic Fts5Structure
236c0 20 2a 66 74 73 35 49 6e 64 65 78 4f 70 74 69 6d   *fts5IndexOptim
236d0 69 7a 65 53 74 72 75 63 74 28 0a 20 20 46 74 73  izeStruct(.  Fts
236e0 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
236f0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
23700 72 75 63 74 0a 29 7b 0a 20 20 46 74 73 35 53 74  ruct.){.  Fts5St
23710 72 75 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20  ructure *pNew = 
23720 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  0;.  int nByte =
23730 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
23740 63 74 75 72 65 29 3b 0a 20 20 69 6e 74 20 6e 53  cture);.  int nS
23750 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 53  eg = pStruct->nS
23760 65 67 6d 65 6e 74 3b 0a 20 20 69 6e 74 20 69 3b  egment;.  int i;
23770 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
23780 74 20 69 66 20 74 68 69 73 20 73 74 72 75 63 74  t if this struct
23790 75 72 65 20 72 65 71 75 69 72 65 73 20 6f 70 74  ure requires opt
237a0 69 6d 69 7a 61 74 69 6f 6e 2e 20 41 20 73 74 72  imization. A str
237b0 75 63 74 75 72 65 20 64 6f 65 73 0a 20 20 2a 2a  ucture does.  **
237c0 20 6e 6f 74 20 72 65 71 75 69 72 65 20 6f 70 74   not require opt
237d0 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 65 69 74  imization if eit
237e0 68 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  her:.  **.  **  
237f0 2b 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  + it consists of
23800 20 66 65 77 65 72 20 74 68 61 6e 20 74 77 6f 20   fewer than two 
23810 73 65 67 6d 65 6e 74 73 2c 20 6f 72 20 0a 20 20  segments, or .  
23820 2a 2a 20 20 2b 20 61 6c 6c 20 73 65 67 6d 65 6e  **  + all segmen
23830 74 73 20 61 72 65 20 6f 6e 20 74 68 65 20 73 61  ts are on the sa
23840 6d 65 20 6c 65 76 65 6c 2c 20 6f 72 0a 20 20 2a  me level, or.  *
23850 2a 20 20 2b 20 61 6c 6c 20 73 65 67 6d 65 6e 74  *  + all segment
23860 73 20 65 78 63 65 70 74 20 6f 6e 65 20 61 72 65  s except one are
23870 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 70 75 74   currently input
23880 73 20 74 6f 20 61 20 6d 65 72 67 65 20 6f 70 65  s to a merge ope
23890 72 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  ration..  **.  *
238a0 2a 20 49 6e 20 74 68 65 20 66 69 72 73 74 20 63  * In the first c
238b0 61 73 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ase, return NULL
238c0 2e 20 49 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c  . In the second,
238d0 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   increment the r
238e0 65 66 2d 63 6f 75 6e 74 0a 20 20 2a 2a 20 6f 6e  ef-count.  ** on
238f0 20 2a 70 53 74 72 75 63 74 20 61 6e 64 20 72 65   *pStruct and re
23900 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66 20 74  turn a copy of t
23910 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74  he pointer to it
23920 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 53 65  ..  */.  if( nSe
23930 67 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  g<2 ) return 0;.
23940 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 74    for(i=0; i<pSt
23950 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b  ruct->nLevel; i+
23960 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 54 68 69  +){.    int nThi
23970 73 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65  s = pStruct->aLe
23980 76 65 6c 5b 69 5d 2e 6e 53 65 67 3b 0a 20 20 20  vel[i].nSeg;.   
23990 20 69 66 28 20 6e 54 68 69 73 3d 3d 6e 53 65 67   if( nThis==nSeg
239a0 20 7c 7c 20 28 6e 54 68 69 73 3d 3d 6e 53 65 67   || (nThis==nSeg
239b0 2d 31 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61  -1 && pStruct->a
239c0 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 3d  Level[i].nMerge=
239d0 3d 6e 54 68 69 73 29 20 29 7b 0a 20 20 20 20 20  =nThis) ){.     
239e0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
239f0 66 28 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20  f(pStruct);.    
23a00 20 20 72 65 74 75 72 6e 20 70 53 74 72 75 63 74    return pStruct
23a10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
23a20 72 74 28 20 70 53 74 72 75 63 74 2d 3e 61 4c 65  rt( pStruct->aLe
23a30 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 3c 3d 6e  vel[i].nMerge<=n
23a40 54 68 69 73 20 29 3b 0a 20 20 7d 0a 0a 20 20 6e  This );.  }..  n
23a50 42 79 74 65 20 2b 3d 20 28 70 53 74 72 75 63 74  Byte += (pStruct
23a60 2d 3e 6e 4c 65 76 65 6c 2b 31 29 20 2a 20 73 69  ->nLevel+1) * si
23a70 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
23a80 72 65 4c 65 76 65 6c 29 3b 0a 20 20 70 4e 65 77  reLevel);.  pNew
23a90 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72   = (Fts5Structur
23aa0 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  e*)sqlite3Fts5Ma
23ab0 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c  llocZero(&p->rc,
23ac0 20 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66 28 20   nByte);..  if( 
23ad0 70 4e 65 77 20 29 7b 0a 20 20 20 20 46 74 73 35  pNew ){.    Fts5
23ae0 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
23af0 70 4c 76 6c 3b 0a 20 20 20 20 6e 42 79 74 65 20  pLvl;.    nByte 
23b00 3d 20 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28  = nSeg * sizeof(
23b10 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
23b20 6d 65 6e 74 29 3b 0a 20 20 20 20 70 4e 65 77 2d  ment);.    pNew-
23b30 3e 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63  >nLevel = pStruc
23b40 74 2d 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20  t->nLevel+1;.   
23b50 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b   pNew->nRef = 1;
23b60 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 57 72 69 74  .    pNew->nWrit
23b70 65 43 6f 75 6e 74 65 72 20 3d 20 70 53 74 72 75  eCounter = pStru
23b80 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  ct->nWriteCounte
23b90 72 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70  r;.    pLvl = &p
23ba0 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72  New->aLevel[pStr
23bb0 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20  uct->nLevel];.  
23bc0 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28    pLvl->aSeg = (
23bd0 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
23be0 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73  ment*)sqlite3Fts
23bf0 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e  5MallocZero(&p->
23c00 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  rc, nByte);.    
23c10 69 66 28 20 70 4c 76 6c 2d 3e 61 53 65 67 20 29  if( pLvl->aSeg )
23c20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c  {.      int iLvl
23c30 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 69 6e  , iSeg;.      in
23c40 74 20 69 53 65 67 4f 75 74 20 3d 20 30 3b 0a 20  t iSegOut = 0;. 
23c50 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20       /* Iterate 
23c60 74 68 72 6f 75 67 68 20 61 6c 6c 20 73 65 67 6d  through all segm
23c70 65 6e 74 73 2c 20 66 72 6f 6d 20 6f 6c 64 65 73  ents, from oldes
23c80 74 20 74 6f 20 6e 65 77 65 73 74 2e 20 41 64 64  t to newest. Add
23c90 20 74 68 65 6d 20 74 6f 0a 20 20 20 20 20 20 2a   them to.      *
23ca0 2a 20 74 68 65 20 6e 65 77 20 46 74 73 35 4c 65  * the new Fts5Le
23cb0 76 65 6c 20 6f 62 6a 65 63 74 20 73 6f 20 74 68  vel object so th
23cc0 61 74 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 30 5d  at pLvl->aSeg[0]
23cd0 20 69 73 20 74 68 65 20 6f 6c 64 65 73 74 0a 20   is the oldest. 
23ce0 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20       ** segment 
23cf0 69 6e 20 74 68 65 20 64 61 74 61 20 73 74 72 75  in the data stru
23d00 63 74 75 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20  cture.  */.     
23d10 20 66 6f 72 28 69 4c 76 6c 3d 70 53 74 72 75 63   for(iLvl=pStruc
23d20 74 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 4c 76  t->nLevel-1; iLv
23d30 6c 3e 3d 30 3b 20 69 4c 76 6c 2d 2d 29 7b 0a 20  l>=0; iLvl--){. 
23d40 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d         for(iSeg=
23d50 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d  0; iSeg<pStruct-
23d60 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
23d70 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  eg; iSeg++){.   
23d80 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65         pLvl->aSe
23d90 67 5b 69 53 65 67 4f 75 74 5d 20 3d 20 70 53 74  g[iSegOut] = pSt
23da0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
23db0 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20  l].aSeg[iSeg];. 
23dc0 20 20 20 20 20 20 20 20 20 69 53 65 67 4f 75 74           iSegOut
23dd0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
23de0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77      }.      pNew
23df0 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 70 4c 76  ->nSegment = pLv
23e00 6c 2d 3e 6e 53 65 67 20 3d 20 6e 53 65 67 3b 0a  l->nSeg = nSeg;.
23e10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23e20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
23e30 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  ew);.      pNew 
23e40 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
23e50 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
23e60 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
23e70 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65 28 46  5IndexOptimize(F
23e80 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
23e90 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
23ea0 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74  Struct;.  Fts5St
23eb0 72 75 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20  ructure *pNew = 
23ec0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
23ed0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
23ee0 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75  ;.  fts5IndexFlu
23ef0 73 68 28 70 29 3b 0a 20 20 70 53 74 72 75 63 74  sh(p);.  pStruct
23f00 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
23f10 52 65 61 64 28 70 29 3b 0a 20 20 66 74 73 35 53  Read(p);.  fts5S
23f20 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61  tructureInvalida
23f30 74 65 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 53  te(p);..  if( pS
23f40 74 72 75 63 74 20 29 7b 0a 20 20 20 20 70 4e 65  truct ){.    pNe
23f50 77 20 3d 20 66 74 73 35 49 6e 64 65 78 4f 70 74  w = fts5IndexOpt
23f60 69 6d 69 7a 65 53 74 72 75 63 74 28 70 2c 20 70  imizeStruct(p, p
23f70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 20 20 66  Struct);.  }.  f
23f80 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
23f90 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 0a 20  ase(pStruct);.. 
23fa0 20 61 73 73 65 72 74 28 20 70 4e 65 77 3d 3d 30   assert( pNew==0
23fb0 20 7c 7c 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65   || pNew->nSegme
23fc0 6e 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 4e  nt>0 );.  if( pN
23fd0 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c  ew ){.    int iL
23fe0 76 6c 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c  vl;.    for(iLvl
23ff0 3d 30 3b 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c  =0; pNew->aLevel
24000 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 3b 20  [iLvl].nSeg==0; 
24010 69 4c 76 6c 2b 2b 29 7b 7d 0a 20 20 20 20 77 68  iLvl++){}.    wh
24020 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
24030 54 45 5f 4f 4b 20 26 26 20 70 4e 65 77 2d 3e 61  TE_OK && pNew->a
24040 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
24050 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >0 ){.      int 
24060 6e 52 65 6d 20 3d 20 46 54 53 35 5f 4f 50 54 5f  nRem = FTS5_OPT_
24070 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 20  WORK_UNIT;.     
24080 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c   fts5IndexMergeL
24090 65 76 65 6c 28 70 2c 20 26 70 4e 65 77 2c 20 69  evel(p, &pNew, i
240a0 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20  Lvl, &nRem);.   
240b0 20 7d 0a 0a 20 20 20 20 66 74 73 35 53 74 72 75   }..    fts5Stru
240c0 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 70 4e  ctureWrite(p, pN
240d0 65 77 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72  ew);.    fts5Str
240e0 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 4e  uctureRelease(pN
240f0 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ew);.  }..  retu
24100 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
24110 72 6e 28 70 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn(p); .}../*.**
24120 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
24130 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
24140 20 73 70 65 63 69 61 6c 20 22 56 41 4c 55 45 53   special "VALUES
24150 28 27 6d 65 72 67 65 27 2c 20 24 6e 4d 65 72 67  ('merge', $nMerg
24160 65 29 22 0a 2a 2a 20 49 4e 53 45 52 54 20 63 6f  e)".** INSERT co
24170 6d 6d 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  mmand..*/.int sq
24180 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4d 65  lite3Fts5IndexMe
24190 72 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  rge(Fts5Index *p
241a0 2c 20 69 6e 74 20 6e 4d 65 72 67 65 29 7b 0a 20  , int nMerge){. 
241b0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
241c0 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
241d0 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
241e0 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
241f0 0a 20 20 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20  .    int nMin = 
24200 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 55 73 65  p->pConfig->nUse
24210 72 6d 65 72 67 65 3b 0a 20 20 20 20 66 74 73 35  rmerge;.    fts5
24220 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64  StructureInvalid
24230 61 74 65 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ate(p);.    if( 
24240 6e 4d 65 72 67 65 3c 30 20 29 7b 0a 20 20 20 20  nMerge<0 ){.    
24250 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
24260 2a 70 4e 65 77 20 3d 20 66 74 73 35 49 6e 64 65  *pNew = fts5Inde
24270 78 4f 70 74 69 6d 69 7a 65 53 74 72 75 63 74 28  xOptimizeStruct(
24280 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20  p, pStruct);.   
24290 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
242a0 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
242b0 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 20  ;.      pStruct 
242c0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4d  = pNew;.      nM
242d0 69 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 6e 4d  in = 2;.      nM
242e0 65 72 67 65 20 3d 20 6e 4d 65 72 67 65 2a 2d 31  erge = nMerge*-1
242f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
24300 70 53 74 72 75 63 74 20 26 26 20 70 53 74 72 75  pStruct && pStru
24310 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 7b 0a 20 20  ct->nLevel ){.  
24320 20 20 20 20 69 66 28 20 66 74 73 35 49 6e 64 65      if( fts5Inde
24330 78 4d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75  xMerge(p, &pStru
24340 63 74 2c 20 6e 4d 65 72 67 65 2c 20 6e 4d 69 6e  ct, nMerge, nMin
24350 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  ) ){.        fts
24360 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28  5StructureWrite(
24370 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20  p, pStruct);.   
24380 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
24390 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
243a0 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
243b0 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  }.  return fts5I
243c0 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
243d0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
243e0 73 35 41 70 70 65 6e 64 52 6f 77 69 64 28 0a 20  s5AppendRowid(. 
243f0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20   Fts5Index *p,. 
24400 20 69 36 34 20 69 44 65 6c 74 61 2c 0a 20 20 46   i64 iDelta,.  F
24410 74 73 35 49 74 65 72 20 2a 70 55 6e 75 73 65 64  ts5Iter *pUnused
24420 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ,.  Fts5Buffer *
24430 70 42 75 66 0a 29 7b 0a 20 20 55 4e 55 53 45 44  pBuf.){.  UNUSED
24440 5f 50 41 52 41 4d 28 70 55 6e 75 73 65 64 29 3b  _PARAM(pUnused);
24450 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70  .  fts5BufferApp
24460 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
24470 2c 20 70 42 75 66 2c 20 69 44 65 6c 74 61 29 3b  , pBuf, iDelta);
24480 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
24490 66 74 73 35 41 70 70 65 6e 64 50 6f 73 6c 69 73  fts5AppendPoslis
244a0 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
244b0 70 2c 0a 20 20 69 36 34 20 69 44 65 6c 74 61 2c  p,.  i64 iDelta,
244c0 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 4d 75  .  Fts5Iter *pMu
244d0 6c 74 69 2c 0a 20 20 46 74 73 35 42 75 66 66 65  lti,.  Fts5Buffe
244e0 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74  r *pBuf.){.  int
244f0 20 6e 44 61 74 61 20 3d 20 70 4d 75 6c 74 69 2d   nData = pMulti-
24500 3e 62 61 73 65 2e 6e 44 61 74 61 3b 0a 20 20 61  >base.nData;.  a
24510 73 73 65 72 74 28 20 6e 44 61 74 61 3e 30 20 29  ssert( nData>0 )
24520 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
24530 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 66  QLITE_OK && 0==f
24540 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70  ts5BufferGrow(&p
24550 2d 3e 72 63 2c 20 70 42 75 66 2c 20 6e 44 61 74  ->rc, pBuf, nDat
24560 61 2b 39 2b 39 29 20 29 7b 0a 20 20 20 20 66 74  a+9+9) ){.    ft
24570 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
24580 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69  ndVarint(pBuf, i
24590 44 65 6c 74 61 29 3b 0a 20 20 20 20 66 74 73 35  Delta);.    fts5
245a0 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
245b0 56 61 72 69 6e 74 28 70 42 75 66 2c 20 6e 44 61  Varint(pBuf, nDa
245c0 74 61 2a 32 29 3b 0a 20 20 20 20 66 74 73 35 42  ta*2);.    fts5B
245d0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
245e0 6c 6f 62 28 70 42 75 66 2c 20 70 4d 75 6c 74 69  lob(pBuf, pMulti
245f0 2d 3e 62 61 73 65 2e 70 44 61 74 61 2c 20 6e 44  ->base.pData, nD
24600 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 73 74  ata);.  }.}...st
24610 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f  atic void fts5Do
24620 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 46 74  clistIterNext(Ft
24630 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70  s5DoclistIter *p
24640 49 74 65 72 29 7b 0a 20 20 75 38 20 2a 70 20 3d  Iter){.  u8 *p =
24650 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74   pIter->aPoslist
24660 20 2b 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20   + pIter->nSize 
24670 2b 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73  + pIter->nPoslis
24680 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  t;..  assert( pI
24690 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 29 3b  ter->aPoslist );
246a0 0a 20 20 69 66 28 20 70 3e 3d 70 49 74 65 72 2d  .  if( p>=pIter-
246b0 3e 61 45 6f 66 20 29 7b 0a 20 20 20 20 70 49 74  >aEof ){.    pIt
246c0 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 30  er->aPoslist = 0
246d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
246e0 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20  64 iDelta;..    
246f0 70 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  p += fts5GetVari
24700 6e 74 28 70 2c 20 28 75 36 34 2a 29 26 69 44 65  nt(p, (u64*)&iDe
24710 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  lta);.    pIter-
24720 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74  >iRowid += iDelt
24730 61 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  a;..    /* Read 
24740 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73 69  position list si
24750 7a 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 5b  ze */.    if( p[
24760 30 5d 20 26 20 30 78 38 30 20 29 7b 0a 20 20 20  0] & 0x80 ){.   
24770 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
24780 20 20 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20     pIter->nSize 
24790 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
247a0 32 28 70 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20  2(p, nPos);.    
247b0 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73    pIter->nPoslis
247c0 74 20 3d 20 28 6e 50 6f 73 3e 3e 31 29 3b 0a 20  t = (nPos>>1);. 
247d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
247e0 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20  pIter->nPoslist 
247f0 3d 20 28 28 69 6e 74 29 28 70 5b 30 5d 29 29 20  = ((int)(p[0])) 
24800 3e 3e 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65  >> 1;.      pIte
24810 72 2d 3e 6e 53 69 7a 65 20 3d 20 31 3b 0a 20 20  r->nSize = 1;.  
24820 20 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e    }..    pIter->
24830 61 50 6f 73 6c 69 73 74 20 3d 20 70 3b 0a 20 20  aPoslist = p;.  
24840 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
24850 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
24860 49 6e 69 74 28 0a 20 20 46 74 73 35 42 75 66 66  Init(.  Fts5Buff
24870 65 72 20 2a 70 42 75 66 2c 20 0a 20 20 46 74 73  er *pBuf, .  Fts
24880 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49  5DoclistIter *pI
24890 74 65 72 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28  ter.){.  memset(
248a0 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
248b0 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74  (*pIter));.  pIt
248c0 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70  er->aPoslist = p
248d0 42 75 66 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d  Buf->p;.  pIter-
248e0 3e 61 45 6f 66 20 3d 20 26 70 42 75 66 2d 3e 70  >aEof = &pBuf->p
248f0 5b 70 42 75 66 2d 3e 6e 5d 3b 0a 20 20 66 74 73  [pBuf->n];.  fts
24900 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
24910 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 23 69 66 20  (pIter);.}..#if 
24920 30 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  0./*.** Append a
24930 20 64 6f 63 6c 69 73 74 20 74 6f 20 62 75 66 66   doclist to buff
24940 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54  er pBuf..**.** T
24950 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
24960 75 6d 65 73 20 74 68 61 74 20 73 70 61 63 65 20  umes that space 
24970 77 69 74 68 69 6e 20 74 68 65 20 62 75 66 66 65  within the buffe
24980 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  r has already be
24990 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e  en.** allocated.
249a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
249b0 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44  fts5MergeAppendD
249c0 6f 63 69 64 28 0a 20 20 46 74 73 35 42 75 66 66  ocid(.  Fts5Buff
249d0 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  er *pBuf,       
249e0 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
249f0 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  r to write to */
24a00 0a 20 20 69 36 34 20 2a 70 69 4c 61 73 74 52 6f  .  i64 *piLastRo
24a10 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  wid,            
24a20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72     /* IN/OUT: Pr
24a30 65 76 69 6f 75 73 20 72 6f 77 69 64 20 77 72 69  evious rowid wri
24a40 74 74 65 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f  tten (if any) */
24a50 0a 20 20 69 36 34 20 69 52 6f 77 69 64 20 20 20  .  i64 iRowid   
24a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a70 20 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61     /* Rowid to a
24a80 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 61 73  ppend */.){.  as
24a90 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 21 3d 30  sert( pBuf->n!=0
24aa0 20 7c 7c 20 28 2a 70 69 4c 61 73 74 52 6f 77 69   || (*piLastRowi
24ab0 64 29 3d 3d 30 20 29 3b 0a 20 20 66 74 73 35 42  d)==0 );.  fts5B
24ac0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
24ad0 61 72 69 6e 74 28 70 42 75 66 2c 20 69 52 6f 77  arint(pBuf, iRow
24ae0 69 64 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77 69  id - *piLastRowi
24af0 64 29 3b 0a 20 20 2a 70 69 4c 61 73 74 52 6f 77  d);.  *piLastRow
24b00 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 23  id = iRowid;.}.#
24b10 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 66  endif..#define f
24b20 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
24b30 63 69 64 28 70 42 75 66 2c 20 69 4c 61 73 74 52  cid(pBuf, iLastR
24b40 6f 77 69 64 2c 20 69 52 6f 77 69 64 29 20 7b 20  owid, iRowid) { 
24b50 20 20 20 20 20 20 5c 0a 20 20 61 73 73 65 72 74        \.  assert
24b60 28 20 28 70 42 75 66 29 2d 3e 6e 21 3d 30 20 7c  ( (pBuf)->n!=0 |
24b70 7c 20 28 69 4c 61 73 74 52 6f 77 69 64 29 3d 3d  | (iLastRowid)==
24b80 30 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  0 );            
24b90 20 20 20 20 20 20 20 5c 0a 20 20 66 74 73 35 42         \.  fts5B
24ba0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
24bb0 61 72 69 6e 74 28 28 70 42 75 66 29 2c 20 28 69  arint((pBuf), (i
24bc0 52 6f 77 69 64 29 20 2d 20 28 69 4c 61 73 74 52  Rowid) - (iLastR
24bd0 6f 77 69 64 29 29 3b 20 5c 0a 20 20 28 69 4c 61  owid)); \.  (iLa
24be0 73 74 52 6f 77 69 64 29 20 3d 20 28 69 52 6f 77  stRowid) = (iRow
24bf0 69 64 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  id);            
24c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c10 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a           \.}../*
24c20 0a 2a 2a 20 53 77 61 70 20 74 68 65 20 63 6f 6e  .** Swap the con
24c30 74 65 6e 74 73 20 6f 66 20 62 75 66 66 65 72 20  tents of buffer 
24c40 2a 70 31 20 77 69 74 68 20 74 68 61 74 20 6f 66  *p1 with that of
24c50 20 2a 70 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   *p2..*/.static 
24c60 76 6f 69 64 20 66 74 73 35 42 75 66 66 65 72 53  void fts5BufferS
24c70 77 61 70 28 46 74 73 35 42 75 66 66 65 72 20 2a  wap(Fts5Buffer *
24c80 70 31 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  p1, Fts5Buffer *
24c90 70 32 29 7b 0a 20 20 46 74 73 35 42 75 66 66 65  p2){.  Fts5Buffe
24ca0 72 20 74 6d 70 20 3d 20 2a 70 31 3b 0a 20 20 2a  r tmp = *p1;.  *
24cb0 70 31 20 3d 20 2a 70 32 3b 0a 20 20 2a 70 32 20  p1 = *p2;.  *p2 
24cc0 3d 20 74 6d 70 3b 0a 7d 0a 0a 73 74 61 74 69 63  = tmp;.}..static
24cd0 20 76 6f 69 64 20 66 74 73 35 4e 65 78 74 52 6f   void fts5NextRo
24ce0 77 69 64 28 46 74 73 35 42 75 66 66 65 72 20 2a  wid(Fts5Buffer *
24cf0 70 42 75 66 2c 20 69 6e 74 20 2a 70 69 4f 66 66  pBuf, int *piOff
24d00 2c 20 69 36 34 20 2a 70 69 52 6f 77 69 64 29 7b  , i64 *piRowid){
24d10 0a 20 20 69 6e 74 20 69 20 3d 20 2a 70 69 4f 66  .  int i = *piOf
24d20 66 3b 0a 20 20 69 66 28 20 69 3e 3d 70 42 75 66  f;.  if( i>=pBuf
24d30 2d 3e 6e 20 29 7b 0a 20 20 20 20 2a 70 69 4f 66  ->n ){.    *piOf
24d40 66 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  f = -1;.  }else{
24d50 0a 20 20 20 20 75 36 34 20 69 56 61 6c 3b 0a 20  .    u64 iVal;. 
24d60 20 20 20 2a 70 69 4f 66 66 20 3d 20 69 20 2b 20     *piOff = i + 
24d70 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
24d80 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69 5d  rint(&pBuf->p[i]
24d90 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 2a 70  , &iVal);.    *p
24da0 69 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a  iRowid += iVal;.
24db0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
24dc0 73 20 69 73 20 74 68 65 20 65 71 75 69 76 61 6c  s is the equival
24dd0 65 6e 74 20 6f 66 20 66 74 73 35 4d 65 72 67 65  ent of fts5Merge
24de0 50 72 65 66 69 78 4c 69 73 74 73 28 29 20 66 6f  PrefixLists() fo
24df0 72 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 6d 6f  r detail=none mo
24e00 64 65 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63  de..** In this c
24e10 61 73 65 20 74 68 65 20 62 75 66 66 65 72 73 20  ase the buffers 
24e20 63 6f 6e 73 69 73 74 20 6f 66 20 61 20 64 65 6c  consist of a del
24e30 74 61 2d 65 6e 63 6f 64 65 64 20 6c 69 73 74 20  ta-encoded list 
24e40 6f 66 20 72 6f 77 69 64 73 20 6f 6e 6c 79 2e 0a  of rowids only..
24e50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
24e60 74 73 35 4d 65 72 67 65 52 6f 77 69 64 4c 69 73  ts5MergeRowidLis
24e70 74 73 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ts(.  Fts5Index 
24e80 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
24e90 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
24ea0 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
24eb0 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 31    Fts5Buffer *p1
24ec0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24ed0 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20    /* First list 
24ee0 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74  to merge */.  Ft
24ef0 73 35 42 75 66 66 65 72 20 2a 70 32 20 20 20 20  s5Buffer *p2    
24f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24f10 20 53 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20   Second list to 
24f20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  merge */.){.  in
24f30 74 20 69 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  t i1 = 0;.  int 
24f40 69 32 20 3d 20 30 3b 0a 20 20 69 36 34 20 69 52  i2 = 0;.  i64 iR
24f50 6f 77 69 64 31 20 3d 20 30 3b 0a 20 20 69 36 34  owid1 = 0;.  i64
24f60 20 69 52 6f 77 69 64 32 20 3d 20 30 3b 0a 20 20   iRowid2 = 0;.  
24f70 69 36 34 20 69 4f 75 74 20 3d 20 30 3b 0a 0a 20  i64 iOut = 0;.. 
24f80 20 46 74 73 35 42 75 66 66 65 72 20 6f 75 74 3b   Fts5Buffer out;
24f90 0a 20 20 6d 65 6d 73 65 74 28 26 6f 75 74 2c 20  .  memset(&out, 
24fa0 30 2c 20 73 69 7a 65 6f 66 28 6f 75 74 29 29 3b  0, sizeof(out));
24fb0 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75  .  sqlite3Fts5Bu
24fc0 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c  fferSize(&p->rc,
24fd0 20 26 6f 75 74 2c 20 70 31 2d 3e 6e 20 2b 20 70   &out, p1->n + p
24fe0 32 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 70 2d 3e  2->n);.  if( p->
24ff0 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  rc ) return;..  
25000 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70 31  fts5NextRowid(p1
25010 2c 20 26 69 31 2c 20 26 69 52 6f 77 69 64 31 29  , &i1, &iRowid1)
25020 3b 0a 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69  ;.  fts5NextRowi
25030 64 28 70 32 2c 20 26 69 32 2c 20 26 69 52 6f 77  d(p2, &i2, &iRow
25040 69 64 32 29 3b 0a 20 20 77 68 69 6c 65 28 20 69  id2);.  while( i
25050 31 3e 3d 30 20 7c 7c 20 69 32 3e 3d 30 20 29 7b  1>=0 || i2>=0 ){
25060 0a 20 20 20 20 69 66 28 20 69 31 3e 3d 30 20 26  .    if( i1>=0 &
25070 26 20 28 69 32 3c 30 20 7c 7c 20 69 52 6f 77 69  & (i2<0 || iRowi
25080 64 31 3c 69 52 6f 77 69 64 32 29 20 29 7b 0a 20  d1<iRowid2) ){. 
25090 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f 75       assert( iOu
250a0 74 3d 3d 30 20 7c 7c 20 69 52 6f 77 69 64 31 3e  t==0 || iRowid1>
250b0 69 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 66 74  iOut );.      ft
250c0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
250d0 6e 64 56 61 72 69 6e 74 28 26 6f 75 74 2c 20 69  ndVarint(&out, i
250e0 52 6f 77 69 64 31 20 2d 20 69 4f 75 74 29 3b 0a  Rowid1 - iOut);.
250f0 20 20 20 20 20 20 69 4f 75 74 20 3d 20 69 52 6f        iOut = iRo
25100 77 69 64 31 3b 0a 20 20 20 20 20 20 66 74 73 35  wid1;.      fts5
25110 4e 65 78 74 52 6f 77 69 64 28 70 31 2c 20 26 69  NextRowid(p1, &i
25120 31 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a 20 20  1, &iRowid1);.  
25130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
25140 73 73 65 72 74 28 20 69 4f 75 74 3d 3d 30 20 7c  ssert( iOut==0 |
25150 7c 20 69 52 6f 77 69 64 32 3e 69 4f 75 74 20 29  | iRowid2>iOut )
25160 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
25170 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
25180 6e 74 28 26 6f 75 74 2c 20 69 52 6f 77 69 64 32  nt(&out, iRowid2
25190 20 2d 20 69 4f 75 74 29 3b 0a 20 20 20 20 20 20   - iOut);.      
251a0 69 4f 75 74 20 3d 20 69 52 6f 77 69 64 32 3b 0a  iOut = iRowid2;.
251b0 20 20 20 20 20 20 69 66 28 20 69 31 3e 3d 30 20        if( i1>=0 
251c0 26 26 20 69 52 6f 77 69 64 31 3d 3d 69 52 6f 77  && iRowid1==iRow
251d0 69 64 32 20 29 7b 0a 20 20 20 20 20 20 20 20 66  id2 ){.        f
251e0 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70 31 2c  ts5NextRowid(p1,
251f0 20 26 69 31 2c 20 26 69 52 6f 77 69 64 31 29 3b   &i1, &iRowid1);
25200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
25210 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70 32 2c  ts5NextRowid(p2,
25220 20 26 69 32 2c 20 26 69 52 6f 77 69 64 32 29 3b   &i2, &iRowid2);
25230 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74  .    }.  }..  ft
25240 73 35 42 75 66 66 65 72 53 77 61 70 28 26 6f 75  s5BufferSwap(&ou
25250 74 2c 20 70 31 29 3b 0a 20 20 66 74 73 35 42 75  t, p1);.  fts5Bu
25260 66 66 65 72 46 72 65 65 28 26 6f 75 74 29 3b 0a  fferFree(&out);.
25270 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 73  }../*.** Buffers
25280 20 70 31 20 61 6e 64 20 70 32 20 63 6f 6e 74 61   p1 and p2 conta
25290 69 6e 20 64 6f 63 6c 69 73 74 73 2e 20 54 68 69  in doclists. Thi
252a0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65  s function merge
252b0 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a  s the content.**
252c0 20 6f 66 20 74 68 65 20 74 77 6f 20 64 6f 63 6c   of the two docl
252d0 69 73 74 73 20 74 6f 67 65 74 68 65 72 20 61 6e  ists together an
252e0 64 20 73 65 74 73 20 62 75 66 66 65 72 20 70 31  d sets buffer p1
252f0 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 62   to the result b
25300 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69  efore.** returni
25310 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
25320 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
25330 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c   error code is l
25340 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 66  eft in p->rc. If
25350 20 61 6e 20 65 72 72 6f 72 20 68 61 73 0a 2a 2a   an error has.**
25360 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
25370 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
25380 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
25390 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
253a0 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73  MergePrefixLists
253b0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
253c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
253d0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
253e0 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
253f0 46 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20  Fts5Buffer *p1, 
25400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25410 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f  /* First list to
25420 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35   merge */.  Fts5
25430 42 75 66 66 65 72 20 2a 70 32 20 20 20 20 20 20  Buffer *p2      
25440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
25450 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65  econd list to me
25460 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  rge */.){.  if( 
25470 70 32 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34  p2->n ){.    i64
25480 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b   iLastRowid = 0;
25490 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74  .    Fts5Doclist
254a0 49 74 65 72 20 69 31 3b 0a 20 20 20 20 46 74 73  Iter i1;.    Fts
254b0 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69 32 3b  5DoclistIter i2;
254c0 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
254d0 6f 75 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b  out = {0, 0, 0};
254e0 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
254f0 74 6d 70 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b  tmp = {0, 0, 0};
25500 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
25510 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28  3Fts5BufferSize(
25520 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 70 31  &p->rc, &out, p1
25530 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 29 20 29 20 72  ->n + p2->n) ) r
25540 65 74 75 72 6e 3b 0a 20 20 20 20 66 74 73 35 44  eturn;.    fts5D
25550 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70  oclistIterInit(p
25560 31 2c 20 26 69 31 29 3b 0a 20 20 20 20 66 74 73  1, &i1);.    fts
25570 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74  5DoclistIterInit
25580 28 70 32 2c 20 26 69 32 29 3b 0a 0a 20 20 20 20  (p2, &i2);..    
25590 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
255a0 20 20 69 66 28 20 69 31 2e 69 52 6f 77 69 64 3c    if( i1.iRowid<
255b0 69 32 2e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20  i2.iRowid ){.   
255c0 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74       /* Copy ent
255d0 72 79 20 66 72 6f 6d 20 69 31 20 2a 2f 0a 20 20  ry from i1 */.  
255e0 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41        fts5MergeA
255f0 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c  ppendDocid(&out,
25600 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 31 2e   iLastRowid, i1.
25610 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
25620 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
25630 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20  ppendBlob(&out, 
25640 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e  i1.aPoslist, i1.
25650 6e 50 6f 73 6c 69 73 74 2b 69 31 2e 6e 53 69 7a  nPoslist+i1.nSiz
25660 65 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  e);.        fts5
25670 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
25680 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &i1);.        if
25690 28 20 69 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30  ( i1.aPoslist==0
256a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
256b0 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28  }.      else if(
256c0 20 69 32 2e 69 52 6f 77 69 64 21 3d 69 31 2e 69   i2.iRowid!=i1.i
256d0 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
256e0 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66   /* Copy entry f
256f0 72 6f 6d 20 69 32 20 2a 2f 0a 20 20 20 20 20 20  rom i2 */.      
25700 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e    fts5MergeAppen
25710 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61  dDocid(&out, iLa
25720 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77  stRowid, i2.iRow
25730 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
25740 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
25750 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 32 2e 61  dBlob(&out, i2.a
25760 50 6f 73 6c 69 73 74 2c 20 69 32 2e 6e 50 6f 73  Poslist, i2.nPos
25770 6c 69 73 74 2b 69 32 2e 6e 53 69 7a 65 29 3b 0a  list+i2.nSize);.
25780 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c          fts5Docl
25790 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 32 29  istIterNext(&i2)
257a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 32  ;.        if( i2
257b0 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 29 20 62  .aPoslist==0 ) b
257c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
257d0 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
257e0 20 20 2f 2a 20 4d 65 72 67 65 20 74 68 65 20 74    /* Merge the t
257f0 77 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  wo position list
25800 73 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 69  s. */ .        i
25810 36 34 20 69 50 6f 73 31 20 3d 20 30 3b 0a 20 20  64 iPos1 = 0;.  
25820 20 20 20 20 20 20 69 36 34 20 69 50 6f 73 32 20        i64 iPos2 
25830 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
25840 20 69 4f 66 66 31 20 3d 20 30 3b 0a 20 20 20 20   iOff1 = 0;.    
25850 20 20 20 20 69 6e 74 20 69 4f 66 66 32 20 3d 20      int iOff2 = 
25860 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61  0;.        u8 *a
25870 31 20 3d 20 26 69 31 2e 61 50 6f 73 6c 69 73 74  1 = &i1.aPoslist
25880 5b 69 31 2e 6e 53 69 7a 65 5d 3b 0a 20 20 20 20  [i1.nSize];.    
25890 20 20 20 20 75 38 20 2a 61 32 20 3d 20 26 69 32      u8 *a2 = &i2
258a0 2e 61 50 6f 73 6c 69 73 74 5b 69 32 2e 6e 53 69  .aPoslist[i2.nSi
258b0 7a 65 5d 3b 0a 0a 20 20 20 20 20 20 20 20 69 36  ze];..        i6
258c0 34 20 69 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  4 iPrev = 0;.   
258d0 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74       Fts5Poslist
258e0 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a 20  Writer writer;. 
258f0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 77         memset(&w
25900 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  riter, 0, sizeof
25910 28 77 72 69 74 65 72 29 29 3b 0a 0a 20 20 20 20  (writer));..    
25920 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70      fts5MergeApp
25930 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69  endDocid(&out, i
25940 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52  LastRowid, i2.iR
25950 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66  owid);.        f
25960 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 74  ts5BufferZero(&t
25970 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  mp);.        sql
25980 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69  ite3Fts5BufferSi
25990 7a 65 28 26 70 2d 3e 72 63 2c 20 26 74 6d 70 2c  ze(&p->rc, &tmp,
259a0 20 69 31 2e 6e 50 6f 73 6c 69 73 74 20 2b 20 69   i1.nPoslist + i
259b0 32 2e 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20  2.nPoslist);.   
259c0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29       if( p->rc )
259d0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20   break;..       
259e0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
259f0 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31  istNext64(a1, i1
25a00 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66  .nPoslist, &iOff
25a10 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20  1, &iPos1);.    
25a20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
25a30 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61 32 2c  oslistNext64(a2,
25a40 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69   i2.nPoslist, &i
25a50 4f 66 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20  Off2, &iPos2);. 
25a60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
25a70 50 6f 73 31 3e 3d 30 20 26 26 20 69 50 6f 73 32  Pos1>=0 && iPos2
25a80 3e 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  >=0 );..        
25a90 69 66 28 20 69 50 6f 73 31 3c 69 50 6f 73 32 20  if( iPos1<iPos2 
25aa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
25ab0 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53  ite3Fts5PoslistS
25ac0 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20  afeAppend(&tmp, 
25ad0 26 69 50 72 65 76 2c 20 69 50 6f 73 31 29 3b 0a  &iPrev, iPos1);.
25ae0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25af0 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74  3Fts5PoslistNext
25b00 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69  64(a1, i1.nPosli
25b10 73 74 2c 20 26 69 4f 66 66 31 2c 20 26 69 50 6f  st, &iOff1, &iPo
25b20 73 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  s1);.        }el
25b30 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
25b40 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
25b50 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c  SafeAppend(&tmp,
25b60 20 26 69 50 72 65 76 2c 20 69 50 6f 73 32 29 3b   &iPrev, iPos2);
25b70 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
25b80 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78  e3Fts5PoslistNex
25b90 74 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c  t64(a2, i2.nPosl
25ba0 69 73 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50  ist, &iOff2, &iP
25bb0 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  os2);.        }.
25bc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f  .        if( iPo
25bd0 73 31 3e 3d 30 20 26 26 20 69 50 6f 73 32 3e 3d  s1>=0 && iPos2>=
25be0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  0 ){.          w
25bf0 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20  hile( 1 ){.     
25c00 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31         if( iPos1
25c10 3c 69 50 6f 73 32 20 29 7b 0a 20 20 20 20 20 20  <iPos2 ){.      
25c20 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73          if( iPos
25c30 31 21 3d 69 50 72 65 76 20 29 7b 0a 20 20 20 20  1!=iPrev ){.    
25c40 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
25c50 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61  te3Fts5PoslistSa
25c60 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26  feAppend(&tmp, &
25c70 69 50 72 65 76 2c 20 69 50 6f 73 31 29 3b 0a 20  iPrev, iPos1);. 
25c80 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
25c90 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
25ca0 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e  ite3Fts5PoslistN
25cb0 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f  ext64(a1, i1.nPo
25cc0 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 20 26  slist, &iOff1, &
25cd0 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20  iPos1);.        
25ce0 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 3c        if( iPos1<
25cf0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
25d00 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
25d10 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
25d20 72 74 28 20 69 50 6f 73 32 21 3d 69 50 72 65 76  rt( iPos2!=iPrev
25d30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
25d40 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
25d50 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28 26  listSafeAppend(&
25d60 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f  tmp, &iPrev, iPo
25d70 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  s2);.           
25d80 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
25d90 73 6c 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20  slistNext64(a2, 
25da0 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f  i2.nPoslist, &iO
25db0 66 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20  ff2, &iPos2);.  
25dc0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
25dd0 69 50 6f 73 32 3c 30 20 29 20 62 72 65 61 6b 3b  iPos2<0 ) break;
25de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
25df0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25e00 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
25e10 28 20 69 50 6f 73 31 3e 3d 30 20 29 7b 0a 20 20  ( iPos1>=0 ){.  
25e20 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73          if( iPos
25e30 31 21 3d 69 50 72 65 76 20 29 7b 0a 20 20 20 20  1!=iPrev ){.    
25e40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
25e50 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70  ts5PoslistSafeAp
25e60 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65  pend(&tmp, &iPre
25e70 76 2c 20 69 50 6f 73 31 29 3b 0a 20 20 20 20 20  v, iPos1);.     
25e80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
25e90 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
25ea0 70 70 65 6e 64 42 6c 6f 62 28 26 74 6d 70 2c 20  ppendBlob(&tmp, 
25eb0 26 61 31 5b 69 4f 66 66 31 5d 2c 20 69 31 2e 6e  &a1[iOff1], i1.n
25ec0 50 6f 73 6c 69 73 74 2d 69 4f 66 66 31 29 3b 0a  Poslist-iOff1);.
25ed0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
25ee0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
25ef0 20 69 50 6f 73 32 3e 3d 30 20 26 26 20 69 50 6f   iPos2>=0 && iPo
25f00 73 32 21 3d 69 50 72 65 76 20 29 3b 0a 20 20 20  s2!=iPrev );.   
25f10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
25f20 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70  s5PoslistSafeApp
25f30 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76  end(&tmp, &iPrev
25f40 2c 20 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20  , iPos2);.      
25f50 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
25f60 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 74 6d  feAppendBlob(&tm
25f70 70 2c 20 26 61 32 5b 69 4f 66 66 32 5d 2c 20 69  p, &a2[iOff2], i
25f80 32 2e 6e 50 6f 73 6c 69 73 74 2d 69 4f 66 66 32  2.nPoslist-iOff2
25f90 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
25fa0 20 20 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f        /* WRITEPO
25fb0 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20  SLISTSIZE */.   
25fc0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
25fd0 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28  afeAppendVarint(
25fe0 26 6f 75 74 2c 20 74 6d 70 2e 6e 20 2a 20 32 29  &out, tmp.n * 2)
25ff0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
26000 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
26010 6f 62 28 26 6f 75 74 2c 20 74 6d 70 2e 70 2c 20  ob(&out, tmp.p, 
26020 74 6d 70 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20  tmp.n);.        
26030 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
26040 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20  ext(&i1);.      
26050 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
26060 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20 20 20  rNext(&i2);.    
26070 20 20 20 20 69 66 28 20 69 31 2e 61 50 6f 73 6c      if( i1.aPosl
26080 69 73 74 3d 3d 30 20 7c 7c 20 69 32 2e 61 50 6f  ist==0 || i2.aPo
26090 73 6c 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b  slist==0 ) break
260a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
260b0 0a 20 20 20 20 69 66 28 20 69 31 2e 61 50 6f 73  .    if( i1.aPos
260c0 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 74  list ){.      ft
260d0 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
260e0 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f  id(&out, iLastRo
260f0 77 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b  wid, i1.iRowid);
26100 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
26110 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
26120 26 6f 75 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73  &out, i1.aPoslis
26130 74 2c 20 69 31 2e 61 45 6f 66 20 2d 20 69 31 2e  t, i1.aEof - i1.
26140 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 7d  aPoslist);.    }
26150 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 69 32  .    else if( i2
26160 2e 61 50 6f 73 6c 69 73 74 20 29 7b 0a 20 20 20  .aPoslist ){.   
26170 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65     fts5MergeAppe
26180 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c  ndDocid(&out, iL
26190 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f  astRowid, i2.iRo
261a0 77 69 64 29 3b 0a 20 20 20 20 20 20 66 74 73 35  wid);.      fts5
261b0 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
261c0 42 6c 6f 62 28 26 6f 75 74 2c 20 69 32 2e 61 50  Blob(&out, i2.aP
261d0 6f 73 6c 69 73 74 2c 20 69 32 2e 61 45 6f 66 20  oslist, i2.aEof 
261e0 2d 20 69 32 2e 61 50 6f 73 6c 69 73 74 29 3b 0a  - i2.aPoslist);.
261f0 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42      }..    fts5B
26200 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
26210 20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e   p1, out.n, out.
26220 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  p);.    fts5Buff
26230 65 72 46 72 65 65 28 26 74 6d 70 29 3b 0a 20 20  erFree(&tmp);.  
26240 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
26250 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  (&out);.  }.}..s
26260 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
26270 65 74 75 70 50 72 65 66 69 78 49 74 65 72 28 0a  etupPrefixIter(.
26280 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
26290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262a0 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 72 65    /* Index to re
262b0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
262c0 20 62 44 65 73 63 2c 20 20 20 20 20 20 20 20 20   bDesc,         
262d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
262e0 54 72 75 65 20 66 6f 72 20 22 4f 52 44 45 52 20  True for "ORDER 
262f0 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 2a  BY rowid DESC" *
26300 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
26310 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  oken,           
26320 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
26330 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69 78 20  ntaining prefix 
26340 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69 6e  to match */.  in
26350 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20  t nToken,       
26360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26370 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
26380 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73 20  pToken in bytes 
26390 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  */.  Fts5Colset 
263a0 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20  *pColset,       
263b0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
263c0 20 6d 61 74 63 68 65 73 20 74 6f 20 74 68 65 73   matches to thes
263d0 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 46  e columns */.  F
263e0 74 73 35 49 74 65 72 20 2a 2a 70 70 49 74 65 72  ts5Iter **ppIter
263f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
26400 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72 20 2a  : New iterator *
26410 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  /.){.  Fts5Struc
26420 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20  ture *pStruct;. 
26430 20 46 74 73 35 42 75 66 66 65 72 20 2a 61 42 75   Fts5Buffer *aBu
26440 66 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  f;.  const int n
26450 42 75 66 20 3d 20 33 32 3b 0a 0a 20 20 76 6f 69  Buf = 32;..  voi
26460 64 20 28 2a 78 4d 65 72 67 65 29 28 46 74 73 35  d (*xMerge)(Fts5
26470 49 6e 64 65 78 2a 2c 20 46 74 73 35 42 75 66 66  Index*, Fts5Buff
26480 65 72 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a  er*, Fts5Buffer*
26490 29 3b 0a 20 20 76 6f 69 64 20 28 2a 78 41 70 70  );.  void (*xApp
264a0 65 6e 64 29 28 46 74 73 35 49 6e 64 65 78 2a 2c  end)(Fts5Index*,
264b0 20 69 36 34 2c 20 46 74 73 35 49 74 65 72 2a 2c   i64, Fts5Iter*,
264c0 20 46 74 73 35 42 75 66 66 65 72 2a 29 3b 0a 20   Fts5Buffer*);. 
264d0 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d   if( p->pConfig-
264e0 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44  >eDetail==FTS5_D
264f0 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
26500 20 20 78 4d 65 72 67 65 20 3d 20 66 74 73 35 4d    xMerge = fts5M
26510 65 72 67 65 52 6f 77 69 64 4c 69 73 74 73 3b 0a  ergeRowidLists;.
26520 20 20 20 20 78 41 70 70 65 6e 64 20 3d 20 66 74      xAppend = ft
26530 73 35 41 70 70 65 6e 64 52 6f 77 69 64 3b 0a 20  s5AppendRowid;. 
26540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 4d 65 72   }else{.    xMer
26550 67 65 20 3d 20 66 74 73 35 4d 65 72 67 65 50 72  ge = fts5MergePr
26560 65 66 69 78 4c 69 73 74 73 3b 0a 20 20 20 20 78  efixLists;.    x
26570 41 70 70 65 6e 64 20 3d 20 66 74 73 35 41 70 70  Append = fts5App
26580 65 6e 64 50 6f 73 6c 69 73 74 3b 0a 20 20 7d 0a  endPoslist;.  }.
26590 0a 20 20 61 42 75 66 20 3d 20 28 46 74 73 35 42  .  aBuf = (Fts5B
265a0 75 66 66 65 72 2a 29 66 74 73 35 49 64 78 4d 61  uffer*)fts5IdxMa
265b0 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46  lloc(p, sizeof(F
265c0 74 73 35 42 75 66 66 65 72 29 2a 6e 42 75 66 29  ts5Buffer)*nBuf)
265d0 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74  ;.  pStruct = ft
265e0 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
265f0 70 29 3b 0a 0a 20 20 69 66 28 20 61 42 75 66 20  p);..  if( aBuf 
26600 26 26 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20  && pStruct ){.  
26610 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
26620 73 20 3d 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s = FTS5INDEX_QU
26630 45 52 59 5f 53 43 41 4e 20 0a 20 20 20 20 20 20  ERY_SCAN .      
26640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
26650 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
26660 53 4b 49 50 45 4d 50 54 59 20 0a 20 20 20 20 20  SKIPEMPTY .     
26670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
26680 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
26690 5f 4e 4f 4f 55 54 50 55 54 3b 0a 20 20 20 20 69  _NOOUTPUT;.    i
266a0 6e 74 20 69 3b 0a 20 20 20 20 69 36 34 20 69 4c  nt i;.    i64 iL
266b0 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  astRowid = 0;.  
266c0 20 20 46 74 73 35 49 74 65 72 20 2a 70 31 20 3d    Fts5Iter *p1 =
266d0 20 30 3b 20 20 20 20 20 2f 2a 20 49 74 65 72 61   0;     /* Itera
266e0 74 6f 72 20 75 73 65 64 20 74 6f 20 67 61 74 68  tor used to gath
266f0 65 72 20 64 61 74 61 20 66 72 6f 6d 20 69 6e 64  er data from ind
26700 65 78 20 2a 2f 0a 20 20 20 20 46 74 73 35 44 61  ex */.    Fts5Da
26710 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 46  ta *pData;.    F
26720 74 73 35 42 75 66 66 65 72 20 64 6f 63 6c 69 73  ts5Buffer doclis
26730 74 3b 0a 20 20 20 20 69 6e 74 20 62 4e 65 77 54  t;.    int bNewT
26740 65 72 6d 20 3d 20 31 3b 0a 0a 20 20 20 20 6d 65  erm = 1;..    me
26750 6d 73 65 74 28 26 64 6f 63 6c 69 73 74 2c 20 30  mset(&doclist, 0
26760 2c 20 73 69 7a 65 6f 66 28 64 6f 63 6c 69 73 74  , sizeof(doclist
26770 29 29 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74  ));.    fts5Mult
26780 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72  iIterNew(p, pStr
26790 75 63 74 2c 20 66 6c 61 67 73 2c 20 70 43 6f 6c  uct, flags, pCol
267a0 73 65 74 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f  set, pToken, nTo
267b0 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 31 29  ken, -1, 0, &p1)
267c0 3b 0a 20 20 20 20 66 74 73 35 49 74 65 72 53 65  ;.    fts5IterSe
267d0 74 4f 75 74 70 75 74 43 62 28 26 70 2d 3e 72 63  tOutputCb(&p->rc
267e0 2c 20 70 31 29 3b 0a 20 20 20 20 66 6f 72 28 20  , p1);.    for( 
267f0 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 20 3b 0a 20 20  /* no-op */ ;.  
26800 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
26810 74 65 72 45 6f 66 28 70 2c 20 70 31 29 3d 3d 30  terEof(p, p1)==0
26820 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  ;.        fts5Mu
26830 6c 74 69 49 74 65 72 4e 65 78 74 32 28 70 2c 20  ltiIterNext2(p, 
26840 70 31 2c 20 26 62 4e 65 77 54 65 72 6d 29 0a 20  p1, &bNewTerm). 
26850 20 20 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35     ){.      Fts5
26860 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
26870 26 70 31 2d 3e 61 53 65 67 5b 20 70 31 2d 3e 61  &p1->aSeg[ p1->a
26880 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
26890 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65  ];.      int nTe
268a0 72 6d 20 3d 20 70 53 65 67 2d 3e 74 65 72 6d 2e  rm = pSeg->term.
268b0 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  n;.      const u
268c0 38 20 2a 70 54 65 72 6d 20 3d 20 70 53 65 67 2d  8 *pTerm = pSeg-
268d0 3e 74 65 72 6d 2e 70 3b 0a 20 20 20 20 20 20 70  >term.p;.      p
268e0 31 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 28 70  1->xSetOutputs(p
268f0 31 2c 20 70 53 65 67 29 3b 0a 0a 20 20 20 20 20  1, pSeg);..     
26900 20 61 73 73 65 72 74 5f 6e 63 28 20 6d 65 6d 63   assert_nc( memc
26910 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d  mp(pToken, pTerm
26920 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54  , MIN(nToken, nT
26930 65 72 6d 29 29 3c 3d 30 20 29 3b 0a 20 20 20 20  erm))<=0 );.    
26940 20 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29    if( bNewTerm )
26950 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54  {.        if( nT
26960 65 72 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65  erm<nToken || me
26970 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65  mcmp(pToken, pTe
26980 72 6d 2c 20 6e 54 6f 6b 65 6e 29 20 29 20 62 72  rm, nToken) ) br
26990 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
269a0 20 20 20 20 69 66 28 20 70 31 2d 3e 62 61 73 65      if( p1->base
269b0 2e 6e 44 61 74 61 3d 3d 30 20 29 20 63 6f 6e 74  .nData==0 ) cont
269c0 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 69 66 28  inue;..      if(
269d0 20 70 31 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64   p1->base.iRowid
269e0 3c 3d 69 4c 61 73 74 52 6f 77 69 64 20 26 26 20  <=iLastRowid && 
269f0 64 6f 63 6c 69 73 74 2e 6e 3e 30 20 29 7b 0a 20  doclist.n>0 ){. 
26a00 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
26a10 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
26a20 20 26 26 20 64 6f 63 6c 69 73 74 2e 6e 3b 20 69   && doclist.n; i
26a30 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ++){.          a
26a40 73 73 65 72 74 28 20 69 3c 6e 42 75 66 20 29 3b  ssert( i<nBuf );
26a50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
26a60 42 75 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20  Buf[i].n==0 ){. 
26a70 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
26a80 75 66 66 65 72 53 77 61 70 28 26 64 6f 63 6c 69  ufferSwap(&docli
26a90 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20  st, &aBuf[i]);. 
26aa0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
26ab0 75 66 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69  ufferZero(&docli
26ac0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  st);.          }
26ad0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26ae0 20 20 78 4d 65 72 67 65 28 70 2c 20 26 64 6f 63    xMerge(p, &doc
26af0 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b  list, &aBuf[i]);
26b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
26b10 35 42 75 66 66 65 72 5a 65 72 6f 28 26 61 42 75  5BufferZero(&aBu
26b20 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  f[i]);.         
26b30 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
26b40 20 20 20 20 20 69 4c 61 73 74 52 6f 77 69 64 20       iLastRowid 
26b50 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 0;.      }..  
26b60 20 20 20 20 78 41 70 70 65 6e 64 28 70 2c 20 70      xAppend(p, p
26b70 31 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 2d 69  1->base.iRowid-i
26b80 4c 61 73 74 52 6f 77 69 64 2c 20 70 31 2c 20 26  LastRowid, p1, &
26b90 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  doclist);.      
26ba0 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 70 31 2d  iLastRowid = p1-
26bb0 3e 62 61 73 65 2e 69 52 6f 77 69 64 3b 0a 20 20  >base.iRowid;.  
26bc0 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30    }..    for(i=0
26bd0 3b 20 69 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a  ; i<nBuf; i++){.
26be0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
26bf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26c00 20 20 20 20 20 20 78 4d 65 72 67 65 28 70 2c 20        xMerge(p, 
26c10 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b  &doclist, &aBuf[
26c20 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
26c30 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
26c40 65 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  e(&aBuf[i]);.   
26c50 20 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69   }.    fts5Multi
26c60 49 74 65 72 46 72 65 65 28 70 31 29 3b 0a 0a 20  IterFree(p1);.. 
26c70 20 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 49     pData = fts5I
26c80 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65  dxMalloc(p, size
26c90 6f 66 28 46 74 73 35 44 61 74 61 29 20 2b 20 64  of(Fts5Data) + d
26ca0 6f 63 6c 69 73 74 2e 6e 29 3b 0a 20 20 20 20 69  oclist.n);.    i
26cb0 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20  f( pData ){.    
26cc0 20 20 70 44 61 74 61 2d 3e 70 20 3d 20 28 75 38    pData->p = (u8
26cd0 2a 29 26 70 44 61 74 61 5b 31 5d 3b 0a 20 20 20  *)&pData[1];.   
26ce0 20 20 20 70 44 61 74 61 2d 3e 6e 6e 20 3d 20 70     pData->nn = p
26cf0 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 3d 20 64  Data->szLeaf = d
26d00 6f 63 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 20 20  oclist.n;.      
26d10 6d 65 6d 63 70 79 28 70 44 61 74 61 2d 3e 70 2c  memcpy(pData->p,
26d20 20 64 6f 63 6c 69 73 74 2e 70 2c 20 64 6f 63 6c   doclist.p, docl
26d30 69 73 74 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74  ist.n);.      ft
26d40 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 32 28  s5MultiIterNew2(
26d50 70 2c 20 70 44 61 74 61 2c 20 62 44 65 73 63 2c  p, pData, bDesc,
26d60 20 70 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a   ppIter);.    }.
26d70 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
26d80 65 65 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20  ee(&doclist);.  
26d90 7d 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  }..  fts5Structu
26da0 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
26db0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t);.  sqlite3_fr
26dc0 65 65 28 61 42 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a  ee(aBuf);.}.../*
26dd0 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
26de0 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  t all subsequent
26df0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
26e00 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28  3Fts5IndexWrite(
26e10 29 20 70 65 72 74 61 69 6e 0a 2a 2a 20 74 6f 20  ) pertain.** to 
26e20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74  the document wit
26e30 68 20 72 6f 77 69 64 20 69 52 6f 77 69 64 2e 0a  h rowid iRowid..
26e40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
26e50 73 35 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74  s5IndexBeginWrit
26e60 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
26e70 69 6e 74 20 62 44 65 6c 65 74 65 2c 20 69 36 34  int bDelete, i64
26e80 20 69 52 6f 77 69 64 29 7b 0a 20 20 61 73 73 65   iRowid){.  asse
26e90 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
26ea0 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  E_OK );..  /* Al
26eb0 6c 6f 63 61 74 65 20 74 68 65 20 68 61 73 68 20  locate the hash 
26ec0 74 61 62 6c 65 20 69 66 20 69 74 20 68 61 73 20  table if it has 
26ed0 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
26ee0 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
26ef0 69 66 28 20 70 2d 3e 70 48 61 73 68 3d 3d 30 20  if( p->pHash==0 
26f00 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
26f10 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 4e 65  qlite3Fts5HashNe
26f20 77 28 70 2d 3e 70 43 6f 6e 66 69 67 2c 20 26 70  w(p->pConfig, &p
26f30 2d 3e 70 48 61 73 68 2c 20 26 70 2d 3e 6e 50 65  ->pHash, &p->nPe
26f40 6e 64 69 6e 67 44 61 74 61 29 3b 0a 20 20 7d 0a  ndingData);.  }.
26f50 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20  .  /* Flush the 
26f60 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69  hash table to di
26f70 73 6b 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  sk if required *
26f80 2f 0a 20 20 69 66 28 20 69 52 6f 77 69 64 3c 70  /.  if( iRowid<p
26f90 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 0a 20  ->iWriteRowid . 
26fa0 20 20 7c 7c 20 28 69 52 6f 77 69 64 3d 3d 70 2d    || (iRowid==p-
26fb0 3e 69 57 72 69 74 65 52 6f 77 69 64 20 26 26 20  >iWriteRowid && 
26fc0 70 2d 3e 62 44 65 6c 65 74 65 3d 3d 30 29 0a 20  p->bDelete==0). 
26fd0 20 20 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64 69 6e    || (p->nPendin
26fe0 67 44 61 74 61 20 3e 20 70 2d 3e 70 43 6f 6e 66  gData > p->pConf
26ff0 69 67 2d 3e 6e 48 61 73 68 53 69 7a 65 29 20 0a  ig->nHashSize) .
27000 20 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64    ){.    fts5Ind
27010 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a  exFlush(p);.  }.
27020 0a 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69  .  p->iWriteRowi
27030 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 70 2d  d = iRowid;.  p-
27040 3e 62 44 65 6c 65 74 65 20 3d 20 62 44 65 6c 65  >bDelete = bDele
27050 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  te;.  return fts
27060 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
27070 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
27080 20 64 61 74 61 20 74 6f 20 64 69 73 6b 2e 0a 2a   data to disk..*
27090 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
270a0 35 49 6e 64 65 78 53 79 6e 63 28 46 74 73 35 49  5IndexSync(Fts5I
270b0 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62 43 6f  ndex *p, int bCo
270c0 6d 6d 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28  mmit){.  assert(
270d0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
270e0 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78  K );.  fts5Index
270f0 46 6c 75 73 68 28 70 29 3b 0a 20 20 69 66 28 20  Flush(p);.  if( 
27100 62 43 6f 6d 6d 69 74 20 29 20 66 74 73 35 43 6c  bCommit ) fts5Cl
27110 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20  oseReader(p);.  
27120 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
27130 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
27140 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6e 79 20  .** Discard any 
27150 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
27160 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  he in-memory has
27170 68 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74  h tables. Do not
27180 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20   write it.** to 
27190 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64  the database. Ad
271a0 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75  ditionally, assu
271b0 6d 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  me that the cont
271c0 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61  ents of the %_da
271d0 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20  ta.** table may 
271e0 68 61 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20  have changed on 
271f0 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d  disk. So any in-
27200 6d 65 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66  memory caches of
27210 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f   %_data .** reco
27220 72 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61  rds must be inva
27230 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  lidated..*/.int 
27240 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
27250 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64  Rollback(Fts5Ind
27260 65 78 20 2a 70 29 7b 0a 20 20 66 74 73 35 43 6c  ex *p){.  fts5Cl
27270 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20  oseReader(p);.  
27280 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64  fts5IndexDiscard
27290 44 61 74 61 28 70 29 3b 0a 20 20 66 74 73 35 53  Data(p);.  fts5S
272a0 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61  tructureInvalida
272b0 74 65 28 70 29 3b 0a 20 20 2f 2a 20 61 73 73 65  te(p);.  /* asse
272c0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
272d0 45 5f 4f 4b 20 29 3b 20 2a 2f 0a 20 20 72 65 74  E_OK ); */.  ret
272e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
272f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61  ../*.** The %_da
27300 74 61 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70  ta table is comp
27310 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 77 68 65  letely empty whe
27320 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
27330 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 0a  is called. This.
27340 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75  ** function popu
27350 6c 61 74 65 73 20 69 74 20 77 69 74 68 20 74 68  lates it with th
27360 65 20 69 6e 69 74 69 61 6c 20 73 74 72 75 63 74  e initial struct
27370 75 72 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  ure objects for 
27380 65 61 63 68 20 69 6e 64 65 78 2c 0a 2a 2a 20 61  each index,.** a
27390 6e 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  nd the initial v
273a0 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 22 61  ersion of the "a
273b0 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20  verages" record 
273c0 28 61 20 7a 65 72 6f 2d 62 79 74 65 20 62 6c 6f  (a zero-byte blo
273d0 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  b)..*/.int sqlit
273e0 65 33 46 74 73 35 49 6e 64 65 78 52 65 69 6e 69  e3Fts5IndexReini
273f0 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  t(Fts5Index *p){
27400 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
27410 20 73 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74   s;.  fts5Struct
27420 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29  ureInvalidate(p)
27430 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30  ;.  memset(&s, 0
27440 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
27450 75 63 74 75 72 65 29 29 3b 0a 20 20 66 74 73 35  ucture));.  fts5
27460 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53  DataWrite(p, FTS
27470 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
27480 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 22 2c  , (const u8*)"",
27490 20 30 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63   0);.  fts5Struc
274a0 74 75 72 65 57 72 69 74 65 28 70 2c 20 26 73 29  tureWrite(p, &s)
274b0 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
274c0 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
274d0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
274e0 65 77 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e  ew Fts5Index han
274f0 64 6c 65 2e 20 49 66 20 74 68 65 20 62 43 72 65  dle. If the bCre
27500 61 74 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ate argument is 
27510 74 72 75 65 2c 20 63 72 65 61 74 65 0a 2a 2a 20  true, create.** 
27520 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
27530 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 25 5f  he underlying %_
27540 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  data table..**.*
27550 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
27560 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e   set *pp to poin
27570 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a  t to the new obj
27580 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ect and return S
27590 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68  QLITE_OK..** Oth
275a0 65 72 77 69 73 65 2c 20 73 65 74 20 2a 70 70 20  erwise, set *pp 
275b0 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75  to NULL and retu
275c0 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
275d0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  or code..*/.int 
275e0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
275f0 4f 70 65 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66  Open(.  Fts5Conf
27600 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20  ig *pConfig, .  
27610 69 6e 74 20 62 43 72 65 61 74 65 2c 20 0a 20 20  int bCreate, .  
27620 46 74 73 35 49 6e 64 65 78 20 2a 2a 70 70 2c 0a  Fts5Index **pp,.
27630 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
27640 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
27650 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 49 6e  ITE_OK;.  Fts5In
27660 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20  dex *p;         
27670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
27680 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a 70   object */..  *p
27690 70 20 3d 20 70 20 3d 20 28 46 74 73 35 49 6e 64  p = p = (Fts5Ind
276a0 65 78 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  ex*)sqlite3Fts5M
276b0 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73  allocZero(&rc, s
276c0 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 29  izeof(Fts5Index)
276d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
276e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d  ITE_OK ){.    p-
276f0 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66  >pConfig = pConf
27700 69 67 3b 0a 20 20 20 20 70 2d 3e 6e 57 6f 72 6b  ig;.    p->nWork
27710 55 6e 69 74 20 3d 20 46 54 53 35 5f 57 4f 52 4b  Unit = FTS5_WORK
27720 5f 55 4e 49 54 3b 0a 20 20 20 20 70 2d 3e 7a 44  _UNIT;.    p->zD
27730 61 74 61 54 62 6c 20 3d 20 73 71 6c 69 74 65 33  ataTbl = sqlite3
27740 46 74 73 35 4d 70 72 69 6e 74 66 28 26 72 63 2c  Fts5Mprintf(&rc,
27750 20 22 25 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e   "%s_data", pCon
27760 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  fig->zName);.   
27770 20 69 66 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c   if( p->zDataTbl
27780 20 26 26 20 62 43 72 65 61 74 65 20 29 7b 0a 20   && bCreate ){. 
27790 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
277a0 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65  3Fts5CreateTable
277b0 28 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e  (.          pCon
277c0 66 69 67 2c 20 22 64 61 74 61 22 2c 20 22 69 64  fig, "data", "id
277d0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
277e0 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42   KEY, block BLOB
277f0 22 2c 20 30 2c 20 70 7a 45 72 72 0a 20 20 20 20  ", 0, pzErr.    
27800 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72    );.      if( r
27810 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27820 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
27830 69 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61  ite3Fts5CreateTa
27840 62 6c 65 28 70 43 6f 6e 66 69 67 2c 20 22 69 64  ble(pConfig, "id
27850 78 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  x", .           
27860 20 22 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70   "segid, term, p
27870 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  gno, PRIMARY KEY
27880 28 73 65 67 69 64 2c 20 74 65 72 6d 29 22 2c 20  (segid, term)", 
27890 0a 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  .            1, 
278a0 70 7a 45 72 72 0a 20 20 20 20 20 20 20 20 29 3b  pzErr.        );
278b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
278c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
278d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
278e0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
278f0 78 52 65 69 6e 69 74 28 70 29 3b 0a 20 20 20 20  xReinit(p);.    
27900 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
27910 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
27920 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
27930 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
27940 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71  if( rc ){.    sq
27950 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c  lite3Fts5IndexCl
27960 6f 73 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 20  ose(p);.    *pp 
27970 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
27980 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
27990 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6f 70  lose a handle op
279a0 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ened by an earli
279b0 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  er call to sqlit
279c0 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28  e3Fts5IndexOpen(
279d0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
279e0 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28  3Fts5IndexClose(
279f0 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
27a00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
27a10 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  _OK;.  if( p ){.
27a20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
27a30 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20  Reader==0 );.   
27a40 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e   fts5StructureIn
27a50 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20 20 20  validate(p);.   
27a60 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
27a70 65 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20  e(p->pWriter);. 
27a80 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
27a90 69 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65 72 29  ize(p->pDeleter)
27aa0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
27ab0 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78 57 72  nalize(p->pIdxWr
27ac0 69 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  iter);.    sqlit
27ad0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70  e3_finalize(p->p
27ae0 49 64 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 20  IdxDeleter);.   
27af0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
27b00 65 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29  e(p->pIdxSelect)
27b10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
27b20 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 61 74 61 56  nalize(p->pDataV
27b30 65 72 73 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c  ersion);.    sql
27b40 69 74 65 33 46 74 73 35 48 61 73 68 46 72 65 65  ite3Fts5HashFree
27b50 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20  (p->pHash);.    
27b60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
27b70 7a 44 61 74 61 54 62 6c 29 3b 0a 20 20 20 20 73  zDataTbl);.    s
27b80 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
27b90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
27ba0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
27bb0 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61  nt p points to a
27bc0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
27bd0 6e 67 20 75 74 66 2d 38 20 74 65 78 74 20 74 68  ng utf-8 text th
27be0 61 74 20 69 73 20 6e 20 62 79 74 65 73 20 69 6e  at is n bytes in
27bf0 20 0a 2a 2a 20 73 69 7a 65 2e 20 52 65 74 75 72   .** size. Retur
27c00 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
27c10 62 79 74 65 73 20 69 6e 20 74 68 65 20 6e 43 68  bytes in the nCh
27c20 61 72 20 63 68 61 72 61 63 74 65 72 20 70 72 65  ar character pre
27c30 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20 62 75  fix of the.** bu
27c40 66 66 65 72 2c 20 6f 72 20 30 20 69 66 20 74 68  ffer, or 0 if th
27c50 65 72 65 20 61 72 65 20 6c 65 73 73 20 74 68 61  ere are less tha
27c60 6e 20 6e 43 68 61 72 20 63 68 61 72 61 63 74 65  n nChar characte
27c70 72 73 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a  rs in total..*/.
27c80 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
27c90 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74  ndexCharlenToByt
27ca0 65 6c 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68  elen(.  const ch
27cb0 61 72 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6e 42  ar *p, .  int nB
27cc0 79 74 65 2c 20 0a 20 20 69 6e 74 20 6e 43 68 61  yte, .  int nCha
27cd0 72 0a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  r.){.  int n = 0
27ce0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
27cf0 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69  (i=0; i<nChar; i
27d00 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 3e 3d  ++){.    if( n>=
27d10 6e 42 79 74 65 20 29 20 72 65 74 75 72 6e 20 30  nByte ) return 0
27d20 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20  ;      /* Input 
27d30 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74  contains fewer t
27d40 68 61 6e 20 6e 43 68 61 72 20 63 68 61 72 73 20  han nChar chars 
27d50 2a 2f 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69  */.    if( (unsi
27d60 67 6e 65 64 20 63 68 61 72 29 70 5b 6e 2b 2b 5d  gned char)p[n++]
27d70 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20  >=0xc0 ){.      
27d80 77 68 69 6c 65 28 20 28 70 5b 6e 5d 20 26 20 30  while( (p[n] & 0
27d90 78 63 30 29 3d 3d 30 78 38 30 20 29 20 6e 2b 2b  xc0)==0x80 ) n++
27da0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
27db0 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
27dc0 20 70 49 6e 20 69 73 20 61 20 55 54 46 2d 38 20   pIn is a UTF-8 
27dd0 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20  encoded string, 
27de0 6e 49 6e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  nIn bytes in siz
27df0 65 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  e. Return the nu
27e00 6d 62 65 72 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f  mber of.** unico
27e10 64 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  de characters in
27e20 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a   the string..*/.
27e30 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
27e40 6e 64 65 78 43 68 61 72 6c 65 6e 28 63 6f 6e 73  ndexCharlen(cons
27e50 74 20 63 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74  t char *pIn, int
27e60 20 6e 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 43 68   nIn){.  int nCh
27e70 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ar = 0;         
27e80 20 20 20 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b     .  int i = 0;
27e90 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20  .  while( i<nIn 
27ea0 29 7b 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69  ){.    if( (unsi
27eb0 67 6e 65 64 20 63 68 61 72 29 70 49 6e 5b 69 2b  gned char)pIn[i+
27ec0 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20  +]>=0xc0 ){.    
27ed0 20 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 26    while( i<nIn &
27ee0 26 20 28 70 49 6e 5b 69 5d 20 26 20 30 78 63 30  & (pIn[i] & 0xc0
27ef0 29 3d 3d 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20  )==0x80 ) i++;. 
27f00 20 20 20 7d 0a 20 20 20 20 6e 43 68 61 72 2b 2b     }.    nChar++
27f10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
27f20 43 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  Char;.}../*.** I
27f30 6e 73 65 72 74 20 6f 72 20 72 65 6d 6f 76 65 20  nsert or remove 
27f40 64 61 74 61 20 74 6f 20 6f 72 20 66 72 6f 6d 20  data to or from 
27f50 74 68 65 20 69 6e 64 65 78 2e 20 45 61 63 68 20  the index. Each 
27f60 74 69 6d 65 20 61 20 64 6f 63 75 6d 65 6e 74 20  time a document 
27f70 69 73 20 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20  is .** added to 
27f80 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  or removed from 
27f90 74 68 65 20 69 6e 64 65 78 2c 20 74 68 69 73 20  the index, this 
27fa0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
27fb0 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a  ed one or more.*
27fc0 2a 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  * times..**.** F
27fd0 6f 72 20 61 6e 20 69 6e 73 65 72 74 2c 20 69 74  or an insert, it
27fe0 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
27ff0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 6f  once for each to
28000 6b 65 6e 20 69 6e 20 74 68 65 20 6e 65 77 20 64  ken in the new d
28010 6f 63 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20 74  ocument..** If t
28020 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
28030 61 20 64 65 6c 65 74 65 2c 20 69 74 20 6d 75 73  a delete, it mus
28040 74 20 62 65 20 63 61 6c 6c 65 64 20 28 61 74 20  t be called (at 
28050 6c 65 61 73 74 29 20 6f 6e 63 65 20 66 6f 72 20  least) once for 
28060 65 61 63 68 0a 2a 2a 20 75 6e 69 71 75 65 20 74  each.** unique t
28070 6f 6b 65 6e 20 69 6e 20 74 68 65 20 64 6f 63 75  oken in the docu
28080 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 69 43 6f  ment with an iCo
28090 6c 20 76 61 6c 75 65 20 6c 65 73 73 20 74 68 61  l value less tha
280a0 6e 20 7a 65 72 6f 2e 20 54 68 65 20 69 50 6f 73  n zero. The iPos
280b0 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20  .** argument is 
280c0 69 67 6e 6f 72 65 64 20 66 6f 72 20 61 20 64 65  ignored for a de
280d0 6c 65 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lete..*/.int sql
280e0 69 74 65 33 46 74 73 35 49 6e 64 65 78 57 72 69  ite3Fts5IndexWri
280f0 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  te(.  Fts5Index 
28100 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
28110 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
28120 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20  o write to */.  
28130 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20  int iCol,       
28140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28150 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20  /* Column token 
28160 61 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20  appears in (-ve 
28170 2d 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20  -> delete) */.  
28180 69 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20  int iPos,       
28190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281a0 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74  /* Position of t
281b0 6f 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75  oken within colu
281c0 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  mn */.  const ch
281d0 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20  ar *pToken, int 
281e0 6e 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e  nToken  /* Token
281f0 20 74 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f 76   to add or remov
28200 65 20 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64  e to or from ind
28210 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ex */.){.  int i
28220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
28240 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
28250 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f  rough indexes */
28260 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
28270 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
28280 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
28290 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69  e */.  Fts5Confi
282a0 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
282b0 70 43 6f 6e 66 69 67 3b 0a 0a 20 20 61 73 73 65  pConfig;..  asse
282c0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
282d0 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OK );.  assert
282e0 28 20 28 69 43 6f 6c 3c 30 29 3d 3d 70 2d 3e 62  ( (iCol<0)==p->b
282f0 44 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20  Delete );..  /* 
28300 41 64 64 20 74 68 65 20 65 6e 74 72 79 20 74 6f  Add the entry to
28310 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 73 20   the main terms 
28320 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 72 63 20 3d  index. */.  rc =
28330 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
28340 57 72 69 74 65 28 0a 20 20 20 20 20 20 70 2d 3e  Write(.      p->
28350 70 48 61 73 68 2c 20 70 2d 3e 69 57 72 69 74 65  pHash, p->iWrite
28360 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f  Rowid, iCol, iPo
28370 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45  s, FTS5_MAIN_PRE
28380 46 49 58 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f  FIX, pToken, nTo
28390 6b 65 6e 0a 20 20 29 3b 0a 0a 20 20 66 6f 72 28  ken.  );..  for(
283a0 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e  i=0; i<pConfig->
283b0 6e 50 72 65 66 69 78 20 26 26 20 72 63 3d 3d 53  nPrefix && rc==S
283c0 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a  QLITE_OK; i++){.
283d0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43      const int nC
283e0 68 61 72 20 3d 20 70 43 6f 6e 66 69 67 2d 3e 61  har = pConfig->a
283f0 50 72 65 66 69 78 5b 69 5d 3b 0a 20 20 20 20 69  Prefix[i];.    i
28400 6e 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74  nt nByte = sqlit
28410 65 33 46 74 73 35 49 6e 64 65 78 43 68 61 72 6c  e3Fts5IndexCharl
28420 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54 6f 6b  enToBytelen(pTok
28430 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 6e 43 68 61  en, nToken, nCha
28440 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  r);.    if( nByt
28450 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
28460 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 57  sqlite3Fts5HashW
28470 72 69 74 65 28 70 2d 3e 70 48 61 73 68 2c 20 0a  rite(p->pHash, .
28480 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 57 72            p->iWr
28490 69 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20  iteRowid, iCol, 
284a0 69 50 6f 73 2c 20 28 63 68 61 72 29 28 46 54 53  iPos, (char)(FTS
284b0 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2b 69 2b  5_MAIN_PREFIX+i+
284c0 31 29 2c 20 70 54 6f 6b 65 6e 2c 0a 20 20 20 20  1), pToken,.    
284d0 20 20 20 20 20 20 6e 42 79 74 65 0a 20 20 20 20        nByte.    
284e0 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a    );.    }.  }..
284f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28500 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
28510 20 69 74 65 72 61 74 6f 72 20 74 6f 20 69 74 65   iterator to ite
28520 72 61 74 65 20 74 68 6f 75 67 68 20 61 6c 6c 20  rate though all 
28530 72 6f 77 69 64 20 74 68 61 74 20 6d 61 74 63 68  rowid that match
28540 20 74 68 65 20 0a 2a 2a 20 73 70 65 63 69 66 69   the .** specifi
28550 65 64 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65  ed token or toke
28560 6e 20 70 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74  n prefix..*/.int
28570 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
28580 78 51 75 65 72 79 28 0a 20 20 46 74 73 35 49 6e  xQuery(.  Fts5In
28590 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
285a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
285b0 20 69 6e 64 65 78 20 74 6f 20 71 75 65 72 79 20   index to query 
285c0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
285d0 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f  *pToken, int nTo
285e0 6b 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f  ken, /* Token (o
285f0 72 20 70 72 65 66 69 78 29 20 74 6f 20 71 75 65  r prefix) to que
28600 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ry for */.  int 
28610 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
28620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
28630 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58  ask of FTS5INDEX
28640 5f 51 55 45 52 59 5f 58 20 66 6c 61 67 73 20 2a  _QUERY_X flags *
28650 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  /.  Fts5Colset *
28660 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20  pColset,        
28670 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 68 65      /* Match the
28680 73 65 20 63 6f 6c 75 6d 6e 73 20 6f 6e 6c 79 20  se columns only 
28690 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  */.  Fts5IndexIt
286a0 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20  er **ppIter     
286b0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77       /* OUT: New
286c0 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
286d0 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e   */.){.  Fts5Con
286e0 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
286f0 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73  ->pConfig;.  Fts
28700 35 49 74 65 72 20 2a 70 52 65 74 20 3d 20 30 3b  5Iter *pRet = 0;
28710 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75  .  Fts5Buffer bu
28720 66 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a  f = {0, 0, 0};..
28730 20 20 2f 2a 20 49 66 20 74 68 65 20 51 55 45 52    /* If the QUER
28740 59 5f 53 43 41 4e 20 66 6c 61 67 20 69 73 20 73  Y_SCAN flag is s
28750 65 74 2c 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c  et, all other fl
28760 61 67 73 20 6d 75 73 74 20 62 65 20 63 6c 65 61  ags must be clea
28770 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  r. */.  assert( 
28780 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
28790 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3d 3d  EX_QUERY_SCAN)==
287a0 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 46 54 53 35  0 || flags==FTS5
287b0 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
287c0 20 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74   );..  if( sqlit
287d0 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65  e3Fts5BufferSize
287e0 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 6e  (&p->rc, &buf, n
287f0 54 6f 6b 65 6e 2b 31 29 3d 3d 30 20 29 7b 0a 20  Token+1)==0 ){. 
28800 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b     int iIdx = 0;
28810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28820 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 73 65 61   /* Index to sea
28830 72 63 68 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70  rch */.    memcp
28840 79 28 26 62 75 66 2e 70 5b 31 5d 2c 20 70 54 6f  y(&buf.p[1], pTo
28850 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 0a 20  ken, nToken);.. 
28860 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
28870 20 77 68 69 63 68 20 69 6e 64 65 78 20 74 6f 20   which index to 
28880 73 65 61 72 63 68 20 61 6e 64 20 73 65 74 20 69  search and set i
28890 49 64 78 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  Idx accordingly.
288a0 20 49 66 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   If this.    ** 
288b0 69 73 20 61 20 70 72 65 66 69 78 20 71 75 65 72  is a prefix quer
288c0 79 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72  y for which ther
288d0 65 20 69 73 20 6e 6f 20 70 72 65 66 69 78 20 69  e is no prefix i
288e0 6e 64 65 78 2c 20 73 65 74 20 69 49 64 78 20 74  ndex, set iIdx t
288f0 6f 0a 20 20 20 20 2a 2a 20 67 72 65 61 74 65 72  o.    ** greater
28900 20 74 68 61 6e 20 70 43 6f 6e 66 69 67 2d 3e 6e   than pConfig->n
28910 50 72 65 66 69 78 20 74 6f 20 69 6e 64 69 63 61  Prefix to indica
28920 74 65 20 74 68 61 74 20 74 68 65 20 71 75 65 72  te that the quer
28930 79 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a  y will be.    **
28940 20 73 61 74 69 73 66 69 65 64 20 62 79 20 73 63   satisfied by sc
28950 61 6e 6e 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  anning multiple 
28960 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6d 61 69  terms in the mai
28970 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a  n index..    **.
28980 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 51 55      ** If the QU
28990 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20 66  ERY_TEST_NOIDX f
289a0 6c 61 67 20 77 61 73 20 73 70 65 63 69 66 69 65  lag was specifie
289b0 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 75 73  d, then this mus
289c0 74 20 62 65 20 61 0a 20 20 20 20 2a 2a 20 70 72  t be a.    ** pr
289d0 65 66 69 78 2d 71 75 65 72 79 2e 20 49 6e 73 74  efix-query. Inst
289e0 65 61 64 20 6f 66 20 75 73 69 6e 67 20 61 20 70  ead of using a p
289f0 72 65 66 69 78 2d 69 6e 64 65 78 20 28 69 66 20  refix-index (if 
28a00 6f 6e 65 20 65 78 69 73 74 73 29 2c 20 0a 20 20  one exists), .  
28a10 20 20 2a 2a 20 65 76 61 6c 75 61 74 65 20 74 68    ** evaluate th
28a20 65 20 70 72 65 66 69 78 20 71 75 65 72 79 20 75  e prefix query u
28a30 73 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 46 54  sing the main FT
28a40 53 20 69 6e 64 65 78 2e 20 54 68 69 73 20 69 73  S index. This is
28a50 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72   used.    ** for
28a60 20 69 6e 74 65 72 6e 61 6c 20 73 61 6e 69 74 79   internal sanity
28a70 20 63 68 65 63 6b 69 6e 67 20 62 79 20 74 68 65   checking by the
28a80 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
28a90 20 69 6e 20 64 65 62 75 67 20 0a 20 20 20 20 2a   in debug .    *
28aa0 2a 20 6d 6f 64 65 20 6f 6e 6c 79 2e 20 20 2a 2f  * mode only.  */
28ab0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
28ac0 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 43 6f  EBUG.    if( pCo
28ad0 6e 66 69 67 2d 3e 62 50 72 65 66 69 78 49 6e 64  nfig->bPrefixInd
28ae0 65 78 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20  ex==0 || (flags 
28af0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
28b00 59 5f 54 45 53 54 5f 4e 4f 49 44 58 29 20 29 7b  Y_TEST_NOIDX) ){
28b10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66  .      assert( f
28b20 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
28b30 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20 29 3b  _QUERY_PREFIX );
28b40 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 31 2b  .      iIdx = 1+
28b50 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
28b60 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
28b70 69 66 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  if.    if( flags
28b80 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
28b90 52 59 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20  RY_PREFIX ){.   
28ba0 20 20 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 66     int nChar = f
28bb0 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28  ts5IndexCharlen(
28bc0 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b  pToken, nToken);
28bd0 0a 20 20 20 20 20 20 66 6f 72 28 69 49 64 78 3d  .      for(iIdx=
28be0 31 3b 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67  1; iIdx<=pConfig
28bf0 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b  ->nPrefix; iIdx+
28c00 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
28c10 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78  pConfig->aPrefix
28c20 5b 69 49 64 78 2d 31 5d 3d 3d 6e 43 68 61 72 20  [iIdx-1]==nChar 
28c30 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
28c40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
28c50 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e  iIdx<=pConfig->n
28c60 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20  Prefix ){.      
28c70 2f 2a 20 53 74 72 61 69 67 68 74 20 69 6e 64 65  /* Straight inde
28c80 78 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20  x lookup */.    
28c90 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
28ca0 2a 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53  *pStruct = fts5S
28cb0 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
28cc0 0a 20 20 20 20 20 20 62 75 66 2e 70 5b 30 5d 20  .      buf.p[0] 
28cd0 3d 20 28 75 38 29 28 46 54 53 35 5f 4d 41 49 4e  = (u8)(FTS5_MAIN
28ce0 5f 50 52 45 46 49 58 20 2b 20 69 49 64 78 29 3b  _PREFIX + iIdx);
28cf0 0a 20 20 20 20 20 20 69 66 28 20 70 53 74 72 75  .      if( pStru
28d00 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  ct ){.        ft
28d10 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
28d20 2c 20 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73  , pStruct, flags
28d30 20 7c 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   | FTS5INDEX_QUE
28d40 52 59 5f 53 4b 49 50 45 4d 50 54 59 2c 20 0a 20  RY_SKIPEMPTY, . 
28d50 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 73             pCols
28d60 65 74 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65  et, buf.p, nToke
28d70 6e 2b 31 2c 20 2d 31 2c 20 30 2c 20 26 70 52 65  n+1, -1, 0, &pRe
28d80 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  t.        );.   
28d90 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
28da0 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
28db0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
28dc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
28dd0 53 63 61 6e 20 6d 75 6c 74 69 70 6c 65 20 74 65  Scan multiple te
28de0 72 6d 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  rms in the main 
28df0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
28e00 6e 74 20 62 44 65 73 63 20 3d 20 28 66 6c 61 67  nt bDesc = (flag
28e10 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
28e20 45 52 59 5f 44 45 53 43 29 21 3d 30 3b 0a 20 20  ERY_DESC)!=0;.  
28e30 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20 46      buf.p[0] = F
28e40 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 3b  TS5_MAIN_PREFIX;
28e50 0a 20 20 20 20 20 20 66 74 73 35 53 65 74 75 70  .      fts5Setup
28e60 50 72 65 66 69 78 49 74 65 72 28 70 2c 20 62 44  PrefixIter(p, bD
28e70 65 73 63 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b  esc, buf.p, nTok
28e80 65 6e 2b 31 2c 20 70 43 6f 6c 73 65 74 2c 20 26  en+1, pColset, &
28e90 70 52 65 74 29 3b 0a 20 20 20 20 20 20 61 73 73  pRet);.      ass
28ea0 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49  ert( p->rc!=SQLI
28eb0 54 45 5f 4f 4b 20 7c 7c 20 70 52 65 74 2d 3e 70  TE_OK || pRet->p
28ec0 43 6f 6c 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20  Colset==0 );.   
28ed0 20 20 20 66 74 73 35 49 74 65 72 53 65 74 4f 75     fts5IterSetOu
28ee0 74 70 75 74 43 62 28 26 70 2d 3e 72 63 2c 20 70  tputCb(&p->rc, p
28ef0 52 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Ret);.      if( 
28f00 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
28f10 20 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35   ){.        Fts5
28f20 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
28f30 26 70 52 65 74 2d 3e 61 53 65 67 5b 70 52 65 74  &pRet->aSeg[pRet
28f40 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
28f50 73 74 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  st];.        if(
28f60 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 29 20 70   pSeg->pLeaf ) p
28f70 52 65 74 2d 3e 78 53 65 74 4f 75 74 70 75 74 73  Ret->xSetOutputs
28f80 28 70 52 65 74 2c 20 70 53 65 67 29 3b 0a 20 20  (pRet, pSeg);.  
28f90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
28fa0 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20   if( p->rc ){.  
28fb0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49      sqlite3Fts5I
28fc0 74 65 72 43 6c 6f 73 65 28 26 70 52 65 74 2d 3e  terClose(&pRet->
28fd0 62 61 73 65 29 3b 0a 20 20 20 20 20 20 70 52 65  base);.      pRe
28fe0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 74 73  t = 0;.      fts
28ff0 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b  5CloseReader(p);
29000 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a 70 70 49  .    }..    *ppI
29010 74 65 72 20 3d 20 26 70 52 65 74 2d 3e 62 61 73  ter = &pRet->bas
29020 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  e;.    sqlite3Ft
29030 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75  s5BufferFree(&bu
29040 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
29050 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
29060 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (p);.}../*.** Re
29070 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
29080 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
29090 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
290a0 75 6d 65 6e 74 20 69 73 20 61 74 20 45 4f 46 2e  ument is at EOF.
290b0 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .*/./*.** Move t
290c0 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68  o the next match
290d0 69 6e 67 20 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69  ing rowid. .*/.i
290e0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
290f0 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78  erNext(Fts5Index
29100 49 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72  Iter *pIndexIter
29110 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  ){.  Fts5Iter *p
29120 49 74 65 72 20 3d 20 28 46 74 73 35 49 74 65 72  Iter = (Fts5Iter
29130 2a 29 70 49 6e 64 65 78 49 74 65 72 3b 0a 20 20  *)pIndexIter;.  
29140 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
29150 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54  Index->rc==SQLIT
29160 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 4d 75  E_OK );.  fts5Mu
29170 6c 74 69 49 74 65 72 4e 65 78 74 28 70 49 74 65  ltiIterNext(pIte
29180 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72  r->pIndex, pIter
29190 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  , 0, 0);.  retur
291a0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
291b0 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29  n(pIter->pIndex)
291c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
291d0 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63  to the next matc
291e0 68 69 6e 67 20 74 65 72 6d 2f 72 6f 77 69 64 2e  hing term/rowid.
291f0 20 55 73 65 64 20 62 79 20 74 68 65 20 66 74 73   Used by the fts
29200 35 76 6f 63 61 62 20 6d 6f 64 75 6c 65 2e 0a 2a  5vocab module..*
29210 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
29220 35 49 74 65 72 4e 65 78 74 53 63 61 6e 28 46 74  5IterNextScan(Ft
29230 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e  s5IndexIter *pIn
29240 64 65 78 49 74 65 72 29 7b 0a 20 20 46 74 73 35  dexIter){.  Fts5
29250 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 28 46  Iter *pIter = (F
29260 74 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49  ts5Iter*)pIndexI
29270 74 65 72 3b 0a 20 20 46 74 73 35 49 6e 64 65 78  ter;.  Fts5Index
29280 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e   *p = pIter->pIn
29290 64 65 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  dex;..  assert( 
292a0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72  pIter->pIndex->r
292b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
292c0 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  .  fts5MultiIter
292d0 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30  Next(p, pIter, 0
292e0 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  , 0);.  if( p->r
292f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29300 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
29310 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
29320 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
29330 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
29340 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70  .    if( pSeg->p
29350 4c 65 61 66 20 26 26 20 70 53 65 67 2d 3e 74 65  Leaf && pSeg->te
29360 72 6d 2e 70 5b 30 5d 21 3d 46 54 53 35 5f 4d 41  rm.p[0]!=FTS5_MA
29370 49 4e 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20  IN_PREFIX ){.   
29380 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
29390 73 65 28 70 53 65 67 2d 3e 70 4c 65 61 66 29 3b  se(pSeg->pLeaf);
293a0 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 4c 65  .      pSeg->pLe
293b0 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 49  af = 0;.      pI
293c0 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20 3d  ter->base.bEof =
293d0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
293e0 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
293f0 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70  xReturn(pIter->p
29400 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Index);.}../*.**
29410 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78   Move to the nex
29420 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64  t matching rowid
29430 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
29440 6f 72 20 61 66 74 65 72 20 69 4d 61 74 63 68 2e  or after iMatch.
29450 20 54 68 65 0a 2a 2a 20 64 65 66 69 6e 69 74 69   The.** definiti
29460 6f 6e 20 6f 66 20 22 61 74 20 6f 72 20 61 66 74  on of "at or aft
29470 65 72 22 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  er" depends on w
29480 68 65 74 68 65 72 20 74 68 69 73 20 69 74 65 72  hether this iter
29490 61 74 6f 72 20 69 74 65 72 61 74 65 73 0a 2a 2a  ator iterates.**
294a0 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
294b0 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69   descending rowi
294c0 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20  d order..*/.int 
294d0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
294e0 65 78 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65  extFrom(Fts5Inde
294f0 78 49 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65  xIter *pIndexIte
29500 72 2c 20 69 36 34 20 69 4d 61 74 63 68 29 7b 0a  r, i64 iMatch){.
29510 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65    Fts5Iter *pIte
29520 72 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29 70  r = (Fts5Iter*)p
29530 49 6e 64 65 78 49 74 65 72 3b 0a 20 20 66 74 73  IndexIter;.  fts
29540 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72  5MultiIterNextFr
29550 6f 6d 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  om(pIter->pIndex
29560 2c 20 70 49 74 65 72 2c 20 69 4d 61 74 63 68 29  , pIter, iMatch)
29570 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
29580 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65 72  ndexReturn(pIter
29590 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a  ->pIndex);.}../*
295a0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
295b0 75 72 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a  urrent term..*/.
295c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
295d0 74 65 33 46 74 73 35 49 74 65 72 54 65 72 6d 28  te3Fts5IterTerm(
295e0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
295f0 49 6e 64 65 78 49 74 65 72 2c 20 69 6e 74 20 2a  IndexIter, int *
29600 70 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  pn){.  int n;.  
29610 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
29620 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 66 74 73  (const char*)fts
29630 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 28  5MultiIterTerm((
29640 46 74 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78  Fts5Iter*)pIndex
29650 49 74 65 72 2c 20 26 6e 29 3b 0a 20 20 2a 70 6e  Iter, &n);.  *pn
29660 20 3d 20 6e 2d 31 3b 0a 20 20 72 65 74 75 72 6e   = n-1;.  return
29670 20 26 7a 5b 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   &z[1];.}../*.**
29680 20 43 6c 6f 73 65 20 61 6e 20 69 74 65 72 61 74   Close an iterat
29690 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20  or opened by an 
296a0 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
296b0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
296c0 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Query()..*/.void
296d0 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
296e0 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 49  Close(Fts5IndexI
296f0 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72 29  ter *pIndexIter)
29700 7b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 49 74  {.  if( pIndexIt
29710 65 72 20 29 7b 0a 20 20 20 20 46 74 73 35 49 74  er ){.    Fts5It
29720 65 72 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73  er *pIter = (Fts
29730 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65  5Iter*)pIndexIte
29740 72 3b 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78  r;.    Fts5Index
29750 20 2a 70 49 6e 64 65 78 20 3d 20 70 49 74 65 72   *pIndex = pIter
29760 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 66 74  ->pIndex;.    ft
29770 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
29780 70 49 74 65 72 29 3b 0a 20 20 20 20 66 74 73 35  pIter);.    fts5
29790 43 6c 6f 73 65 52 65 61 64 65 72 28 70 49 6e 64  CloseReader(pInd
297a0 65 78 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ex);.  }.}../*.*
297b0 2a 20 52 65 61 64 20 61 6e 64 20 64 65 63 6f 64  * Read and decod
297c0 65 20 74 68 65 20 22 61 76 65 72 61 67 65 73 22  e the "averages"
297d0 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
297e0 20 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a   database. .**.*
297f0 2a 20 50 61 72 61 6d 65 74 65 72 20 61 6e 53 69  * Parameter anSi
29800 7a 65 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ze must point to
29810 20 61 6e 20 61 72 72 61 79 20 6f 66 20 73 69 7a   an array of siz
29820 65 20 6e 43 6f 6c 2c 20 77 68 65 72 65 20 6e 43  e nCol, where nC
29830 6f 6c 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6d  ol is.** the num
29840 62 65 72 20 6f 66 20 75 73 65 72 20 64 65 66 69  ber of user defi
29850 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  ned columns in t
29860 68 65 20 46 54 53 20 74 61 62 6c 65 2e 0a 2a 2f  he FTS table..*/
29870 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
29880 49 6e 64 65 78 47 65 74 41 76 65 72 61 67 65 73  IndexGetAverages
29890 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
298a0 36 34 20 2a 70 6e 52 6f 77 2c 20 69 36 34 20 2a  64 *pnRow, i64 *
298b0 61 6e 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 6e  anSize){.  int n
298c0 43 6f 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  Col = p->pConfig
298d0 2d 3e 6e 43 6f 6c 3b 0a 20 20 46 74 73 35 44 61  ->nCol;.  Fts5Da
298e0 74 61 20 2a 70 44 61 74 61 3b 0a 0a 20 20 2a 70  ta *pData;..  *p
298f0 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 6d 65 6d 73  nRow = 0;.  mems
29900 65 74 28 61 6e 53 69 7a 65 2c 20 30 2c 20 73 69  et(anSize, 0, si
29910 7a 65 6f 66 28 69 36 34 29 20 2a 20 6e 43 6f 6c  zeof(i64) * nCol
29920 29 3b 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73  );.  pData = fts
29930 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53  5DataRead(p, FTS
29940 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
29950 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
29960 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61  SQLITE_OK && pDa
29970 74 61 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 69 6e  ta->nn ){.    in
29980 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  t i = 0;.    int
29990 20 69 43 6f 6c 3b 0a 20 20 20 20 69 20 2b 3d 20   iCol;.    i += 
299a0 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  fts5GetVarint(&p
299b0 44 61 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34  Data->p[i], (u64
299c0 2a 29 70 6e 52 6f 77 29 3b 0a 20 20 20 20 66 6f  *)pnRow);.    fo
299d0 72 28 69 43 6f 6c 3d 30 3b 20 69 3c 70 44 61 74  r(iCol=0; i<pDat
299e0 61 2d 3e 6e 6e 20 26 26 20 69 43 6f 6c 3c 6e 43  a->nn && iCol<nC
299f0 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
29a00 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
29a10 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b  arint(&pData->p[
29a20 69 5d 2c 20 28 75 36 34 2a 29 26 61 6e 53 69 7a  i], (u64*)&anSiz
29a30 65 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 7d 0a  e[iCol]);.    }.
29a40 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52    }..  fts5DataR
29a50 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20  elease(pData);. 
29a60 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
29a70 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
29a80 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65  *.** Replace the
29a90 20 63 75 72 72 65 6e 74 20 22 61 76 65 72 61 67   current "averag
29aa0 65 73 22 20 72 65 63 6f 72 64 20 77 69 74 68 20  es" record with 
29ab0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
29ac0 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 73  the buffer .** s
29ad0 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 20 73  upplied as the s
29ae0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
29af0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
29b00 73 35 49 6e 64 65 78 53 65 74 41 76 65 72 61 67  s5IndexSetAverag
29b10 65 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  es(Fts5Index *p,
29b20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61   const u8 *pData
29b30 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20  , int nData){.  
29b40 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
29b50 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74  QLITE_OK );.  ft
29b60 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 46  s5DataWrite(p, F
29b70 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
29b80 49 44 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61  ID, pData, nData
29b90 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
29ba0 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
29bb0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
29bc0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
29bd0 20 6f 66 20 62 6c 6f 63 6b 73 20 74 68 69 73 20   of blocks this 
29be0 6d 6f 64 75 6c 65 20 68 61 73 20 72 65 61 64 20  module has read 
29bf0 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 0a  from the %_data.
29c00 2a 2a 20 74 61 62 6c 65 20 73 69 6e 63 65 20 69  ** table since i
29c10 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a  t was created..*
29c20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
29c30 35 49 6e 64 65 78 52 65 61 64 73 28 46 74 73 35  5IndexReads(Fts5
29c40 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 72 65 74  Index *p){.  ret
29c50 75 72 6e 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a  urn p->nRead;.}.
29c60 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 33  ./*.** Set the 3
29c70 32 2d 62 69 74 20 63 6f 6f 6b 69 65 20 76 61 6c  2-bit cookie val
29c80 75 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  ue stored at the
29c90 20 73 74 61 72 74 20 6f 66 20 61 6c 6c 20 73 74   start of all st
29ca0 72 75 63 74 75 72 65 20 0a 2a 2a 20 72 65 63 6f  ructure .** reco
29cb0 72 64 73 20 74 6f 20 74 68 65 20 76 61 6c 75 65  rds to the value
29cc0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
29cd0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
29ce0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
29cf0 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
29d00 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
29d10 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  te error code if
29d20 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63   an error.** occ
29d30 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  urs..*/.int sqli
29d40 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 43  te3Fts5IndexSetC
29d50 6f 6f 6b 69 65 28 46 74 73 35 49 6e 64 65 78 20  ookie(Fts5Index 
29d60 2a 70 2c 20 69 6e 74 20 69 4e 65 77 29 7b 0a 20  *p, int iNew){. 
29d70 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
29d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d90 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
29da0 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f  code */.  Fts5Co
29db0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
29dc0 70 2d 3e 70 43 6f 6e 66 69 67 3b 20 20 20 20 2f  p->pConfig;    /
29dd0 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
29de0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 38 20 61  object */.  u8 a
29df0 43 6f 6f 6b 69 65 5b 34 5d 3b 20 20 20 20 20 20  Cookie[4];      
29e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e10 20 2f 2a 20 42 69 6e 61 72 79 20 72 65 70 72 65   /* Binary repre
29e20 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 69 4e 65  sentation of iNe
29e30 77 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62  w */.  sqlite3_b
29e40 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a  lob *pBlob = 0;.
29e50 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
29e60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
29e70 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 33   sqlite3Fts5Put3
29e80 32 28 61 43 6f 6f 6b 69 65 2c 20 69 4e 65 77 29  2(aCookie, iNew)
29e90 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
29ea0 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e  3_blob_open(pCon
29eb0 66 69 67 2d 3e 64 62 2c 20 70 43 6f 6e 66 69 67  fig->db, pConfig
29ec0 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54  ->zDb, p->zDataT
29ed0 62 6c 2c 20 0a 20 20 20 20 20 20 22 62 6c 6f 63  bl, .      "bloc
29ee0 6b 22 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55  k", FTS5_STRUCTU
29ef0 52 45 5f 52 4f 57 49 44 2c 20 31 2c 20 26 70 42  RE_ROWID, 1, &pB
29f00 6c 6f 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  lob.  );.  if( r
29f10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29f20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
29f30 5f 77 72 69 74 65 28 70 42 6c 6f 62 2c 20 61 43  _write(pBlob, aC
29f40 6f 6f 6b 69 65 2c 20 34 2c 20 30 29 3b 0a 20 20  ookie, 4, 0);.  
29f50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
29f60 6c 6f 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29  lob_close(pBlob)
29f70 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
29f80 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  rc;.}..int sqlit
29f90 65 33 46 74 73 35 49 6e 64 65 78 4c 6f 61 64 43  e3Fts5IndexLoadC
29fa0 6f 6e 66 69 67 28 46 74 73 35 49 6e 64 65 78 20  onfig(Fts5Index 
29fb0 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  *p){.  Fts5Struc
29fc0 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20  ture *pStruct;. 
29fd0 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53   pStruct = fts5S
29fe0 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
29ff0 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
2a000 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
2a010 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
2a020 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
2a030 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
2a040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2a080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a0a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a0b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a0c0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f  ********.** Belo
2a0d0 77 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20  w this point is 
2a0e0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
2a0f0 6f 6e 20 6f 66 20 74 68 65 20 69 6e 74 65 67 72  on of the integr
2a100 69 74 79 2d 63 68 65 63 6b 20 0a 2a 2a 20 66 75  ity-check .** fu
2a110 6e 63 74 69 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a  nctionality..*/.
2a120 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
2a130 73 69 6d 70 6c 65 20 63 68 65 63 6b 73 75 6d 20  simple checksum 
2a140 76 61 6c 75 65 20 62 61 73 65 64 20 6f 6e 20 74  value based on t
2a150 68 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  he arguments..*/
2a160 0a 75 36 34 20 73 71 6c 69 74 65 33 46 74 73 35  .u64 sqlite3Fts5
2a170 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28  IndexEntryCksum(
2a180 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a  .  i64 iRowid, .
2a190 20 20 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69    int iCol, .  i
2a1a0 6e 74 20 69 50 6f 73 2c 20 0a 20 20 69 6e 74 20  nt iPos, .  int 
2a1b0 69 49 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68  iIdx,.  const ch
2a1c0 61 72 20 2a 70 54 65 72 6d 2c 0a 20 20 69 6e 74  ar *pTerm,.  int
2a1d0 20 6e 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20   nTerm.){.  int 
2a1e0 69 3b 0a 20 20 75 36 34 20 72 65 74 20 3d 20 69  i;.  u64 ret = i
2a1f0 52 6f 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20  Rowid;.  ret += 
2a200 28 72 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b  (ret<<3) + iCol;
2a210 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c  .  ret += (ret<<
2a220 33 29 20 2b 20 69 50 6f 73 3b 0a 20 20 69 66 28  3) + iPos;.  if(
2a230 20 69 49 64 78 3e 3d 30 20 29 20 72 65 74 20 2b   iIdx>=0 ) ret +
2a240 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 28 46 54  = (ret<<3) + (FT
2a250 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b  S5_MAIN_PREFIX +
2a260 20 69 49 64 78 29 3b 0a 20 20 66 6f 72 28 69 3d   iIdx);.  for(i=
2a270 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29  0; i<nTerm; i++)
2a280 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29   ret += (ret<<3)
2a290 20 2b 20 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 72   + pTerm[i];.  r
2a2a0 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69  eturn ret;.}..#i
2a2b0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2a2c0 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  G./*.** This fun
2a2d0 63 74 69 6f 6e 20 69 73 20 70 75 72 65 6c 79 20  ction is purely 
2a2e0 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74  an internal test
2a2f0 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f  . It does not co
2a300 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20  ntribute to .** 
2a310 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  FTS functionalit
2a320 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69  y, or even the i
2a330 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20  ntegrity-check, 
2a340 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a  in any way..**.*
2a350 2a 20 49 6e 73 74 65 61 64 2c 20 69 74 20 74 65  * Instead, it te
2a360 73 74 73 20 74 68 61 74 20 74 68 65 20 73 61 6d  sts that the sam
2a370 65 20 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f  e set of pgno/ro
2a380 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  wid combinations
2a390 20 61 72 65 20 0a 2a 2a 20 76 69 73 69 74 65 64   are .** visited
2a3a0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
2a3b0 68 65 74 68 65 72 20 74 68 65 20 64 6f 63 6c 69  hether the docli
2a3c0 73 74 2d 69 6e 64 65 78 20 69 64 65 6e 74 69 66  st-index identif
2a3d0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
2a3e0 73 0a 2a 2a 20 69 53 65 67 69 64 2f 69 4c 65 61  s.** iSegid/iLea
2a3f0 66 20 69 73 20 69 74 65 72 61 74 65 64 20 69 6e  f is iterated in
2a400 20 66 6f 72 77 61 72 64 73 20 6f 72 20 72 65 76   forwards or rev
2a410 65 72 73 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  erse order..*/.s
2a420 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 54  tatic void fts5T
2a430 65 73 74 44 6c 69 64 78 52 65 76 65 72 73 65 28  estDlidxReverse(
2a440 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
2a450 20 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20   .  int iSegid, 
2a460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a470 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69      /* Segment i
2a480 64 20 74 6f 20 6c 6f 61 64 20 66 72 6f 6d 20 2a  d to load from *
2a490 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 20 20 20  /.  int iLeaf   
2a4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4b0 20 20 20 20 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c      /* Load docl
2a4c0 69 73 74 2d 69 6e 64 65 78 20 66 6f 72 20 74 68  ist-index for th
2a4d0 69 73 20 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20 20  is leaf */.){.  
2a4e0 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
2a4f0 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 75 36 34  Dlidx = 0;.  u64
2a500 20 63 6b 73 75 6d 31 20 3d 20 31 33 3b 0a 20 20   cksum1 = 13;.  
2a510 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 31 33 3b  u64 cksum2 = 13;
2a520 0a 0a 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66  ..  for(pDlidx=f
2a530 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
2a540 28 70 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69  (p, 0, iSegid, i
2a550 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 66 74 73  Leaf);.      fts
2a560 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
2a570 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20   pDlidx)==0;.   
2a580 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
2a590 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a  Next(p, pDlidx).
2a5a0 20 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f    ){.    i64 iRo
2a5b0 77 69 64 20 3d 20 66 74 73 35 44 6c 69 64 78 49  wid = fts5DlidxI
2a5c0 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29  terRowid(pDlidx)
2a5d0 3b 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d  ;.    int pgno =
2a5e0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
2a5f0 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  no(pDlidx);.    
2a600 61 73 73 65 72 74 28 20 70 67 6e 6f 3e 69 4c 65  assert( pgno>iLe
2a610 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31  af );.    cksum1
2a620 20 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69   += iRowid + ((i
2a630 36 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20  64)pgno<<32);.  
2a640 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65  }.  fts5DlidxIte
2a650 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20  rFree(pDlidx);. 
2a660 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20   pDlidx = 0;..  
2a670 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44  for(pDlidx=fts5D
2a680 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20  lidxIterInit(p, 
2a690 31 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66  1, iSegid, iLeaf
2a6a0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  );.      fts5Dli
2a6b0 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
2a6c0 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66  idx)==0;.      f
2a6d0 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76  ts5DlidxIterPrev
2a6e0 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 29 7b  (p, pDlidx).  ){
2a6f0 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20  .    i64 iRowid 
2a700 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 52  = fts5DlidxIterR
2a710 6f 77 69 64 28 70 44 6c 69 64 78 29 3b 0a 20 20  owid(pDlidx);.  
2a720 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73    int pgno = fts
2a730 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
2a740 44 6c 69 64 78 29 3b 0a 20 20 20 20 61 73 73 65  Dlidx);.    asse
2a750 72 74 28 20 66 74 73 35 44 6c 69 64 78 49 74 65  rt( fts5DlidxIte
2a760 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3e 69 4c  rPgno(pDlidx)>iL
2a770 65 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d  eaf );.    cksum
2a780 32 20 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28  2 += iRowid + ((
2a790 69 36 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20  i64)pgno<<32);. 
2a7a0 20 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74   }.  fts5DlidxIt
2a7b0 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a  erFree(pDlidx);.
2a7c0 20 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20    pDlidx = 0;.. 
2a7d0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
2a7e0 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21  TE_OK && cksum1!
2a7f0 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20  =cksum2 ) p->rc 
2a800 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2a810 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
2a820 73 35 51 75 65 72 79 43 6b 73 75 6d 28 0a 20 20  s5QueryCksum(.  
2a830 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
2a840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a850 2f 2a 20 46 74 73 35 20 69 6e 64 65 78 20 6f 62  /* Fts5 index ob
2a860 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49  ject */.  int iI
2a870 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  dx,.  const char
2a880 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20   *z,            
2a890 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6b        /* Index k
2a8a0 65 79 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  ey to query for 
2a8b0 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  int n,     
2a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8d0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2a8e0 69 6e 64 65 78 20 6b 65 79 20 69 6e 20 62 79 74  index key in byt
2a8f0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  es */.  int flag
2a900 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2a910 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
2a920 20 66 6f 72 20 46 74 73 35 49 6e 64 65 78 51 75   for Fts5IndexQu
2a930 65 72 79 20 2a 2f 0a 20 20 75 36 34 20 2a 70 43  ery */.  u64 *pC
2a940 6b 73 75 6d 20 20 20 20 20 20 20 20 20 20 20 20  ksum            
2a950 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
2a960 55 54 3a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c  UT: Checksum val
2a970 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65  ue */.){.  int e
2a980 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e  Detail = p->pCon
2a990 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20  fig->eDetail;.  
2a9a0 75 36 34 20 63 6b 73 75 6d 20 3d 20 2a 70 43 6b  u64 cksum = *pCk
2a9b0 73 75 6d 3b 0a 20 20 46 74 73 35 49 6e 64 65 78  sum;.  Fts5Index
2a9c0 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b  Iter *pIter = 0;
2a9d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
2a9e0 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72  te3Fts5IndexQuer
2a9f0 79 28 70 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67 73  y(p, z, n, flags
2aa00 2c 20 30 2c 20 26 70 49 74 65 72 29 3b 0a 0a 20  , 0, &pIter);.. 
2aa10 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
2aa20 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69  TE_OK && 0==sqli
2aa30 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70  te3Fts5IterEof(p
2aa40 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69 36 34  Iter) ){.    i64
2aa50 20 72 6f 77 69 64 20 3d 20 70 49 74 65 72 2d 3e   rowid = pIter->
2aa60 69 52 6f 77 69 64 3b 0a 0a 20 20 20 20 69 66 28  iRowid;..    if(
2aa70 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44   eDetail==FTS5_D
2aa80 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
2aa90 20 20 20 20 63 6b 73 75 6d 20 5e 3d 20 73 71 6c      cksum ^= sql
2aaa0 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74  ite3Fts5IndexEnt
2aab0 72 79 43 6b 73 75 6d 28 72 6f 77 69 64 2c 20 30  ryCksum(rowid, 0
2aac0 2c 20 30 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29  , 0, iIdx, z, n)
2aad0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2aae0 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65     Fts5PoslistRe
2aaf0 61 64 65 72 20 73 52 65 61 64 65 72 3b 0a 20 20  ader sReader;.  
2ab00 20 20 20 20 66 6f 72 28 73 71 6c 69 74 65 33 46      for(sqlite3F
2ab10 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
2ab20 49 6e 69 74 28 70 49 74 65 72 2d 3e 70 44 61 74  Init(pIter->pDat
2ab30 61 2c 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 2c  a, pIter->nData,
2ab40 20 26 73 52 65 61 64 65 72 29 3b 0a 20 20 20 20   &sReader);.    
2ab50 20 20 20 20 20 20 73 52 65 61 64 65 72 2e 62 45        sReader.bE
2ab60 6f 66 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20  of==0;.         
2ab70 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
2ab80 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 73  istReaderNext(&s
2ab90 52 65 61 64 65 72 29 0a 20 20 20 20 20 20 29 7b  Reader).      ){
2aba0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
2abb0 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c  l = FTS5_POS2COL
2abc0 55 4d 4e 28 73 52 65 61 64 65 72 2e 69 50 6f 73  UMN(sReader.iPos
2abd0 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  );.        int i
2abe0 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f  Off = FTS5_POS2O
2abf0 46 46 53 45 54 28 73 52 65 61 64 65 72 2e 69 50  FFSET(sReader.iP
2ac00 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73  os);.        cks
2ac10 75 6d 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73  um ^= sqlite3Fts
2ac20 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d  5IndexEntryCksum
2ac30 28 72 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 4f  (rowid, iCol, iO
2ac40 66 66 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b  ff, iIdx, z, n);
2ac50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2ac60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2ac70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
2ac80 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74   = sqlite3Fts5It
2ac90 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a 20  erNext(pIter);. 
2aca0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
2acb0 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28  e3Fts5IterClose(
2acc0 70 49 74 65 72 29 3b 0a 0a 20 20 2a 70 43 6b 73  pIter);..  *pCks
2acd0 75 6d 20 3d 20 63 6b 73 75 6d 3b 0a 20 20 72 65  um = cksum;.  re
2ace0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
2acf0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2ad00 20 69 73 20 61 6c 73 6f 20 70 75 72 65 6c 79 20   is also purely 
2ad10 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74  an internal test
2ad20 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f  . It does not co
2ad30 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20  ntribute to .** 
2ad40 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  FTS functionalit
2ad50 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69  y, or even the i
2ad60 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20  ntegrity-check, 
2ad70 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 73  in any way..*/.s
2ad80 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 54  tatic void fts5T
2ad90 65 73 74 54 65 72 6d 28 0a 20 20 46 74 73 35 49  estTerm(.  Fts5I
2ada0 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
2adb0 42 75 66 66 65 72 20 2a 70 50 72 65 76 2c 20 20  Buffer *pPrev,  
2adc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2add0 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a  revious term */.
2ade0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c    const char *z,
2adf0 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
2ae00 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6e 65    /* Possibly ne
2ae10 77 20 74 65 72 6d 20 74 6f 20 74 65 73 74 20 2a  w term to test *
2ae20 2f 0a 20 20 75 36 34 20 65 78 70 65 63 74 65 64  /.  u64 expected
2ae30 2c 0a 20 20 75 36 34 20 2a 70 43 6b 73 75 6d 0a  ,.  u64 *pCksum.
2ae40 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d  ){.  int rc = p-
2ae50 3e 72 63 3b 0a 20 20 69 66 28 20 70 50 72 65 76  >rc;.  if( pPrev
2ae60 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74  ->n==0 ){.    ft
2ae70 73 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c  s5BufferSet(&rc,
2ae80 20 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73   pPrev, n, (cons
2ae90 74 20 75 38 2a 29 7a 29 3b 0a 20 20 7d 65 6c 73  t u8*)z);.  }els
2aea0 65 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  e.  if( rc==SQLI
2aeb0 54 45 5f 4f 4b 20 26 26 20 28 70 50 72 65 76 2d  TE_OK && (pPrev-
2aec0 3e 6e 21 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28  >n!=n || memcmp(
2aed0 70 50 72 65 76 2d 3e 70 2c 20 7a 2c 20 6e 29 29  pPrev->p, z, n))
2aee0 20 29 7b 0a 20 20 20 20 75 36 34 20 63 6b 73 75   ){.    u64 cksu
2aef0 6d 33 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20  m3 = *pCksum;.  
2af00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
2af10 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  erm = (const cha
2af20 72 2a 29 26 70 50 72 65 76 2d 3e 70 5b 31 5d 3b  r*)&pPrev->p[1];
2af30 20 20 2f 2a 20 74 65 72 6d 20 73 61 6e 73 20 70    /* term sans p
2af40 72 65 66 69 78 2d 62 79 74 65 20 2a 2f 0a 20 20  refix-byte */.  
2af50 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70 50    int nTerm = pP
2af60 72 65 76 2d 3e 6e 2d 31 3b 20 20 20 20 20 20 20  rev->n-1;       
2af70 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2af80 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a  zTerm in bytes *
2af90 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d  /.    int iIdx =
2afa0 20 28 70 50 72 65 76 2d 3e 70 5b 30 5d 20 2d 20   (pPrev->p[0] - 
2afb0 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58  FTS5_MAIN_PREFIX
2afc0 29 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  );.    int flags
2afd0 20 3d 20 28 69 49 64 78 3d 3d 30 20 3f 20 30 20   = (iIdx==0 ? 0 
2afe0 3a 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  : FTS5INDEX_QUER
2aff0 59 5f 50 52 45 46 49 58 29 3b 0a 20 20 20 20 75  Y_PREFIX);.    u
2b000 36 34 20 63 6b 31 20 3d 20 30 3b 0a 20 20 20 20  64 ck1 = 0;.    
2b010 75 36 34 20 63 6b 32 20 3d 20 30 3b 0a 0a 20 20  u64 ck2 = 0;..  
2b020 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
2b030 74 68 65 20 72 65 73 75 6c 74 73 20 72 65 74 75  the results retu
2b040 72 6e 65 64 20 66 6f 72 20 41 53 43 20 61 6e 64  rned for ASC and
2b050 20 44 45 53 43 20 71 75 65 72 69 65 73 20 61 72   DESC queries ar
2b060 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d  e.    ** the sam
2b070 65 2e 20 49 66 20 6e 6f 74 2c 20 63 61 6c 6c 20  e. If not, call 
2b080 74 68 69 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e  this corruption.
2b090 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74    */.    rc = ft
2b0a0 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20  s5QueryCksum(p, 
2b0b0 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  iIdx, zTerm, nTe
2b0c0 72 6d 2c 20 66 6c 61 67 73 2c 20 26 63 6b 31 29  rm, flags, &ck1)
2b0d0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2b0e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b0f0 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46   int f = flags|F
2b100 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
2b110 45 53 43 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ESC;.      rc = 
2b120 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70  fts5QueryCksum(p
2b130 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e  , iIdx, zTerm, n
2b140 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a  Term, f, &ck2);.
2b150 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2b160 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
2b170 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46  k1!=ck2 ) rc = F
2b180 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20  TS5_CORRUPT;..  
2b190 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
2b1a0 61 20 70 72 65 66 69 78 20 71 75 65 72 79 2c 20  a prefix query, 
2b1b0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 72  check that the r
2b1c0 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64 20  esults returned 
2b1d0 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68  if the.    ** th
2b1e0 65 20 69 6e 64 65 78 20 69 73 20 64 69 73 61 62  e index is disab
2b1f0 6c 65 64 20 61 72 65 20 74 68 65 20 73 61 6d 65  led are the same
2b200 2e 20 49 6e 20 62 6f 74 68 20 41 53 43 20 61 6e  . In both ASC an
2b210 64 20 44 45 53 43 20 6f 72 64 65 72 2e 20 0a 20  d DESC order. . 
2b220 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
2b230 73 20 63 68 65 63 6b 20 6d 61 79 20 6f 6e 6c 79  s check may only
2b240 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66   be performed if
2b250 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
2b260 69 73 20 65 6d 70 74 79 2e 20 54 68 69 73 0a 20  is empty. This. 
2b270 20 20 20 2a 2a 20 69 73 20 62 65 63 61 75 73 65     ** is because
2b280 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
2b290 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 61 20  only supports a 
2b2a0 73 69 6e 67 6c 65 20 73 63 61 6e 20 71 75 65 72  single scan quer
2b2b0 79 20 61 74 0a 20 20 20 20 2a 2a 20 61 20 74 69  y at.    ** a ti
2b2c0 6d 65 2c 20 61 6e 64 20 74 68 65 20 6d 75 6c 74  me, and the mult
2b2d0 69 2d 69 74 65 72 20 6c 6f 6f 70 20 66 72 6f 6d  i-iter loop from
2b2e0 20 77 68 69 63 68 20 74 68 69 73 20 66 75 6e 63   which this func
2b2f0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 0a 20  tion is called. 
2b300 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79     ** is already
2b310 20 70 65 72 66 6f 72 6d 69 6e 67 20 73 75 63 68   performing such
2b320 20 61 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20   a scan. */.    
2b330 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44  if( p->nPendingD
2b340 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ata==0 ){.      
2b350 69 66 28 20 69 49 64 78 3e 30 20 26 26 20 72 63  if( iIdx>0 && rc
2b360 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b370 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66         int f = f
2b380 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51  lags|FTS5INDEX_Q
2b390 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 3b  UERY_TEST_NOIDX;
2b3a0 0a 20 20 20 20 20 20 20 20 63 6b 32 20 3d 20 30  .        ck2 = 0
2b3b0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  ;.        rc = f
2b3c0 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c  ts5QueryCksum(p,
2b3d0 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54   iIdx, zTerm, nT
2b3e0 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20  erm, f, &ck2);. 
2b3f0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2b400 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21  QLITE_OK && ck1!
2b410 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35  =ck2 ) rc = FTS5
2b420 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2b430 7d 0a 20 20 20 20 20 20 69 66 28 20 69 49 64 78  }.      if( iIdx
2b440 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  >0 && rc==SQLITE
2b450 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
2b460 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53  nt f = flags|FTS
2b470 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53  5INDEX_QUERY_TES
2b480 54 5f 4e 4f 49 44 58 7c 46 54 53 35 49 4e 44 45  T_NOIDX|FTS5INDE
2b490 58 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a 20 20  X_QUERY_DESC;.  
2b4a0 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20        ck2 = 0;. 
2b4b0 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
2b4c0 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49  QueryCksum(p, iI
2b4d0 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  dx, zTerm, nTerm
2b4e0 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20  , f, &ck2);.    
2b4f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b500 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b  TE_OK && ck1!=ck
2b510 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f  2 ) rc = FTS5_CO
2b520 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  RRUPT;.      }. 
2b530 20 20 20 7d 0a 0a 20 20 20 20 63 6b 73 75 6d 33     }..    cksum3
2b540 20 5e 3d 20 63 6b 31 3b 0a 20 20 20 20 66 74 73   ^= ck1;.    fts
2b550 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20  5BufferSet(&rc, 
2b560 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74  pPrev, n, (const
2b570 20 75 38 2a 29 7a 29 3b 0a 0a 20 20 20 20 69 66   u8*)z);..    if
2b580 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b590 26 26 20 63 6b 73 75 6d 33 21 3d 65 78 70 65 63  && cksum3!=expec
2b5a0 74 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ted ){.      rc 
2b5b0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2b5c0 20 20 20 20 7d 0a 20 20 20 20 2a 70 43 6b 73 75      }.    *pCksu
2b5d0 6d 20 3d 20 63 6b 73 75 6d 33 3b 0a 20 20 7d 0a  m = cksum3;.  }.
2b5e0 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a    p->rc = rc;.}.
2b5f0 20 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65   .#else.# define
2b600 20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52 65   fts5TestDlidxRe
2b610 76 65 72 73 65 28 78 2c 79 2c 7a 29 0a 23 20 64  verse(x,y,z).# d
2b620 65 66 69 6e 65 20 66 74 73 35 54 65 73 74 54 65  efine fts5TestTe
2b630 72 6d 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a  rm(u,v,w,x,y,z).
2b640 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68  #endif../*.** Ch
2b650 65 63 6b 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20  eck that:.**.** 
2b660 20 20 31 29 20 41 6c 6c 20 6c 65 61 76 65 73 20    1) All leaves 
2b670 6f 66 20 70 53 65 67 20 62 65 74 77 65 65 6e 20  of pSeg between 
2b680 69 46 69 72 73 74 20 61 6e 64 20 69 4c 61 73 74  iFirst and iLast
2b690 20 28 69 6e 63 6c 75 73 69 76 65 29 20 65 78 69   (inclusive) exi
2b6a0 73 74 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63  st and.**      c
2b6b0 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 74 65 72 6d  ontain zero term
2b6c0 73 2e 0a 2a 2a 20 20 20 32 29 20 41 6c 6c 20 6c  s..**   2) All l
2b6d0 65 61 76 65 73 20 6f 66 20 70 53 65 67 20 62 65  eaves of pSeg be
2b6e0 74 77 65 65 6e 20 69 4e 6f 52 6f 77 69 64 20 61  tween iNoRowid a
2b6f0 6e 64 20 69 4c 61 73 74 20 28 69 6e 63 6c 75 73  nd iLast (inclus
2b700 69 76 65 29 20 65 78 69 73 74 20 61 6e 64 0a 2a  ive) exist and.*
2b710 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a  *      contain z
2b720 65 72 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73  ero rowids..*/.s
2b730 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
2b740 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
2b750 63 6b 45 6d 70 74 79 28 0a 20 20 46 74 73 35 49  ckEmpty(.  Fts5I
2b760 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53  ndex *p,.  Fts5S
2b770 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
2b780 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 53 65  *pSeg,     /* Se
2b790 67 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69  gment to check i
2b7a0 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65  nternal consiste
2b7b0 6e 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  ncy */.  int iFi
2b7c0 72 73 74 2c 0a 20 20 69 6e 74 20 69 4e 6f 52 6f  rst,.  int iNoRo
2b7d0 77 69 64 2c 0a 20 20 69 6e 74 20 69 4c 61 73 74  wid,.  int iLast
2b7e0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  .){.  int i;..  
2b7f0 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  /* Now check tha
2b800 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d 70 74  t the iter.nEmpt
2b810 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69  y leaves followi
2b820 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  ng the current l
2b830 65 61 66 0a 20 20 2a 2a 20 28 61 29 20 65 78 69  eaf.  ** (a) exi
2b840 73 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61  st and (b) conta
2b850 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a  in no terms. */.
2b860 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20    for(i=iFirst; 
2b870 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
2b880 20 26 26 20 69 3c 3d 69 4c 61 73 74 3b 20 69 2b   && i<=iLast; i+
2b890 2b 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61  +){.    Fts5Data
2b8a0 20 2a 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61   *pLeaf = fts5Da
2b8b0 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53  taRead(p, FTS5_S
2b8c0 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65  EGMENT_ROWID(pSe
2b8d0 67 2d 3e 69 53 65 67 69 64 2c 20 69 29 29 3b 0a  g->iSegid, i));.
2b8e0 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b      if( pLeaf ){
2b8f0 0a 20 20 20 20 20 20 69 66 28 20 21 66 74 73 35  .      if( !fts5
2b900 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70  LeafIsTermless(p
2b910 4c 65 61 66 29 20 29 20 70 2d 3e 72 63 20 3d 20  Leaf) ) p->rc = 
2b920 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2b930 20 20 20 20 69 66 28 20 69 3e 3d 69 4e 6f 52 6f      if( i>=iNoRo
2b940 77 69 64 20 26 26 20 30 21 3d 66 74 73 35 4c 65  wid && 0!=fts5Le
2b950 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28  afFirstRowidOff(
2b960 70 4c 65 61 66 29 20 29 20 70 2d 3e 72 63 20 3d  pLeaf) ) p->rc =
2b970 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2b980 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74     }.    fts5Dat
2b990 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
2b9a0 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
2b9b0 6f 69 64 20 66 74 73 35 49 6e 74 65 67 72 69 74  oid fts5Integrit
2b9c0 79 43 68 65 63 6b 50 67 69 64 78 28 46 74 73 35  yCheckPgidx(Fts5
2b9d0 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 61  Index *p, Fts5Da
2b9e0 74 61 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69 6e  ta *pLeaf){.  in
2b9f0 74 20 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a  t iTermOff = 0;.
2ba00 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 46 74 73    int ii;..  Fts
2ba10 35 42 75 66 66 65 72 20 62 75 66 31 20 3d 20 7b  5Buffer buf1 = {
2ba20 30 2c 30 2c 30 7d 3b 0a 20 20 46 74 73 35 42 75  0,0,0};.  Fts5Bu
2ba30 66 66 65 72 20 62 75 66 32 20 3d 20 7b 30 2c 30  ffer buf2 = {0,0
2ba40 2c 30 7d 3b 0a 0a 20 20 69 69 20 3d 20 70 4c 65  ,0};..  ii = pLe
2ba50 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 77 68  af->szLeaf;.  wh
2ba60 69 6c 65 28 20 69 69 3c 70 4c 65 61 66 2d 3e 6e  ile( ii<pLeaf->n
2ba70 6e 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  n && p->rc==SQLI
2ba80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
2ba90 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 69 4f   res;.    int iO
2baa0 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 63  ff;.    int nInc
2bab0 72 3b 0a 0a 20 20 20 20 69 69 20 2b 3d 20 66 74  r;..    ii += ft
2bac0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
2bad0 4c 65 61 66 2d 3e 70 5b 69 69 5d 2c 20 6e 49 6e  Leaf->p[ii], nIn
2bae0 63 72 29 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66  cr);.    iTermOf
2baf0 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20 20 20  f += nIncr;.    
2bb00 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
2bb10 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d  ..    if( iOff>=
2bb20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
2bb30 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46  .      p->rc = F
2bb40 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2bb50 20 7d 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d   }else if( iTerm
2bb60 4f 66 66 3d 3d 6e 49 6e 63 72 20 29 7b 0a 20 20  Off==nIncr ){.  
2bb70 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20      int nByte;. 
2bb80 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
2bb90 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
2bba0 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42  eaf->p[iOff], nB
2bbb0 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  yte);.      if( 
2bbc0 28 69 4f 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65  (iOff+nByte)>pLe
2bbd0 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
2bbe0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
2bbf0 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2bc00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2bc10 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
2bc20 70 2d 3e 72 63 2c 20 26 62 75 66 31 2c 20 6e 42  p->rc, &buf1, nB
2bc30 79 74 65 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69  yte, &pLeaf->p[i
2bc40 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Off]);.      }. 
2bc50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bc60 69 6e 74 20 6e 4b 65 65 70 2c 20 6e 42 79 74 65  int nKeep, nByte
2bc70 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
2bc80 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
2bc90 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
2bca0 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 69   nKeep);.      i
2bcb0 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
2bcc0 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70  rint32(&pLeaf->p
2bcd0 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a  [iOff], nByte);.
2bce0 20 20 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3e        if( nKeep>
2bcf0 62 75 66 31 2e 6e 20 7c 7c 20 28 69 4f 66 66 2b  buf1.n || (iOff+
2bd00 6e 42 79 74 65 29 3e 70 4c 65 61 66 2d 3e 73 7a  nByte)>pLeaf->sz
2bd10 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
2bd20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2bd30 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RUPT;.      }els
2bd40 65 7b 0a 20 20 20 20 20 20 20 20 62 75 66 31 2e  e{.        buf1.
2bd50 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20  n = nKeep;.     
2bd60 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
2bd70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
2bd80 26 62 75 66 31 2c 20 6e 42 79 74 65 2c 20 26 70  &buf1, nByte, &p
2bd90 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a  Leaf->p[iOff]);.
2bda0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
2bdb0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
2bdc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2bdd0 65 73 20 3d 20 66 74 73 35 42 75 66 66 65 72 43  es = fts5BufferC
2bde0 6f 6d 70 61 72 65 28 26 62 75 66 31 2c 20 26 62  ompare(&buf1, &b
2bdf0 75 66 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66  uf2);.        if
2be00 28 20 72 65 73 3c 3d 30 20 29 20 70 2d 3e 72 63  ( res<=0 ) p->rc
2be10 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2be20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2be30 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
2be40 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 32 2c 20  (&p->rc, &buf2, 
2be50 62 75 66 31 2e 6e 2c 20 62 75 66 31 2e 70 29 3b  buf1.n, buf1.p);
2be60 0a 20 20 7d 0a 0a 20 20 66 74 73 35 42 75 66 66  .  }..  fts5Buff
2be70 65 72 46 72 65 65 28 26 62 75 66 31 29 3b 0a 20  erFree(&buf1);. 
2be80 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
2be90 26 62 75 66 32 29 3b 0a 7d 0a 0a 73 74 61 74 69  &buf2);.}..stati
2bea0 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
2beb0 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53 65  IntegrityCheckSe
2bec0 67 6d 65 6e 74 28 0a 20 20 46 74 73 35 49 6e 64  gment(.  Fts5Ind
2bed0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
2bee0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
2bef0 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
2bf00 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
2bf10 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
2bf20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
2bf30 74 6f 20 63 68 65 63 6b 20 69 6e 74 65 72 6e 61  to check interna
2bf40 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f  l consistency */
2bf50 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  .){.  Fts5Config
2bf60 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
2bf70 43 6f 6e 66 69 67 3b 0a 20 20 73 71 6c 69 74 65  Config;.  sqlite
2bf80 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
2bf90 30 3b 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  0;.  int rc2;.  
2bfa0 69 6e 74 20 69 49 64 78 50 72 65 76 4c 65 61 66  int iIdxPrevLeaf
2bfb0 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72   = pSeg->pgnoFir
2bfc0 73 74 2d 31 3b 0a 20 20 69 6e 74 20 69 44 6c 69  st-1;.  int iDli
2bfd0 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65  dxPrevLeaf = pSe
2bfe0 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 0a 20 20  g->pgnoLast;..  
2bff0 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69  if( pSeg->pgnoFi
2c000 72 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  rst==0 ) return;
2c010 0a 0a 20 20 66 74 73 35 49 6e 64 65 78 50 72 65  ..  fts5IndexPre
2c020 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 53 74  pareStmt(p, &pSt
2c030 6d 74 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  mt, sqlite3_mpri
2c040 6e 74 66 28 0a 20 20 20 20 20 20 22 53 45 4c 45  ntf(.      "SELE
2c050 43 54 20 73 65 67 69 64 2c 20 74 65 72 6d 2c 20  CT segid, term, 
2c060 28 70 67 6e 6f 3e 3e 31 29 2c 20 28 70 67 6e 6f  (pgno>>1), (pgno
2c070 26 31 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  &1) FROM %Q.'%q_
2c080 69 64 78 27 20 57 48 45 52 45 20 73 65 67 69 64  idx' WHERE segid
2c090 3d 25 64 22 2c 0a 20 20 20 20 20 20 70 43 6f 6e  =%d",.      pCon
2c0a0 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
2c0b0 67 2d 3e 7a 4e 61 6d 65 2c 20 70 53 65 67 2d 3e  g->zName, pSeg->
2c0c0 69 53 65 67 69 64 0a 20 20 29 29 3b 0a 0a 20 20  iSegid.  ));..  
2c0d0 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  /* Iterate throu
2c0e0 67 68 20 74 68 65 20 62 2d 74 72 65 65 20 68 69  gh the b-tree hi
2c0f0 65 72 61 72 63 68 79 2e 20 20 2a 2f 0a 20 20 77  erarchy.  */.  w
2c100 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
2c110 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
2c120 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
2c130 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
2c140 20 69 36 34 20 69 52 6f 77 3b 20 20 20 20 20 20   i64 iRow;      
2c150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c160 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73  * Rowid for this
2c170 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 46 74 73   leaf */.    Fts
2c180 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20  5Data *pLeaf;   
2c190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
2c1a0 74 61 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66  ta for this leaf
2c1b0 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 6e 49 64   */..    int nId
2c1c0 78 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 5f  xTerm = sqlite3_
2c1d0 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
2c1e0 6d 74 2c 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73  mt, 1);.    cons
2c1f0 74 20 63 68 61 72 20 2a 7a 49 64 78 54 65 72 6d  t char *zIdxTerm
2c200 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
2c210 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2c220 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20  ext(pStmt, 1);. 
2c230 20 20 20 69 6e 74 20 69 49 64 78 4c 65 61 66 20     int iIdxLeaf 
2c240 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2c250 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a  _int(pStmt, 2);.
2c260 20 20 20 20 69 6e 74 20 62 49 64 78 44 6c 69 64      int bIdxDlid
2c270 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  x = sqlite3_colu
2c280 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33 29  mn_int(pStmt, 3)
2c290 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2c2a0 20 6c 65 61 66 20 69 6e 20 71 75 65 73 74 69 6f   leaf in questio
2c2b0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
2c2c0 65 6e 20 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20  en trimmed from 
2c2d0 74 68 65 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20  the segment, .  
2c2e0 20 20 2a 2a 20 69 67 6e 6f 72 65 20 74 68 69 73    ** ignore this
2c2f0 20 62 2d 74 72 65 65 20 65 6e 74 72 79 2e 20 4f   b-tree entry. O
2c300 74 68 65 72 77 69 73 65 2c 20 6c 6f 61 64 20 69  therwise, load i
2c310 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a  t into memory. *
2c320 2f 0a 20 20 20 20 69 66 28 20 69 49 64 78 4c 65  /.    if( iIdxLe
2c330 61 66 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  af<pSeg->pgnoFir
2c340 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  st ) continue;. 
2c350 20 20 20 69 52 6f 77 20 3d 20 46 54 53 35 5f 53     iRow = FTS5_S
2c360 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65  EGMENT_ROWID(pSe
2c370 67 2d 3e 69 53 65 67 69 64 2c 20 69 49 64 78 4c  g->iSegid, iIdxL
2c380 65 61 66 29 3b 0a 20 20 20 20 70 4c 65 61 66 20  eaf);.    pLeaf 
2c390 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
2c3a0 2c 20 69 52 6f 77 29 3b 0a 20 20 20 20 69 66 28  , iRow);.    if(
2c3b0 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61   pLeaf==0 ) brea
2c3c0 6b 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  k;..    /* Check
2c3d0 20 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 63   that the leaf c
2c3e0 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74  ontains at least
2c3f0 20 6f 6e 65 20 74 65 72 6d 2c 20 61 6e 64 20 74   one term, and t
2c400 68 61 74 20 69 74 20 69 73 20 65 71 75 61 6c 0a  hat it is equal.
2c410 20 20 20 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72      ** to or lar
2c420 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 70 6c  ger than the spl
2c430 69 74 2d 6b 65 79 20 69 6e 20 7a 49 64 78 54 65  it-key in zIdxTe
2c440 72 6d 2e 20 20 41 6c 73 6f 20 63 68 65 63 6b 20  rm.  Also check 
2c450 74 68 61 74 20 69 66 20 74 68 65 72 65 0a 20 20  that if there.  
2c460 20 20 2a 2a 20 69 73 20 61 6c 73 6f 20 61 20 72    ** is also a r
2c470 6f 77 69 64 20 70 6f 69 6e 74 65 72 20 77 69 74  owid pointer wit
2c480 68 69 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67  hin the leaf pag
2c490 65 20 68 65 61 64 65 72 2c 20 69 74 20 70 6f 69  e header, it poi
2c4a0 6e 74 73 20 74 6f 20 61 0a 20 20 20 20 2a 2a 20  nts to a.    ** 
2c4b0 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20  location before 
2c4c0 74 68 65 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20  the term.  */.  
2c4d0 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3c    if( pLeaf->nn<
2c4e0 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  =pLeaf->szLeaf )
2c4f0 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
2c500 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2c510 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
2c520 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20  nt iOff;        
2c530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
2c540 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 65  fset of first te
2c550 72 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20  rm on leaf */.  
2c560 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66      int iRowidOf
2c570 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
2c580 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72  /* Offset of fir
2c590 73 74 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66  st rowid on leaf
2c5a0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 54   */.      int nT
2c5b0 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
2c5c0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2c5d0 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e   term on leaf in
2c5e0 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20   bytes */.      
2c5f0 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20  int res;        
2c600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2c610 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 65 72  omparison of ter
2c620 6d 20 61 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20  m and split-key 
2c630 2a 2f 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d  */..      iOff =
2c640 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65   fts5LeafFirstTe
2c650 72 6d 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20  rmOff(pLeaf);.  
2c660 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20      iRowidOff = 
2c670 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77  fts5LeafFirstRow
2c680 69 64 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20  idOff(pLeaf);.  
2c690 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66      if( iRowidOf
2c6a0 66 3e 3d 69 4f 66 66 20 29 7b 0a 20 20 20 20 20  f>=iOff ){.     
2c6b0 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
2c6c0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
2c6d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f  else{.        iO
2c6e0 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
2c6f0 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b  int32(&pLeaf->p[
2c700 69 4f 66 66 5d 2c 20 6e 54 65 72 6d 29 3b 0a 20  iOff], nTerm);. 
2c710 20 20 20 20 20 20 20 72 65 73 20 3d 20 6d 65 6d         res = mem
2c720 63 6d 70 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  cmp(&pLeaf->p[iO
2c730 66 66 5d 2c 20 7a 49 64 78 54 65 72 6d 2c 20 4d  ff], zIdxTerm, M
2c740 49 4e 28 6e 54 65 72 6d 2c 20 6e 49 64 78 54 65  IN(nTerm, nIdxTe
2c750 72 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rm));.        if
2c760 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d  ( res==0 ) res =
2c770 20 6e 54 65 72 6d 20 2d 20 6e 49 64 78 54 65 72   nTerm - nIdxTer
2c780 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  m;.        if( r
2c790 65 73 3c 30 20 29 20 70 2d 3e 72 63 20 3d 20 46  es<0 ) p->rc = F
2c7a0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2c7b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 35     }..      fts5
2c7c0 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 50 67  IntegrityCheckPg
2c7d0 69 64 78 28 70 2c 20 70 4c 65 61 66 29 3b 0a 20  idx(p, pLeaf);. 
2c7e0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74     }.    fts5Dat
2c7f0 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
2c800 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29  .    if( p->rc )
2c810 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
2c820 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
2c830 68 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c  he iter.nEmpty l
2c840 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  eaves following 
2c850 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
2c860 0a 20 20 20 20 2a 2a 20 28 61 29 20 65 78 69 73  .    ** (a) exis
2c870 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69  t and (b) contai
2c880 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20  n no terms. */. 
2c890 20 20 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65     fts5IndexInte
2c8a0 67 72 69 74 79 43 68 65 63 6b 45 6d 70 74 79 28  grityCheckEmpty(
2c8b0 0a 20 20 20 20 20 20 20 20 70 2c 20 70 53 65 67  .        p, pSeg
2c8c0 2c 20 69 49 64 78 50 72 65 76 4c 65 61 66 2b 31  , iIdxPrevLeaf+1
2c8d0 2c 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66  , iDlidxPrevLeaf
2c8e0 2b 31 2c 20 69 49 64 78 4c 65 61 66 2d 31 0a 20  +1, iIdxLeaf-1. 
2c8f0 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d     );.    if( p-
2c900 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  >rc ) break;..  
2c910 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
2c920 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
2c930 2c 20 63 68 65 63 6b 20 74 68 61 74 20 69 74 20  , check that it 
2c940 6c 6f 6f 6b 73 20 72 69 67 68 74 2e 20 2a 2f 0a  looks right. */.
2c950 20 20 20 20 69 66 28 20 62 49 64 78 44 6c 69 64      if( bIdxDlid
2c960 78 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 44  x ){.      Fts5D
2c970 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
2c980 20 3d 20 30 3b 20 20 2f 2a 20 46 6f 72 20 69 74   = 0;  /* For it
2c990 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
2c9a0 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f  doclist index */
2c9b0 0a 20 20 20 20 20 20 69 6e 74 20 69 50 72 65 76  .      int iPrev
2c9c0 4c 65 61 66 20 3d 20 69 49 64 78 4c 65 61 66 3b  Leaf = iIdxLeaf;
2c9d0 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 69  .      int iSegi
2c9e0 64 20 3d 20 70 53 65 67 2d 3e 69 53 65 67 69 64  d = pSeg->iSegid
2c9f0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 67 20  ;.      int iPg 
2ca00 3d 20 30 3b 0a 20 20 20 20 20 20 69 36 34 20 69  = 0;.      i64 i
2ca10 4b 65 79 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  Key;..      for(
2ca20 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78  pDlidx=fts5Dlidx
2ca30 49 74 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69  IterInit(p, 0, i
2ca40 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29  Segid, iIdxLeaf)
2ca50 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
2ca60 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
2ca70 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20  pDlidx)==0;.    
2ca80 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
2ca90 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64  terNext(p, pDlid
2caa0 78 29 0a 20 20 20 20 20 20 29 7b 0a 0a 20 20 20  x).      ){..   
2cab0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 61 6e       /* Check an
2cac0 79 20 72 6f 77 69 64 2d 6c 65 73 73 20 70 61 67  y rowid-less pag
2cad0 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 62 65  es that occur be
2cae0 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  fore the current
2caf0 20 6c 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20   leaf. */.      
2cb00 20 20 66 6f 72 28 69 50 67 3d 69 50 72 65 76 4c    for(iPg=iPrevL
2cb10 65 61 66 2b 31 3b 20 69 50 67 3c 66 74 73 35 44  eaf+1; iPg<fts5D
2cb20 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
2cb30 69 64 78 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20  idx); iPg++){.  
2cb40 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46          iKey = F
2cb50 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
2cb60 44 28 69 53 65 67 69 64 2c 20 69 50 67 29 3b 0a  D(iSegid, iPg);.
2cb70 20 20 20 20 20 20 20 20 20 20 70 4c 65 61 66 20            pLeaf 
2cb80 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
2cb90 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  , iKey);.       
2cba0 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a     if( pLeaf ){.
2cbb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2cbc0 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77  fts5LeafFirstRow
2cbd0 69 64 4f 66 66 28 70 4c 65 61 66 29 21 3d 30 20  idOff(pLeaf)!=0 
2cbe0 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43  ) p->rc = FTS5_C
2cbf0 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
2cc00 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
2cc10 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  ase(pLeaf);.    
2cc20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cc30 7d 0a 20 20 20 20 20 20 20 20 69 50 72 65 76 4c  }.        iPrevL
2cc40 65 61 66 20 3d 20 66 74 73 35 44 6c 69 64 78 49  eaf = fts5DlidxI
2cc50 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b  terPgno(pDlidx);
2cc60 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  ..        /* Che
2cc70 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61 66  ck that the leaf
2cc80 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20   page indicated 
2cc90 62 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  by the iterator 
2cca0 72 65 61 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20  really does.    
2ccb0 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74      ** contain t
2ccc0 68 65 20 72 6f 77 69 64 20 73 75 67 67 65 73 74  he rowid suggest
2ccd0 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 2e 20  ed by the same. 
2cce0 2a 2f 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20  */.        iKey 
2ccf0 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
2cd00 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69 50 72  OWID(iSegid, iPr
2cd10 65 76 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  evLeaf);.       
2cd20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
2cd30 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a  aRead(p, iKey);.
2cd40 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
2cd50 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  f ){.          i
2cd60 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20  64 iRowid;.     
2cd70 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f       int iRowidO
2cd80 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72  ff = fts5LeafFir
2cd90 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66  stRowidOff(pLeaf
2cda0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 41 53 53  );.          ASS
2cdb0 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c  ERT_SZLEAF_OK(pL
2cdc0 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eaf);.          
2cdd0 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d 70  if( iRowidOff>=p
2cde0 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
2cdf0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72              p->r
2ce00 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2ce10 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2ce20 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  e{.            f
2ce30 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c  ts5GetVarint(&pL
2ce40 65 61 66 2d 3e 70 5b 69 52 6f 77 69 64 4f 66 66  eaf->p[iRowidOff
2ce50 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64  ], (u64*)&iRowid
2ce60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2ce70 66 28 20 69 52 6f 77 69 64 21 3d 66 74 73 35 44  f( iRowid!=fts5D
2ce80 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44  lidxIterRowid(pD
2ce90 6c 69 64 78 29 20 29 20 70 2d 3e 72 63 20 3d 20  lidx) ) p->rc = 
2cea0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2ceb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cec0 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
2ced0 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  ase(pLeaf);.    
2cee0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
2cef0 20 20 20 20 20 69 44 6c 69 64 78 50 72 65 76 4c       iDlidxPrevL
2cf00 65 61 66 20 3d 20 69 50 67 3b 0a 20 20 20 20 20  eaf = iPg;.     
2cf10 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
2cf20 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  ee(pDlidx);.    
2cf30 20 20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52    fts5TestDlidxR
2cf40 65 76 65 72 73 65 28 70 2c 20 69 53 65 67 69 64  everse(p, iSegid
2cf50 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a 20 20 20  , iIdxLeaf);.   
2cf60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 44   }else{.      iD
2cf70 6c 69 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70  lidxPrevLeaf = p
2cf80 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20  Seg->pgnoLast;. 
2cf90 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68       /* TODO: Ch
2cfa0 65 63 6b 20 74 68 65 72 65 20 69 73 20 6e 6f 20  eck there is no 
2cfb0 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f  doclist index */
2cfc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 49 64 78  .    }..    iIdx
2cfd0 50 72 65 76 4c 65 61 66 20 3d 20 69 49 64 78 4c  PrevLeaf = iIdxL
2cfe0 65 61 66 3b 0a 20 20 7d 0a 0a 20 20 72 63 32 20  eaf;.  }..  rc2 
2cff0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
2d000 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  ze(pStmt);.  if(
2d010 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
2d020 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b  K ) p->rc = rc2;
2d030 0a 0a 20 20 2f 2a 20 50 61 67 65 20 69 74 65 72  ..  /* Page iter
2d040 2e 69 4c 65 61 66 20 6d 75 73 74 20 6e 6f 77 20  .iLeaf must now 
2d050 62 65 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74  be the rightmost
2d060 20 6c 65 61 66 2d 70 61 67 65 20 69 6e 20 74 68   leaf-page in th
2d070 65 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 23 69 66  e segment */.#if
2d080 20 30 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d   0.  if( p->rc==
2d090 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 74 65  SQLITE_OK && ite
2d0a0 72 2e 69 4c 65 61 66 21 3d 70 53 65 67 2d 3e 70  r.iLeaf!=pSeg->p
2d0b0 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70  gnoLast ){.    p
2d0c0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2d0d0 55 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  UPT;.  }.#endif.
2d0e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 69 6e  }.../*.** Run in
2d0f0 74 65 72 6e 61 6c 20 63 68 65 63 6b 73 20 74 6f  ternal checks to
2d100 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
2d110 20 46 54 53 20 69 6e 64 65 78 20 28 61 29 20 69   FTS index (a) i
2d120 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a  s internally .**
2d130 20 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20   consistent and 
2d140 28 62 29 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74  (b) contains ent
2d150 72 69 65 73 20 66 6f 72 20 77 68 69 63 68 20 74  ries for which t
2d160 68 65 20 58 4f 52 20 6f 66 20 74 68 65 20 63 68  he XOR of the ch
2d170 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 73 20 63 61  ecksums.** as ca
2d180 6c 63 75 6c 61 74 65 64 20 62 79 20 73 71 6c 69  lculated by sqli
2d190 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72  te3Fts5IndexEntr
2d1a0 79 43 6b 73 75 6d 28 29 20 69 73 20 63 6b 73 75  yCksum() is cksu
2d1b0 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  m..**.** Return 
2d1c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
2d1d0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 69 6e 74  f any of the int
2d1e0 65 72 6e 61 6c 20 63 68 65 63 6b 73 20 66 61 69  ernal checks fai
2d1f0 6c 2c 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20  l, or if the.** 
2d200 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e 6f  checksum does no
2d210 74 20 6d 61 74 63 68 2e 20 52 65 74 75 72 6e 20  t match. Return 
2d220 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
2d230 20 63 68 65 63 6b 73 20 70 61 73 73 20 77 69 74   checks pass wit
2d240 68 6f 75 74 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f  hout.** error, o
2d250 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 53 51 4c  r some other SQL
2d260 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
2d270 66 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20  f another error 
2d280 28 65 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63  (e.g. OOM).** oc
2d290 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  curs..*/.int sql
2d2a0 69 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 74  ite3Fts5IndexInt
2d2b0 65 67 72 69 74 79 43 68 65 63 6b 28 46 74 73 35  egrityCheck(Fts5
2d2c0 49 6e 64 65 78 20 2a 70 2c 20 75 36 34 20 63 6b  Index *p, u64 ck
2d2d0 73 75 6d 29 7b 0a 20 20 69 6e 74 20 65 44 65 74  sum){.  int eDet
2d2e0 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  ail = p->pConfig
2d2f0 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 75 36 34  ->eDetail;.  u64
2d300 20 63 6b 73 75 6d 32 20 3d 20 30 3b 20 20 20 20   cksum2 = 0;    
2d310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d320 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f  Checksum based o
2d330 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e  n contents of in
2d340 64 65 78 65 73 20 2a 2f 0a 20 20 46 74 73 35 42  dexes */.  Fts5B
2d350 75 66 66 65 72 20 70 6f 73 6c 69 73 74 20 3d 20  uffer poslist = 
2d360 7b 30 2c 30 2c 30 7d 3b 20 20 20 2f 2a 20 42 75  {0,0,0};   /* Bu
2d370 66 66 65 72 20 75 73 65 64 20 74 6f 20 68 6f 6c  ffer used to hol
2d380 64 20 61 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20  d a poslist */. 
2d390 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
2d3a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d3b0 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
2d3c0 61 74 65 20 74 68 72 6f 75 67 68 20 65 6e 74 69  ate through enti
2d3d0 72 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74  re index */.  Ft
2d3e0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
2d3f0 72 75 63 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  ruct;         /*
2d400 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
2d410 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
2d420 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 55 73  TE_DEBUG.  /* Us
2d430 65 64 20 62 79 20 65 78 74 72 61 20 69 6e 74 65  ed by extra inte
2d440 72 6e 61 6c 20 74 65 73 74 73 20 6f 6e 6c 79 20  rnal tests only 
2d450 72 75 6e 20 69 66 20 4e 44 45 42 55 47 20 69 73  run if NDEBUG is
2d460 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 2a 2f 0a   not defined */.
2d470 20 20 75 36 34 20 63 6b 73 75 6d 33 20 3d 20 30    u64 cksum3 = 0
2d480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d490 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61    /* Checksum ba
2d4a0 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20  sed on contents 
2d4b0 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  of indexes */.  
2d4c0 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 20  Fts5Buffer term 
2d4d0 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20  = {0,0,0};      
2d4e0 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 74  /* Buffer used t
2d4f0 6f 20 68 6f 6c 64 20 6d 6f 73 74 20 72 65 63 65  o hold most rece
2d500 6e 74 20 74 65 72 6d 20 2a 2f 0a 23 65 6e 64 69  nt term */.#endi
2d510 66 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c  f.  const int fl
2d520 61 67 73 20 3d 20 46 54 53 35 49 4e 44 45 58 5f  ags = FTS5INDEX_
2d530 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54 3b 0a  QUERY_NOOUTPUT;.
2d540 20 20 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65    .  /* Load the
2d550 20 46 54 53 20 69 6e 64 65 78 20 73 74 72 75 63   FTS index struc
2d560 74 75 72 65 20 2a 2f 0a 20 20 70 53 74 72 75 63  ture */.  pStruc
2d570 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
2d580 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 2f 2a 20  eRead(p);..  /* 
2d590 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 69  Check that the i
2d5a0 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20 6f 66  nternal nodes of
2d5b0 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 6d 61   each segment ma
2d5c0 74 63 68 20 74 68 65 20 6c 65 61 76 65 73 20 2a  tch the leaves *
2d5d0 2f 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20  /.  if( pStruct 
2d5e0 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c  ){.    int iLvl,
2d5f0 20 69 53 65 67 3b 0a 20 20 20 20 66 6f 72 28 69   iSeg;.    for(i
2d600 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72  Lvl=0; iLvl<pStr
2d610 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
2d620 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  l++){.      for(
2d630 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74  iSeg=0; iSeg<pSt
2d640 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
2d650 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29  l].nSeg; iSeg++)
2d660 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 53 74  {.        Fts5St
2d670 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
2d680 70 53 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d  pSeg = &pStruct-
2d690 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53  >aLevel[iLvl].aS
2d6a0 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20  eg[iSeg];.      
2d6b0 20 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67    fts5IndexInteg
2d6c0 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65 6e 74  rityCheckSegment
2d6d0 28 70 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20  (p, pSeg);.     
2d6e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2d6f0 2f 2a 20 54 68 65 20 63 6b 73 75 6d 20 61 72 67  /* The cksum arg
2d700 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
2d710 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2d720 20 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63   a checksum calc
2d730 75 6c 61 74 65 64 0a 20 20 2a 2a 20 62 61 73 65  ulated.  ** base
2d740 64 20 6f 6e 20 61 6c 6c 20 65 78 70 65 63 74 65  d on all expecte
2d750 64 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  d entries in the
2d760 20 46 54 53 20 69 6e 64 65 78 20 28 69 6e 63 6c   FTS index (incl
2d770 75 64 69 6e 67 20 70 72 65 66 69 78 20 69 6e 64  uding prefix ind
2d780 65 78 0a 20 20 2a 2a 20 65 6e 74 72 69 65 73 29  ex.  ** entries)
2d790 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 68 65  . This block che
2d7a0 63 6b 73 20 74 68 61 74 20 61 20 63 68 65 63 6b  cks that a check
2d7b0 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 20 62  sum calculated b
2d7c0 61 73 65 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  ased on the.  **
2d7d0 20 61 63 74 75 61 6c 20 63 6f 6e 74 65 6e 74 73   actual contents
2d7e0 20 6f 66 20 46 54 53 20 69 6e 64 65 78 20 69 73   of FTS index is
2d7f0 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a   identical..  **
2d800 0a 20 20 2a 2a 20 54 77 6f 20 76 65 72 73 69 6f  .  ** Two versio
2d810 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 63  ns of the same c
2d820 68 65 63 6b 73 75 6d 20 61 72 65 20 63 61 6c 63  hecksum are calc
2d830 75 6c 61 74 65 64 2e 20 54 68 65 20 66 69 72 73  ulated. The firs
2d840 74 20 28 73 74 61 63 6b 0a 20 20 2a 2a 20 76 61  t (stack.  ** va
2d850 72 69 61 62 6c 65 20 63 6b 73 75 6d 32 29 20 62  riable cksum2) b
2d860 61 73 65 64 20 6f 6e 20 65 6e 74 72 69 65 73 20  ased on entries 
2d870 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
2d880 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64  he full-text ind
2d890 65 78 0a 20 20 2a 2a 20 77 68 69 6c 65 20 64 6f  ex.  ** while do
2d8a0 69 6e 67 20 61 20 6c 69 6e 65 61 72 20 73 63 61  ing a linear sca
2d8b0 6e 20 6f 66 20 65 61 63 68 20 69 6e 64 69 76 69  n of each indivi
2d8c0 64 75 61 6c 20 69 6e 64 65 78 20 69 6e 20 74 75  dual index in tu
2d8d0 72 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  rn. .  **.  ** A
2d8e0 73 20 65 61 63 68 20 74 65 72 6d 20 76 69 73 69  s each term visi
2d8f0 74 65 64 20 62 79 20 74 68 65 20 6c 69 6e 65 61  ted by the linea
2d900 72 20 73 63 61 6e 73 2c 20 61 20 73 65 70 61 72  r scans, a separ
2d910 61 74 65 20 71 75 65 72 79 20 66 6f 72 20 74 68  ate query for th
2d920 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 65 72 6d  e.  ** same term
2d930 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 63   is performed. c
2d940 6b 73 75 6d 33 20 69 73 20 63 61 6c 63 75 6c 61  ksum3 is calcula
2d950 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
2d960 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 65 78   entries.  ** ex
2d970 74 72 61 63 74 65 64 20 62 79 20 74 68 65 73 65  tracted by these
2d980 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20   queries..  */. 
2d990 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74   for(fts5MultiIt
2d9a0 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74  erNew(p, pStruct
2d9b0 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 30  , flags, 0, 0, 0
2d9c0 2c 20 2d 31 2c 20 30 2c 20 26 70 49 74 65 72 29  , -1, 0, &pIter)
2d9d0 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  ;.      fts5Mult
2d9e0 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65  iIterEof(p, pIte
2d9f0 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73  r)==0;.      fts
2da00 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
2da10 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20  , pIter, 0, 0). 
2da20 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20   ){.    int n;  
2da30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da40 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
2da50 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  erm in bytes */.
2da60 20 20 20 20 69 36 34 20 69 50 6f 73 20 3d 20 30      i64 iPos = 0
2da70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2da80 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 72 65 61 64  /* Position read
2da90 20 66 72 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f   from poslist */
2daa0 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  .    int iOff = 
2dab0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2dac0 20 2f 2a 20 4f 66 66 73 65 74 20 77 69 74 68 69   /* Offset withi
2dad0 6e 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20  n poslist */.   
2dae0 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74   i64 iRowid = ft
2daf0 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64  s5MultiIterRowid
2db00 28 70 49 74 65 72 29 3b 0a 20 20 20 20 63 68 61  (pIter);.    cha
2db10 72 20 2a 7a 20 3d 20 28 63 68 61 72 2a 29 66 74  r *z = (char*)ft
2db20 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28  s5MultiIterTerm(
2db30 70 49 74 65 72 2c 20 26 6e 29 3b 0a 0a 20 20 20  pIter, &n);..   
2db40 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2db50 20 6e 65 77 20 74 65 72 6d 2c 20 71 75 65 72 79   new term, query
2db60 20 66 6f 72 20 69 74 2e 20 55 70 64 61 74 65 20   for it. Update 
2db70 63 6b 73 75 6d 33 20 77 69 74 68 20 74 68 65 20  cksum3 with the 
2db80 72 65 73 75 6c 74 73 2e 20 2a 2f 0a 20 20 20 20  results. */.    
2db90 66 74 73 35 54 65 73 74 54 65 72 6d 28 70 2c 20  fts5TestTerm(p, 
2dba0 26 74 65 72 6d 2c 20 7a 2c 20 6e 2c 20 63 6b 73  &term, z, n, cks
2dbb0 75 6d 32 2c 20 26 63 6b 73 75 6d 33 29 3b 0a 0a  um2, &cksum3);..
2dbc0 20 20 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d      if( eDetail=
2dbd0 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e  =FTS5_DETAIL_NON
2dbe0 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30  E ){.      if( 0
2dbf0 3d 3d 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49  ==fts5MultiIterI
2dc00 73 45 6d 70 74 79 28 70 2c 20 70 49 74 65 72 29  sEmpty(p, pIter)
2dc10 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6b 73 75   ){.        cksu
2dc20 6d 32 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73  m2 ^= sqlite3Fts
2dc30 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d  5IndexEntryCksum
2dc40 28 69 52 6f 77 69 64 2c 20 30 2c 20 30 2c 20 2d  (iRowid, 0, 0, -
2dc50 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  1, z, n);.      
2dc60 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2dc70 20 20 20 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30     poslist.n = 0
2dc80 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 69  ;.      fts5Segi
2dc90 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20 26 70  terPoslist(p, &p
2dca0 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72  Iter->aSeg[pIter
2dcb0 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
2dcc0 73 74 5d 2c 20 30 2c 20 26 70 6f 73 6c 69 73 74  st], 0, &poslist
2dcd0 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
2dce0 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 50 6f  0==sqlite3Fts5Po
2dcf0 73 6c 69 73 74 4e 65 78 74 36 34 28 70 6f 73 6c  slistNext64(posl
2dd00 69 73 74 2e 70 2c 20 70 6f 73 6c 69 73 74 2e 6e  ist.p, poslist.n
2dd10 2c 20 26 69 4f 66 66 2c 20 26 69 50 6f 73 29 20  , &iOff, &iPos) 
2dd20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
2dd30 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32 43  Col = FTS5_POS2C
2dd40 4f 4c 55 4d 4e 28 69 50 6f 73 29 3b 0a 20 20 20  OLUMN(iPos);.   
2dd50 20 20 20 20 20 69 6e 74 20 69 54 6f 6b 4f 66 66       int iTokOff
2dd60 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53   = FTS5_POS2OFFS
2dd70 45 54 28 69 50 6f 73 29 3b 0a 20 20 20 20 20 20  ET(iPos);.      
2dd80 20 20 63 6b 73 75 6d 32 20 5e 3d 20 73 71 6c 69    cksum2 ^= sqli
2dd90 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72  te3Fts5IndexEntr
2dda0 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 69  yCksum(iRowid, i
2ddb0 43 6f 6c 2c 20 69 54 6f 6b 4f 66 66 2c 20 2d 31  Col, iTokOff, -1
2ddc0 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  , z, n);.      }
2ddd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73  .    }.  }.  fts
2dde0 35 54 65 73 74 54 65 72 6d 28 70 2c 20 26 74 65  5TestTerm(p, &te
2ddf0 72 6d 2c 20 30 2c 20 30 2c 20 63 6b 73 75 6d 32  rm, 0, 0, cksum2
2de00 2c 20 26 63 6b 73 75 6d 33 29 3b 0a 0a 20 20 66  , &cksum3);..  f
2de10 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
2de20 28 70 49 74 65 72 29 3b 0a 20 20 69 66 28 20 70  (pIter);.  if( p
2de30 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
2de40 26 26 20 63 6b 73 75 6d 21 3d 63 6b 73 75 6d 32  && cksum!=cksum2
2de50 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
2de60 43 4f 52 52 55 50 54 3b 0a 0a 20 20 66 74 73 35  CORRUPT;..  fts5
2de70 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
2de80 28 70 53 74 72 75 63 74 29 3b 0a 23 69 66 64 65  (pStruct);.#ifde
2de90 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
2dea0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
2deb0 26 74 65 72 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  &term);.#endif. 
2dec0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
2ded0 26 70 6f 73 6c 69 73 74 29 3b 0a 20 20 72 65 74  &poslist);.  ret
2dee0 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
2def0 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  urn(p);.}../****
2df00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2df10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2df20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2df30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2df40 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
2df50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2df60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2df70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2df80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2df90 0a 2a 2a 20 42 65 6c 6f 77 20 74 68 69 73 20 70  .** Below this p
2dfa0 6f 69 6e 74 20 69 73 20 74 68 65 20 69 6d 70 6c  oint is the impl
2dfb0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
2dfc0 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20  e fts5_decode() 
2dfd0 73 63 61 6c 61 72 0a 2a 2a 20 66 75 6e 63 74 69  scalar.** functi
2dfe0 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f 0a 0a 2f 2a 0a  on only..*/../*.
2dff0 2a 2a 20 44 65 63 6f 64 65 20 61 20 73 65 67 6d  ** Decode a segm
2e000 65 6e 74 2d 64 61 74 61 20 72 6f 77 69 64 20 66  ent-data rowid f
2e010 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74  rom the %_data t
2e020 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
2e030 69 6f 6e 20 69 73 0a 2a 2a 20 74 68 65 20 6f 70  ion is.** the op
2e040 70 6f 73 69 74 65 20 6f 66 20 6d 61 63 72 6f 20  posite of macro 
2e050 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
2e060 49 44 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ID()..*/.static 
2e070 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 52  void fts5DecodeR
2e080 6f 77 69 64 28 0a 20 20 69 36 34 20 69 52 6f 77  owid(.  i64 iRow
2e090 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
2e0a0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
2e0b0 20 66 72 6f 6d 20 25 5f 64 61 74 61 20 74 61 62   from %_data tab
2e0c0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 53  le */.  int *piS
2e0d0 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  egid,           
2e0e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2e0f0 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20  Segment id */.  
2e100 69 6e 74 20 2a 70 62 44 6c 69 64 78 2c 20 20 20  int *pbDlidx,   
2e110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e120 2f 2a 20 4f 55 54 3a 20 44 6c 69 64 78 20 66 6c  /* OUT: Dlidx fl
2e130 61 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 48  ag */.  int *piH
2e140 65 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  eight,          
2e150 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2e160 48 65 69 67 68 74 20 2a 2f 0a 20 20 69 6e 74 20  Height */.  int 
2e170 2a 70 69 50 67 6e 6f 20 20 20 20 20 20 20 20 20  *piPgno         
2e180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2e190 55 54 3a 20 50 61 67 65 20 6e 75 6d 62 65 72 20  UT: Page number 
2e1a0 2a 2f 0a 29 7b 0a 20 20 2a 70 69 50 67 6e 6f 20  */.){.  *piPgno 
2e1b0 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26  = (int)(iRowid &
2e1c0 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53   (((i64)1 << FTS
2e1d0 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 20 2d  5_DATA_PAGE_B) -
2e1e0 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e   1));.  iRowid >
2e1f0 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47  >= FTS5_DATA_PAG
2e200 45 5f 42 3b 0a 0a 20 20 2a 70 69 48 65 69 67 68  E_B;..  *piHeigh
2e210 74 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64  t = (int)(iRowid
2e220 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46   & (((i64)1 << F
2e230 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f  TS5_DATA_HEIGHT_
2e240 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77  B) - 1));.  iRow
2e250 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41  id >>= FTS5_DATA
2e260 5f 48 45 49 47 48 54 5f 42 3b 0a 0a 20 20 2a 70  _HEIGHT_B;..  *p
2e270 62 44 6c 69 64 78 20 3d 20 28 69 6e 74 29 28 69  bDlidx = (int)(i
2e280 52 6f 77 69 64 20 26 20 30 78 30 30 30 31 29 3b  Rowid & 0x0001);
2e290 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54  .  iRowid >>= FT
2e2a0 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 3b 0a 0a  S5_DATA_DLI_B;..
2e2b0 20 20 2a 70 69 53 65 67 69 64 20 3d 20 28 69 6e    *piSegid = (in
2e2c0 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69  t)(iRowid & (((i
2e2d0 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54  64)1 << FTS5_DAT
2e2e0 41 5f 49 44 5f 42 29 20 2d 20 31 29 29 3b 0a 7d  A_ID_B) - 1));.}
2e2f0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
2e300 73 35 44 65 62 75 67 52 6f 77 69 64 28 69 6e 74  s5DebugRowid(int
2e310 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66 65   *pRc, Fts5Buffe
2e320 72 20 2a 70 42 75 66 2c 20 69 36 34 20 69 4b 65  r *pBuf, i64 iKe
2e330 79 29 7b 0a 20 20 69 6e 74 20 69 53 65 67 69 64  y){.  int iSegid
2e340 2c 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e 6f  , iHeight, iPgno
2e350 2c 20 62 44 6c 69 64 78 3b 20 20 20 20 20 20 20  , bDlidx;       
2e360 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 65 6e 65  /* Rowid compene
2e370 6e 74 73 20 2a 2f 0a 20 20 66 74 73 35 44 65 63  nts */.  fts5Dec
2e380 6f 64 65 52 6f 77 69 64 28 69 4b 65 79 2c 20 26  odeRowid(iKey, &
2e390 69 53 65 67 69 64 2c 20 26 62 44 6c 69 64 78 2c  iSegid, &bDlidx,
2e3a0 20 26 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e   &iHeight, &iPgn
2e3b0 6f 29 3b 0a 0a 20 20 69 66 28 20 69 53 65 67 69  o);..  if( iSegi
2e3c0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  d==0 ){.    if( 
2e3d0 69 4b 65 79 3d 3d 46 54 53 35 5f 41 56 45 52 41  iKey==FTS5_AVERA
2e3e0 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  GES_ROWID ){.   
2e3f0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2e400 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2e410 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 61 76  (pRc, pBuf, "{av
2e420 65 72 61 67 65 73 7d 20 22 29 3b 0a 20 20 20 20  erages} ");.    
2e430 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
2e440 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2e450 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
2e460 70 42 75 66 2c 20 22 7b 73 74 72 75 63 74 75 72  pBuf, "{structur
2e470 65 7d 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e}");.    }.  }.
2e480 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69    else{.    sqli
2e490 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2e4a0 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2e4b0 42 75 66 2c 20 22 7b 25 73 73 65 67 69 64 3d 25  Buf, "{%ssegid=%
2e4c0 64 20 68 3d 25 64 20 70 67 6e 6f 3d 25 64 7d 22  d h=%d pgno=%d}"
2e4d0 2c 0a 20 20 20 20 20 20 20 20 62 44 6c 69 64 78  ,.        bDlidx
2e4e0 20 3f 20 22 64 6c 69 64 78 20 22 20 3a 20 22 22   ? "dlidx " : ""
2e4f0 2c 20 69 53 65 67 69 64 2c 20 69 48 65 69 67 68  , iSegid, iHeigh
2e500 74 2c 20 69 50 67 6e 6f 0a 20 20 20 20 29 3b 0a  t, iPgno.    );.
2e510 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
2e520 69 64 20 66 74 73 35 44 65 62 75 67 53 74 72 75  id fts5DebugStru
2e530 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52  cture(.  int *pR
2e540 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2e550 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
2e560 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  UT: error code *
2e570 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
2e580 70 42 75 66 2c 0a 20 20 46 74 73 35 53 74 72 75  pBuf,.  Fts5Stru
2e590 63 74 75 72 65 20 2a 70 0a 29 7b 0a 20 20 69 6e  cture *p.){.  in
2e5a0 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 20 20 20  t iLvl, iSeg;   
2e5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e5c0 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
2e5d0 20 6c 65 76 65 6c 73 2c 20 73 65 67 6d 65 6e 74   levels, segment
2e5e0 73 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 4c 76 6c  s */..  for(iLvl
2e5f0 3d 30 3b 20 69 4c 76 6c 3c 70 2d 3e 6e 4c 65 76  =0; iLvl<p->nLev
2e600 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
2e610 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
2e620 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 2d 3e  vel *pLvl = &p->
2e630 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
2e640 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2e650 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2e660 70 52 63 2c 20 70 42 75 66 2c 20 0a 20 20 20 20  pRc, pBuf, .    
2e670 20 20 20 20 22 20 7b 6c 76 6c 3d 25 64 20 6e 4d      " {lvl=%d nM
2e680 65 72 67 65 3d 25 64 20 6e 53 65 67 3d 25 64 22  erge=%d nSeg=%d"
2e690 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 2d 3e 6e 4d  , iLvl, pLvl->nM
2e6a0 65 72 67 65 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67  erge, pLvl->nSeg
2e6b0 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 6f 72 28  .    );.    for(
2e6c0 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76  iSeg=0; iSeg<pLv
2e6d0 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29  l->nSeg; iSeg++)
2e6e0 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  {.      Fts5Stru
2e6f0 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
2e700 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67  eg = &pLvl->aSeg
2e710 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 73 71  [iSeg];.      sq
2e720 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2e730 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
2e740 20 70 42 75 66 2c 20 22 20 7b 69 64 3d 25 64 20   pBuf, " {id=%d 
2e750 6c 65 61 76 65 73 3d 25 64 2e 2e 25 64 7d 22 2c  leaves=%d..%d}",
2e760 20 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 67   .          pSeg
2e770 2d 3e 69 53 65 67 69 64 2c 20 70 53 65 67 2d 3e  ->iSegid, pSeg->
2e780 70 67 6e 6f 46 69 72 73 74 2c 20 70 53 65 67 2d  pgnoFirst, pSeg-
2e790 3e 70 67 6e 6f 4c 61 73 74 0a 20 20 20 20 20 20  >pgnoLast.      
2e7a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2e7b0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2e7c0 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
2e7d0 70 42 75 66 2c 20 22 7d 22 29 3b 0a 20 20 7d 0a  pBuf, "}");.  }.
2e7e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
2e7f0 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 74 73   part of the fts
2e800 35 5f 64 65 63 6f 64 65 28 29 20 64 65 62 75 67  5_decode() debug
2e810 67 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a 2a 2a 20  ging aid..**.** 
2e820 41 72 67 75 6d 65 6e 74 73 20 70 42 6c 6f 62 2f  Arguments pBlob/
2e830 6e 42 6c 6f 62 20 63 6f 6e 74 61 69 6e 20 61 20  nBlob contain a 
2e840 73 65 72 69 61 6c 69 7a 65 64 20 46 74 73 35 53  serialized Fts5S
2e850 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 2e  tructure object.
2e860 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
2e870 6e 20 61 70 70 65 6e 64 73 20 61 20 68 75 6d 61  n appends a huma
2e880 6e 2d 72 65 61 64 61 62 6c 65 20 72 65 70 72 65  n-readable repre
2e890 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
2e8a0 20 73 61 6d 65 20 6f 62 6a 65 63 74 0a 2a 2a 20   same object.** 
2e8b0 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 61  to the buffer pa
2e8c0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2e8d0 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f  nd argument. .*/
2e8e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
2e8f0 35 44 65 63 6f 64 65 53 74 72 75 63 74 75 72 65  5DecodeStructure
2e900 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20  (.  int *pRc,   
2e910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e920 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65      /* IN/OUT: e
2e930 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46  rror code */.  F
2e940 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
2e950 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c  .  const u8 *pBl
2e960 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b  ob, int nBlob.){
2e970 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2e980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e990 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2e9a0 65 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  e */.  Fts5Struc
2e9b0 74 75 72 65 20 2a 70 20 3d 20 30 3b 20 20 20 20  ture *p = 0;    
2e9c0 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6f 64 65         /* Decode
2e9d0 64 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65  d structure obje
2e9e0 63 74 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74  ct */..  rc = ft
2e9f0 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64  s5StructureDecod
2ea00 65 28 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20  e(pBlob, nBlob, 
2ea10 30 2c 20 26 70 29 3b 0a 20 20 69 66 28 20 72 63  0, &p);.  if( rc
2ea20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ea30 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20     *pRc = rc;.  
2ea40 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
2ea50 20 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74   fts5DebugStruct
2ea60 75 72 65 28 70 52 63 2c 20 70 42 75 66 2c 20 70  ure(pRc, pBuf, p
2ea70 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  );.  fts5Structu
2ea80 72 65 52 65 6c 65 61 73 65 28 70 29 3b 0a 7d 0a  reRelease(p);.}.
2ea90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 70  ./*.** This is p
2eaa0 61 72 74 20 6f 66 20 74 68 65 20 66 74 73 35 5f  art of the fts5_
2eab0 64 65 63 6f 64 65 28 29 20 64 65 62 75 67 67 69  decode() debuggi
2eac0 6e 67 20 61 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72  ng aid..**.** Ar
2ead0 67 75 6d 65 6e 74 73 20 70 42 6c 6f 62 2f 6e 42  guments pBlob/nB
2eae0 6c 6f 62 20 63 6f 6e 74 61 69 6e 20 61 6e 20 22  lob contain an "
2eaf0 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64  averages" record
2eb00 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2eb10 0a 2a 2a 20 61 70 70 65 6e 64 73 20 61 20 68 75  .** appends a hu
2eb20 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 72 65 70  man-readable rep
2eb30 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72  resentation of r
2eb40 65 63 6f 72 64 20 74 6f 20 74 68 65 20 62 75 66  ecord to the buf
2eb50 66 65 72 20 70 61 73 73 65 64 20 0a 2a 2a 20 61  fer passed .** a
2eb60 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
2eb70 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69  ument. .*/.stati
2eb80 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64  c void fts5Decod
2eb90 65 41 76 65 72 61 67 65 73 28 0a 20 20 69 6e 74  eAverages(.  int
2eba0 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
2ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ebc0 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f  IN/OUT: error co
2ebd0 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  de */.  Fts5Buff
2ebe0 65 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73  er *pBuf,.  cons
2ebf0 74 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74  t u8 *pBlob, int
2ec00 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20   nBlob.){.  int 
2ec10 69 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63  i = 0;.  const c
2ec20 68 61 72 20 2a 7a 53 70 61 63 65 20 3d 20 22 22  har *zSpace = ""
2ec30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 42  ;..  while( i<nB
2ec40 6c 6f 62 20 29 7b 0a 20 20 20 20 75 36 34 20 69  lob ){.    u64 i
2ec50 56 61 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71  Val;.    i += sq
2ec60 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
2ec70 6e 74 28 26 70 42 6c 6f 62 5b 69 5d 2c 20 26 69  nt(&pBlob[i], &i
2ec80 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
2ec90 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2eca0 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2ecb0 66 2c 20 22 25 73 25 64 22 2c 20 7a 53 70 61 63  f, "%s%d", zSpac
2ecc0 65 2c 20 28 69 6e 74 29 69 56 61 6c 29 3b 0a 20  e, (int)iVal);. 
2ecd0 20 20 20 7a 53 70 61 63 65 20 3d 20 22 20 22 3b     zSpace = " ";
2ece0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75  .  }.}../*.** Bu
2ecf0 66 66 65 72 20 28 61 2f 6e 29 20 69 73 20 61 73  ffer (a/n) is as
2ed00 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  sumed to contain
2ed10 20 61 20 6c 69 73 74 20 6f 66 20 73 65 72 69 61   a list of seria
2ed20 6c 69 7a 65 64 20 76 61 72 69 6e 74 73 2e 20 52  lized varints. R
2ed30 65 61 64 0a 2a 2a 20 65 61 63 68 20 76 61 72 69  ead.** each vari
2ed40 6e 74 20 61 6e 64 20 61 70 70 65 6e 64 20 69 74  nt and append it
2ed50 73 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  s string represe
2ed60 6e 74 61 74 69 6f 6e 20 74 6f 20 62 75 66 66 65  ntation to buffe
2ed70 72 20 70 42 75 66 2e 20 52 65 74 75 72 6e 0a 2a  r pBuf. Return.*
2ed80 2a 20 61 66 74 65 72 20 65 69 74 68 65 72 20 74  * after either t
2ed90 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72 20  he input buffer 
2eda0 69 73 20 65 78 68 61 75 73 74 65 64 20 6f 72 20  is exhausted or 
2edb0 61 20 30 20 76 61 6c 75 65 20 69 73 20 72 65 61  a 0 value is rea
2edc0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
2edd0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
2ede0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
2edf0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69   read from the i
2ee00 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a  nput buffer..*/.
2ee10 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
2ee20 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 69 6e 74  ecodePoslist(int
2ee30 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66 65   *pRc, Fts5Buffe
2ee40 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75  r *pBuf, const u
2ee50 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  8 *a, int n){.  
2ee60 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20  int iOff = 0;.  
2ee70 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b  while( iOff<n ){
2ee80 0a 20 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20  .    int iVal;. 
2ee90 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
2eea0 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
2eeb0 66 66 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20  ff], iVal);.    
2eec0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2eed0 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
2eee0 63 2c 20 70 42 75 66 2c 20 22 20 25 64 22 2c 20  c, pBuf, " %d", 
2eef0 69 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74  iVal);.  }.  ret
2ef00 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a  urn iOff;.}../*.
2ef10 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66 20  ** The start of 
2ef20 62 75 66 66 65 72 20 28 61 2f 6e 29 20 63 6f 6e  buffer (a/n) con
2ef30 74 61 69 6e 73 20 74 68 65 20 73 74 61 72 74 20  tains the start 
2ef40 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68  of a doclist. Th
2ef50 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61 79  e doclist.** may
2ef60 20 6f 72 20 6d 61 79 20 6e 6f 74 20 66 69 6e 69   or may not fini
2ef70 73 68 20 77 69 74 68 69 6e 20 74 68 65 20 62 75  sh within the bu
2ef80 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  ffer. This funct
2ef90 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 74 65  ion appends a te
2efa0 78 74 0a 2a 2a 20 72 65 70 72 65 73 65 6e 74 61  xt.** representa
2efb0 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 74  tion of the part
2efc0 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20   of the doclist 
2efd0 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74 20  that is present 
2efe0 74 6f 20 62 75 66 66 65 72 0a 2a 2a 20 70 42 75  to buffer.** pBu
2eff0 66 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  f. .**.** The re
2f000 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
2f010 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
2f020 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
2f030 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f  input buffer..*/
2f040 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
2f050 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 69 6e  DecodeDoclist(in
2f060 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66  t *pRc, Fts5Buff
2f070 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20  er *pBuf, const 
2f080 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20  u8 *a, int n){. 
2f090 20 69 36 34 20 69 44 6f 63 69 64 20 3d 20 30 3b   i64 iDocid = 0;
2f0a0 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b  .  int iOff = 0;
2f0b0 0a 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  ..  if( n>0 ){. 
2f0c0 20 20 20 69 4f 66 66 20 3d 20 73 71 6c 69 74 65     iOff = sqlite
2f0d0 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 61  3Fts5GetVarint(a
2f0e0 2c 20 28 75 36 34 2a 29 26 69 44 6f 63 69 64 29  , (u64*)&iDocid)
2f0f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
2f100 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2f110 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
2f120 20 69 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69   id=%lld", iDoci
2f130 64 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  d);.  }.  while(
2f140 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69   iOff<n ){.    i
2f150 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 69 6e 74  nt nPos;.    int
2f160 20 62 44 65 6c 3b 0a 20 20 20 20 69 4f 66 66 20   bDel;.    iOff 
2f170 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73  += fts5GetPoslis
2f180 74 53 69 7a 65 28 26 61 5b 69 4f 66 66 5d 2c 20  tSize(&a[iOff], 
2f190 26 6e 50 6f 73 2c 20 26 62 44 65 6c 29 3b 0a 20  &nPos, &bDel);. 
2f1a0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2f1b0 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2f1c0 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 6e 50  (pRc, pBuf, " nP
2f1d0 6f 73 3d 25 64 25 73 22 2c 20 6e 50 6f 73 2c 20  os=%d%s", nPos, 
2f1e0 62 44 65 6c 3f 22 2a 22 3a 22 22 29 3b 0a 20 20  bDel?"*":"");.  
2f1f0 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65    iOff += fts5De
2f200 63 6f 64 65 50 6f 73 6c 69 73 74 28 70 52 63 2c  codePoslist(pRc,
2f210 20 70 42 75 66 2c 20 26 61 5b 69 4f 66 66 5d 2c   pBuf, &a[iOff],
2f220 20 4d 49 4e 28 6e 2d 69 4f 66 66 2c 20 6e 50 6f   MIN(n-iOff, nPo
2f230 73 29 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66  s));.    if( iOf
2f240 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34  f<n ){.      i64
2f250 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 69   iDelta;.      i
2f260 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  Off += sqlite3Ft
2f270 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
2f280 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  Off], (u64*)&iDe
2f290 6c 74 61 29 3b 0a 20 20 20 20 20 20 69 44 6f 63  lta);.      iDoc
2f2a0 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20  id += iDelta;.  
2f2b0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2f2c0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2f2d0 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 69  f(pRc, pBuf, " i
2f2e0 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29  d=%lld", iDocid)
2f2f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
2f300 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f  eturn iOff;.}../
2f310 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2f320 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  on is part of th
2f330 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20  e fts5_decode() 
2f340 64 65 62 75 67 67 69 6e 67 20 66 75 6e 63 74 69  debugging functi
2f350 6f 6e 2e 20 49 74 20 69 73 20 0a 2a 2a 20 6f 6e  on. It is .** on
2f360 6c 79 20 65 76 65 72 20 75 73 65 64 20 77 69 74  ly ever used wit
2f370 68 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 74 61  h detail=none ta
2f380 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 42 75 66 66  bles..**.** Buff
2f390 65 72 20 28 70 44 61 74 61 2f 6e 44 61 74 61 29  er (pData/nData)
2f3a0 20 63 6f 6e 74 61 69 6e 73 20 61 20 64 6f 63 6c   contains a docl
2f3b0 69 73 74 20 69 6e 20 74 68 65 20 66 6f 72 6d 61  ist in the forma
2f3c0 74 20 75 73 65 64 20 62 79 20 64 65 74 61 69 6c  t used by detail
2f3d0 3d 6e 6f 6e 65 0a 2a 2a 20 74 61 62 6c 65 73 2e  =none.** tables.
2f3e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
2f3f0 70 70 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72  ppends a human-r
2f400 65 61 64 61 62 6c 65 20 76 65 72 73 69 6f 6e 20  eadable version 
2f410 6f 66 20 74 68 61 74 20 6c 69 73 74 20 74 6f 0a  of that list to.
2f420 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  ** buffer pBuf..
2f430 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73  **.** If *pRc is
2f440 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
2f450 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20  TE_OK when this 
2f460 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2f470 65 64 2c 20 69 74 20 69 73 20 61 0a 2a 2a 20 6e  ed, it is a.** n
2f480 6f 2d 6f 70 2e 20 49 66 20 61 6e 20 4f 4f 4d 20  o-op. If an OOM 
2f490 6f 72 20 6f 74 68 65 72 20 65 72 72 6f 72 20 6f  or other error o
2f4a0 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 69  ccurs within thi
2f4b0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 2a 70 52 63  s function, *pRc
2f4c0 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 61 6e   is.** set to an
2f4d0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
2f4e0 64 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  de before return
2f4f0 69 6e 67 2e 20 54 68 65 20 66 69 6e 61 6c 20 73  ing. The final s
2f500 74 61 74 65 20 6f 66 20 62 75 66 66 65 72 0a 2a  tate of buffer.*
2f510 2a 20 70 42 75 66 20 69 73 20 75 6e 64 65 66 69  * pBuf is undefi
2f520 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
2f530 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f540 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64   fts5DecodeRowid
2f550 4c 69 73 74 28 0a 20 20 69 6e 74 20 2a 70 52 63  List(.  int *pRc
2f560 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f570 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
2f580 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f  T: Error code */
2f590 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
2f5a0 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
2f5b0 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
2f5c0 61 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20 2a  append text to *
2f5d0 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44  /.  const u8 *pD
2f5e0 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 20 20  ata, int nData  
2f5f0 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 64      /* Data to d
2f600 65 63 6f 64 65 20 6c 69 73 74 2d 6f 66 2d 72 6f  ecode list-of-ro
2f610 77 69 64 73 20 66 72 6f 6d 20 2a 2f 0a 29 7b 0a  wids from */.){.
2f620 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
2f630 36 34 20 69 52 6f 77 69 64 20 3d 20 30 3b 0a 0a  64 iRowid = 0;..
2f640 20 20 77 68 69 6c 65 28 20 69 3c 6e 44 61 74 61    while( i<nData
2f650 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2f660 61 72 20 2a 7a 41 70 70 20 3d 20 22 22 3b 0a 20  ar *zApp = "";. 
2f670 20 20 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20     u64 iVal;.   
2f680 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73   i += sqlite3Fts
2f690 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74  5GetVarint(&pDat
2f6a0 61 5b 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20  a[i], &iVal);.  
2f6b0 20 20 69 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c    iRowid += iVal
2f6c0 3b 0a 0a 20 20 20 20 69 66 28 20 69 3c 6e 44 61  ;..    if( i<nDa
2f6d0 74 61 20 26 26 20 70 44 61 74 61 5b 69 5d 3d 3d  ta && pData[i]==
2f6e0 30 78 30 30 20 29 7b 0a 20 20 20 20 20 20 69 2b  0x00 ){.      i+
2f6f0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e  +;.      if( i<n
2f700 44 61 74 61 20 26 26 20 70 44 61 74 61 5b 69 5d  Data && pData[i]
2f710 3d 3d 30 78 30 30 20 29 7b 0a 20 20 20 20 20 20  ==0x00 ){.      
2f720 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7a    i++;.        z
2f730 41 70 70 20 3d 20 22 2b 22 3b 0a 20 20 20 20 20  App = "+";.     
2f740 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f750 7a 41 70 70 20 3d 20 22 2a 22 3b 0a 20 20 20 20  zApp = "*";.    
2f760 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73    }.    }..    s
2f770 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2f780 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2f790 2c 20 70 42 75 66 2c 20 22 20 25 6c 6c 64 25 73  , pBuf, " %lld%s
2f7a0 22 2c 20 69 52 6f 77 69 64 2c 20 7a 41 70 70 29  ", iRowid, zApp)
2f7b0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
2f7c0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
2f7d0 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65  n of user-define
2f7e0 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  d scalar functio
2f7f0 6e 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 2e  n fts5_decode().
2f800 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2f810 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69  fts5DecodeFuncti
2f820 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  on(.  sqlite3_co
2f830 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20  ntext *pCtx,    
2f840 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
2f850 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a  n call context *
2f860 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
2f870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f880 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2f890 20 61 72 67 73 20 28 61 6c 77 61 79 73 20 32 29   args (always 2)
2f8a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
2f8b0 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20  lue **apVal     
2f8c0 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
2f8d0 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  n arguments */.)
2f8e0 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20  {.  i64 iRowid; 
2f8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f900 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72      /* Rowid for
2f910 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65   record being de
2f920 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  coded */.  int i
2f930 53 65 67 69 64 2c 69 48 65 69 67 68 74 2c 69 50  Segid,iHeight,iP
2f940 67 6e 6f 2c 62 44 6c 69 64 78 3b 2f 2a 20 52 6f  gno,bDlidx;/* Ro
2f950 77 69 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a  wid components *
2f960 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 42  /.  const u8 *aB
2f970 6c 6f 62 3b 20 69 6e 74 20 6e 3b 20 20 20 20 20  lob; int n;     
2f980 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 6f      /* Record to
2f990 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20   decode */.  u8 
2f9a0 2a 61 20 3d 20 30 3b 0a 20 20 46 74 73 35 42 75  *a = 0;.  Fts5Bu
2f9b0 66 66 65 72 20 73 3b 20 20 20 20 20 20 20 20 20  ffer s;         
2f9c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 69            /* Bui
2f9d0 6c 64 20 75 70 20 74 65 78 74 20 74 6f 20 72 65  ld up text to re
2f9e0 74 75 72 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  turn here */.  i
2f9f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2fa00 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
2fa10 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2fa20 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 20 3d 20  .  int nSpace = 
2fa30 30 3b 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c  0;.  int eDetail
2fa40 4e 6f 6e 65 20 3d 20 28 73 71 6c 69 74 65 33 5f  None = (sqlite3_
2fa50 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 21  user_data(pCtx)!
2fa60 3d 30 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  =0);..  assert( 
2fa70 6e 41 72 67 3d 3d 32 20 29 3b 0a 20 20 55 4e 55  nArg==2 );.  UNU
2fa80 53 45 44 5f 50 41 52 41 4d 28 6e 41 72 67 29 3b  SED_PARAM(nArg);
2fa90 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c  .  memset(&s, 0,
2faa0 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
2fab0 65 72 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3d  er));.  iRowid =
2fac0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
2fad0 6e 74 36 34 28 61 70 56 61 6c 5b 30 5d 29 3b 0a  nt64(apVal[0]);.
2fae0 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70  .  /* Make a cop
2faf0 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  y of the second 
2fb00 61 72 67 75 6d 65 6e 74 20 28 61 20 62 6c 6f 62  argument (a blob
2fb10 29 20 69 6e 20 61 42 6c 6f 62 5b 5d 2e 20 54 68  ) in aBlob[]. Th
2fb20 65 20 61 42 6c 6f 62 5b 5d 0a 20 20 2a 2a 20 63  e aBlob[].  ** c
2fb30 6f 70 79 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20  opy is followed 
2fb40 62 79 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52  by FTS5_DATA_ZER
2fb50 4f 5f 50 41 44 44 49 4e 47 20 30 78 30 30 20 62  O_PADDING 0x00 b
2fb60 79 74 65 73 2c 20 77 68 69 63 68 20 70 72 65 76  ytes, which prev
2fb70 65 6e 74 73 0a 20 20 2a 2a 20 62 75 66 66 65 72  ents.  ** buffer
2fb80 20 6f 76 65 72 72 65 61 64 73 20 65 76 65 6e 20   overreads even 
2fb90 69 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  if the record is
2fba0 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20   corrupt.  */.  
2fbb0 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
2fbc0 65 5f 62 79 74 65 73 28 61 70 56 61 6c 5b 31 5d  e_bytes(apVal[1]
2fbd0 29 3b 0a 20 20 61 42 6c 6f 62 20 3d 20 73 71 6c  );.  aBlob = sql
2fbe0 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28  ite3_value_blob(
2fbf0 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 6e 53 70  apVal[1]);.  nSp
2fc00 61 63 65 20 3d 20 6e 20 2b 20 46 54 53 35 5f 44  ace = n + FTS5_D
2fc10 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47  ATA_ZERO_PADDING
2fc20 3b 0a 20 20 61 20 3d 20 28 75 38 2a 29 73 71 6c  ;.  a = (u8*)sql
2fc30 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
2fc40 72 6f 28 26 72 63 2c 20 6e 53 70 61 63 65 29 3b  ro(&rc, nSpace);
2fc50 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 20 67 6f  .  if( a==0 ) go
2fc60 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20  to decode_out;. 
2fc70 20 6d 65 6d 63 70 79 28 61 2c 20 61 42 6c 6f 62   memcpy(a, aBlob
2fc80 2c 20 6e 29 3b 0a 0a 0a 20 20 66 74 73 35 44 65  , n);...  fts5De
2fc90 63 6f 64 65 52 6f 77 69 64 28 69 52 6f 77 69 64  codeRowid(iRowid
2fca0 2c 20 26 69 53 65 67 69 64 2c 20 26 62 44 6c 69  , &iSegid, &bDli
2fcb0 64 78 2c 20 26 69 48 65 69 67 68 74 2c 20 26 69  dx, &iHeight, &i
2fcc0 50 67 6e 6f 29 3b 0a 0a 20 20 66 74 73 35 44 65  Pgno);..  fts5De
2fcd0 62 75 67 52 6f 77 69 64 28 26 72 63 2c 20 26 73  bugRowid(&rc, &s
2fce0 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 69 66 28  , iRowid);.  if(
2fcf0 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 46   bDlidx ){.    F
2fd00 74 73 35 44 61 74 61 20 64 6c 69 64 78 3b 0a 20  ts5Data dlidx;. 
2fd10 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20     Fts5DlidxLvl 
2fd20 6c 76 6c 3b 0a 0a 20 20 20 20 64 6c 69 64 78 2e  lvl;..    dlidx.
2fd30 70 20 3d 20 61 3b 0a 20 20 20 20 64 6c 69 64 78  p = a;.    dlidx
2fd40 2e 6e 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 6d 65  .nn = n;..    me
2fd50 6d 73 65 74 28 26 6c 76 6c 2c 20 30 2c 20 73 69  mset(&lvl, 0, si
2fd60 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76  zeof(Fts5DlidxLv
2fd70 6c 29 29 3b 0a 20 20 20 20 6c 76 6c 2e 70 44 61  l));.    lvl.pDa
2fd80 74 61 20 3d 20 26 64 6c 69 64 78 3b 0a 20 20 20  ta = &dlidx;.   
2fd90 20 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 20 3d   lvl.iLeafPgno =
2fda0 20 69 50 67 6e 6f 3b 0a 0a 20 20 20 20 66 6f 72   iPgno;..    for
2fdb0 28 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78  (fts5DlidxLvlNex
2fdc0 74 28 26 6c 76 6c 29 3b 20 6c 76 6c 2e 62 45 6f  t(&lvl); lvl.bEo
2fdd0 66 3d 3d 30 3b 20 66 74 73 35 44 6c 69 64 78 4c  f==0; fts5DlidxL
2fde0 76 6c 4e 65 78 74 28 26 6c 76 6c 29 29 7b 0a 20  vlNext(&lvl)){. 
2fdf0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
2fe00 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2fe10 74 66 28 26 72 63 2c 20 26 73 2c 20 0a 20 20 20  tf(&rc, &s, .   
2fe20 20 20 20 20 20 20 20 22 20 25 64 28 25 6c 6c 64         " %d(%lld
2fe30 29 22 2c 20 6c 76 6c 2e 69 4c 65 61 66 50 67 6e  )", lvl.iLeafPgn
2fe40 6f 2c 20 6c 76 6c 2e 69 52 6f 77 69 64 0a 20 20  o, lvl.iRowid.  
2fe50 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
2fe60 65 6c 73 65 20 69 66 28 20 69 53 65 67 69 64 3d  else if( iSegid=
2fe70 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 52  =0 ){.    if( iR
2fe80 6f 77 69 64 3d 3d 46 54 53 35 5f 41 56 45 52 41  owid==FTS5_AVERA
2fe90 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  GES_ROWID ){.   
2fea0 20 20 20 66 74 73 35 44 65 63 6f 64 65 41 76 65     fts5DecodeAve
2feb0 72 61 67 65 73 28 26 72 63 2c 20 26 73 2c 20 61  rages(&rc, &s, a
2fec0 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
2fed0 0a 20 20 20 20 20 20 66 74 73 35 44 65 63 6f 64  .      fts5Decod
2fee0 65 53 74 72 75 63 74 75 72 65 28 26 72 63 2c 20  eStructure(&rc, 
2fef0 26 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d  &s, a, n);.    }
2ff00 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65  .  }else if( eDe
2ff10 74 61 69 6c 4e 6f 6e 65 20 29 7b 0a 20 20 20 20  tailNone ){.    
2ff20 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b  Fts5Buffer term;
2ff30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ff40 20 43 75 72 72 65 6e 74 20 74 65 72 6d 20 72 65   Current term re
2ff50 61 64 20 66 72 6f 6d 20 70 61 67 65 20 2a 2f 0a  ad from page */.
2ff60 20 20 20 20 69 6e 74 20 73 7a 4c 65 61 66 3b 0a      int szLeaf;.
2ff70 20 20 20 20 69 6e 74 20 69 50 67 69 64 78 4f 66      int iPgidxOf
2ff80 66 20 3d 20 73 7a 4c 65 61 66 20 3d 20 66 74 73  f = szLeaf = fts
2ff90 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a  5GetU16(&a[2]);.
2ffa0 20 20 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66      int iTermOff
2ffb0 3b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 20  ;.    int nKeep 
2ffc0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66  = 0;.    int iOf
2ffd0 66 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  f;..    memset(&
2ffe0 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  term, 0, sizeof(
2fff0 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20  Fts5Buffer));.. 
30000 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 61 6e 79     /* Decode any
30010 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63   entries that oc
30020 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20 66  cur before the f
30030 69 72 73 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  irst term. */.  
30040 20 20 69 66 28 20 73 7a 4c 65 61 66 3c 6e 20 29    if( szLeaf<n )
30050 7b 0a 20 20 20 20 20 20 69 50 67 69 64 78 4f 66  {.      iPgidxOf
30060 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
30070 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66  nt32(&a[iPgidxOf
30080 66 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20  f], iTermOff);. 
30090 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
300a0 69 54 65 72 6d 4f 66 66 20 3d 20 73 7a 4c 65 61  iTermOff = szLea
300b0 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  f;.    }.    fts
300c0 35 44 65 63 6f 64 65 52 6f 77 69 64 4c 69 73 74  5DecodeRowidList
300d0 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 34 5d 2c  (&rc, &s, &a[4],
300e0 20 69 54 65 72 6d 4f 66 66 2d 34 29 3b 0a 0a 20   iTermOff-4);.. 
300f0 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f     iOff = iTermO
30100 66 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  ff;.    while( i
30110 4f 66 66 3c 73 7a 4c 65 61 66 20 29 7b 0a 20 20  Off<szLeaf ){.  
30120 20 20 20 20 69 6e 74 20 6e 41 70 70 65 6e 64 3b      int nAppend;
30130 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20  ..      /* Read 
30140 74 68 65 20 74 65 72 6d 20 64 61 74 61 20 66 6f  the term data fo
30150 72 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 2a  r the next term*
30160 2f 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  /.      iOff += 
30170 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
30180 26 61 5b 69 4f 66 66 5d 2c 20 6e 41 70 70 65 6e  &a[iOff], nAppen
30190 64 29 3b 0a 20 20 20 20 20 20 74 65 72 6d 2e 6e  d);.      term.n
301a0 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20   = nKeep;.      
301b0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
301c0 42 6c 6f 62 28 26 72 63 2c 20 26 74 65 72 6d 2c  Blob(&rc, &term,
301d0 20 6e 41 70 70 65 6e 64 2c 20 26 61 5b 69 4f 66   nAppend, &a[iOf
301e0 66 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  f]);.      sqlit
301f0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
30200 6e 64 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ndPrintf(.      
30210 20 20 20 20 26 72 63 2c 20 26 73 2c 20 22 20 74      &rc, &s, " t
30220 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e  erm=%.*s", term.
30230 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  n, (const char*)
30240 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 29 3b 0a  term.p.      );.
30250 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 41        iOff += nA
30260 70 70 65 6e 64 3b 0a 0a 20 20 20 20 20 20 2f 2a  ppend;..      /*
30270 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72   Figure out wher
30280 65 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f  e the doclist fo
30290 72 20 74 68 69 73 20 74 65 72 6d 20 65 6e 64 73  r this term ends
302a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 50   */.      if( iP
302b0 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  gidxOff<n ){.   
302c0 20 20 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b 0a       int nIncr;.
302d0 20 20 20 20 20 20 20 20 69 50 67 69 64 78 4f 66          iPgidxOf
302e0 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
302f0 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66  nt32(&a[iPgidxOf
30300 66 5d 2c 20 6e 49 6e 63 72 29 3b 0a 20 20 20 20  f], nIncr);.    
30310 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20      iTermOff += 
30320 6e 49 6e 63 72 3b 0a 20 20 20 20 20 20 7d 65 6c  nIncr;.      }el
30330 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 65 72  se{.        iTer
30340 6d 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20  mOff = szLeaf;. 
30350 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74       }..      ft
30360 73 35 44 65 63 6f 64 65 52 6f 77 69 64 4c 69 73  s5DecodeRowidLis
30370 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f  t(&rc, &s, &a[iO
30380 66 66 5d 2c 20 69 54 65 72 6d 4f 66 66 2d 69 4f  ff], iTermOff-iO
30390 66 66 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  ff);.      iOff 
303a0 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20  = iTermOff;.    
303b0 20 20 69 66 28 20 69 4f 66 66 3c 73 7a 4c 65 61    if( iOff<szLea
303c0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66  f ){.        iOf
303d0 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
303e0 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
303f0 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Keep);.      }. 
30400 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75     }..    fts5Bu
30410 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b  fferFree(&term);
30420 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74  .  }else{.    Ft
30430 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20  s5Buffer term;  
30440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
30450 75 72 72 65 6e 74 20 74 65 72 6d 20 72 65 61 64  urrent term read
30460 20 66 72 6f 6d 20 70 61 67 65 20 2a 2f 0a 20 20   from page */.  
30470 20 20 69 6e 74 20 73 7a 4c 65 61 66 3b 20 20 20    int szLeaf;   
30480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30490 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 70 67 69  /* Offset of pgi
304a0 64 78 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 20  dx in a[] */.   
304b0 20 69 6e 74 20 69 50 67 69 64 78 4f 66 66 3b 0a   int iPgidxOff;.
304c0 20 20 20 20 69 6e 74 20 69 50 67 69 64 78 50 72      int iPgidxPr
304d0 65 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ev = 0;         
304e0 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61    /* Previous va
304f0 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 70 67  lue read from pg
30500 69 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  idx */.    int i
30510 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 20  TermOff = 0;.   
30520 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 20 3d   int iRowidOff =
30530 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66   0;.    int iOff
30540 3b 0a 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69  ;.    int nDocli
30550 73 74 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28  st;..    memset(
30560 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &term, 0, sizeof
30570 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a  (Fts5Buffer));..
30580 20 20 20 20 69 66 28 20 6e 3c 34 20 29 7b 0a 20      if( n<4 ){. 
30590 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
305a0 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 26  BufferSet(&rc, &
305b0 73 2c 20 37 2c 20 28 63 6f 6e 73 74 20 75 38 2a  s, 7, (const u8*
305c0 29 22 63 6f 72 72 75 70 74 22 29 3b 0a 20 20 20  )"corrupt");.   
305d0 20 20 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f     goto decode_o
305e0 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ut;.    }else{. 
305f0 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d       iRowidOff =
30600 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 30   fts5GetU16(&a[0
30610 5d 29 3b 0a 20 20 20 20 20 20 69 50 67 69 64 78  ]);.      iPgidx
30620 4f 66 66 20 3d 20 73 7a 4c 65 61 66 20 3d 20 66  Off = szLeaf = f
30630 74 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29  ts5GetU16(&a[2])
30640 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 67 69  ;.      if( iPgi
30650 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20  dxOff<n ){.     
30660 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74     fts5GetVarint
30670 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d  32(&a[iPgidxOff]
30680 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20 20  , iTermOff);.   
30690 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
306a0 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 6f  /* Decode the po
306b0 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 61 69 6c  sition list tail
306c0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
306d0 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
306e0 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 21 3d   if( iRowidOff!=
306f0 30 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20  0 ){.      iOff 
30700 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20  = iRowidOff;.   
30710 20 7d 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d   }else if( iTerm
30720 4f 66 66 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Off!=0 ){.      
30730 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
30740 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30750 20 20 69 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b    iOff = szLeaf;
30760 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44  .    }.    fts5D
30770 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 26 72 63  ecodePoslist(&rc
30780 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69 4f 66  , &s, &a[4], iOf
30790 66 2d 34 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65  f-4);..    /* De
307a0 63 6f 64 65 20 61 6e 79 20 6d 6f 72 65 20 64 6f  code any more do
307b0 63 6c 69 73 74 20 64 61 74 61 20 74 68 61 74 20  clist data that 
307c0 61 70 70 65 61 72 73 20 6f 6e 20 74 68 65 20 70  appears on the p
307d0 61 67 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20  age before the. 
307e0 20 20 20 2a 2a 20 66 69 72 73 74 20 74 65 72 6d     ** first term
307f0 2e 20 2a 2f 0a 20 20 20 20 6e 44 6f 63 6c 69 73  . */.    nDoclis
30800 74 20 3d 20 28 69 54 65 72 6d 4f 66 66 20 3f 20  t = (iTermOff ? 
30810 69 54 65 72 6d 4f 66 66 20 3a 20 73 7a 4c 65 61  iTermOff : szLea
30820 66 29 20 2d 20 69 4f 66 66 3b 0a 20 20 20 20 66  f) - iOff;.    f
30830 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74  ts5DecodeDoclist
30840 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66  (&rc, &s, &a[iOf
30850 66 5d 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 0a  f], nDoclist);..
30860 20 20 20 20 77 68 69 6c 65 28 20 69 50 67 69 64      while( iPgid
30870 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20  xOff<n ){.      
30880 69 6e 74 20 62 46 69 72 73 74 20 3d 20 28 69 50  int bFirst = (iP
30890 67 69 64 78 4f 66 66 3d 3d 73 7a 4c 65 61 66 29  gidxOff==szLeaf)
308a0 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f  ;     /* True fo
308b0 72 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  r first term on 
308c0 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  page */.      in
308d0 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
308e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
308f0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
30900 64 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 69 6e  data */.      in
30910 74 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 0a 20  t iEnd;.      . 
30920 20 20 20 20 20 69 50 67 69 64 78 4f 66 66 20 2b       iPgidxOff +
30930 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
30940 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c  2(&a[iPgidxOff],
30950 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69   nByte);.      i
30960 50 67 69 64 78 50 72 65 76 20 2b 3d 20 6e 42 79  PgidxPrev += nBy
30970 74 65 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d  te;.      iOff =
30980 20 69 50 67 69 64 78 50 72 65 76 3b 0a 0a 20 20   iPgidxPrev;..  
30990 20 20 20 20 69 66 28 20 69 50 67 69 64 78 4f 66      if( iPgidxOf
309a0 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 66  f<n ){.        f
309b0 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
309c0 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 42  a[iPgidxOff], nB
309d0 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 45  yte);.        iE
309e0 6e 64 20 3d 20 69 50 67 69 64 78 50 72 65 76 20  nd = iPgidxPrev 
309f0 2b 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 7d  + nByte;.      }
30a00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 45  else{.        iE
30a10 6e 64 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20  nd = szLeaf;.   
30a20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
30a30 62 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20  bFirst==0 ){.   
30a40 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
30a50 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
30a60 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  iOff], nByte);. 
30a70 20 20 20 20 20 20 20 74 65 72 6d 2e 6e 20 3d 20         term.n = 
30a80 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20  nByte;.      }. 
30a90 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
30aa0 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
30ab0 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  iOff], nByte);. 
30ac0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
30ad0 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20 26  ppendBlob(&rc, &
30ae0 74 65 72 6d 2c 20 6e 42 79 74 65 2c 20 26 61 5b  term, nByte, &a[
30af0 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 69 4f  iOff]);.      iO
30b00 66 66 20 2b 3d 20 6e 42 79 74 65 3b 0a 0a 20 20  ff += nByte;..  
30b10 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
30b20 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
30b30 66 28 0a 20 20 20 20 20 20 20 20 20 20 26 72 63  f(.          &rc
30b40 2c 20 26 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a  , &s, " term=%.*
30b50 73 22 2c 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e  s", term.n, (con
30b60 73 74 20 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a  st char*)term.p.
30b70 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
30b80 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64  Off += fts5Decod
30b90 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73  eDoclist(&rc, &s
30ba0 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 69 45 6e 64  , &a[iOff], iEnd
30bb0 2d 69 4f 66 66 29 3b 0a 20 20 20 20 7d 0a 0a 20  -iOff);.    }.. 
30bc0 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
30bd0 65 28 26 74 65 72 6d 29 3b 0a 20 20 7d 0a 20 20  e(&term);.  }.  
30be0 0a 20 64 65 63 6f 64 65 5f 6f 75 74 3a 0a 20 20  . decode_out:.  
30bf0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b  sqlite3_free(a);
30c00 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
30c10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
30c20 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
30c30 70 43 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61  pCtx, (const cha
30c40 72 2a 29 73 2e 70 2c 20 73 2e 6e 2c 20 53 51 4c  r*)s.p, s.n, SQL
30c50 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
30c60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
30c70 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
30c80 72 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63 29  r_code(pCtx, rc)
30c90 3b 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66  ;.  }.  fts5Buff
30ca0 65 72 46 72 65 65 28 26 73 29 3b 0a 7d 0a 0a 2f  erFree(&s);.}../
30cb0 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
30cc0 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d  ntation of user-
30cd0 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66  defined scalar f
30ce0 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 72 6f 77  unction fts5_row
30cf0 69 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  id()..*/.static 
30d00 76 6f 69 64 20 66 74 73 35 52 6f 77 69 64 46 75  void fts5RowidFu
30d10 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
30d20 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
30d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
30d40 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65  ction call conte
30d50 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  xt */.  int nArg
30d60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
30d70 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
30d80 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61 79  r of args (alway
30d90 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s 2) */.  sqlite
30da0 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20  3_value **apVal 
30db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
30dc0 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
30dd0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
30de0 61 72 20 2a 7a 41 72 67 3b 0a 20 20 69 66 28 20  ar *zArg;.  if( 
30df0 6e 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73  nArg==0 ){.    s
30e00 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
30e10 72 6f 72 28 70 43 74 78 2c 20 22 73 68 6f 75 6c  ror(pCtx, "shoul
30e20 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64  d be: fts5_rowid
30e30 28 73 75 62 6a 65 63 74 2c 20 2e 2e 2e 2e 29 22  (subject, ....)"
30e40 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , -1);.  }else{.
30e50 20 20 20 20 7a 41 72 67 20 3d 20 28 63 6f 6e 73      zArg = (cons
30e60 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
30e70 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
30e80 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  [0]);.    if( 0=
30e90 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70  =sqlite3_stricmp
30ea0 28 7a 41 72 67 2c 20 22 73 65 67 6d 65 6e 74 22  (zArg, "segment"
30eb0 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69  ) ){.      i64 i
30ec0 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 6e 74  Rowid;.      int
30ed0 20 73 65 67 69 64 2c 20 70 67 6e 6f 3b 0a 20 20   segid, pgno;.  
30ee0 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 33 20      if( nArg!=3 
30ef0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
30f00 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
30f10 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20 20 20  pCtx, .         
30f20 20 20 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66     "should be: f
30f30 74 73 35 5f 72 6f 77 69 64 28 27 73 65 67 6d 65  ts5_rowid('segme
30f40 6e 74 27 2c 20 73 65 67 69 64 2c 20 70 67 6e 6f  nt', segid, pgno
30f50 29 29 22 2c 20 2d 31 0a 20 20 20 20 20 20 20 20  ))", -1.        
30f60 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
30f70 20 20 20 20 20 20 20 20 73 65 67 69 64 20 3d 20          segid = 
30f80 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
30f90 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20  t(apVal[1]);.   
30fa0 20 20 20 20 20 70 67 6e 6f 20 3d 20 73 71 6c 69       pgno = sqli
30fb0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70  te3_value_int(ap
30fc0 56 61 6c 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20  Val[2]);.       
30fd0 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53   iRowid = FTS5_S
30fe0 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 73 65 67  EGMENT_ROWID(seg
30ff0 69 64 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  id, pgno);.     
31000 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
31010 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 69 52  t_int64(pCtx, iR
31020 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  owid);.      }. 
31030 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31040 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
31050 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20  rror(pCtx, .    
31060 20 20 20 20 22 66 69 72 73 74 20 61 72 67 20 74      "first arg t
31070 6f 20 66 74 73 35 5f 72 6f 77 69 64 28 29 20 6d  o fts5_rowid() m
31080 75 73 74 20 62 65 20 27 73 65 67 6d 65 6e 74 27  ust be 'segment'
31090 22 20 2c 20 2d 31 0a 20 20 20 20 20 20 29 3b 0a  " , -1.      );.
310a0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
310b0 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  ** This is calle
310c0 64 20 61 73 20 70 61 72 74 20 6f 66 20 72 65 67  d as part of reg
310d0 69 73 74 65 72 69 6e 67 20 74 68 65 20 46 54 53  istering the FTS
310e0 35 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 64 61  5 module with da
310f0 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
31100 74 69 6f 6e 20 64 62 2e 20 49 74 20 72 65 67 69  tion db. It regi
31110 73 74 65 72 73 20 73 65 76 65 72 61 6c 20 75 73  sters several us
31120 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61  er-defined scala
31130 72 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 66  r functions usef
31140 75 6c 0a 2a 2a 20 77 69 74 68 20 46 54 53 35 2e  ul.** with FTS5.
31150 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
31160 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
31170 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
31180 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
31190 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 53   some other.** S
311a0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
311b0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73   is returned ins
311c0 74 65 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tead..*/.int sql
311d0 69 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 69  ite3Fts5IndexIni
311e0 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
311f0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
31200 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
31210 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22 66  on(.      db, "f
31220 74 73 35 5f 64 65 63 6f 64 65 22 2c 20 32 2c 20  ts5_decode", 2, 
31230 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
31240 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69  fts5DecodeFuncti
31250 6f 6e 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 0a 20  on, 0, 0.  );.. 
31260 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31270 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
31280 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
31290 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20  nction(.        
312a0 64 62 2c 20 22 66 74 73 35 5f 64 65 63 6f 64 65  db, "fts5_decode
312b0 5f 6e 6f 6e 65 22 2c 20 32 2c 20 0a 20 20 20 20  _none", 2, .    
312c0 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c      SQLITE_UTF8,
312d0 20 28 76 6f 69 64 2a 29 64 62 2c 20 66 74 73 35   (void*)db, fts5
312e0 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20  DecodeFunction, 
312f0 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  0, 0.    );.  }.
31300 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
31310 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
31320 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
31330 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20  function(.      
31340 20 20 64 62 2c 20 22 66 74 73 35 5f 72 6f 77 69    db, "fts5_rowi
31350 64 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  d", -1, SQLITE_U
31360 54 46 38 2c 20 30 2c 20 66 74 73 35 52 6f 77 69  TF8, 0, fts5Rowi
31370 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a  dFunction, 0, 0.
31380 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74      );.  }.  ret
31390 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 69 6e 74 20  urn rc;.}...int 
313a0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
313b0 52 65 73 65 74 28 46 74 73 35 49 6e 64 65 78 20  Reset(Fts5Index 
313c0 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
313d0 2d 3e 70 53 74 72 75 63 74 3d 3d 30 20 7c 7c 20  ->pStruct==0 || 
313e0 70 2d 3e 69 53 74 72 75 63 74 56 65 72 73 69 6f  p->iStructVersio
313f0 6e 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 66 74  n!=0 );.  if( ft
31400 73 35 49 6e 64 65 78 44 61 74 61 56 65 72 73 69  s5IndexDataVersi
31410 6f 6e 28 70 29 21 3d 70 2d 3e 69 53 74 72 75 63  on(p)!=p->iStruc
31420 74 56 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20  tVersion ){.    
31430 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e 76  fts5StructureInv
31440 61 6c 69 64 61 74 65 28 70 29 3b 0a 20 20 7d 0a  alidate(p);.  }.
31450 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
31460 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a     exReturn(p);.}.