/ Hex Artifact Content
Login

Artifact 7d93b9503e02e57c94ce22e08758723f6d833969495a2c89ac7ca63957ab0053:


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 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5aa0: 52 65 74 72 69 65 76 65 20 61 20 72 65 63 6f 72  Retrieve a recor
5ab0: 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74  d from the %_dat
5ac0: 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  a table..**.** I
5ad0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
5ae0: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
5af0: 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ned and an error
5b00: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 0a 2a 2a   left in the .**
5b10: 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63   Fts5Index objec
5b20: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73  t..*/.static Fts
5b30: 35 44 61 74 61 20 2a 66 74 73 35 44 61 74 61 52  5Data *fts5DataR
5b40: 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ead(Fts5Index *p
5b50: 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20  , i64 iRowid){. 
5b60: 20 46 74 73 35 44 61 74 61 20 2a 70 52 65 74 20   Fts5Data *pRet 
5b70: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  = 0;.  if( p->rc
5b80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5b90: 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
5ba0: 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20 69 66 28 20  TE_OK;..    if( 
5bb0: 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20 20  p->pReader ){.  
5bc0: 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
5bd0: 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
5be0: 54 45 5f 41 42 4f 52 54 20 69 66 20 74 68 65 72  TE_ABORT if ther
5bf0: 65 20 68 61 73 20 62 65 65 6e 20 61 20 73 61 76  e has been a sav
5c00: 65 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20  epoint.      ** 
5c10: 72 6f 6c 6c 62 61 63 6b 20 73 69 6e 63 65 20 69  rollback since i
5c20: 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e  t was last used.
5c30: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 20   In this case a 
5c40: 6e 65 77 20 62 6c 6f 62 20 68 61 6e 64 6c 65 0a  new blob handle.
5c50: 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
5c60: 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ired.  */.      
5c70: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42  sqlite3_blob *pB
5c80: 6c 6f 62 20 3d 20 70 2d 3e 70 52 65 61 64 65 72  lob = p->pReader
5c90: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 61 64  ;.      p->pRead
5ca0: 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  er = 0;.      rc
5cb0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
5cc0: 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69 52  reopen(pBlob, iR
5cd0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 61 73 73  owid);.      ass
5ce0: 65 72 74 28 20 70 2d 3e 70 52 65 61 64 65 72 3d  ert( p->pReader=
5cf0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  =0 );.      p->p
5d00: 52 65 61 64 65 72 20 3d 20 70 42 6c 6f 62 3b 0a  Reader = pBlob;.
5d10: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
5d20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
5d30: 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64     fts5CloseRead
5d40: 65 72 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  er(p);.      }. 
5d50: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
5d60: 49 54 45 5f 41 42 4f 52 54 20 29 20 72 63 20 3d  ITE_ABORT ) rc =
5d70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
5d80: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
5d90: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73 20   blob handle is 
5da0: 6e 6f 74 20 6f 70 65 6e 20 61 74 20 74 68 69 73  not open at this
5db0: 20 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 69 74 20   point, open it 
5dc0: 61 6e 64 20 73 65 65 6b 20 0a 20 20 20 20 2a 2a  and seek .    **
5dd0: 20 74 6f 20 74 68 65 20 72 65 71 75 65 73 74 65   to the requeste
5de0: 64 20 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20 20  d entry.  */.   
5df0: 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 3d   if( p->pReader=
5e00: 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  =0 && rc==SQLITE
5e10: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46 74 73  _OK ){.      Fts
5e20: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
5e30: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
5e40: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5e50: 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e  3_blob_open(pCon
5e60: 66 69 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20  fig->db, .      
5e70: 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62      pConfig->zDb
5e80: 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 22  , p->zDataTbl, "
5e90: 62 6c 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c 20  block", iRowid, 
5ea0: 30 2c 20 26 70 2d 3e 70 52 65 61 64 65 72 0a 20  0, &p->pReader. 
5eb0: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
5ec0: 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20     /* If either 
5ed0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  of the sqlite3_b
5ee0: 6c 6f 62 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71  lob_open() or sq
5ef0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65  lite3_blob_reope
5f00: 6e 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a  n() calls.    **
5f10: 20 61 62 6f 76 65 20 72 65 74 75 72 6e 65 64 20   above returned 
5f20: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 72 65  SQLITE_ERROR, re
5f30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
5f40: 55 50 54 5f 56 54 41 42 20 69 6e 73 74 65 61 64  UPT_VTAB instead
5f50: 2e 0a 20 20 20 20 2a 2a 20 41 6c 6c 20 74 68 65  ..    ** All the
5f60: 20 72 65 61 73 6f 6e 73 20 74 68 6f 73 65 20 66   reasons those f
5f70: 75 6e 63 74 69 6f 6e 73 20 6d 69 67 68 74 20 72  unctions might r
5f80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
5f90: 4f 52 20 2d 20 6d 69 73 73 69 6e 67 0a 20 20 20  OR - missing.   
5fa0: 20 2a 2a 20 74 61 62 6c 65 2c 20 6d 69 73 73 69   ** table, missi
5fb0: 6e 67 20 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f 62  ng row, non-blob
5fc0: 2f 74 65 78 74 20 69 6e 20 62 6c 6f 63 6b 20 63  /text in block c
5fd0: 6f 6c 75 6d 6e 20 2d 20 69 6e 64 69 63 61 74 65  olumn - indicate
5fe0: 20 0a 20 20 20 20 2a 2a 20 62 61 63 6b 69 6e 67   .    ** backing
5ff0: 20 73 74 6f 72 65 20 63 6f 72 72 75 70 74 69 6f   store corruptio
6000: 6e 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  n.  */.    if( r
6010: 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  c==SQLITE_ERROR 
6020: 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ) rc = FTS5_CORR
6030: 55 50 54 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  UPT;..    if( rc
6040: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6050: 20 20 20 20 20 75 38 20 2a 61 4f 75 74 20 3d 20       u8 *aOut = 
6060: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
6070: 20 2f 2a 20 52 65 61 64 20 62 6c 6f 62 20 64 61   /* Read blob da
6080: 74 61 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  ta into this buf
6090: 66 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  fer */.      int
60a0: 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33   nByte = sqlite3
60b0: 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70  _blob_bytes(p->p
60c0: 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 69  Reader);.      i
60d0: 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 73 69 7a 65  nt nAlloc = size
60e0: 6f 66 28 46 74 73 35 44 61 74 61 29 20 2b 20 6e  of(Fts5Data) + n
60f0: 42 79 74 65 20 2b 20 46 54 53 35 5f 44 41 54 41  Byte + FTS5_DATA
6100: 5f 50 41 44 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PADDING;.      
6110: 70 52 65 74 20 3d 20 28 46 74 73 35 44 61 74 61  pRet = (Fts5Data
6120: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
6130: 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  (nAlloc);.      
6140: 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
6150: 20 20 20 20 70 52 65 74 2d 3e 6e 6e 20 3d 20 6e      pRet->nn = n
6160: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 61 4f  Byte;.        aO
6170: 75 74 20 3d 20 70 52 65 74 2d 3e 70 20 3d 20 28  ut = pRet->p = (
6180: 75 38 2a 29 26 70 52 65 74 5b 31 5d 3b 0a 20 20  u8*)&pRet[1];.  
6190: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
61a0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
61b0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  OMEM;.      }.. 
61c0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
61d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
61e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
61f0: 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 52 65 61  lob_read(p->pRea
6200: 64 65 72 2c 20 61 4f 75 74 2c 20 6e 42 79 74 65  der, aOut, nByte
6210: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
6220: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
6230: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
6240: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52   sqlite3_free(pR
6250: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  et);.        pRe
6260: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  t = 0;.      }el
6270: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
6280: 4f 44 4f 31 3a 20 46 69 78 20 74 68 69 73 20 2a  ODO1: Fix this *
6290: 2f 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  /.        pRet->
62a0: 70 5b 6e 42 79 74 65 5d 20 3d 20 30 78 30 30 3b  p[nByte] = 0x00;
62b0: 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 73  .        pRet->s
62c0: 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74 55  zLeaf = fts5GetU
62d0: 31 36 28 26 70 52 65 74 2d 3e 70 5b 32 5d 29 3b  16(&pRet->p[2]);
62e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
62f0: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
6300: 20 20 20 70 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20     p->nRead++;. 
6310: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70   }..  assert( (p
6320: 52 65 74 3d 3d 30 29 3d 3d 28 70 2d 3e 72 63 21  Ret==0)==(p->rc!
6330: 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20  =SQLITE_OK) );. 
6340: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
6350: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
6360: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 64 61   reference to da
6370: 74 61 20 72 65 63 6f 72 64 20 72 65 74 75 72 6e  ta record return
6380: 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
6390: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 66 74 73 35   call to.** fts5
63a0: 44 61 74 61 52 65 61 64 28 29 2e 0a 2a 2f 0a 73  DataRead()..*/.s
63b0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
63c0: 61 74 61 52 65 6c 65 61 73 65 28 46 74 73 35 44  ataRelease(Fts5D
63d0: 61 74 61 20 2a 70 44 61 74 61 29 7b 0a 20 20 73  ata *pData){.  s
63e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74  qlite3_free(pDat
63f0: 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74  a);.}..static Ft
6400: 73 35 44 61 74 61 20 2a 66 74 73 35 4c 65 61 66  s5Data *fts5Leaf
6410: 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a  Read(Fts5Index *
6420: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  p, i64 iRowid){.
6430: 20 20 46 74 73 35 44 61 74 61 20 2a 70 52 65 74    Fts5Data *pRet
6440: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
6450: 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 69 66  p, iRowid);.  if
6460: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69 66  ( pRet ){.    if
6470: 28 20 70 52 65 74 2d 3e 73 7a 4c 65 61 66 3e 70  ( pRet->szLeaf>p
6480: 52 65 74 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 20  Ret->nn ){.     
6490: 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
64a0: 52 52 55 50 54 3b 0a 20 20 20 20 20 20 66 74 73  RRUPT;.      fts
64b0: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 52 65  5DataRelease(pRe
64c0: 74 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d  t);.      pRet =
64d0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
64e0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
64f0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
6500: 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
6510: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
6520: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
6530: 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 68 61 72  **ppStmt,.  char
6540: 20 2a 7a 53 71 6c 0a 29 7b 0a 20 20 69 66 28 20   *zSql.){.  if( 
6550: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
6560: 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c   ){.    if( zSql
6570: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
6580: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
6590: 65 5f 76 33 28 70 2d 3e 70 43 6f 6e 66 69 67 2d  e_v3(p->pConfig-
65a0: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 0a 20  >db, zSql, -1,. 
65b0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
65c0: 50 52 45 50 41 52 45 5f 50 45 52 53 49 53 54 45  PREPARE_PERSISTE
65d0: 4e 54 7c 53 51 4c 49 54 45 5f 50 52 45 50 41 52  NT|SQLITE_PREPAR
65e0: 45 5f 4e 4f 5f 56 54 41 42 2c 0a 20 20 20 20 20  E_NO_VTAB,.     
65f0: 20 20 20 20 20 70 70 53 74 6d 74 2c 20 30 29 3b       ppStmt, 0);
6600: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6610: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
6620: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
6630: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
6640: 28 7a 53 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e  (zSql);.  return
6650: 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   p->rc;.}.../*.*
6660: 2a 20 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c  * INSERT OR REPL
6670: 41 43 45 20 61 20 72 65 63 6f 72 64 20 69 6e 74  ACE a record int
6680: 6f 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  o the %_data tab
6690: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
66a0: 69 64 20 66 74 73 35 44 61 74 61 57 72 69 74 65  id fts5DataWrite
66b0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
66c0: 36 34 20 69 52 6f 77 69 64 2c 20 63 6f 6e 73 74  64 iRowid, const
66d0: 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20   u8 *pData, int 
66e0: 6e 44 61 74 61 29 7b 0a 20 20 69 66 28 20 70 2d  nData){.  if( p-
66f0: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
6700: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
6710: 70 2d 3e 70 57 72 69 74 65 72 3d 3d 30 20 29 7b  p->pWriter==0 ){
6720: 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20  .    Fts5Config 
6730: 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
6740: 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49  onfig;.    fts5I
6750: 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
6760: 70 2c 20 26 70 2d 3e 70 57 72 69 74 65 72 2c 20  p, &p->pWriter, 
6770: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
6780: 0a 20 20 20 20 20 20 20 20 20 20 22 52 45 50 4c  .          "REPL
6790: 41 43 45 20 49 4e 54 4f 20 27 25 71 27 2e 27 25  ACE INTO '%q'.'%
67a0: 71 5f 64 61 74 61 27 28 69 64 2c 20 62 6c 6f 63  q_data'(id, bloc
67b0: 6b 29 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c  k) VALUES(?,?)",
67c0: 20 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e   .          pCon
67d0: 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
67e0: 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b  g->zName.    ));
67f0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29  .    if( p->rc )
6800: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
6810: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
6820: 36 34 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 31  64(p->pWriter, 1
6830: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c  , iRowid);.  sql
6840: 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
6850: 2d 3e 70 57 72 69 74 65 72 2c 20 32 2c 20 70 44  ->pWriter, 2, pD
6860: 61 74 61 2c 20 6e 44 61 74 61 2c 20 53 51 4c 49  ata, nData, SQLI
6870: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71  TE_STATIC);.  sq
6880: 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 57  lite3_step(p->pW
6890: 72 69 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20  riter);.  p->rc 
68a0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
68b0: 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 73  p->pWriter);.  s
68c0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
68d0: 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 32 29 3b  (p->pWriter, 2);
68e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
68f0: 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
6900: 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44  SQL:.**.**     D
6910: 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64 61 74  ELETE FROM %_dat
6920: 61 20 57 48 45 52 45 20 69 64 20 42 45 54 57 45  a WHERE id BETWE
6930: 45 4e 20 24 69 46 69 72 73 74 20 41 4e 44 20 24  EN $iFirst AND $
6940: 69 4c 61 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20  iLast.*/.static 
6950: 76 6f 69 64 20 66 74 73 35 44 61 74 61 44 65 6c  void fts5DataDel
6960: 65 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ete(Fts5Index *p
6970: 2c 20 69 36 34 20 69 46 69 72 73 74 2c 20 69 36  , i64 iFirst, i6
6980: 34 20 69 4c 61 73 74 29 7b 0a 20 20 69 66 28 20  4 iLast){.  if( 
6990: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
69a0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
69b0: 28 20 70 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30  ( p->pDeleter==0
69c0: 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66   ){.    Fts5Conf
69d0: 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
69e0: 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68  >pConfig;.    ch
69f0: 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ar *zSql = sqlit
6a00: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
6a10: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
6a20: 20 27 25 71 27 2e 27 25 71 5f 64 61 74 61 27 20   '%q'.'%q_data' 
6a30: 57 48 45 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20  WHERE id>=? AND 
6a40: 69 64 3c 3d 3f 22 2c 20 0a 20 20 20 20 20 20 20  id<=?", .       
6a50: 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c     pConfig->zDb,
6a60: 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a   pConfig->zName.
6a70: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 66      );.    if( f
6a80: 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53  ts5IndexPrepareS
6a90: 74 6d 74 28 70 2c 20 26 70 2d 3e 70 44 65 6c 65  tmt(p, &p->pDele
6aa0: 74 65 72 2c 20 7a 53 71 6c 29 20 29 20 72 65 74  ter, zSql) ) ret
6ab0: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  urn;.  }..  sqli
6ac0: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
6ad0: 2d 3e 70 44 65 6c 65 74 65 72 2c 20 31 2c 20 69  ->pDeleter, 1, i
6ae0: 46 69 72 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  First);.  sqlite
6af0: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e  3_bind_int64(p->
6b00: 70 44 65 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61  pDeleter, 2, iLa
6b10: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  st);.  sqlite3_s
6b20: 74 65 70 28 70 2d 3e 70 44 65 6c 65 74 65 72 29  tep(p->pDeleter)
6b30: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69  ;.  p->rc = sqli
6b40: 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44 65  te3_reset(p->pDe
6b50: 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  leter);.}../*.**
6b60: 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 63 6f   Remove all reco
6b70: 72 64 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  rds associated w
6b80: 69 74 68 20 73 65 67 6d 65 6e 74 20 69 53 65 67  ith segment iSeg
6b90: 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  id..*/.static vo
6ba0: 69 64 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76  id fts5DataRemov
6bb0: 65 53 65 67 6d 65 6e 74 28 46 74 73 35 49 6e 64  eSegment(Fts5Ind
6bc0: 65 78 20 2a 70 2c 20 69 6e 74 20 69 53 65 67 69  ex *p, int iSegi
6bd0: 64 29 7b 0a 20 20 69 36 34 20 69 46 69 72 73 74  d){.  i64 iFirst
6be0: 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
6bf0: 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30 29  ROWID(iSegid, 0)
6c00: 3b 0a 20 20 69 36 34 20 69 4c 61 73 74 20 3d 20  ;.  i64 iLast = 
6c10: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
6c20: 49 44 28 69 53 65 67 69 64 2b 31 2c 20 30 29 2d  ID(iSegid+1, 0)-
6c30: 31 3b 0a 20 20 66 74 73 35 44 61 74 61 44 65 6c  1;.  fts5DataDel
6c40: 65 74 65 28 70 2c 20 69 46 69 72 73 74 2c 20 69  ete(p, iFirst, i
6c50: 4c 61 73 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Last);.  if( p->
6c60: 70 49 64 78 44 65 6c 65 74 65 72 3d 3d 30 20 29  pIdxDeleter==0 )
6c70: 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  {.    Fts5Config
6c80: 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
6c90: 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35  Config;.    fts5
6ca0: 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74  IndexPrepareStmt
6cb0: 28 70 2c 20 26 70 2d 3e 70 49 64 78 44 65 6c 65  (p, &p->pIdxDele
6cc0: 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72  ter, sqlite3_mpr
6cd0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
6ce0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71  "DELETE FROM '%q
6cf0: 27 2e 27 25 71 5f 69 64 78 27 20 57 48 45 52 45  '.'%q_idx' WHERE
6d00: 20 73 65 67 69 64 3d 3f 22 2c 0a 20 20 20 20 20   segid=?",.     
6d10: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
6d20: 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  b, pConfig->zNam
6d30: 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20  e.    ));.  }.  
6d40: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
6d50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
6d60: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e  te3_bind_int(p->
6d70: 70 49 64 78 44 65 6c 65 74 65 72 2c 20 31 2c 20  pIdxDeleter, 1, 
6d80: 69 53 65 67 69 64 29 3b 0a 20 20 20 20 73 71 6c  iSegid);.    sql
6d90: 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64  ite3_step(p->pId
6da0: 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 70  xDeleter);.    p
6db0: 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  ->rc = sqlite3_r
6dc0: 65 73 65 74 28 70 2d 3e 70 49 64 78 44 65 6c 65  eset(p->pIdxDele
6dd0: 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ter);.  }.}../*.
6de0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66  ** Release a ref
6df0: 65 72 65 6e 63 65 20 74 6f 20 61 6e 20 46 74 73  erence to an Fts
6e00: 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63  5Structure objec
6e10: 74 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  t returned by an
6e20: 20 65 61 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c   earlier .** cal
6e30: 6c 20 74 6f 20 66 74 73 35 53 74 72 75 63 74 75  l to fts5Structu
6e40: 72 65 52 65 61 64 28 29 20 6f 72 20 66 74 73 35  reRead() or fts5
6e50: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
6e60: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
6e70: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  d fts5StructureR
6e80: 65 6c 65 61 73 65 28 46 74 73 35 53 74 72 75 63  elease(Fts5Struc
6e90: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
6ea0: 20 20 69 66 28 20 70 53 74 72 75 63 74 20 26 26    if( pStruct &&
6eb0: 20 30 3e 3d 28 2d 2d 70 53 74 72 75 63 74 2d 3e   0>=(--pStruct->
6ec0: 6e 52 65 66 29 20 29 7b 0a 20 20 20 20 69 6e 74  nRef) ){.    int
6ed0: 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   i;.    assert( 
6ee0: 70 53 74 72 75 63 74 2d 3e 6e 52 65 66 3d 3d 30  pStruct->nRef==0
6ef0: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
6f00: 20 69 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76   i<pStruct->nLev
6f10: 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  el; i++){.      
6f20: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74  sqlite3_free(pSt
6f30: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  ruct->aLevel[i].
6f40: 61 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  aSeg);.    }.   
6f50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
6f60: 74 72 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  truct);.  }.}..s
6f70: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
6f80: 74 72 75 63 74 75 72 65 52 65 66 28 46 74 73 35  tructureRef(Fts5
6f90: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
6fa0: 63 74 29 7b 0a 20 20 70 53 74 72 75 63 74 2d 3e  ct){.  pStruct->
6fb0: 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nRef++;.}../*.**
6fc0: 20 44 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64   Deserialize and
6fd0: 20 72 65 74 75 72 6e 20 74 68 65 20 73 74 72 75   return the stru
6fe0: 63 74 75 72 65 20 72 65 63 6f 72 64 20 63 75 72  cture record cur
6ff0: 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
7000: 20 73 65 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66   serialized.** f
7010: 6f 72 6d 20 77 69 74 68 69 6e 20 62 75 66 66 65  orm within buffe
7020: 72 20 70 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a  r pData/nData..*
7030: 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72  *.** The Fts5Str
7040: 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20  ucture.aLevel[] 
7050: 61 6e 64 20 65 61 63 68 20 46 74 73 35 53 74 72  and each Fts5Str
7060: 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67  uctureLevel.aSeg
7070: 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20  [] array.** are 
7080: 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62  over-allocated b
7090: 79 20 6f 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73  y one slot. This
70a0: 20 61 6c 6c 6f 77 73 20 74 68 65 20 73 74 72 75   allows the stru
70b0: 63 74 75 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  cture contents.*
70c0: 2a 20 74 6f 20 62 65 20 6d 6f 72 65 20 65 61 73  * to be more eas
70d0: 69 6c 79 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a  ily edited..**.*
70e0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
70f0: 63 75 72 73 2c 20 2a 70 70 4f 75 74 20 69 73 20  curs, *ppOut is 
7100: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
7110: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
7120: 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64  code.** returned
7130: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 2a 70 70  . Otherwise, *pp
7140: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Out is set to po
7150: 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f  int to the new o
7160: 62 6a 65 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c  bject and.** SQL
7170: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
7180: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
7190: 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f  ts5StructureDeco
71a0: 64 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  de(.  const u8 *
71b0: 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  pData,          
71c0: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
71d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 73 65 72 69 61  containing seria
71e0: 6c 69 7a 65 64 20 73 74 72 75 63 74 75 72 65 20  lized structure 
71f0: 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20  */.  int nData, 
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7210: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
7220: 62 75 66 66 65 72 20 70 44 61 74 61 20 69 6e 20  buffer pData in 
7230: 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  bytes */.  int *
7240: 70 69 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20  piCookie,       
7250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
7260: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b  nfiguration cook
7270: 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74  ie value */.  Ft
7280: 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
7290: 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Out           /*
72a0: 20 4f 55 54 3a 20 44 65 73 65 72 69 61 6c 69 7a   OUT: Deserializ
72b0: 65 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  ed object */.){.
72c0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
72d0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20  E_OK;.  int i = 
72e0: 30 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20  0;.  int iLvl;. 
72f0: 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b   int nLevel = 0;
7300: 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20  .  int nSegment 
7310: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  = 0;.  int nByte
7320: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7330: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
7340: 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  of space to allo
7350: 63 61 74 65 20 61 74 20 70 52 65 74 20 2a 2f 0a  cate at pRet */.
7360: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
7370: 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20  *pRet = 0;      
7380: 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f    /* Structure o
7390: 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20  bject to return 
73a0: 2a 2f 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68  */..  /* Grab th
73b0: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a  e cookie value *
73c0: 2f 0a 20 20 69 66 28 20 70 69 43 6f 6f 6b 69 65  /.  if( piCookie
73d0: 20 29 20 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73   ) *piCookie = s
73e0: 71 6c 69 74 65 33 46 74 73 35 47 65 74 33 32 28  qlite3Fts5Get32(
73f0: 70 44 61 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b  pData);.  i = 4;
7400: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
7410: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
7420: 6c 65 76 65 6c 73 20 61 6e 64 20 73 65 67 6d 65  levels and segme
7430: 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  nts from the sta
7440: 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  rt of the.  ** s
7450: 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e  tructure record.
7460: 20 20 2a 2f 0a 20 20 69 20 2b 3d 20 66 74 73 35    */.  i += fts5
7470: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
7480: 74 61 5b 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a  ta[i], nLevel);.
7490: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
74a0: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
74b0: 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 69  , nSegment);.  i
74c0: 66 28 20 6e 4c 65 76 65 6c 3e 46 54 53 35 5f 4d  f( nLevel>FTS5_M
74d0: 41 58 5f 53 45 47 4d 45 4e 54 20 20 20 7c 7c 20  AX_SEGMENT   || 
74e0: 6e 4c 65 76 65 6c 3c 30 0a 20 20 20 7c 7c 20 6e  nLevel<0.   || n
74f0: 53 65 67 6d 65 6e 74 3e 46 54 53 35 5f 4d 41 58  Segment>FTS5_MAX
7500: 5f 53 45 47 4d 45 4e 54 20 7c 7c 20 6e 53 65 67  _SEGMENT || nSeg
7510: 6d 65 6e 74 3c 30 0a 20 20 29 7b 0a 20 20 20 20  ment<0.  ){.    
7520: 72 65 74 75 72 6e 20 46 54 53 35 5f 43 4f 52 52  return FTS5_CORR
7530: 55 50 54 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  UPT;.  }.  nByte
7540: 20 3d 20 28 0a 20 20 20 20 20 20 73 69 7a 65 6f   = (.      sizeo
7550: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29  f(Fts5Structure)
7560: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
7570: 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74        /* Main st
7580: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20  ructure */.     
7590: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
75a0: 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e  ctureLevel) * (n
75b0: 4c 65 76 65 6c 2d 31 29 20 20 20 20 2f 2a 20 61  Level-1)    /* a
75c0: 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f  Level[] array */
75d0: 0a 20 20 29 3b 0a 20 20 70 52 65 74 20 3d 20 28  .  );.  pRet = (
75e0: 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 73  Fts5Structure*)s
75f0: 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
7600: 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65 29  Zero(&rc, nByte)
7610: 3b 0a 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b  ;..  if( pRet ){
7620: 0a 20 20 20 20 70 52 65 74 2d 3e 6e 52 65 66 20  .    pRet->nRef 
7630: 3d 20 31 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e  = 1;.    pRet->n
7640: 4c 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b 0a  Level = nLevel;.
7650: 20 20 20 20 70 52 65 74 2d 3e 6e 53 65 67 6d 65      pRet->nSegme
7660: 6e 74 20 3d 20 6e 53 65 67 6d 65 6e 74 3b 0a 20  nt = nSegment;. 
7670: 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46     i += sqlite3F
7680: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
7690: 61 74 61 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e  ata[i], &pRet->n
76a0: 57 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a  WriteCounter);..
76b0: 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
76c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
76d0: 20 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69 4c   iLvl<nLevel; iL
76e0: 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73  vl++){.      Fts
76f0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
7700: 2a 70 4c 76 6c 20 3d 20 26 70 52 65 74 2d 3e 61  *pLvl = &pRet->a
7710: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20  Level[iLvl];.   
7720: 20 20 20 69 6e 74 20 6e 54 6f 74 61 6c 20 3d 20     int nTotal = 
7730: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65  0;.      int iSe
7740: 67 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 3e  g;..      if( i>
7750: 3d 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  =nData ){.      
7760: 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52    rc = FTS5_CORR
7770: 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  UPT;.      }else
7780: 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66  {.        i += f
7790: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
77a0: 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e  pData[i], pLvl->
77b0: 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 20  nMerge);.       
77c0: 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
77d0: 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c  int32(&pData[i],
77e0: 20 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20   nTotal);.      
77f0: 20 20 69 66 28 20 6e 54 6f 74 61 6c 3c 70 4c 76    if( nTotal<pLv
7800: 6c 2d 3e 6e 4d 65 72 67 65 20 29 20 72 63 20 3d  l->nMerge ) rc =
7810: 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
7820: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65         pLvl->aSe
7830: 67 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75  g = (Fts5Structu
7840: 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74  reSegment*)sqlit
7850: 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
7860: 28 26 72 63 2c 20 0a 20 20 20 20 20 20 20 20 20  (&rc, .         
7870: 20 20 20 6e 54 6f 74 61 6c 20 2a 20 73 69 7a 65     nTotal * size
7880: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
7890: 53 65 67 6d 65 6e 74 29 0a 20 20 20 20 20 20 20  Segment).       
78a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 53 65 67   );.        nSeg
78b0: 6d 65 6e 74 20 2d 3d 20 6e 54 6f 74 61 6c 3b 0a  ment -= nTotal;.
78c0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
78d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
78e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c   ){.        pLvl
78f0: 2d 3e 6e 53 65 67 20 3d 20 6e 54 6f 74 61 6c 3b  ->nSeg = nTotal;
7900: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65  .        for(iSe
7910: 67 3d 30 3b 20 69 53 65 67 3c 6e 54 6f 74 61 6c  g=0; iSeg<nTotal
7920: 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
7930: 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
7940: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
7950: 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  = &pLvl->aSeg[iS
7960: 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eg];.          i
7970: 66 28 20 69 3e 3d 6e 44 61 74 61 20 29 7b 0a 20  f( i>=nData ){. 
7980: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
7990: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
79a0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
79b0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
79c0: 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35         i += fts5
79d0: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
79e0: 74 61 5b 69 5d 2c 20 70 53 65 67 2d 3e 69 53 65  ta[i], pSeg->iSe
79f0: 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gid);.          
7a00: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
7a10: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
7a20: 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29  pSeg->pgnoFirst)
7a30: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
7a40: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
7a50: 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 53 65 67  (&pData[i], pSeg
7a60: 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20  ->pgnoLast);.   
7a70: 20 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d         if( pSeg-
7a80: 3e 70 67 6e 6f 4c 61 73 74 3c 70 53 65 67 2d 3e  >pgnoLast<pSeg->
7a90: 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20 20 20  pgnoFirst ){.   
7aa0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 46 54           rc = FT
7ab0: 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
7ac0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7ad0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7ae0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
7af0: 20 69 4c 76 6c 3e 30 20 26 26 20 70 4c 76 6c 5b   iLvl>0 && pLvl[
7b00: 2d 31 5d 2e 6e 4d 65 72 67 65 20 26 26 20 6e 54  -1].nMerge && nT
7b10: 6f 74 61 6c 3d 3d 30 20 29 20 72 63 20 3d 20 46  otal==0 ) rc = F
7b20: 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
7b30: 20 20 20 20 20 69 66 28 20 69 4c 76 6c 3d 3d 6e       if( iLvl==n
7b40: 4c 65 76 65 6c 2d 31 20 26 26 20 70 4c 76 6c 2d  Level-1 && pLvl-
7b50: 3e 6e 4d 65 72 67 65 20 29 20 72 63 20 3d 20 46  >nMerge ) rc = F
7b60: 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
7b70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
7b80: 66 28 20 6e 53 65 67 6d 65 6e 74 21 3d 30 20 26  f( nSegment!=0 &
7b90: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
7ba0: 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ) rc = FTS5_CORR
7bb0: 55 50 54 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  UPT;..    if( rc
7bc0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7bd0: 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
7be0: 72 65 52 65 6c 65 61 73 65 28 70 52 65 74 29 3b  reRelease(pRet);
7bf0: 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b  .      pRet = 0;
7c00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
7c10: 70 4f 75 74 20 3d 20 70 52 65 74 3b 0a 20 20 72  pOut = pRet;.  r
7c20: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7c30: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  **.*/.static voi
7c40: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 41  d fts5StructureA
7c50: 64 64 4c 65 76 65 6c 28 69 6e 74 20 2a 70 52 63  ddLevel(int *pRc
7c60: 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  , Fts5Structure 
7c70: 2a 2a 70 70 53 74 72 75 63 74 29 7b 0a 20 20 69  **ppStruct){.  i
7c80: 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
7c90: 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74  OK ){.    Fts5St
7ca0: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
7cb0: 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20   = *ppStruct;.  
7cc0: 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 70    int nLevel = p
7cd0: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a  Struct->nLevel;.
7ce0: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
7cf0: 28 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66  (.        sizeof
7d00: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29 20  (Fts5Structure) 
7d10: 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
7d20: 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72 75 63     /* Main struc
7d30: 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ture */.        
7d40: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
7d50: 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c  tureLevel) * (nL
7d60: 65 76 65 6c 2b 31 29 20 20 2f 2a 20 61 4c 65 76  evel+1)  /* aLev
7d70: 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  el[] array */.  
7d80: 20 20 29 3b 0a 0a 20 20 20 20 70 53 74 72 75 63    );..    pStruc
7d90: 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  t = sqlite3_real
7da0: 6c 6f 63 28 70 53 74 72 75 63 74 2c 20 6e 42 79  loc(pStruct, nBy
7db0: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74  te);.    if( pSt
7dc0: 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20 6d 65  ruct ){.      me
7dd0: 6d 73 65 74 28 26 70 53 74 72 75 63 74 2d 3e 61  mset(&pStruct->a
7de0: 4c 65 76 65 6c 5b 6e 4c 65 76 65 6c 5d 2c 20 30  Level[nLevel], 0
7df0: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
7e00: 75 63 74 75 72 65 4c 65 76 65 6c 29 29 3b 0a 20  uctureLevel));. 
7e10: 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 4c       pStruct->nL
7e20: 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 2a 70  evel++;.      *p
7e30: 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63  pStruct = pStruc
7e40: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
7e50: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
7e60: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
7e70: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 65   }.}../*.** Exte
7e80: 6e 64 20 6c 65 76 65 6c 20 69 4c 76 6c 20 73 6f  nd level iLvl so
7e90: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 72   that there is r
7ea0: 6f 6f 6d 20 66 6f 72 20 61 74 20 6c 65 61 73 74  oom for at least
7eb0: 20 6e 45 78 74 72 61 20 6d 6f 72 65 0a 2a 2a 20   nExtra more.** 
7ec0: 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  segments..*/.sta
7ed0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72  tic void fts5Str
7ee0: 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65  uctureExtendLeve
7ef0: 6c 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a  l(.  int *pRc, .
7f00: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
7f10: 2a 70 53 74 72 75 63 74 2c 20 0a 20 20 69 6e 74  *pStruct, .  int
7f20: 20 69 4c 76 6c 2c 20 0a 20 20 69 6e 74 20 6e 45   iLvl, .  int nE
7f30: 78 74 72 61 2c 20 0a 20 20 69 6e 74 20 62 49 6e  xtra, .  int bIn
7f40: 73 65 72 74 0a 29 7b 0a 20 20 69 66 28 20 2a 70  sert.){.  if( *p
7f50: 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
7f60: 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
7f70: 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
7f80: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
7f90: 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 46 74 73 35  [iLvl];.    Fts5
7fa0: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
7fb0: 20 2a 61 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20   *aNew;.    int 
7fc0: 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 42 79 74  nByte;..    nByt
7fd0: 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20  e = (pLvl->nSeg 
7fe0: 2b 20 6e 45 78 74 72 61 29 20 2a 20 73 69 7a 65  + nExtra) * size
7ff0: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
8000: 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 61 4e  Segment);.    aN
8010: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
8020: 6c 6c 6f 63 28 70 4c 76 6c 2d 3e 61 53 65 67 2c  lloc(pLvl->aSeg,
8030: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
8040: 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 69   aNew ){.      i
8050: 66 28 20 62 49 6e 73 65 72 74 3d 3d 30 20 29 7b  f( bInsert==0 ){
8060: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
8070: 26 61 4e 65 77 5b 70 4c 76 6c 2d 3e 6e 53 65 67  &aNew[pLvl->nSeg
8080: 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  ], 0, sizeof(Fts
8090: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
80a0: 74 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20  t) * nExtra);.  
80b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
80c0: 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 70     int nMove = p
80d0: 4c 76 6c 2d 3e 6e 53 65 67 20 2a 20 73 69 7a 65  Lvl->nSeg * size
80e0: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
80f0: 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Segment);.      
8100: 20 20 6d 65 6d 6d 6f 76 65 28 26 61 4e 65 77 5b    memmove(&aNew[
8110: 6e 45 78 74 72 61 5d 2c 20 61 4e 65 77 2c 20 6e  nExtra], aNew, n
8120: 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 6d  Move);.        m
8130: 65 6d 73 65 74 28 61 4e 65 77 2c 20 30 2c 20 73  emset(aNew, 0, s
8140: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
8150: 75 72 65 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45  ureSegment) * nE
8160: 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xtra);.      }. 
8170: 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20       pLvl->aSeg 
8180: 3d 20 61 4e 65 77 3b 0a 20 20 20 20 7d 65 6c 73  = aNew;.    }els
8190: 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  e{.      *pRc = 
81a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
81b0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69    }.  }.}..stati
81c0: 63 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  c Fts5Structure 
81d0: 2a 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65  *fts5StructureRe
81e0: 61 64 55 6e 63 61 63 68 65 64 28 46 74 73 35 49  adUncached(Fts5I
81f0: 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35  ndex *p){.  Fts5
8200: 53 74 72 75 63 74 75 72 65 20 2a 70 52 65 74 20  Structure *pRet 
8210: 3d 20 30 3b 0a 20 20 46 74 73 35 43 6f 6e 66 69  = 0;.  Fts5Confi
8220: 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
8230: 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20 69  pConfig;.  int i
8240: 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20  Cookie;         
8250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
8260: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b  nfiguration cook
8270: 69 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  ie */.  Fts5Data
8280: 20 2a 70 44 61 74 61 3b 0a 0a 20 20 70 44 61 74   *pData;..  pDat
8290: 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
82a0: 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55  (p, FTS5_STRUCTU
82b0: 52 45 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66 28  RE_ROWID);.  if(
82c0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
82d0: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f  K ){.    /* TODO
82e0: 3a 20 44 6f 20 77 65 20 6e 65 65 64 20 74 68 69  : Do we need thi
82f0: 73 20 69 66 20 74 68 65 20 6c 65 61 66 2d 69 6e  s if the leaf-in
8300: 64 65 78 20 69 73 20 61 70 70 65 6e 64 65 64 3f  dex is appended?
8310: 20 50 72 6f 62 61 62 6c 79 2e 2e 2e 20 2a 2f 0a   Probably... */.
8320: 20 20 20 20 6d 65 6d 73 65 74 28 26 70 44 61 74      memset(&pDat
8330: 61 2d 3e 70 5b 70 44 61 74 61 2d 3e 6e 6e 5d 2c  a->p[pData->nn],
8340: 20 30 2c 20 46 54 53 35 5f 44 41 54 41 5f 50 41   0, FTS5_DATA_PA
8350: 44 44 49 4e 47 29 3b 0a 20 20 20 20 70 2d 3e 72  DDING);.    p->r
8360: 63 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  c = fts5Structur
8370: 65 44 65 63 6f 64 65 28 70 44 61 74 61 2d 3e 70  eDecode(pData->p
8380: 2c 20 70 44 61 74 61 2d 3e 6e 6e 2c 20 26 69 43  , pData->nn, &iC
8390: 6f 6f 6b 69 65 2c 20 26 70 52 65 74 29 3b 0a 20  ookie, &pRet);. 
83a0: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
83b0: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 6f 6e 66  LITE_OK && pConf
83c0: 69 67 2d 3e 69 43 6f 6f 6b 69 65 21 3d 69 43 6f  ig->iCookie!=iCo
83d0: 6f 6b 69 65 20 29 7b 0a 20 20 20 20 20 20 70 2d  okie ){.      p-
83e0: 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73  >rc = sqlite3Fts
83f0: 35 43 6f 6e 66 69 67 4c 6f 61 64 28 70 43 6f 6e  5ConfigLoad(pCon
8400: 66 69 67 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a 20  fig, iCookie);. 
8410: 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74     }.    fts5Dat
8420: 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b  aRelease(pData);
8430: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  .    if( p->rc!=
8440: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8450: 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
8460: 52 65 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20  Release(pRet);. 
8470: 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20       pRet = 0;. 
8480: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
8490: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 73 74 61 74  rn pRet;.}..stat
84a0: 69 63 20 69 36 34 20 66 74 73 35 49 6e 64 65 78  ic i64 fts5Index
84b0: 44 61 74 61 56 65 72 73 69 6f 6e 28 46 74 73 35  DataVersion(Fts5
84c0: 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 36 34  Index *p){.  i64
84d0: 20 69 56 65 72 73 69 6f 6e 20 3d 20 30 3b 0a 0a   iVersion = 0;..
84e0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
84f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
8500: 28 20 70 2d 3e 70 44 61 74 61 56 65 72 73 69 6f  ( p->pDataVersio
8510: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  n==0 ){.      p-
8520: 3e 72 63 20 3d 20 66 74 73 35 49 6e 64 65 78 50  >rc = fts5IndexP
8530: 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70  repareStmt(p, &p
8540: 2d 3e 70 44 61 74 61 56 65 72 73 69 6f 6e 2c 20  ->pDataVersion, 
8550: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8560: 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47  e3_mprintf("PRAG
8570: 4d 41 20 25 51 2e 64 61 74 61 5f 76 65 72 73 69  MA %Q.data_versi
8580: 6f 6e 22 2c 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  on", p->pConfig-
8590: 3e 7a 44 62 29 0a 20 20 20 20 20 20 20 20 20 20  >zDb).          
85a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
85b0: 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  rc ) return 0;. 
85c0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 53 51     }..    if( SQ
85d0: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
85e0: 33 5f 73 74 65 70 28 70 2d 3e 70 44 61 74 61 56  3_step(p->pDataV
85f0: 65 72 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20  ersion) ){.     
8600: 20 69 56 65 72 73 69 6f 6e 20 3d 20 73 71 6c 69   iVersion = sqli
8610: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
8620: 28 70 2d 3e 70 44 61 74 61 56 65 72 73 69 6f 6e  (p->pDataVersion
8630: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
8640: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
8650: 72 65 73 65 74 28 70 2d 3e 70 44 61 74 61 56 65  reset(p->pDataVe
8660: 72 73 69 6f 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72  rsion);.  }..  r
8670: 65 74 75 72 6e 20 69 56 65 72 73 69 6f 6e 3b 0a  eturn iVersion;.
8680: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 2c 20 64  }../*.** Read, d
8690: 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72  eserialize and r
86a0: 65 74 75 72 6e 20 74 68 65 20 73 74 72 75 63 74  eturn the struct
86b0: 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  ure record..**.*
86c0: 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63 74  * The Fts5Struct
86d0: 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64  ure.aLevel[] and
86e0: 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63 74   each Fts5Struct
86f0: 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20  ureLevel.aSeg[] 
8700: 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65  array.** are ove
8710: 72 2d 61 6c 6c 6f 63 61 74 65 64 20 61 73 20 64  r-allocated as d
8720: 65 73 63 72 69 62 65 64 20 66 6f 72 20 66 75 6e  escribed for fun
8730: 63 74 69 6f 6e 20 66 74 73 35 53 74 72 75 63 74  ction fts5Struct
8740: 75 72 65 44 65 63 6f 64 65 28 29 20 0a 2a 2a 20  ureDecode() .** 
8750: 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  above..**.** If 
8760: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
8770: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
8780: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  d and an error c
8790: 6f 64 65 20 6c 65 66 74 20 69 6e 20 74 68 65 0a  ode left in the.
87a0: 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e  ** Fts5Index han
87b0: 64 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  dle. If an error
87c0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
87d0: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
87e0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  function.** is c
87f0: 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
8800: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
8810: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 66  Fts5Structure *f
8820: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
8830: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
8840: 0a 20 20 69 66 28 20 70 2d 3e 70 53 74 72 75 63  .  if( p->pStruc
8850: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 69  t==0 ){.    p->i
8860: 53 74 72 75 63 74 56 65 72 73 69 6f 6e 20 3d 20  StructVersion = 
8870: 66 74 73 35 49 6e 64 65 78 44 61 74 61 56 65 72  fts5IndexDataVer
8880: 73 69 6f 6e 28 70 29 3b 0a 20 20 20 20 69 66 28  sion(p);.    if(
8890: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
88a0: 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 53  K ){.      p->pS
88b0: 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
88c0: 63 74 75 72 65 52 65 61 64 55 6e 63 61 63 68 65  ctureReadUncache
88d0: 64 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  d(p);.    }.  }.
88e0: 0a 23 69 66 20 30 0a 20 20 65 6c 73 65 7b 0a 20  .#if 0.  else{. 
88f0: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
8900: 20 2a 70 54 65 73 74 20 3d 20 66 74 73 35 53 74   *pTest = fts5St
8910: 72 75 63 74 75 72 65 52 65 61 64 55 6e 63 61 63  ructureReadUncac
8920: 68 65 64 28 70 29 3b 0a 20 20 20 20 69 66 28 20  hed(p);.    if( 
8930: 70 54 65 73 74 20 29 7b 0a 20 20 20 20 20 20 69  pTest ){.      i
8940: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 61  nt i, j;.      a
8950: 73 73 65 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74  ssert_nc( p->pSt
8960: 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d  ruct->nSegment==
8970: 70 54 65 73 74 2d 3e 6e 53 65 67 6d 65 6e 74 20  pTest->nSegment 
8980: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f  );.      assert_
8990: 6e 63 28 20 70 2d 3e 70 53 74 72 75 63 74 2d 3e  nc( p->pStruct->
89a0: 6e 4c 65 76 65 6c 3d 3d 70 54 65 73 74 2d 3e 6e  nLevel==pTest->n
89b0: 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20 20 20 66  Level );.      f
89c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 65 73 74 2d  or(i=0; i<pTest-
89d0: 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20  >nLevel; i++){. 
89e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63         assert_nc
89f0: 28 20 70 2d 3e 70 53 74 72 75 63 74 2d 3e 61 4c  ( p->pStruct->aL
8a00: 65 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 3d 3d  evel[i].nMerge==
8a10: 70 54 65 73 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d  pTest->aLevel[i]
8a20: 2e 6e 4d 65 72 67 65 20 29 3b 0a 20 20 20 20 20  .nMerge );.     
8a30: 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 2d     assert_nc( p-
8a40: 3e 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  >pStruct->aLevel
8a50: 5b 69 5d 2e 6e 53 65 67 3d 3d 70 54 65 73 74 2d  [i].nSeg==pTest-
8a60: 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65 67 20  >aLevel[i].nSeg 
8a70: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  );.        for(j
8a80: 3d 30 3b 20 6a 3c 70 54 65 73 74 2d 3e 61 4c 65  =0; j<pTest->aLe
8a90: 76 65 6c 5b 69 5d 2e 6e 53 65 67 3b 20 6a 2b 2b  vel[i].nSeg; j++
8aa0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74 73  ){.          Fts
8ab0: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
8ac0: 74 20 2a 70 31 20 3d 20 26 70 54 65 73 74 2d 3e  t *p1 = &pTest->
8ad0: 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65 67 5b 6a  aLevel[i].aSeg[j
8ae0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 46 74 73  ];.          Fts
8af0: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
8b00: 74 20 2a 70 32 20 3d 20 26 70 2d 3e 70 53 74 72  t *p2 = &p->pStr
8b10: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61  uct->aLevel[i].a
8b20: 53 65 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  Seg[j];.        
8b30: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 31 2d    assert_nc( p1-
8b40: 3e 69 53 65 67 69 64 3d 3d 70 32 2d 3e 69 53 65  >iSegid==p2->iSe
8b50: 67 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  gid );.         
8b60: 20 61 73 73 65 72 74 5f 6e 63 28 20 70 31 2d 3e   assert_nc( p1->
8b70: 70 67 6e 6f 46 69 72 73 74 3d 3d 70 32 2d 3e 70  pgnoFirst==p2->p
8b80: 67 6e 6f 46 69 72 73 74 20 29 3b 0a 20 20 20 20  gnoFirst );.    
8b90: 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
8ba0: 20 70 31 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d 70   p1->pgnoLast==p
8bb0: 32 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 3b 0a 20  2->pgnoLast );. 
8bc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8bd0: 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
8be0: 74 75 72 65 52 65 6c 65 61 73 65 28 70 54 65 73  tureRelease(pTes
8bf0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  t);.    }.  }.#e
8c00: 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 2d 3e 72  ndif..  if( p->r
8c10: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
8c20: 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72  eturn 0;.  asser
8c30: 74 28 20 70 2d 3e 69 53 74 72 75 63 74 56 65 72  t( p->iStructVer
8c40: 73 69 6f 6e 21 3d 30 20 29 3b 0a 20 20 61 73 73  sion!=0 );.  ass
8c50: 65 72 74 28 20 70 2d 3e 70 53 74 72 75 63 74 21  ert( p->pStruct!
8c60: 3d 30 20 29 3b 0a 20 20 66 74 73 35 53 74 72 75  =0 );.  fts5Stru
8c70: 63 74 75 72 65 52 65 66 28 70 2d 3e 70 53 74 72  ctureRef(p->pStr
8c80: 75 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  uct);.  return p
8c90: 2d 3e 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 73 74  ->pStruct;.}..st
8ca0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74  atic void fts5St
8cb0: 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74  ructureInvalidat
8cc0: 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  e(Fts5Index *p){
8cd0: 0a 20 20 69 66 28 20 70 2d 3e 70 53 74 72 75 63  .  if( p->pStruc
8ce0: 74 20 29 7b 0a 20 20 20 20 66 74 73 35 53 74 72  t ){.    fts5Str
8cf0: 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 2d  uctureRelease(p-
8d00: 3e 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 70  >pStruct);.    p
8d10: 2d 3e 70 53 74 72 75 63 74 20 3d 20 30 3b 0a 20  ->pStruct = 0;. 
8d20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
8d30: 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
8d40: 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
8d50: 69 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  in index structu
8d60: 72 65 20 70 53 74 72 75 63 74 2e 20 54 68 69 73  re pStruct. This
8d70: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
8d80: 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20 61  only ever used a
8d90: 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74  s part of assert
8da0: 28 29 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 2a  () conditions..*
8db0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
8dc0: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
8dd0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 43 6f   fts5StructureCo
8de0: 75 6e 74 53 65 67 6d 65 6e 74 73 28 46 74 73 35  untSegments(Fts5
8df0: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
8e00: 63 74 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67 6d  ct){.  int nSegm
8e10: 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ent = 0;        
8e20: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
8e30: 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e  number of segmen
8e40: 74 73 20 2a 2f 0a 20 20 69 66 28 20 70 53 74 72  ts */.  if( pStr
8e50: 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  uct ){.    int i
8e60: 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Lvl;            
8e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
8e80: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
8e90: 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20  ugh levels */.  
8ea0: 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
8eb0: 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
8ec0: 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
8ed0: 20 20 20 6e 53 65 67 6d 65 6e 74 20 2b 3d 20 70     nSegment += p
8ee0: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
8ef0: 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 20 20 20 20 7d  Lvl].nSeg;.    }
8f00: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e  .  }..  return n
8f10: 53 65 67 6d 65 6e 74 3b 0a 7d 0a 23 65 6e 64 69  Segment;.}.#endi
8f20: 66 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42  f..#define fts5B
8f30: 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
8f40: 6c 6f 62 28 70 42 75 66 2c 20 70 42 6c 6f 62 2c  lob(pBuf, pBlob,
8f50: 20 6e 42 6c 6f 62 29 20 7b 20 20 20 20 20 5c 0a   nBlob) {     \.
8f60: 20 20 61 73 73 65 72 74 28 20 28 70 42 75 66 29    assert( (pBuf)
8f70: 2d 3e 6e 53 70 61 63 65 3e 3d 28 28 70 42 75 66  ->nSpace>=((pBuf
8f80: 29 2d 3e 6e 2b 6e 42 6c 6f 62 29 20 29 3b 20 20  )->n+nBlob) );  
8f90: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6d             \.  m
8fa0: 65 6d 63 70 79 28 26 28 70 42 75 66 29 2d 3e 70  emcpy(&(pBuf)->p
8fb0: 5b 28 70 42 75 66 29 2d 3e 6e 5d 2c 20 70 42 6c  [(pBuf)->n], pBl
8fc0: 6f 62 2c 20 6e 42 6c 6f 62 29 3b 20 20 20 20 20  ob, nBlob);     
8fd0: 20 20 20 20 20 20 20 20 5c 0a 20 20 28 70 42 75          \.  (pBu
8fe0: 66 29 2d 3e 6e 20 2b 3d 20 6e 42 6c 6f 62 3b 20  f)->n += nBlob; 
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9010: 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e       \.}..#defin
9020: 65 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65  e fts5BufferSafe
9030: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75  AppendVarint(pBu
9040: 66 2c 20 69 56 61 6c 29 20 7b 20 20 20 20 20 20  f, iVal) {      
9050: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 28 70            \.  (p
9060: 42 75 66 29 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  Buf)->n += sqlit
9070: 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28  e3Fts5PutVarint(
9080: 26 28 70 42 75 66 29 2d 3e 70 5b 28 70 42 75 66  &(pBuf)->p[(pBuf
9090: 29 2d 3e 6e 5d 2c 20 28 69 56 61 6c 29 29 3b 20  )->n], (iVal)); 
90a0: 20 5c 0a 20 20 61 73 73 65 72 74 28 20 28 70 42   \.  assert( (pB
90b0: 75 66 29 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 42  uf)->nSpace>=(pB
90c0: 75 66 29 2d 3e 6e 20 29 3b 20 20 20 20 20 20 20  uf)->n );       
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90e0: 20 20 20 5c 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53     \.}.../*.** S
90f0: 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 73 74 6f  erialize and sto
9100: 72 65 20 74 68 65 20 22 73 74 72 75 63 74 75 72  re the "structur
9110: 65 22 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  e" record..**.**
9120: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
9130: 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
9140: 72 6f 72 20 63 6f 64 65 20 69 6e 20 74 68 65 20  ror code in the 
9150: 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74  Fts5Index object
9160: 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  . If an.** error
9170: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
9180: 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
9190: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
91a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
91b0: 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69  fts5StructureWri
91c0: 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  te(Fts5Index *p,
91d0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
91e0: 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20  pStruct){.  if( 
91f0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
9200: 20 29 7b 0a 20 20 20 20 46 74 73 35 42 75 66 66   ){.    Fts5Buff
9210: 65 72 20 62 75 66 3b 20 20 20 20 20 20 20 20 20  er buf;         
9220: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
9230: 74 6f 20 73 65 72 69 61 6c 69 7a 65 20 72 65 63  to serialize rec
9240: 6f 72 64 20 69 6e 74 6f 20 2a 2f 0a 20 20 20 20  ord into */.    
9250: 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20  int iLvl;       
9260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9270: 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
9280: 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20   through levels 
9290: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b  */.    int iCook
92a0: 69 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ie;             
92b0: 20 20 20 20 20 2f 2a 20 43 6f 6f 6b 69 65 20 76       /* Cookie v
92c0: 61 6c 75 65 20 74 6f 20 73 74 6f 72 65 20 2a 2f  alue to store */
92d0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ..    assert( pS
92e0: 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d  truct->nSegment=
92f0: 3d 66 74 73 35 53 74 72 75 63 74 75 72 65 43 6f  =fts5StructureCo
9300: 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72  untSegments(pStr
9310: 75 63 74 29 20 29 3b 0a 20 20 20 20 6d 65 6d 73  uct) );.    mems
9320: 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65  et(&buf, 0, size
9330: 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b  of(Fts5Buffer));
9340: 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ..    /* Append 
9350: 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 66  the current conf
9360: 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65  iguration cookie
9370: 20 2a 2f 0a 20 20 20 20 69 43 6f 6f 6b 69 65 20   */.    iCookie 
9380: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 69 43  = p->pConfig->iC
9390: 6f 6f 6b 69 65 3b 0a 20 20 20 20 69 66 28 20 69  ookie;.    if( i
93a0: 43 6f 6f 6b 69 65 3c 30 20 29 20 69 43 6f 6f 6b  Cookie<0 ) iCook
93b0: 69 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  ie = 0;..    if(
93c0: 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 42   0==sqlite3Fts5B
93d0: 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63  ufferSize(&p->rc
93e0: 2c 20 26 62 75 66 2c 20 34 2b 39 2b 39 2b 39 29  , &buf, 4+9+9+9)
93f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9400: 33 46 74 73 35 50 75 74 33 32 28 62 75 66 2e 70  3Fts5Put32(buf.p
9410: 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a 20 20 20 20  , iCookie);.    
9420: 20 20 62 75 66 2e 6e 20 3d 20 34 3b 0a 20 20 20    buf.n = 4;.   
9430: 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
9440: 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62  eAppendVarint(&b
9450: 75 66 2c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  uf, pStruct->nLe
9460: 76 65 6c 29 3b 0a 20 20 20 20 20 20 66 74 73 35  vel);.      fts5
9470: 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
9480: 56 61 72 69 6e 74 28 26 62 75 66 2c 20 70 53 74  Varint(&buf, pSt
9490: 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 29 3b  ruct->nSegment);
94a0: 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
94b0: 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
94c0: 74 28 26 62 75 66 2c 20 28 69 36 34 29 70 53 74  t(&buf, (i64)pSt
94d0: 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e  ruct->nWriteCoun
94e0: 74 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ter);.    }..   
94f0: 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
9500: 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
9510: 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
9520: 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20    int iSeg;     
9530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9540: 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
9550: 74 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65  te through segme
9560: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 74 73  nts */.      Fts
9570: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
9580: 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74  *pLvl = &pStruct
9590: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
95a0: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
95b0: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
95c0: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
95d0: 3e 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20  >nMerge);.      
95e0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
95f0: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
9600: 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 29  buf, pLvl->nSeg)
9610: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9620: 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c  pLvl->nMerge<=pL
9630: 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 20  vl->nSeg );..   
9640: 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
9650: 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20  Seg<pLvl->nSeg; 
9660: 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
9670: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
9680: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
9690: 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67  &buf, pLvl->aSeg
96a0: 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a  [iSeg].iSegid);.
96b0: 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
96c0: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
96d0: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76  p->rc, &buf, pLv
96e0: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67  l->aSeg[iSeg].pg
96f0: 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  noFirst);.      
9700: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
9710: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
9720: 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65   &buf, pLvl->aSe
9730: 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74  g[iSeg].pgnoLast
9740: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9750: 0a 0a 20 20 20 20 66 74 73 35 44 61 74 61 57 72  ..    fts5DataWr
9760: 69 74 65 28 70 2c 20 46 54 53 35 5f 53 54 52 55  ite(p, FTS5_STRU
9770: 43 54 55 52 45 5f 52 4f 57 49 44 2c 20 62 75 66  CTURE_ROWID, buf
9780: 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20 20  .p, buf.n);.    
9790: 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
97a0: 62 75 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  buf);.  }.}..#if
97b0: 20 30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66   0.static void f
97c0: 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75 72  ts5DebugStructur
97d0: 65 28 69 6e 74 2a 2c 46 74 73 35 42 75 66 66 65  e(int*,Fts5Buffe
97e0: 72 2a 2c 46 74 73 35 53 74 72 75 63 74 75 72 65  r*,Fts5Structure
97f0: 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  *);.static void 
9800: 66 74 73 35 50 72 69 6e 74 53 74 72 75 63 74 75  fts5PrintStructu
9810: 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  re(const char *z
9820: 43 61 70 74 69 6f 6e 2c 20 46 74 73 35 53 74 72  Caption, Fts5Str
9830: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
9840: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
9850: 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 42 75  ITE_OK;.  Fts5Bu
9860: 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d 73  ffer buf;.  mems
9870: 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65  et(&buf, 0, size
9880: 6f 66 28 62 75 66 29 29 3b 0a 20 20 66 74 73 35  of(buf));.  fts5
9890: 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28 26  DebugStructure(&
98a0: 72 63 2c 20 26 62 75 66 2c 20 70 53 74 72 75 63  rc, &buf, pStruc
98b0: 74 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74  t);.  fprintf(st
98c0: 64 6f 75 74 2c 20 22 25 73 3a 20 25 73 5c 6e 22  dout, "%s: %s\n"
98d0: 2c 20 7a 43 61 70 74 69 6f 6e 2c 20 62 75 66 2e  , zCaption, buf.
98e0: 70 29 3b 0a 20 20 66 66 6c 75 73 68 28 73 74 64  p);.  fflush(std
98f0: 6f 75 74 29 3b 0a 20 20 66 74 73 35 42 75 66 66  out);.  fts5Buff
9900: 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a  erFree(&buf);.}.
9910: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66  #else.# define f
9920: 74 73 35 50 72 69 6e 74 53 74 72 75 63 74 75 72  ts5PrintStructur
9930: 65 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 73  e(x,y).#endif..s
9940: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 65  tatic int fts5Se
9950: 67 6d 65 6e 74 53 69 7a 65 28 46 74 73 35 53 74  gmentSize(Fts5St
9960: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
9970: 70 53 65 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  pSeg){.  return 
9980: 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  1 + pSeg->pgnoLa
9990: 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46  st - pSeg->pgnoF
99a0: 69 72 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  irst;.}../*.** R
99b0: 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66 20  eturn a copy of 
99c0: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  index structure 
99d0: 70 53 74 72 75 63 74 2e 20 45 78 63 65 70 74 2c  pStruct. Except,
99e0: 20 70 72 6f 6d 6f 74 65 20 61 73 20 6d 61 6e 79   promote as many
99f0: 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 61 73   .** segments as
9a00: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 65 76   possible to lev
9a10: 65 6c 20 69 50 72 6f 6d 6f 74 65 2e 20 49 66 20  el iPromote. If 
9a20: 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 4e  an OOM occurs, N
9a30: 55 4c 4c 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  ULL is .** retur
9a40: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ned..*/.static v
9a50: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
9a60: 65 50 72 6f 6d 6f 74 65 54 6f 28 0a 20 20 46 74  ePromoteTo(.  Ft
9a70: 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 6e  s5Index *p,.  in
9a80: 74 20 69 50 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e  t iPromote,.  in
9a90: 74 20 73 7a 50 72 6f 6d 6f 74 65 2c 0a 20 20 46  t szPromote,.  F
9aa0: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
9ab0: 74 72 75 63 74 0a 29 7b 0a 20 20 69 6e 74 20 69  truct.){.  int i
9ac0: 6c 2c 20 69 73 3b 0a 20 20 46 74 73 35 53 74 72  l, is;.  Fts5Str
9ad0: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4f 75  uctureLevel *pOu
9ae0: 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  t = &pStruct->aL
9af0: 65 76 65 6c 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a  evel[iPromote];.
9b00: 0a 20 20 69 66 28 20 70 4f 75 74 2d 3e 6e 4d 65  .  if( pOut->nMe
9b10: 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f  rge==0 ){.    fo
9b20: 72 28 69 6c 3d 69 50 72 6f 6d 6f 74 65 2b 31 3b  r(il=iPromote+1;
9b30: 20 69 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65   il<pStruct->nLe
9b40: 76 65 6c 3b 20 69 6c 2b 2b 29 7b 0a 20 20 20 20  vel; il++){.    
9b50: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
9b60: 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53  evel *pLvl = &pS
9b70: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c  truct->aLevel[il
9b80: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76  ];.      if( pLv
9b90: 6c 2d 3e 6e 4d 65 72 67 65 20 29 20 72 65 74 75  l->nMerge ) retu
9ba0: 72 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 73  rn;.      for(is
9bb0: 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69  =pLvl->nSeg-1; i
9bc0: 73 3e 3d 30 3b 20 69 73 2d 2d 29 7b 0a 20 20 20  s>=0; is--){.   
9bd0: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 66 74       int sz = ft
9be0: 73 35 53 65 67 6d 65 6e 74 53 69 7a 65 28 26 70  s5SegmentSize(&p
9bf0: 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 29 3b 0a  Lvl->aSeg[is]);.
9c00: 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e 73          if( sz>s
9c10: 7a 50 72 6f 6d 6f 74 65 20 29 20 72 65 74 75 72  zPromote ) retur
9c20: 6e 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  n;.        fts5S
9c30: 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65  tructureExtendLe
9c40: 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72  vel(&p->rc, pStr
9c50: 75 63 74 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 31  uct, iPromote, 1
9c60: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
9c70: 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
9c80: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
9c90: 28 70 4f 75 74 2d 3e 61 53 65 67 2c 20 26 70 4c  (pOut->aSeg, &pL
9ca0: 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 2c 20 73 69  vl->aSeg[is], si
9cb0: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
9cc0: 72 65 53 65 67 6d 65 6e 74 29 29 3b 0a 20 20 20  reSegment));.   
9cd0: 20 20 20 20 20 70 4f 75 74 2d 3e 6e 53 65 67 2b       pOut->nSeg+
9ce0: 2b 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  +;.        pLvl-
9cf0: 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20 7d  >nSeg--;.      }
9d00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
9d10: 0a 2a 2a 20 41 20 6e 65 77 20 73 65 67 6d 65 6e  .** A new segmen
9d20: 74 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  t has just been 
9d30: 77 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c  written to level
9d40: 20 69 4c 76 6c 20 6f 66 20 69 6e 64 65 78 20 73   iLvl of index s
9d50: 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 53 74 72  tructure.** pStr
9d60: 75 63 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69  uct. This functi
9d70: 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  on determines if
9d80: 20 61 6e 79 20 73 65 67 6d 65 6e 74 73 20 73 68   any segments sh
9d90: 6f 75 6c 64 20 62 65 20 70 72 6f 6d 6f 74 65 64  ould be promoted
9da0: 0a 2a 2a 20 61 73 20 61 20 72 65 73 75 6c 74 2e  .** as a result.
9db0: 20 53 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72   Segments are pr
9dc0: 6f 6d 6f 74 65 64 20 69 6e 20 74 77 6f 20 73 63  omoted in two sc
9dd0: 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20  enarios:.**.**  
9de0: 20 61 29 20 49 66 20 74 68 65 20 73 65 67 6d 65   a) If the segme
9df0: 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  nt just written 
9e00: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
9e10: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d  one or more segm
9e20: 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 77 69 74  ents.**      wit
9e30: 68 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73  hin the previous
9e40: 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c   populated level
9e50: 2c 20 69 74 20 69 73 20 70 72 6f 6d 6f 74 65 64  , it is promoted
9e60: 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
9e70: 0a 2a 2a 20 20 20 20 20 20 70 6f 70 75 6c 61 74  .**      populat
9e80: 65 64 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20  ed level..**.** 
9e90: 20 20 62 29 20 49 66 20 74 68 65 20 73 65 67 6d    b) If the segm
9ea0: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
9eb0: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
9ec0: 74 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65  the newest segme
9ed0: 6e 74 20 6f 6e 0a 2a 2a 20 20 20 20 20 20 74 68  nt on.**      th
9ee0: 65 20 6e 65 78 74 20 70 6f 70 75 6c 61 74 65 64  e next populated
9ef0: 20 6c 65 76 65 6c 2c 20 74 68 65 6e 20 74 68 61   level, then tha
9f00: 74 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20 61  t segment, and a
9f10: 6e 79 20 6f 74 68 65 72 20 61 64 6a 61 63 65 6e  ny other adjacen
9f20: 74 0a 2a 2a 20 20 20 20 20 20 73 65 67 6d 65 6e  t.**      segmen
9f30: 74 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f  ts that are also
9f40: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
9f50: 65 20 6f 6e 65 20 6a 75 73 74 20 77 72 69 74 74  e one just writt
9f60: 65 6e 2c 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  en, are .**     
9f70: 20 70 72 6f 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a   promoted. .**.*
9f80: 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  * If one or more
9f90: 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72   segments are pr
9fa0: 6f 6d 6f 74 65 64 2c 20 74 68 65 20 73 74 72 75  omoted, the stru
9fb0: 63 74 75 72 65 20 6f 62 6a 65 63 74 20 69 73 20  cture object is 
9fc0: 75 70 64 61 74 65 64 0a 2a 2a 20 74 6f 20 72 65  updated.** to re
9fd0: 66 6c 65 63 74 20 74 68 69 73 2e 0a 2a 2f 0a 73  flect this..*/.s
9fe0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
9ff0: 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28  tructurePromote(
a000: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
a010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a020: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
a030: 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  nd object */.  i
a040: 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20  nt iLvl,        
a050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a060: 2a 20 49 6e 64 65 78 20 6c 65 76 65 6c 20 6a 75  * Index level ju
a070: 73 74 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20  st updated */.  
a080: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
a090: 53 74 72 75 63 74 20 20 20 20 20 20 20 20 20 20  Struct          
a0a0: 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  /* Index structu
a0b0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  re */.){.  if( p
a0c0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
a0d0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 54 73 74 3b  ){.    int iTst;
a0e0: 0a 20 20 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74  .    int iPromot
a0f0: 65 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20  e = -1;.    int 
a100: 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 30 3b 20 20  szPromote = 0;  
a110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
a120: 6d 6f 74 65 20 61 6e 79 74 68 69 6e 67 20 74 68  mote anything th
a130: 69 73 20 73 69 7a 65 20 6f 72 20 73 6d 61 6c 6c  is size or small
a140: 65 72 20 2a 2f 0a 20 20 20 20 46 74 73 35 53 74  er */.    Fts5St
a150: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
a160: 70 53 65 67 3b 20 20 20 2f 2a 20 53 65 67 6d 65  pSeg;   /* Segme
a170: 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  nt just written 
a180: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 53 65 67  */.    int szSeg
a190: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a1a0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
a1b0: 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69  segment just wri
a1c0: 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tten */.    int 
a1d0: 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e  nSeg = pStruct->
a1e0: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
a1f0: 67 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 65 67  g;..    if( nSeg
a200: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
a210: 20 20 70 53 65 67 20 3d 20 26 70 53 74 72 75 63    pSeg = &pStruc
a220: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
a230: 61 53 65 67 5b 70 53 74 72 75 63 74 2d 3e 61 4c  aSeg[pStruct->aL
a240: 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 2d  evel[iLvl].nSeg-
a250: 31 5d 3b 0a 20 20 20 20 73 7a 53 65 67 20 3d 20  1];.    szSeg = 
a260: 28 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  (1 + pSeg->pgnoL
a270: 61 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f  ast - pSeg->pgno
a280: 46 69 72 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  First);..    /* 
a290: 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e 64 69 74  Check for condit
a2a0: 69 6f 6e 20 28 61 29 20 2a 2f 0a 20 20 20 20 66  ion (a) */.    f
a2b0: 6f 72 28 69 54 73 74 3d 69 4c 76 6c 2d 31 3b 20  or(iTst=iLvl-1; 
a2c0: 69 54 73 74 3e 3d 30 20 26 26 20 70 53 74 72 75  iTst>=0 && pStru
a2d0: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d  ct->aLevel[iTst]
a2e0: 2e 6e 53 65 67 3d 3d 30 3b 20 69 54 73 74 2d 2d  .nSeg==0; iTst--
a2f0: 29 3b 0a 20 20 20 20 69 66 28 20 69 54 73 74 3e  );.    if( iTst>
a300: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
a310: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 4d  i;.      int szM
a320: 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 46 74  ax = 0;.      Ft
a330: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
a340: 20 2a 70 54 73 74 20 3d 20 26 70 53 74 72 75 63   *pTst = &pStruc
a350: 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d 3b  t->aLevel[iTst];
a360: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a370: 54 73 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29  Tst->nMerge==0 )
a380: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
a390: 20 69 3c 70 54 73 74 2d 3e 6e 53 65 67 3b 20 69   i<pTst->nSeg; i
a3a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
a3b0: 20 73 7a 20 3d 20 70 54 73 74 2d 3e 61 53 65 67   sz = pTst->aSeg
a3c0: 5b 69 5d 2e 70 67 6e 6f 4c 61 73 74 20 2d 20 70  [i].pgnoLast - p
a3d0: 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67 6e  Tst->aSeg[i].pgn
a3e0: 6f 46 69 72 73 74 20 2b 20 31 3b 0a 20 20 20 20  oFirst + 1;.    
a3f0: 20 20 20 20 69 66 28 20 73 7a 3e 73 7a 4d 61 78      if( sz>szMax
a400: 20 29 20 73 7a 4d 61 78 20 3d 20 73 7a 3b 0a 20   ) szMax = sz;. 
a410: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a420: 20 73 7a 4d 61 78 3e 3d 73 7a 53 65 67 20 29 7b   szMax>=szSeg ){
a430: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64  .        /* Cond
a440: 69 74 69 6f 6e 20 28 61 29 20 69 73 20 74 72 75  ition (a) is tru
a450: 65 2e 20 50 72 6f 6d 6f 74 65 20 74 68 65 20 6e  e. Promote the n
a460: 65 77 65 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e  ewest segment on
a470: 20 6c 65 76 65 6c 20 0a 20 20 20 20 20 20 20 20   level .        
a480: 2a 2a 20 69 4c 76 6c 20 74 6f 20 6c 65 76 65 6c  ** iLvl to level
a490: 20 69 54 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20   iTst.  */.     
a4a0: 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69 54     iPromote = iT
a4b0: 73 74 3b 0a 20 20 20 20 20 20 20 20 73 7a 50 72  st;.        szPr
a4c0: 6f 6d 6f 74 65 20 3d 20 73 7a 4d 61 78 3b 0a 20  omote = szMax;. 
a4d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a4e0: 20 20 2f 2a 20 49 66 20 63 6f 6e 64 69 74 69 6f    /* If conditio
a4f0: 6e 20 28 61 29 20 69 73 20 6e 6f 74 20 6d 65 74  n (a) is not met
a500: 2c 20 61 73 73 75 6d 65 20 28 62 29 20 69 73 20  , assume (b) is 
a510: 74 72 75 65 2e 20 53 74 72 75 63 74 75 72 65 50  true. StructureP
a520: 72 6f 6d 6f 74 65 54 6f 28 29 0a 20 20 20 20 2a  romoteTo().    *
a530: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  * is a no-op if 
a540: 69 74 20 69 73 20 6e 6f 74 2e 20 20 2a 2f 0a 20  it is not.  */. 
a550: 20 20 20 69 66 28 20 69 50 72 6f 6d 6f 74 65 3c     if( iPromote<
a560: 30 20 29 7b 0a 20 20 20 20 20 20 69 50 72 6f 6d  0 ){.      iProm
a570: 6f 74 65 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20  ote = iLvl;.    
a580: 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a    szPromote = sz
a590: 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  Seg;.    }.    f
a5a0: 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d  ts5StructureProm
a5b0: 6f 74 65 54 6f 28 70 2c 20 69 50 72 6f 6d 6f 74  oteTo(p, iPromot
a5c0: 65 2c 20 73 7a 50 72 6f 6d 6f 74 65 2c 20 70 53  e, szPromote, pS
a5d0: 74 72 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  truct);.  }.}...
a5e0: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
a5f0: 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
a600: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
a610: 67 75 6d 65 6e 74 2e 20 49 66 20 74 68 65 20 65  gument. If the e
a620: 6e 64 20 6f 66 20 74 68 65 20 0a 2a 2a 20 64 6f  nd of the .** do
a630: 63 6c 69 73 74 2d 69 6e 64 65 78 20 70 61 67 65  clist-index page
a640: 20 69 73 20 72 65 61 63 68 65 64 2c 20 72 65 74   is reached, ret
a650: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f  urn non-zero..*/
a660: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
a670: 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 46 74 73  DlidxLvlNext(Fts
a680: 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29  5DlidxLvl *pLvl)
a690: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  {.  Fts5Data *pD
a6a0: 61 74 61 20 3d 20 70 4c 76 6c 2d 3e 70 44 61 74  ata = pLvl->pDat
a6b0: 61 3b 0a 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e  a;..  if( pLvl->
a6c0: 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  iOff==0 ){.    a
a6d0: 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45 6f  ssert( pLvl->bEo
a6e0: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76 6c  f==0 );.    pLvl
a6f0: 2d 3e 69 4f 66 66 20 3d 20 31 3b 0a 20 20 20 20  ->iOff = 1;.    
a700: 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66 74  pLvl->iOff += ft
a710: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
a720: 44 61 74 61 2d 3e 70 5b 31 5d 2c 20 70 4c 76 6c  Data->p[1], pLvl
a730: 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20  ->iLeafPgno);.  
a740: 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20    pLvl->iOff += 
a750: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  fts5GetVarint(&p
a760: 44 61 74 61 2d 3e 70 5b 70 4c 76 6c 2d 3e 69 4f  Data->p[pLvl->iO
a770: 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 4c 76 6c  ff], (u64*)&pLvl
a780: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70  ->iRowid);.    p
a790: 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 3d  Lvl->iFirstOff =
a7a0: 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 20 20 7d   pLvl->iOff;.  }
a7b0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 4f  else{.    int iO
a7c0: 66 66 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66 66  ff;.    for(iOff
a7d0: 3d 70 4c 76 6c 2d 3e 69 4f 66 66 3b 20 69 4f 66  =pLvl->iOff; iOf
a7e0: 66 3c 70 44 61 74 61 2d 3e 6e 6e 3b 20 69 4f 66  f<pData->nn; iOf
a7f0: 66 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  f++){.      if( 
a800: 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 20 29  pData->p[iOff] )
a810: 20 62 72 65 61 6b 3b 20 0a 20 20 20 20 7d 0a 0a   break; .    }..
a820: 20 20 20 20 69 66 28 20 69 4f 66 66 3c 70 44 61      if( iOff<pDa
a830: 74 61 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 20 20  ta->nn ){.      
a840: 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 20 20  i64 iVal;.      
a850: 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  pLvl->iLeafPgno 
a860: 2b 3d 20 28 69 4f 66 66 20 2d 20 70 4c 76 6c 2d  += (iOff - pLvl-
a870: 3e 69 4f 66 66 29 20 2b 20 31 3b 0a 20 20 20 20  >iOff) + 1;.    
a880: 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
a890: 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e  tVarint(&pData->
a8a0: 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  p[iOff], (u64*)&
a8b0: 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 70 4c 76  iVal);.      pLv
a8c0: 6c 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 56 61  l->iRowid += iVa
a8d0: 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69  l;.      pLvl->i
a8e0: 4f 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20  Off = iOff;.    
a8f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 76  }else{.      pLv
a900: 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20  l->bEof = 1;.   
a910: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
a920: 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a   pLvl->bEof;.}..
a930: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
a940: 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
a950: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
a960: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
a970: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49  c int fts5DlidxI
a980: 74 65 72 4e 65 78 74 52 28 46 74 73 35 49 6e 64  terNextR(Fts5Ind
a990: 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78  ex *p, Fts5Dlidx
a9a0: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
a9b0: 20 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 6c   iLvl){.  Fts5Dl
a9c0: 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26  idxLvl *pLvl = &
a9d0: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c  pIter->aLvl[iLvl
a9e0: 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  ];..  assert( iL
a9f0: 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29  vl<pIter->nLvl )
aa00: 3b 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69 64  ;.  if( fts5Dlid
aa10: 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 20 29  xLvlNext(pLvl) )
aa20: 7b 0a 20 20 20 20 69 66 28 20 28 69 4c 76 6c 2b  {.    if( (iLvl+
aa30: 31 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76 6c  1) < pIter->nLvl
aa40: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c   ){.      fts5Dl
aa50: 69 64 78 49 74 65 72 4e 65 78 74 52 28 70 2c 20  idxIterNextR(p, 
aa60: 70 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a  pIter, iLvl+1);.
aa70: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 5b 31        if( pLvl[1
aa80: 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20  ].bEof==0 ){.   
aa90: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
aaa0: 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61  ease(pLvl->pData
aab0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
aac0: 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pLvl, 0, sizeo
aad0: 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29  f(Fts5DlidxLvl))
aae0: 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e  ;.        pLvl->
aaf0: 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61  pData = fts5Data
ab00: 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20  Read(p, .       
ab10: 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f       FTS5_DLIDX_
ab20: 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65  ROWID(pIter->iSe
ab30: 67 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b  gid, iLvl, pLvl[
ab40: 31 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20  1].iLeafPgno).  
ab50: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
ab60: 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61   if( pLvl->pData
ab70: 20 29 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e   ) fts5DlidxLvlN
ab80: 65 78 74 28 70 4c 76 6c 29 3b 0a 20 20 20 20 20  ext(pLvl);.     
ab90: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
aba0: 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c  return pIter->aL
abb0: 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74  vl[0].bEof;.}.st
abc0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
abd0: 64 78 49 74 65 72 4e 65 78 74 28 46 74 73 35 49  dxIterNext(Fts5I
abe0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69  ndex *p, Fts5Dli
abf0: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
ac00: 20 20 72 65 74 75 72 6e 20 66 74 73 35 44 6c 69    return fts5Dli
ac10: 64 78 49 74 65 72 4e 65 78 74 52 28 70 2c 20 70  dxIterNextR(p, p
ac20: 49 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  Iter, 0);.}../*.
ac30: 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20  ** The iterator 
ac40: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
ac50: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 68 61 73  rst argument has
ac60: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
ac70: 69 65 6c 64 73 20 73 65 74 0a 2a 2a 20 61 73 20  ields set.** as 
ac80: 66 6f 6c 6c 6f 77 73 2e 20 54 68 69 73 20 66 75  follows. This fu
ac90: 6e 63 74 69 6f 6e 20 73 65 74 73 20 75 70 20 74  nction sets up t
aca0: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 69  he rest of the i
acb0: 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20  terator so that 
acc0: 69 74 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  it.** points to 
acd0: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
ace0: 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  in the doclist-i
acf0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 44  ndex..**.**   pD
ad00: 61 74 61 3a 0a 2a 2a 20 20 20 20 20 70 6f 69 6e  ata:.**     poin
ad10: 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 2d 69  ter to doclist-i
ad20: 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 0a 2a 2a  ndex record, .**
ad30: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
ad40: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
ad50: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
ad60: 6f 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  o is the page nu
ad70: 6d 62 65 72 20 74 68 65 0a 2a 2a 20 64 6f 63 6c  mber the.** docl
ad80: 69 73 74 20 69 73 20 61 73 73 6f 63 69 61 74 65  ist is associate
ad90: 64 20 77 69 74 68 20 28 74 68 65 20 6f 6e 65 20  d with (the one 
ada0: 66 65 61 74 75 72 69 6e 67 20 74 68 65 20 74 65  featuring the te
adb0: 72 6d 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rm)..*/.static i
adc0: 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  nt fts5DlidxIter
add0: 46 69 72 73 74 28 46 74 73 35 44 6c 69 64 78 49  First(Fts5DlidxI
ade0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
adf0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
ae00: 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20   i<pIter->nLvl; 
ae10: 69 2b 2b 29 7b 0a 20 20 20 20 66 74 73 35 44 6c  i++){.    fts5Dl
ae20: 69 64 78 4c 76 6c 4e 65 78 74 28 26 70 49 74 65  idxLvlNext(&pIte
ae30: 72 2d 3e 61 4c 76 6c 5b 69 5d 29 3b 0a 20 20 7d  r->aLvl[i]);.  }
ae40: 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
ae50: 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d  >aLvl[0].bEof;.}
ae60: 0a 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  ...static int ft
ae70: 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 46  s5DlidxIterEof(F
ae80: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
ae90: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
aea0: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  r){.  return p->
aeb0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
aec0: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
aed0: 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  bEof;.}..static 
aee0: 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74  void fts5DlidxIt
aef0: 65 72 4c 61 73 74 28 46 74 73 35 49 6e 64 65 78  erLast(Fts5Index
af00: 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74   *p, Fts5DlidxIt
af10: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
af20: 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e  t i;..  /* Advan
af30: 63 65 20 65 61 63 68 20 6c 65 76 65 6c 20 74 6f  ce each level to
af40: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
af50: 6f 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  on the last page
af60: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 49 74 65   */.  for(i=pIte
af70: 72 2d 3e 6e 4c 76 6c 2d 31 3b 20 70 2d 3e 72 63  r->nLvl-1; p->rc
af80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
af90: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 46  >=0; i--){.    F
afa0: 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76  ts5DlidxLvl *pLv
afb0: 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c  l = &pIter->aLvl
afc0: 5b 69 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [i];.    while( 
afd0: 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74  fts5DlidxLvlNext
afe0: 28 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20 20 20  (pLvl)==0 );.   
aff0: 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b   pLvl->bEof = 0;
b000: 0a 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b  ..    if( i>0 ){
b010: 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64 78  .      Fts5Dlidx
b020: 4c 76 6c 20 2a 70 43 68 69 6c 64 20 3d 20 26 70  Lvl *pChild = &p
b030: 4c 76 6c 5b 2d 31 5d 3b 0a 20 20 20 20 20 20 66  Lvl[-1];.      f
b040: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
b050: 43 68 69 6c 64 2d 3e 70 44 61 74 61 29 3b 0a 20  Child->pData);. 
b060: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 68 69       memset(pChi
b070: 6c 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  ld, 0, sizeof(Ft
b080: 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
b090: 20 20 20 20 70 43 68 69 6c 64 2d 3e 70 44 61 74      pChild->pDat
b0a0: 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
b0b0: 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46  (p, .          F
b0c0: 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28  TS5_DLIDX_ROWID(
b0d0: 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69  pIter->iSegid, i
b0e0: 2d 31 2c 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50  -1, pLvl->iLeafP
b0f0: 67 6e 6f 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  gno).      );.  
b100: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
b110: 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74   Move the iterat
b120: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
b130: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 74   only argument t
b140: 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  o the previous e
b150: 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ntry..*/.static 
b160: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  int fts5DlidxLvl
b170: 50 72 65 76 28 46 74 73 35 44 6c 69 64 78 4c 76  Prev(Fts5DlidxLv
b180: 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20 69 6e 74 20  l *pLvl){.  int 
b190: 69 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66  iOff = pLvl->iOf
b1a0: 66 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c  f;..  assert( pL
b1b0: 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20  vl->bEof==0 );. 
b1c0: 20 69 66 28 20 69 4f 66 66 3c 3d 70 4c 76 6c 2d   if( iOff<=pLvl-
b1d0: 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20 20  >iFirstOff ){.  
b1e0: 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 31    pLvl->bEof = 1
b1f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
b200: 38 20 2a 61 20 3d 20 70 4c 76 6c 2d 3e 70 44 61  8 *a = pLvl->pDa
b210: 74 61 2d 3e 70 3b 0a 20 20 20 20 69 36 34 20 69  ta->p;.    i64 i
b220: 56 61 6c 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69  Val;.    int iLi
b230: 6d 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b  mit;.    int ii;
b240: 0a 20 20 20 20 69 6e 74 20 6e 5a 65 72 6f 20 3d  .    int nZero =
b250: 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72   0;..    /* Curr
b260: 65 6e 74 6c 79 20 69 4f 66 66 20 70 6f 69 6e 74  ently iOff point
b270: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  s to the first b
b280: 79 74 65 20 6f 66 20 61 20 76 61 72 69 6e 74 2e  yte of a varint.
b290: 20 54 68 69 73 20 62 6c 6f 63 6b 20 0a 20 20 20   This block .   
b2a0: 20 2a 2a 20 64 65 63 72 65 6d 65 6e 74 73 20 69   ** decrements i
b2b0: 4f 66 66 20 75 6e 74 69 6c 20 69 74 20 70 6f 69  Off until it poi
b2c0: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
b2d0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 70 72 65   byte of the pre
b2e0: 76 69 6f 75 73 20 0a 20 20 20 20 2a 2a 20 76 61  vious .    ** va
b2f0: 72 69 6e 74 2e 20 54 61 6b 69 6e 67 20 63 61 72  rint. Taking car
b300: 65 20 6e 6f 74 20 74 6f 20 72 65 61 64 20 61 6e  e not to read an
b310: 79 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  y memory locatio
b320: 6e 73 20 74 68 61 74 20 6f 63 63 75 72 0a 20 20  ns that occur.  
b330: 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20    ** before the 
b340: 62 75 66 66 65 72 20 69 6e 20 6d 65 6d 6f 72 79  buffer in memory
b350: 2e 20 20 2a 2f 0a 20 20 20 20 69 4c 69 6d 69 74  .  */.    iLimit
b360: 20 3d 20 28 69 4f 66 66 3e 39 20 3f 20 69 4f 66   = (iOff>9 ? iOf
b370: 66 2d 39 20 3a 20 30 29 3b 0a 20 20 20 20 66 6f  f-9 : 0);.    fo
b380: 72 28 69 4f 66 66 2d 2d 3b 20 69 4f 66 66 3e 69  r(iOff--; iOff>i
b390: 4c 69 6d 69 74 3b 20 69 4f 66 66 2d 2d 29 7b 0a  Limit; iOff--){.
b3a0: 20 20 20 20 20 20 69 66 28 20 28 61 5b 69 4f 66        if( (a[iOf
b3b0: 66 2d 31 5d 20 26 20 30 78 38 30 29 3d 3d 30 20  f-1] & 0x80)==0 
b3c0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a  ) break;.    }..
b3d0: 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e      fts5GetVarin
b3e0: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
b3f0: 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 70 4c  *)&iVal);.    pL
b400: 76 6c 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 56  vl->iRowid -= iV
b410: 61 6c 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4c  al;.    pLvl->iL
b420: 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a 20 20 20 20  eafPgno--;..    
b430: 2f 2a 20 53 6b 69 70 20 62 61 63 6b 77 61 72 64  /* Skip backward
b440: 73 20 70 61 73 74 20 61 6e 79 20 30 78 30 30 20  s past any 0x00 
b450: 76 61 72 69 6e 74 73 2e 20 2a 2f 0a 20 20 20 20  varints. */.    
b460: 66 6f 72 28 69 69 3d 69 4f 66 66 2d 31 3b 20 69  for(ii=iOff-1; i
b470: 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f  i>=pLvl->iFirstO
b480: 66 66 20 26 26 20 61 5b 69 69 5d 3d 3d 30 78 30  ff && a[ii]==0x0
b490: 30 3b 20 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20  0; ii--){.      
b4a0: 6e 5a 65 72 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nZero++;.    }. 
b4b0: 20 20 20 69 66 28 20 69 69 3e 3d 70 4c 76 6c 2d     if( ii>=pLvl-
b4c0: 3e 69 46 69 72 73 74 4f 66 66 20 26 26 20 28 61  >iFirstOff && (a
b4d0: 5b 69 69 5d 20 26 20 30 78 38 30 29 20 29 7b 0a  [ii] & 0x80) ){.
b4e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74        /* The byt
b4f0: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62 65  e immediately be
b500: 66 6f 72 65 20 74 68 65 20 6c 61 73 74 20 30 78  fore the last 0x
b510: 30 30 20 62 79 74 65 20 68 61 73 20 74 68 65 20  00 byte has the 
b520: 30 78 38 30 20 62 69 74 0a 20 20 20 20 20 20 2a  0x80 bit.      *
b530: 2a 20 73 65 74 2e 20 53 6f 20 74 68 65 20 6c 61  * set. So the la
b540: 73 74 20 30 78 30 30 20 69 73 20 6f 6e 6c 79 20  st 0x00 is only 
b550: 61 20 76 61 72 69 6e 74 20 30 20 69 66 20 74 68  a varint 0 if th
b560: 65 72 65 20 61 72 65 20 38 20 6d 6f 72 65 20 30  ere are 8 more 0
b570: 78 38 30 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  x80.      ** byt
b580: 65 73 20 62 65 66 6f 72 65 20 61 5b 69 69 5d 2e  es before a[ii].
b590: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 5a   */.      int bZ
b5a0: 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ero = 0;        
b5b0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
b5c0: 20 6c 61 73 74 20 30 78 30 30 20 63 6f 75 6e 74   last 0x00 count
b5d0: 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28  s */.      if( (
b5e0: 69 69 2d 38 29 3e 3d 70 4c 76 6c 2d 3e 69 46 69  ii-8)>=pLvl->iFi
b5f0: 72 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  rstOff ){.      
b600: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
b610: 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 38 20 26   for(j=1; j<=8 &
b620: 26 20 28 61 5b 69 69 2d 6a 5d 20 26 20 30 78 38  & (a[ii-j] & 0x8
b630: 30 29 3b 20 6a 2b 2b 29 3b 0a 20 20 20 20 20 20  0); j++);.      
b640: 20 20 62 5a 65 72 6f 20 3d 20 28 6a 3e 38 29 3b    bZero = (j>8);
b650: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b660: 66 28 20 62 5a 65 72 6f 3d 3d 30 20 29 20 6e 5a  f( bZero==0 ) nZ
b670: 65 72 6f 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  ero--;.    }.   
b680: 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f   pLvl->iLeafPgno
b690: 20 2d 3d 20 6e 5a 65 72 6f 3b 0a 20 20 20 20 70   -= nZero;.    p
b6a0: 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66  Lvl->iOff = iOff
b6b0: 20 2d 20 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 0a 20   - nZero;.  }.. 
b6c0: 20 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45   return pLvl->bE
b6d0: 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  of;.}..static in
b6e0: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  t fts5DlidxIterP
b6f0: 72 65 76 52 28 46 74 73 35 49 6e 64 65 78 20 2a  revR(Fts5Index *
b700: 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  p, Fts5DlidxIter
b710: 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4c 76   *pIter, int iLv
b720: 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c  l){.  Fts5DlidxL
b730: 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65  vl *pLvl = &pIte
b740: 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a  r->aLvl[iLvl];..
b750: 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70    assert( iLvl<p
b760: 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20  Iter->nLvl );.  
b770: 69 66 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  if( fts5DlidxLvl
b780: 50 72 65 76 28 70 4c 76 6c 29 20 29 7b 0a 20 20  Prev(pLvl) ){.  
b790: 20 20 69 66 28 20 28 69 4c 76 6c 2b 31 29 20 3c    if( (iLvl+1) <
b7a0: 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a   pIter->nLvl ){.
b7b0: 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
b7c0: 74 65 72 50 72 65 76 52 28 70 2c 20 70 49 74 65  terPrevR(p, pIte
b7d0: 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20 20  r, iLvl+1);.    
b7e0: 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62 45    if( pLvl[1].bE
b7f0: 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  of==0 ){.       
b800: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
b810: 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20  (pLvl->pData);. 
b820: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c         memset(pL
b830: 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  vl, 0, sizeof(Ft
b840: 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
b850: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74        pLvl->pDat
b860: 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
b870: 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  (p, .           
b880: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
b890: 44 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c  D(pIter->iSegid,
b8a0: 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69   iLvl, pLvl[1].i
b8b0: 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20  LeafPgno).      
b8c0: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
b8d0: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a   pLvl->pData ){.
b8e0: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
b8f0: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78   fts5DlidxLvlNex
b900: 74 28 70 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20 20  t(pLvl)==0 );.  
b910: 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62 45          pLvl->bE
b920: 6f 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  of = 0;.        
b930: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
b940: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49    }..  return pI
b950: 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f  ter->aLvl[0].bEo
b960: 66 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  f;.}.static int 
b970: 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65  fts5DlidxIterPre
b980: 76 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  v(Fts5Index *p, 
b990: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
b9a0: 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Iter){.  return 
b9b0: 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65  fts5DlidxIterPre
b9c0: 76 52 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b  vR(p, pIter, 0);
b9d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
b9e0: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69   doclist-index i
b9f0: 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 61  terator object a
ba00: 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74 73 35  llocated by fts5
ba10: 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 29 2e  DlidxIterInit().
ba20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ba30: 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
ba40: 65 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  e(Fts5DlidxIter 
ba50: 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
ba60: 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  Iter ){.    int 
ba70: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
ba80: 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69  i<pIter->nLvl; i
ba90: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44  ++){.      fts5D
baa0: 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
bab0: 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44 61 74 61 29  ->aLvl[i].pData)
bac0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
bad0: 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b  te3_free(pIter);
bae0: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46  .  }.}..static F
baf0: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 66 74  ts5DlidxIter *ft
bb00: 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28  s5DlidxIterInit(
bb10: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb30: 20 20 20 2f 2a 20 46 74 73 35 20 42 61 63 6b 65     /* Fts5 Backe
bb40: 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69  nd to iterate wi
bb50: 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 52  thin */.  int bR
bb60: 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ev,             
bb70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
bb80: 65 20 66 6f 72 20 4f 52 44 45 52 20 42 59 20 41  e for ORDER BY A
bb90: 53 43 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67  SC */.  int iSeg
bba0: 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
bbb0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65          /* Segme
bbc0: 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69  nt id */.  int i
bbd0: 4c 65 61 66 50 67 20 20 20 20 20 20 20 20 20 20  LeafPg          
bbe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
bbf0: 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  af page number t
bc00: 6f 20 6c 6f 61 64 20 64 6c 69 64 78 20 66 6f 72  o load dlidx for
bc10: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69   */.){.  Fts5Dli
bc20: 64 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  dxIter *pIter = 
bc30: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  0;.  int i;.  in
bc40: 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20  t bDone = 0;..  
bc50: 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d  for(i=0; p->rc==
bc60: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44 6f  SQLITE_OK && bDo
bc70: 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ne==0; i++){.   
bc80: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
bc90: 65 6f 66 28 46 74 73 35 44 6c 69 64 78 49 74 65  eof(Fts5DlidxIte
bca0: 72 29 20 2b 20 69 20 2a 20 73 69 7a 65 6f 66 28  r) + i * sizeof(
bcb0: 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 3b 0a 20  Fts5DlidxLvl);. 
bcc0: 20 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72     Fts5DlidxIter
bcd0: 20 2a 70 4e 65 77 3b 0a 0a 20 20 20 20 70 4e 65   *pNew;..    pNe
bce0: 77 20 3d 20 28 46 74 73 35 44 6c 69 64 78 49 74  w = (Fts5DlidxIt
bcf0: 65 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  er*)sqlite3_real
bd00: 6c 6f 63 28 70 49 74 65 72 2c 20 6e 42 79 74 65  loc(pIter, nByte
bd10: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
bd20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  =0 ){.      p->r
bd30: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
bd40: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
bd50: 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
bd60: 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44  FTS5_DLIDX_ROWID
bd70: 28 69 53 65 67 69 64 2c 20 69 2c 20 69 4c 65 61  (iSegid, i, iLea
bd80: 66 50 67 29 3b 0a 20 20 20 20 20 20 46 74 73 35  fPg);.      Fts5
bd90: 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d  DlidxLvl *pLvl =
bda0: 20 26 70 4e 65 77 2d 3e 61 4c 76 6c 5b 69 5d 3b   &pNew->aLvl[i];
bdb0: 0a 20 20 20 20 20 20 70 49 74 65 72 20 3d 20 70  .      pIter = p
bdc0: 4e 65 77 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  New;.      memse
bdd0: 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pLvl, 0, sizeo
bde0: 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29  f(Fts5DlidxLvl))
bdf0: 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44  ;.      pLvl->pD
be00: 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65  ata = fts5DataRe
be10: 61 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20  ad(p, iRowid);. 
be20: 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70       if( pLvl->p
be30: 44 61 74 61 20 26 26 20 28 70 4c 76 6c 2d 3e 70  Data && (pLvl->p
be40: 44 61 74 61 2d 3e 70 5b 30 5d 20 26 20 30 78 30  Data->p[0] & 0x0
be50: 30 30 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  001)==0 ){.     
be60: 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20     bDone = 1;.  
be70: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65      }.      pIte
be80: 72 2d 3e 6e 4c 76 6c 20 3d 20 69 2b 31 3b 0a 20  r->nLvl = i+1;. 
be90: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
bea0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
beb0: 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   ){.    pIter->i
bec0: 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a  Segid = iSegid;.
bed0: 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20      if( bRev==0 
bee0: 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  ){.      fts5Dli
bef0: 64 78 49 74 65 72 46 69 72 73 74 28 70 49 74 65  dxIterFirst(pIte
bf00: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
bf10: 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
bf20: 65 72 4c 61 73 74 28 70 2c 20 70 49 74 65 72 29  erLast(p, pIter)
bf30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
bf40: 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  f( p->rc!=SQLITE
bf50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74 73 35 44  _OK ){.    fts5D
bf60: 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 49 74  lidxIterFree(pIt
bf70: 65 72 29 3b 0a 20 20 20 20 70 49 74 65 72 20 3d  er);.    pIter =
bf80: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   0;.  }..  retur
bf90: 6e 20 70 49 74 65 72 3b 0a 7d 0a 0a 73 74 61 74  n pIter;.}..stat
bfa0: 69 63 20 69 36 34 20 66 74 73 35 44 6c 69 64 78  ic i64 fts5Dlidx
bfb0: 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 44 6c  IterRowid(Fts5Dl
bfc0: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
bfd0: 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
bfe0: 3e 61 4c 76 6c 5b 30 5d 2e 69 52 6f 77 69 64 3b  >aLvl[0].iRowid;
bff0: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  .}.static int ft
c000: 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
c010: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
c020: 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Iter){.  return 
c030: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69  pIter->aLvl[0].i
c040: 4c 65 61 66 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  LeafPgno;.}../*.
c050: 2a 2a 20 4c 6f 61 64 20 74 68 65 20 6e 65 78 74  ** Load the next
c060: 20 6c 65 61 66 20 70 61 67 65 20 69 6e 74 6f 20   leaf page into 
c070: 74 68 65 20 73 65 67 6d 65 6e 74 20 69 74 65 72  the segment iter
c080: 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
c090: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
c0a0: 4e 65 78 74 50 61 67 65 28 0a 20 20 46 74 73 35  NextPage(.  Fts5
c0b0: 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
c0d0: 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
c0e0: 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ct */.  Fts5SegI
c0f0: 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
c100: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
c110: 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 74  tor to advance t
c120: 6f 20 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a 29  o next page */.)
c130: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c  {.  Fts5Data *pL
c140: 65 61 66 3b 0a 20 20 46 74 73 35 53 74 72 75 63  eaf;.  Fts5Struc
c150: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
c160: 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 3b  g = pIter->pSeg;
c170: 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
c180: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
c190: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  ;.  pIter->iLeaf
c1a0: 50 67 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 70 49  Pgno++;.  if( pI
c1b0: 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 29  ter->pNextLeaf )
c1c0: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65  {.    pIter->pLe
c1d0: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4e 65 78  af = pIter->pNex
c1e0: 74 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72  tLeaf;.    pIter
c1f0: 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 30 3b  ->pNextLeaf = 0;
c200: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74  .  }else if( pIt
c210: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d 70  er->iLeafPgno<=p
c220: 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b  Seg->pgnoLast ){
c230: 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  .    pIter->pLea
c240: 66 20 3d 20 66 74 73 35 4c 65 61 66 52 65 61 64  f = fts5LeafRead
c250: 28 70 2c 20 0a 20 20 20 20 20 20 20 20 46 54 53  (p, .        FTS
c260: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
c270: 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 49  pSeg->iSegid, pI
c280: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a  ter->iLeafPgno).
c290: 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
c2a0: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
c2b0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 65 61   = 0;.  }.  pLea
c2c0: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
c2d0: 3b 0a 0a 20 20 69 66 28 20 70 4c 65 61 66 20 29  ;..  if( pLeaf )
c2e0: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67  {.    pIter->iPg
c2f0: 69 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e  idxOff = pLeaf->
c300: 73 7a 4c 65 61 66 3b 0a 20 20 20 20 69 66 28 20  szLeaf;.    if( 
c310: 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65  fts5LeafIsTermle
c320: 73 73 28 70 4c 65 61 66 29 20 29 7b 0a 20 20 20  ss(pLeaf) ){.   
c330: 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
c340: 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61 66 2d  Doclist = pLeaf-
c350: 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  >nn+1;.    }else
c360: 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  {.      pIter->i
c370: 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35  PgidxOff += fts5
c380: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65  GetVarint32(&pLe
c390: 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 50 67  af->p[pIter->iPg
c3a0: 69 64 78 4f 66 66 5d 2c 0a 20 20 20 20 20 20 20  idxOff],.       
c3b0: 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
c3c0: 44 6f 63 6c 69 73 74 0a 20 20 20 20 20 20 29 3b  Doclist.      );
c3d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
c3e0: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20 70  .** Argument p p
c3f0: 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
c400: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 76  r containing a v
c410: 61 72 69 6e 74 20 74 6f 20 62 65 20 69 6e 74 65  arint to be inte
c420: 72 70 72 65 74 65 64 20 61 73 20 61 0a 2a 2a 20  rpreted as a.** 
c430: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73 69  position list si
c440: 7a 65 20 66 69 65 6c 64 2e 20 52 65 61 64 20 74  ze field. Read t
c450: 68 65 20 76 61 72 69 6e 74 20 61 6e 64 20 72 65  he varint and re
c460: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
c470: 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61 64  of bytes.** read
c480: 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  . Before returni
c490: 6e 67 2c 20 73 65 74 20 2a 70 6e 53 7a 20 74 6f  ng, set *pnSz to
c4a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
c4b0: 79 74 65 73 20 69 6e 20 74 68 65 20 70 6f 73 69  ytes in the posi
c4c0: 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 2c 20 61 6e  tion.** list, an
c4d0: 64 20 2a 70 62 44 65 6c 20 74 6f 20 74 72 75 65  d *pbDel to true
c4e0: 20 69 66 20 74 68 65 20 64 65 6c 65 74 65 20 66   if the delete f
c4f0: 6c 61 67 20 69 73 20 73 65 74 2c 20 6f 72 20 66  lag is set, or f
c500: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  alse otherwise..
c510: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
c520: 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65  s5GetPoslistSize
c530: 28 63 6f 6e 73 74 20 75 38 20 2a 70 2c 20 69 6e  (const u8 *p, in
c540: 74 20 2a 70 6e 53 7a 2c 20 69 6e 74 20 2a 70 62  t *pnSz, int *pb
c550: 44 65 6c 29 7b 0a 20 20 69 6e 74 20 6e 53 7a 3b  Del){.  int nSz;
c560: 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
c570: 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
c580: 74 33 32 28 70 2c 20 6e 2c 20 6e 53 7a 29 3b 0a  t32(p, n, nSz);.
c590: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 53 7a    assert_nc( nSz
c5a0: 3e 3d 30 20 29 3b 0a 20 20 2a 70 6e 53 7a 20 3d  >=0 );.  *pnSz =
c5b0: 20 6e 53 7a 2f 32 3b 0a 20 20 2a 70 62 44 65 6c   nSz/2;.  *pbDel
c5c0: 20 3d 20 6e 53 7a 20 26 20 30 78 30 30 30 31 3b   = nSz & 0x0001;
c5d0: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
c5e0: 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65  /*.** Fts5SegIte
c5f0: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63 75  r.iLeafOffset cu
c600: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
c610: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
c620: 20 6f 66 20 61 0a 2a 2a 20 70 6f 73 69 74 69 6f   of a.** positio
c630: 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c  n-list size fiel
c640: 64 2e 20 52 65 61 64 20 74 68 65 20 76 61 6c 75  d. Read the valu
c650: 65 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20 61  e of the field a
c660: 6e 64 20 73 74 6f 72 65 20 69 74 0a 2a 2a 20 69  nd store it.** i
c670: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
c680: 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a  variables:.**.**
c690: 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 6e     Fts5SegIter.n
c6a0: 50 6f 73 0a 2a 2a 20 20 20 46 74 73 35 53 65 67  Pos.**   Fts5Seg
c6b0: 49 74 65 72 2e 62 44 65 6c 0a 2a 2a 0a 2a 2a 20  Iter.bDel.**.** 
c6c0: 4c 65 61 76 65 20 46 74 73 35 53 65 67 49 74 65  Leave Fts5SegIte
c6d0: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f  r.iLeafOffset po
c6e0: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
c6f0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
c700: 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  .** position lis
c710: 74 20 63 6f 6e 74 65 6e 74 20 28 69 66 20 61 6e  t content (if an
c720: 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  y)..*/.static vo
c730: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  id fts5SegIterLo
c740: 61 64 4e 50 6f 73 28 46 74 73 35 49 6e 64 65 78  adNPos(Fts5Index
c750: 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
c760: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
c770: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
c780: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66   ){.    int iOff
c790: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
c7a0: 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65  ffset;  /* Offse
c7b0: 74 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f 0a  t to read at */.
c7c0: 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41      ASSERT_SZLEA
c7d0: 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61  F_OK(pIter->pLea
c7e0: 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  f);.    if( p->p
c7f0: 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d  Config->eDetail=
c800: 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e  =FTS5_DETAIL_NON
c810: 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  E ){.      int i
c820: 45 6f 64 20 3d 20 4d 49 4e 28 70 49 74 65 72 2d  Eod = MIN(pIter-
c830: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 2c 20  >iEndofDoclist, 
c840: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
c850: 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70 49 74  Leaf);.      pIt
c860: 65 72 2d 3e 62 44 65 6c 20 3d 20 30 3b 0a 20 20  er->bDel = 0;.  
c870: 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20      pIter->nPos 
c880: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = 1;.      if( i
c890: 4f 66 66 3c 69 45 6f 64 20 26 26 20 70 49 74 65  Off<iEod && pIte
c8a0: 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  r->pLeaf->p[iOff
c8b0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
c8c0: 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 31 3b  pIter->bDel = 1;
c8d0: 0a 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b  .        iOff++;
c8e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66  .        if( iOf
c8f0: 66 3c 69 45 6f 64 20 26 26 20 70 49 74 65 72 2d  f<iEod && pIter-
c900: 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 3d  >pLeaf->p[iOff]=
c910: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
c920: 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 31 3b  pIter->nPos = 1;
c930: 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 2b  .          iOff+
c940: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
c950: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
c960: 72 2d 3e 6e 50 6f 73 20 3d 20 30 3b 0a 20 20 20  r->nPos = 0;.   
c970: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
c980: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c990: 69 6e 74 20 6e 53 7a 3b 0a 20 20 20 20 20 20 66  int nSz;.      f
c9a0: 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
c9b0: 33 32 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  32(pIter->pLeaf-
c9c0: 3e 70 2c 20 69 4f 66 66 2c 20 6e 53 7a 29 3b 0a  >p, iOff, nSz);.
c9d0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65        pIter->bDe
c9e0: 6c 20 3d 20 28 6e 53 7a 20 26 20 30 78 30 30 30  l = (nSz & 0x000
c9f0: 31 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  1);.      pIter-
ca00: 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a  >nPos = nSz>>1;.
ca10: 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
ca20: 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3e 3d 30 20   pIter->nPos>=0 
ca30: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74  );.    }.    pIt
ca40: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
ca50: 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a 7d 0a 0a 73  = iOff;.  }.}..s
ca60: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
ca70: 65 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64 28  egIterLoadRowid(
ca80: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
ca90: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
caa0: 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74  ){.  u8 *a = pIt
cab0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20 20  er->pLeaf->p;   
cac0: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
cad0: 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d  o read data from
cae0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d   */.  int iOff =
caf0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
cb00: 73 65 74 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53  set;..  ASSERT_S
cb10: 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e  ZLEAF_OK(pIter->
cb20: 70 4c 65 61 66 29 3b 0a 20 20 69 66 28 20 69 4f  pLeaf);.  if( iO
cb30: 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66  ff>=pIter->pLeaf
cb40: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
cb50: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
cb60: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
cb70: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c     if( pIter->pL
cb80: 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eaf==0 ){.      
cb90: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
cba0: 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 46  E_OK ) p->rc = F
cbb0: 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
cbc0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
cbd0: 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20  .    iOff = 4;. 
cbe0: 20 20 20 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c     a = pIter->pL
cbf0: 65 61 66 2d 3e 70 3b 0a 20 20 7d 0a 20 20 69 4f  eaf->p;.  }.  iO
cc00: 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  ff += sqlite3Fts
cc10: 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f  5GetVarint(&a[iO
cc20: 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ff], (u64*)&pIte
cc30: 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 70 49  r->iRowid);.  pI
cc40: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
cc50: 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a   = iOff;.}../*.*
cc60: 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c  * Fts5SegIter.iL
cc70: 65 61 66 4f 66 66 73 65 74 20 63 75 72 72 65 6e  eafOffset curren
cc80: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  tly points to th
cc90: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
cca0: 74 68 65 20 0a 2a 2a 20 22 6e 53 75 66 66 69 78  the .** "nSuffix
ccb0: 22 20 66 69 65 6c 64 20 6f 66 20 61 20 74 65 72  " field of a ter
ccc0: 6d 2e 20 46 75 6e 63 74 69 6f 6e 20 70 61 72 61  m. Function para
ccd0: 6d 65 74 65 72 20 6e 4b 65 65 70 20 63 6f 6e 74  meter nKeep cont
cce0: 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 0a 2a  ains the value.*
ccf0: 2a 20 6f 66 20 74 68 65 20 22 6e 50 72 65 66 69  * of the "nPrefi
cd00: 78 22 20 66 69 65 6c 64 20 28 69 66 20 74 68 65  x" field (if the
cd10: 72 65 20 77 61 73 20 6f 6e 65 20 2d 20 69 74 20  re was one - it 
cd20: 69 73 20 70 61 73 73 65 64 20 30 20 69 66 20 74  is passed 0 if t
cd30: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
cd40: 72 73 74 20 74 65 72 6d 20 69 6e 20 74 68 65 20  rst term in the 
cd50: 73 65 67 6d 65 6e 74 29 2e 0a 2a 2a 0a 2a 2a 20  segment)..**.** 
cd60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 6f  This function po
cd70: 70 75 6c 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  pulates:.**.**  
cd80: 20 46 74 73 35 53 65 67 49 74 65 72 2e 74 65 72   Fts5SegIter.ter
cd90: 6d 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74  m.**   Fts5SegIt
cda0: 65 72 2e 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 61  er.rowid.**.** a
cdb0: 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 20 6c  ccordingly and l
cdc0: 65 61 76 65 73 20 28 46 74 73 35 53 65 67 49 74  eaves (Fts5SegIt
cdd0: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 29 20  er.iLeafOffset) 
cde0: 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6e 74 65  set to the conte
cdf0: 6e 74 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72  nt of.** the fir
ce00: 73 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  st position list
ce10: 2e 20 54 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  . The position l
ce20: 69 73 74 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  ist belonging to
ce30: 20 64 6f 63 75 6d 65 6e 74 20 0a 2a 2a 20 28 46   document .** (F
ce40: 74 73 35 53 65 67 49 74 65 72 2e 69 52 6f 77 69  ts5SegIter.iRowi
ce50: 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  d)..*/.static vo
ce60: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  id fts5SegIterLo
ce70: 61 64 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78  adTerm(Fts5Index
ce80: 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
ce90: 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 6e 4b 65   *pIter, int nKe
cea0: 65 70 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70  ep){.  u8 *a = p
ceb0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20  Iter->pLeaf->p; 
cec0: 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
ced0: 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72   to read data fr
cee0: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66  om */.  int iOff
cef0: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
cf00: 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65  ffset;  /* Offse
cf10: 74 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f 0a  t to read at */.
cf20: 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20    int nNew;     
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf40: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6e 65    /* Bytes of ne
cf50: 77 20 64 61 74 61 20 2a 2f 0a 0a 20 20 69 4f 66  w data */..  iOf
cf60: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
cf70: 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
cf80: 4e 65 77 29 3b 0a 20 20 69 66 28 20 69 4f 66 66  New);.  if( iOff
cf90: 2b 6e 4e 65 77 3e 70 49 74 65 72 2d 3e 70 4c 65  +nNew>pIter->pLe
cfa0: 61 66 2d 3e 6e 6e 20 7c 7c 20 6e 4b 65 65 70 3e  af->nn || nKeep>
cfb0: 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20 29 7b  pIter->term.n ){
cfc0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53  .    p->rc = FTS
cfd0: 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  5_CORRUPT;.    r
cfe0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 74  eturn;.  }.  pIt
cff0: 65 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65  er->term.n = nKe
d000: 65 70 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  ep;.  fts5Buffer
d010: 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
d020: 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  c, &pIter->term,
d030: 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29   nNew, &a[iOff])
d040: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
d050: 72 2d 3e 74 65 72 6d 2e 6e 3c 3d 70 49 74 65 72  r->term.n<=pIter
d060: 2d 3e 74 65 72 6d 2e 6e 53 70 61 63 65 20 29 3b  ->term.nSpace );
d070: 0a 20 20 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b  .  iOff += nNew;
d080: 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  .  pIter->iTermL
d090: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
d0a0: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  ;.  pIter->iTerm
d0b0: 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72  LeafPgno = pIter
d0c0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 70  ->iLeafPgno;.  p
d0d0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
d0e0: 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 69 66 28  t = iOff;..  if(
d0f0: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
d100: 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  f>=pIter->pLeaf-
d110: 3e 6e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 72  >nn ){.    pIter
d120: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
d130: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
d140: 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nn+1;.  }else{. 
d150: 20 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20     int nExtra;. 
d160: 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78     pIter->iPgidx
d170: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
d180: 72 69 6e 74 33 32 28 26 61 5b 70 49 74 65 72 2d  rint32(&a[pIter-
d190: 3e 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 45 78  >iPgidxOff], nEx
d1a0: 74 72 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  tra);.    pIter-
d1b0: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 2b  >iEndofDoclist +
d1c0: 3d 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 0a 20  = nExtra;.  }.. 
d1d0: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
d1e0: 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72 29 3b  Rowid(p, pIter);
d1f0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
d200: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
d210: 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35  Fts5Index*, Fts5
d220: 53 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b  SegIter*, int*);
d230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
d240: 35 53 65 67 49 74 65 72 4e 65 78 74 5f 52 65 76  5SegIterNext_Rev
d250: 65 72 73 65 28 46 74 73 35 49 6e 64 65 78 2a 2c  erse(Fts5Index*,
d260: 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c 20 69   Fts5SegIter*, i
d270: 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  nt*);.static voi
d280: 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  d fts5SegIterNex
d290: 74 5f 4e 6f 6e 65 28 46 74 73 35 49 6e 64 65 78  t_None(Fts5Index
d2a0: 2a 2c 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c  *, Fts5SegIter*,
d2b0: 20 69 6e 74 2a 29 3b 0a 0a 73 74 61 74 69 63 20   int*);..static 
d2c0: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
d2d0: 53 65 74 4e 65 78 74 28 46 74 73 35 49 6e 64 65  SetNext(Fts5Inde
d2e0: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
d2f0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
d300: 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
d310: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
d320: 45 52 53 45 20 29 7b 0a 20 20 20 20 70 49 74 65  ERSE ){.    pIte
d330: 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 53  r->xNext = fts5S
d340: 65 67 49 74 65 72 4e 65 78 74 5f 52 65 76 65 72  egIterNext_Rever
d350: 73 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  se;.  }else if( 
d360: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
d370: 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
d380: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70 49 74  _NONE ){.    pIt
d390: 65 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35  er->xNext = fts5
d3a0: 53 65 67 49 74 65 72 4e 65 78 74 5f 4e 6f 6e 65  SegIterNext_None
d3b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
d3c0: 49 74 65 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74  Iter->xNext = ft
d3d0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 3b 0a 20  s5SegIterNext;. 
d3e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74   }.}../*.** Init
d3f0: 69 61 6c 69 7a 65 20 74 68 65 20 69 74 65 72 61  ialize the itera
d400: 74 6f 72 20 6f 62 6a 65 63 74 20 70 49 74 65 72  tor object pIter
d410: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
d420: 75 67 68 20 74 68 65 20 65 6e 74 72 69 65 73 20  ugh the entries 
d430: 69 6e 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 70 53  in.** segment pS
d440: 65 67 2e 20 54 68 65 20 69 74 65 72 61 74 6f 72  eg. The iterator
d450: 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
d460: 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
d470: 6e 74 72 79 20 77 68 65 6e 20 0a 2a 2a 20 74 68  ntry when .** th
d480: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
d490: 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  rns..**.** If an
d4a0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46   error occurs, F
d4b0: 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73  ts5Index.rc is s
d4c0: 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72  et to an appropr
d4d0: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
d4e0: 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72   If .** an error
d4f0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
d500: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
d510: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
d520: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
d530: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
d540: 64 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69  d fts5SegIterIni
d550: 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
d560: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
d570: 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65       /* FTS inde
d580: 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  x object */.  Ft
d590: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
d5a0: 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a  nt *pSeg,     /*
d5b0: 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
d5c0: 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73  segment */.  Fts
d5d0: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d5f0: 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61  Object to popula
d600: 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  te */.){.  if( p
d610: 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d  Seg->pgnoFirst==
d620: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
d630: 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 20   happens if the 
d640: 73 65 67 6d 65 6e 74 20 69 73 20 62 65 69 6e 67  segment is being
d650: 20 75 73 65 64 20 61 73 20 61 6e 20 69 6e 70 75   used as an inpu
d660: 74 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e  t to an incremen
d670: 74 61 6c 0a 20 20 20 20 2a 2a 20 6d 65 72 67 65  tal.    ** merge
d680: 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 68 61   and all data ha
d690: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 22  s already been "
d6a0: 74 72 69 6d 6d 65 64 22 2e 20 53 65 65 20 66 75  trimmed". See fu
d6b0: 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 66 74  nction.    ** ft
d6c0: 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 29  s5TrimSegments()
d6d0: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 49 6e   for details. In
d6e0: 20 74 68 69 73 20 63 61 73 65 20 6c 65 61 76 65   this case leave
d6f0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 65 6d   the iterator em
d700: 70 74 79 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  pty..    ** The 
d710: 63 61 6c 6c 65 72 20 77 69 6c 6c 20 73 65 65 20  caller will see 
d720: 74 68 65 20 28 70 49 74 65 72 2d 3e 70 4c 65 61  the (pIter->pLea
d730: 66 3d 3d 30 29 20 61 6e 64 20 61 73 73 75 6d 65  f==0) and assume
d740: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
d750: 0a 20 20 20 20 2a 2a 20 61 74 20 45 4f 46 20 61  .    ** at EOF a
d760: 6c 72 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20 61  lready. */.    a
d770: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c  ssert( pIter->pL
d780: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  eaf==0 );.    re
d790: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
d7a0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
d7b0: 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  K ){.    memset(
d7c0: 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
d7d0: 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 20 20 66  (*pIter));.    f
d7e0: 74 73 35 53 65 67 49 74 65 72 53 65 74 4e 65 78  ts5SegIterSetNex
d7f0: 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  t(p, pIter);.   
d800: 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70   pIter->pSeg = p
d810: 53 65 67 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  Seg;.    pIter->
d820: 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 53 65 67  iLeafPgno = pSeg
d830: 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20  ->pgnoFirst-1;. 
d840: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
d850: 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
d860: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
d870: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
d880: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
d890: 66 4f 66 66 73 65 74 20 3d 20 34 3b 0a 20 20 20  fOffset = 4;.   
d8a0: 20 61 73 73 65 72 74 5f 6e 63 28 20 70 49 74 65   assert_nc( pIte
d8b0: 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3e 34 20 29  r->pLeaf->nn>4 )
d8c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28  ;.    assert_nc(
d8d0: 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65   fts5LeafFirstTe
d8e0: 72 6d 4f 66 66 28 70 49 74 65 72 2d 3e 70 4c 65  rmOff(pIter->pLe
d8f0: 61 66 29 3d 3d 34 20 29 3b 0a 20 20 20 20 70 49  af)==4 );.    pI
d900: 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d  ter->iPgidxOff =
d910: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73   pIter->pLeaf->s
d920: 7a 4c 65 61 66 2b 31 3b 0a 20 20 20 20 66 74 73  zLeaf+1;.    fts
d930: 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d  5SegIterLoadTerm
d940: 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20  (p, pIter, 0);. 
d950: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
d960: 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
d970: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
d980: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d990: 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64  only ever called
d9a0: 20 6f 6e 20 69 74 65 72 61 74 6f 72 73 20 63 72   on iterators cr
d9b0: 65 61 74 65 64 20 62 79 20 63 61 6c 6c 73 20 74  eated by calls t
d9c0: 6f 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 51 75  o.** Fts5IndexQu
d9d0: 65 72 79 28 29 20 77 69 74 68 20 74 68 65 20 46  ery() with the F
d9e0: 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
d9f0: 45 53 43 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ESC flag set..**
da00: 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72  .** The iterator
da10: 20 69 73 20 69 6e 20 61 6e 20 75 6e 75 73 75 61   is in an unusua
da20: 6c 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  l state when thi
da30: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
da40: 6c 6c 65 64 3a 20 74 68 65 0a 2a 2a 20 46 74 73  lled: the.** Fts
da50: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
da60: 66 73 65 74 20 76 61 72 69 61 62 6c 65 20 69 73  fset variable is
da70: 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
da80: 65 74 20 6f 66 20 74 68 65 20 73 74 61 72 74 20  et of the start 
da90: 6f 66 0a 2a 2a 20 74 68 65 20 70 6f 73 69 74 69  of.** the positi
daa0: 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
dab0: 6c 64 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ld for the first
dac0: 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20   relevant rowid 
dad0: 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  on the page..** 
dae0: 46 74 73 35 53 65 67 49 74 65 72 2e 72 6f 77 69  Fts5SegIter.rowi
daf0: 64 20 69 73 20 73 65 74 2c 20 62 75 74 20 6e 50  d is set, but nP
db00: 6f 73 20 61 6e 64 20 62 44 65 6c 20 61 72 65 20  os and bDel are 
db10: 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  not..**.** This 
db20: 66 75 6e 63 74 69 6f 6e 20 61 64 76 61 6e 63 65  function advance
db30: 73 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73  s the iterator s
db40: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
db50: 20 74 6f 20 74 68 65 20 6c 61 73 74 20 0a 2a 2a   to the last .**
db60: 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20   relevant rowid 
db70: 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 2c  on the page and,
db80: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 69   if necessary, i
db90: 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 0a  nitializes the .
dba0: 2a 2a 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  ** aRowidOffset[
dbb0: 5d 20 61 6e 64 20 69 52 6f 77 69 64 4f 66 66 73  ] and iRowidOffs
dbc0: 65 74 20 76 61 72 69 61 62 6c 65 73 2e 20 41 74  et variables. At
dbd0: 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
dbe0: 69 74 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69  iterator.** is i
dbf0: 6e 20 69 74 73 20 72 65 67 75 6c 61 72 20 73 74  n its regular st
dc00: 61 74 65 20 2d 20 46 74 73 35 53 65 67 49 74 65  ate - Fts5SegIte
dc10: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f  r.iLeafOffset po
dc20: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
dc30: 74 0a 2a 2a 20 62 79 74 65 20 6f 66 20 74 68 65  t.** byte of the
dc40: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63   position list c
dc50: 6f 6e 74 65 6e 74 20 61 73 73 6f 63 69 61 74 65  ontent associate
dc60: 64 20 77 69 74 68 20 73 61 69 64 20 72 6f 77 69  d with said rowi
dc70: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
dc80: 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76  d fts5SegIterRev
dc90: 65 72 73 65 49 6e 69 74 50 61 67 65 28 46 74 73  erseInitPage(Fts
dca0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
dcb0: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
dcc0: 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20    int eDetail = 
dcd0: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
dce0: 61 69 6c 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70  ail;.  int n = p
dcf0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
dd00: 65 61 66 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  eaf;.  int i = p
dd10: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
dd20: 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74  t;.  u8 *a = pIt
dd30: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
dd40: 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 73 65 74  int iRowidOffset
dd50: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3e 70   = 0;..  if( n>p
dd60: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
dd70: 69 73 74 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  ist ){.    n = p
dd80: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
dd90: 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 41 53 53 45  ist;.  }..  ASSE
dda0: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74  RT_SZLEAF_OK(pIt
ddb0: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 77 68  er->pLeaf);.  wh
ddc0: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36  ile( 1 ){.    i6
ddd0: 34 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 0a 20  4 iDelta = 0;.. 
dde0: 20 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d     if( eDetail==
ddf0: 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
de00: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74 6f 64   ){.      /* tod
de10: 6f 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  o */.      if( i
de20: 3c 6e 20 26 26 20 61 5b 69 5d 3d 3d 30 20 29 7b  <n && a[i]==0 ){
de30: 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
de40: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 20 26 26        if( i<n &&
de50: 20 61 5b 69 5d 3d 3d 30 20 29 20 69 2b 2b 3b 0a   a[i]==0 ) i++;.
de60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
de70: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 6f  e{.      int nPo
de80: 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 75  s;.      int bDu
de90: 6d 6d 79 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20  mmy;.      i += 
dea0: 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69  fts5GetPoslistSi
deb0: 7a 65 28 26 61 5b 69 5d 2c 20 26 6e 50 6f 73 2c  ze(&a[i], &nPos,
dec0: 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20   &bDummy);.     
ded0: 20 69 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20   i += nPos;.    
dee0: 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 20 29  }.    if( i>=n )
def0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 20 2b 3d   break;.    i +=
df00: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
df10: 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  a[i], (u64*)&iDe
df20: 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  lta);.    pIter-
df30: 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74  >iRowid += iDelt
df40: 61 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65  a;..    /* If ne
df50: 63 65 73 73 61 72 79 2c 20 67 72 6f 77 20 74 68  cessary, grow th
df60: 65 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f  e pIter->aRowidO
df70: 66 66 73 65 74 5b 5d 20 61 72 72 61 79 2e 20 2a  ffset[] array. *
df80: 2f 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  /.    if( iRowid
df90: 4f 66 66 73 65 74 3e 3d 70 49 74 65 72 2d 3e 6e  Offset>=pIter->n
dfa0: 52 6f 77 69 64 4f 66 66 73 65 74 20 29 7b 0a 20  RowidOffset ){. 
dfb0: 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20       int nNew = 
dfc0: 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66  pIter->nRowidOff
dfd0: 73 65 74 20 2b 20 38 3b 0a 20 20 20 20 20 20 69  set + 8;.      i
dfe0: 6e 74 20 2a 61 4e 65 77 20 3d 20 28 69 6e 74 2a  nt *aNew = (int*
dff0: 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
e000: 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66  (pIter->aRowidOf
e010: 66 73 65 74 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f  fset, nNew*sizeo
e020: 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 69  f(int));.      i
e030: 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
e040: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
e050: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
e060: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e070: 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e   }.      pIter->
e080: 61 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 61  aRowidOffset = a
e090: 4e 65 77 3b 0a 20 20 20 20 20 20 70 49 74 65 72  New;.      pIter
e0a0: 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 3d  ->nRowidOffset =
e0b0: 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a 0a 20 20   nNew;.    }..  
e0c0: 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f    pIter->aRowidO
e0d0: 66 66 73 65 74 5b 69 52 6f 77 69 64 4f 66 66 73  ffset[iRowidOffs
e0e0: 65 74 2b 2b 5d 20 3d 20 70 49 74 65 72 2d 3e 69  et++] = pIter->i
e0f0: 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20  LeafOffset;.    
e100: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e110: 65 74 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 70 49  et = i;.  }.  pI
e120: 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65  ter->iRowidOffse
e130: 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 73 65 74  t = iRowidOffset
e140: 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4c  ;.  fts5SegIterL
e150: 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72  oadNPos(p, pIter
e160: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73  );.}../*.**.*/.s
e170: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
e180: 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65 77  egIterReverseNew
e190: 50 61 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a  Page(Fts5Index *
e1a0: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
e1b0: 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74  pIter){.  assert
e1c0: 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
e1d0: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
e1e0: 56 45 52 53 45 20 29 3b 0a 20 20 61 73 73 65 72  VERSE );.  asser
e1f0: 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  t( pIter->flags 
e200: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  & FTS5_SEGITER_O
e210: 4e 45 54 45 52 4d 20 29 3b 0a 0a 20 20 66 74 73  NETERM );..  fts
e220: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
e230: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49  er->pLeaf);.  pI
e240: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
e250: 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
e260: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74  SQLITE_OK && pIt
e270: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e 70 49  er->iLeafPgno>pI
e280: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
e290: 6e 6f 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61  no ){.    Fts5Da
e2a0: 74 61 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70 49  ta *pNew;.    pI
e2b0: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d  ter->iLeafPgno--
e2c0: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 66 74 73  ;.    pNew = fts
e2d0: 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53  5DataRead(p, FTS
e2e0: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
e2f0: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
e300: 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  ->pSeg->iSegid, 
e310: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
e320: 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 69 66 28  .    ));.    if(
e330: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 2f   pNew ){.      /
e340: 2a 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  * iTermLeafOffse
e350: 74 20 6d 61 79 20 62 65 20 65 71 75 61 6c 20 74  t may be equal t
e360: 6f 20 73 7a 4c 65 61 66 20 69 66 20 74 68 65 20  o szLeaf if the 
e370: 74 65 72 6d 20 69 73 20 74 68 65 20 6c 61 73 74  term is the last
e380: 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 6e 67 20  .      ** thing 
e390: 6f 6e 20 74 68 65 20 70 61 67 65 20 2d 20 69 2e  on the page - i.
e3a0: 65 2e 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  e. the first row
e3b0: 69 64 20 69 73 20 6f 6e 20 74 68 65 20 66 6f 6c  id is on the fol
e3c0: 6c 6f 77 69 6e 67 20 70 61 67 65 2e 0a 20 20 20  lowing page..   
e3d0: 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
e3e0: 73 65 20 6c 65 61 76 65 20 70 49 74 65 72 2d 3e  se leave pIter->
e3f0: 70 4c 65 61 66 3d 3d 30 2c 20 74 68 69 73 20 69  pLeaf==0, this i
e400: 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45 4f  terator is at EO
e410: 46 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  F. */.      if( 
e420: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
e430: 3d 3d 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  ==pIter->iTermLe
e440: 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  afPgno ){.      
e450: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
e460: 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20  >pLeaf==0 );.   
e470: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
e480: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3c  iTermLeafOffset<
e490: 70 4e 65 77 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  pNew->szLeaf ){.
e4a0: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
e4b0: 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20  >pLeaf = pNew;. 
e4c0: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
e4d0: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49  iLeafOffset = pI
e4e0: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66  ter->iTermLeafOf
e4f0: 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  fset;.        }.
e500: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e510: 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f       int iRowidO
e520: 66 66 3b 0a 20 20 20 20 20 20 20 20 69 52 6f 77  ff;.        iRow
e530: 69 64 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66  idOff = fts5Leaf
e540: 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4e  FirstRowidOff(pN
e550: 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
e560: 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20   iRowidOff ){.  
e570: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
e580: 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Leaf = pNew;.   
e590: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
e5a0: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 52 6f 77  eafOffset = iRow
e5b0: 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 7d  idOff;.        }
e5c0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
e5d0: 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
e5e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   ){.        u8 *
e5f0: 61 20 3d 20 26 70 49 74 65 72 2d 3e 70 4c 65 61  a = &pIter->pLea
e600: 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4c 65 61  f->p[pIter->iLea
e610: 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 20 20  fOffset];.      
e620: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
e630: 66 73 65 74 20 2b 3d 20 66 74 73 35 47 65 74 56  fset += fts5GetV
e640: 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26  arint(a, (u64*)&
e650: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
e660: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e670: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e680: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
e690: 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ase(pNew);.     
e6a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
e6b0: 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
e6c0: 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   ){.    pIter->i
e6d0: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70  EndofDoclist = p
e6e0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b  Iter->pLeaf->nn+
e6f0: 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  1;.    fts5SegIt
e700: 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
e710: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d  e(p, pIter);.  }
e720: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
e730: 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74 65   true if the ite
e740: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
e750: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
e760: 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  ent currently.**
e770: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 64 65 6c   points to a del
e780: 65 74 65 20 6d 61 72 6b 65 72 2e 20 41 20 64 65  ete marker. A de
e790: 6c 65 74 65 20 6d 61 72 6b 65 72 20 69 73 20 61  lete marker is a
e7a0: 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 20 30  n entry with a 0
e7b0: 20 62 79 74 65 0a 2a 2a 20 70 6f 73 69 74 69 6f   byte.** positio
e7c0: 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  n-list..*/.stati
e7d0: 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49  c int fts5MultiI
e7e0: 74 65 72 49 73 45 6d 70 74 79 28 46 74 73 35 49  terIsEmpty(Fts5I
e7f0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49 74 65  ndex *p, Fts5Ite
e800: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73  r *pIter){.  Fts
e810: 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
e820: 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70 49   &pIter->aSeg[pI
e830: 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
e840: 46 69 72 73 74 5d 3b 0a 20 20 72 65 74 75 72 6e  First];.  return
e850: 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f   (p->rc==SQLITE_
e860: 4f 4b 20 26 26 20 70 53 65 67 2d 3e 70 4c 65 61  OK && pSeg->pLea
e870: 66 20 26 26 20 70 53 65 67 2d 3e 6e 50 6f 73 3d  f && pSeg->nPos=
e880: 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  =0);.}../*.** Ad
e890: 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 70  vance iterator p
e8a0: 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74  Iter to the next
e8b0: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
e8c0: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 74  is version of ft
e8d0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 29 20  s5SegIterNext() 
e8e0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20  is only used by 
e8f0: 72 65 76 65 72 73 65 20 69 74 65 72 61 74 6f 72  reverse iterator
e900: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
e910: 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  d fts5SegIterNex
e920: 74 5f 52 65 76 65 72 73 65 28 0a 20 20 46 74 73  t_Reverse(.  Fts
e930: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e950: 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
e960: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
e970: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
e980: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
e990: 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
e9a0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 55 6e 75 73  */.  int *pbUnus
e9b0: 65 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ed              
e9c0: 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 2a       /* Unused *
e9d0: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
e9e0: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
e9f0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
ea00: 53 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  SE );.  assert( 
ea10: 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66  pIter->pNextLeaf
ea20: 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==0 );.  UNUSED_
ea30: 50 41 52 41 4d 28 70 62 55 6e 75 73 65 64 29 3b  PARAM(pbUnused);
ea40: 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69  ..  if( pIter->i
ea50: 52 6f 77 69 64 4f 66 66 73 65 74 3e 30 20 29 7b  RowidOffset>0 ){
ea60: 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74  .    u8 *a = pIt
ea70: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
ea80: 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
ea90: 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20  i64 iDelta;..   
eaa0: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66   pIter->iRowidOf
eab0: 66 73 65 74 2d 2d 3b 0a 20 20 20 20 70 49 74 65  fset--;.    pIte
eac0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
ead0: 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66   pIter->aRowidOf
eae0: 66 73 65 74 5b 70 49 74 65 72 2d 3e 69 52 6f 77  fset[pIter->iRow
eaf0: 69 64 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 66  idOffset];.    f
eb00: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
eb10: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
eb20: 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e    iOff = pIter->
eb30: 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20  iLeafOffset;.   
eb40: 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d   if( p->pConfig-
eb50: 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44  >eDetail!=FTS5_D
eb60: 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
eb70: 20 20 20 20 69 4f 66 66 20 2b 3d 20 70 49 74 65      iOff += pIte
eb80: 72 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a 20  r->nPos;.    }. 
eb90: 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74     fts5GetVarint
eba0: 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
ebb0: 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 70  )&iDelta);.    p
ebc0: 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d 20  Iter->iRowid -= 
ebd0: 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73 65 7b  iDelta;.  }else{
ebe0: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
ebf0: 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28 70  ReverseNewPage(p
ec00: 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  , pIter);.  }.}.
ec10: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69  ./*.** Advance i
ec20: 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 74 6f  terator pIter to
ec30: 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e   the next entry.
ec40: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  .**.** This vers
ec50: 69 6f 6e 20 6f 66 20 66 74 73 35 53 65 67 49 74  ion of fts5SegIt
ec60: 65 72 4e 65 78 74 28 29 20 69 73 20 6f 6e 6c 79  erNext() is only
ec70: 20 75 73 65 64 20 69 66 20 64 65 74 61 69 6c 3d   used if detail=
ec80: 6e 6f 6e 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20  none and the.** 
ec90: 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 74 20  iterator is not 
eca0: 61 20 72 65 76 65 72 73 65 20 64 69 72 65 63 74  a reverse direct
ecb0: 69 6f 6e 20 69 74 65 72 61 74 6f 72 2e 0a 2a 2f  ion iterator..*/
ecc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
ecd0: 35 53 65 67 49 74 65 72 4e 65 78 74 5f 4e 6f 6e  5SegIterNext_Non
ece0: 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
ecf0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
ed00: 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
ed10: 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
ed20: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
ed30: 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
ed40: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
ed50: 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74  advance */.  int
ed60: 20 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20   *pbNewTerm     
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ed80: 4f 55 54 3a 20 53 65 74 20 66 6f 72 20 6e 65 77  OUT: Set for new
ed90: 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e   term */.){.  in
eda0: 74 20 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72  t iOff;..  asser
edb0: 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
edc0: 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _OK );.  assert(
edd0: 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26   (pIter->flags &
ede0: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
edf0: 56 45 52 53 45 29 3d 3d 30 20 29 3b 0a 20 20 61  VERSE)==0 );.  a
ee00: 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69  ssert( p->pConfi
ee10: 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  g->eDetail==FTS5
ee20: 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a  _DETAIL_NONE );.
ee30: 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46  .  ASSERT_SZLEAF
ee40: 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  _OK(pIter->pLeaf
ee50: 29 3b 0a 20 20 69 4f 66 66 20 3d 20 70 49 74 65  );.  iOff = pIte
ee60: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a  r->iLeafOffset;.
ee70: 0a 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79  .  /* Next entry
ee80: 20 69 73 20 6f 6e 20 74 68 65 20 6e 65 78 74 20   is on the next 
ee90: 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 49  page */.  if( pI
eea0: 74 65 72 2d 3e 70 53 65 67 20 26 26 20 69 4f 66  ter->pSeg && iOf
eeb0: 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  f>=pIter->pLeaf-
eec0: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 66  >szLeaf ){.    f
eed0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
eee0: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
eef0: 20 20 69 66 28 20 70 2d 3e 72 63 20 7c 7c 20 70    if( p->rc || p
ef00: 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  Iter->pLeaf==0 )
ef10: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 49 74   return;.    pIt
ef20: 65 72 2d 3e 69 52 6f 77 69 64 20 3d 20 30 3b 0a  er->iRowid = 0;.
ef30: 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20      iOff = 4;.  
ef40: 7d 0a 0a 20 20 69 66 28 20 69 4f 66 66 3c 70 49  }..  if( iOff<pI
ef50: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
ef60: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 78  st ){.    /* Nex
ef70: 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20 74 68  t entry is on th
ef80: 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 2a  e current page *
ef90: 2f 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74 61  /.    i64 iDelta
efa0: 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71  ;.    iOff += sq
efb0: 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
efc0: 6e 74 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66  nt(&pIter->pLeaf
efd0: 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  ->p[iOff], (u64*
efe0: 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 70  )&iDelta);.    p
eff0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
f000: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 70 49  t = iOff;.    pI
f010: 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69  ter->iRowid += i
f020: 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73 65 20 69  Delta;.  }else i
f030: 66 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73  f( (pIter->flags
f040: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
f050: 4f 4e 45 54 45 52 4d 29 3d 3d 30 20 29 7b 0a 20  ONETERM)==0 ){. 
f060: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 53     if( pIter->pS
f070: 65 67 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  eg ){.      int 
f080: 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20 20 20  nKeep = 0;.     
f090: 20 69 66 28 20 69 4f 66 66 21 3d 66 74 73 35 4c   if( iOff!=fts5L
f0a0: 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28  eafFirstTermOff(
f0b0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 20 29 7b  pIter->pLeaf) ){
f0c0: 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
f0d0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
f0e0: 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  (&pIter->pLeaf->
f0f0: 70 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b  p[iOff], nKeep);
f100: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
f110: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
f120: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
f130: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54  fts5SegIterLoadT
f140: 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e 4b  erm(p, pIter, nK
f150: 65 65 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  eep);.    }else{
f160: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
f170: 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  *pList = 0;.    
f180: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
f190: 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  erm = 0;.      i
f1a0: 6e 74 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20  nt nList;.      
f1b0: 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
f1c0: 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48 61 73 68  canNext(p->pHash
f1d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f1e0: 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72  Fts5HashScanEntr
f1f0: 79 28 70 2d 3e 70 48 61 73 68 2c 20 26 7a 54 65  y(p->pHash, &zTe
f200: 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69  rm, &pList, &nLi
f210: 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  st);.      if( p
f220: 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 6e  List==0 ) goto n
f230: 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b 0a 20 20  ext_none_eof;.  
f240: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
f250: 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74  ->p = (u8*)pList
f260: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70  ;.      pIter->p
f270: 4c 65 61 66 2d 3e 6e 6e 20 3d 20 6e 4c 69 73 74  Leaf->nn = nList
f280: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70  ;.      pIter->p
f290: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e  Leaf->szLeaf = n
f2a0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65  List;.      pIte
f2b0: 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
f2c0: 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20   = nList;.      
f2d0: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
f2e0: 72 53 65 74 28 26 70 2d 3e 72 63 2c 26 70 49 74  rSet(&p->rc,&pIt
f2f0: 65 72 2d 3e 74 65 72 6d 2c 20 28 69 6e 74 29 73  er->term, (int)s
f300: 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 20 28 75  trlen(zTerm), (u
f310: 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20  8*)zTerm);.     
f320: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
f330: 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72  set = fts5GetVar
f340: 69 6e 74 28 70 4c 69 73 74 2c 20 28 75 36 34 2a  int(pList, (u64*
f350: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
f360: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
f370: 20 70 62 4e 65 77 54 65 72 6d 20 29 20 2a 70 62   pbNewTerm ) *pb
f380: 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d  NewTerm = 1;.  }
f390: 65 6c 73 65 7b 0a 20 20 20 20 67 6f 74 6f 20 6e  else{.    goto n
f3a0: 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b 0a 20 20  ext_none_eof;.  
f3b0: 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72  }..  fts5SegIter
f3c0: 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
f3d0: 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 3b 0a 20  r);..  return;. 
f3e0: 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3a 0a 20  next_none_eof:. 
f3f0: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
f400: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
f410: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
f420: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64   0;.}.../*.** Ad
f430: 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 70  vance iterator p
f440: 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74  Iter to the next
f450: 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49   entry. .**.** I
f460: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
f470: 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  s, Fts5Index.rc 
f480: 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70  is set to an app
f490: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
f4a0: 6f 64 65 2e 20 49 74 20 0a 2a 2a 20 69 73 20 6e  ode. It .** is n
f4b0: 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e  ot considered an
f4c0: 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 69 74   error if the it
f4d0: 65 72 61 74 6f 72 20 72 65 61 63 68 65 73 20 45  erator reaches E
f4e0: 4f 46 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  OF. If an error 
f4f0: 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  has .** already 
f500: 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
f510: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
f520: 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
f530: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
f540: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
f550: 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Next(.  Fts5Inde
f560: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
f570: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
f580: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
f590: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
f5a0: 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
f5b0: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
f5c0: 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20  to advance */.  
f5d0: 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20  int *pbNewTerm  
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5f0: 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66 6f 72 20  /* OUT: Set for 
f600: 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20  new term */.){. 
f610: 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
f620: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
f630: 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 69  .  int iOff;.  i
f640: 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b  nt bNewTerm = 0;
f650: 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30  .  int nKeep = 0
f660: 3b 0a 20 20 75 38 20 2a 61 3b 0a 20 20 69 6e 74  ;.  u8 *a;.  int
f670: 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   n;..  assert( p
f680: 62 4e 65 77 54 65 72 6d 3d 3d 30 20 7c 7c 20 2a  bNewTerm==0 || *
f690: 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 29 3b 0a  pbNewTerm==0 );.
f6a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f    assert( p->pCo
f6b0: 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46  nfig->eDetail!=F
f6c0: 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
f6d0: 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20  );..  /* Search 
f6e0: 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  for the end of t
f6f0: 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
f700: 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72   within the curr
f710: 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 61  ent page. */.  a
f720: 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 6e   = pLeaf->p;.  n
f730: 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66   = pLeaf->szLeaf
f740: 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45  ;..  ASSERT_SZLE
f750: 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20  AF_OK(pLeaf);.  
f760: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
f770: 65 61 66 4f 66 66 73 65 74 20 2b 20 70 49 74 65  eafOffset + pIte
f780: 72 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 69 66 28 20  r->nPos;..  if( 
f790: 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 2f 2a  iOff<n ){.    /*
f7a0: 20 54 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   The next entry 
f7b0: 69 73 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  is on the curren
f7c0: 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  t page. */.    a
f7d0: 73 73 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c 3d  ssert_nc( iOff<=
f7e0: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
f7f0: 6c 69 73 74 20 29 3b 0a 20 20 20 20 69 66 28 20  list );.    if( 
f800: 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 69 45 6e  iOff>=pIter->iEn
f810: 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20  dofDoclist ){.  
f820: 20 20 20 20 62 4e 65 77 54 65 72 6d 20 3d 20 31      bNewTerm = 1
f830: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66  ;.      if( iOff
f840: 21 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74 54  !=fts5LeafFirstT
f850: 65 72 6d 4f 66 66 28 70 4c 65 61 66 29 20 29 7b  ermOff(pLeaf) ){
f860: 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
f870: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
f880: 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70  (&a[iOff], nKeep
f890: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
f8a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 36 34 20  else{.      u64 
f8b0: 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 69 4f  iDelta;.      iO
f8c0: 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  ff += sqlite3Fts
f8d0: 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f  5GetVarint(&a[iO
f8e0: 66 66 5d 2c 20 26 69 44 65 6c 74 61 29 3b 0a 20  ff], &iDelta);. 
f8f0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77       pIter->iRow
f900: 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20  id += iDelta;.  
f910: 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69      assert_nc( i
f920: 44 65 6c 74 61 3e 30 20 29 3b 0a 20 20 20 20 7d  Delta>0 );.    }
f930: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
f940: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
f950: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74  .  }else if( pIt
f960: 65 72 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20  er->pSeg==0 ){. 
f970: 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69     const u8 *pLi
f980: 73 74 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  st = 0;.    cons
f990: 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20  t char *zTerm = 
f9a0: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 69 73 74  0;.    int nList
f9b0: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
f9c0: 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  ( (pIter->flags 
f9d0: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  & FTS5_SEGITER_O
f9e0: 4e 45 54 45 52 4d 29 20 7c 7c 20 70 62 4e 65 77  NETERM) || pbNew
f9f0: 54 65 72 6d 20 29 3b 0a 20 20 20 20 69 66 28 20  Term );.    if( 
fa00: 30 3d 3d 28 70 49 74 65 72 2d 3e 66 6c 61 67 73  0==(pIter->flags
fa10: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
fa20: 4f 4e 45 54 45 52 4d 29 20 29 7b 0a 20 20 20 20  ONETERM) ){.    
fa30: 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
fa40: 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48 61  hScanNext(p->pHa
fa50: 73 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sh);.      sqlit
fa60: 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e  e3Fts5HashScanEn
fa70: 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26 7a  try(p->pHash, &z
fa80: 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e  Term, &pList, &n
fa90: 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
faa0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
fab0: 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52  .      fts5DataR
fac0: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
fad0: 65 61 66 29 3b 0a 20 20 20 20 20 20 70 49 74 65  eaf);.      pIte
fae0: 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r->pLeaf = 0;.  
faf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
fb00: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d  Iter->pLeaf->p =
fb10: 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20   (u8*)pList;.   
fb20: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d     pIter->pLeaf-
fb30: 3e 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  >nn = nList;.   
fb40: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d     pIter->pLeaf-
fb50: 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b  >szLeaf = nList;
fb60: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45  .      pIter->iE
fb70: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 6e 4c  ndofDoclist = nL
fb80: 69 73 74 2b 31 3b 0a 20 20 20 20 20 20 73 71 6c  ist+1;.      sql
fb90: 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 65  ite3Fts5BufferSe
fba0: 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72  t(&p->rc, &pIter
fbb0: 2d 3e 74 65 72 6d 2c 20 28 69 6e 74 29 73 74 72  ->term, (int)str
fbc0: 6c 65 6e 28 7a 54 65 72 6d 29 2c 0a 20 20 20 20  len(zTerm),.    
fbd0: 20 20 20 20 20 20 28 75 38 2a 29 7a 54 65 72 6d        (u8*)zTerm
fbe0: 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
fbf0: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74  iLeafOffset = ft
fc00: 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c 69 73  s5GetVarint(pLis
fc10: 74 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  t, (u64*)&pIter-
fc20: 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  >iRowid);.      
fc30: 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a  *pbNewTerm = 1;.
fc40: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
fc50: 20 20 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20     iOff = 0;.   
fc60: 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 69   /* Next entry i
fc70: 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72  s not on the cur
fc80: 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 20  rent page */.   
fc90: 20 77 68 69 6c 65 28 20 69 4f 66 66 3d 3d 30 20   while( iOff==0 
fca0: 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  ){.      fts5Seg
fcb0: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
fcc0: 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 70 4c  pIter);.      pL
fcd0: 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  eaf = pIter->pLe
fce0: 61 66 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  af;.      if( pL
fcf0: 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  eaf==0 ) break;.
fd00: 20 20 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c        ASSERT_SZL
fd10: 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20  EAF_OK(pLeaf);. 
fd20: 20 20 20 20 20 69 66 28 20 28 69 4f 66 66 20 3d       if( (iOff =
fd30: 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f   fts5LeafFirstRo
fd40: 77 69 64 4f 66 66 28 70 4c 65 61 66 29 29 20 26  widOff(pLeaf)) &
fd50: 26 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 73 7a  & iOff<pLeaf->sz
fd60: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
fd70: 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46  iOff += sqlite3F
fd80: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c  ts5GetVarint(&pL
fd90: 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  eaf->p[iOff], (u
fda0: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
fdb0: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74  id);.        pIt
fdc0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
fdd0: 3d 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20  = iOff;..       
fde0: 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3e 70   if( pLeaf->nn>p
fdf0: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
fe00: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
fe10: 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70 4c 65  >iPgidxOff = pLe
fe20: 61 66 2d 3e 73 7a 4c 65 61 66 20 2b 20 66 74 73  af->szLeaf + fts
fe30: 35 47 65 74 56 61 72 69 6e 74 33 32 28 0a 20 20  5GetVarint32(.  
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 26 70 4c 65              &pLe
fe50: 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c  af->p[pLeaf->szL
fe60: 65 61 66 5d 2c 20 70 49 74 65 72 2d 3e 69 45 6e  eaf], pIter->iEn
fe70: 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20 20 20 20  dofDoclist.     
fe80: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
fe90: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
fea0: 65 6c 73 65 20 69 66 28 20 70 4c 65 61 66 2d 3e  else if( pLeaf->
feb0: 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  nn>pLeaf->szLeaf
fec0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65   ){.        pIte
fed0: 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70  r->iPgidxOff = p
fee0: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2b 20 66  Leaf->szLeaf + f
fef0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 0a  ts5GetVarint32(.
ff00: 20 20 20 20 20 20 20 20 20 20 20 20 26 70 4c 65              &pLe
ff10: 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c  af->p[pLeaf->szL
ff20: 65 61 66 5d 2c 20 69 4f 66 66 0a 20 20 20 20 20  eaf], iOff.     
ff30: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49     );.        pI
ff40: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
ff50: 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20   = iOff;.       
ff60: 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
ff70: 63 6c 69 73 74 20 3d 20 69 4f 66 66 3b 0a 20 20  clist = iOff;.  
ff80: 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20 3d        bNewTerm =
ff90: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
ffa0: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66    assert_nc( iOf
ffb0: 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  f<pLeaf->szLeaf 
ffc0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  );.      if( iOf
ffd0: 66 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  f>pLeaf->szLeaf 
ffe0: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
fff0: 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
10000 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
10010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10020 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
10030 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  f the iterator i
10040 73 20 6e 6f 77 20 61 74 20 45 4f 46 2e 20 49 66  s now at EOF. If
10050 20 73 6f 2c 20 72 65 74 75 72 6e 20 65 61 72 6c   so, return earl
10060 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 74 65  y. */.  if( pIte
10070 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
10080 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a  if( bNewTerm ){.
10090 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
100a0 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
100b0 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 7b  GITER_ONETERM ){
100c0 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
100d0 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
100e0 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
100f0 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
10100 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10110 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
10120 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49  erLoadTerm(p, pI
10130 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  ter, nKeep);.   
10140 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
10150 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
10160 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
10170 70 62 4e 65 77 54 65 72 6d 20 29 20 2a 70 62 4e  pbNewTerm ) *pbN
10180 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  ewTerm = 1;.    
10190 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
101a0 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c       /* The foll
101b0 6f 77 69 6e 67 20 63 6f 75 6c 64 20 62 65 20 64  owing could be d
101c0 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 66  one by calling f
101d0 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
101e0 6f 73 28 29 2e 20 42 75 74 0a 20 20 20 20 20 20  os(). But.      
101f0 2a 2a 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73  ** this block is
10200 20 70 61 72 74 69 63 75 6c 61 72 6c 79 20 70 65   particularly pe
10210 72 66 6f 72 6d 61 6e 63 65 20 63 72 69 74 69 63  rformance critic
10220 61 6c 2c 20 73 6f 20 65 71 75 69 76 61 6c 65 6e  al, so equivalen
10230 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 20  t.      ** code 
10240 69 73 20 69 6e 6c 69 6e 65 64 2e 20 0a 20 20 20  is inlined. .   
10250 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4c     **.      ** L
10260 61 74 65 72 3a 20 53 77 69 74 63 68 65 64 20 62  ater: Switched b
10270 61 63 6b 20 74 6f 20 66 74 73 35 53 65 67 49 74  ack to fts5SegIt
10280 65 72 4c 6f 61 64 4e 50 6f 73 28 29 20 62 65 63  erLoadNPos() bec
10290 61 75 73 65 20 69 74 20 73 75 70 70 6f 72 74 73  ause it supports
102a0 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 61 69 6c  .      ** detail
102b0 3d 6e 6f 6e 65 20 6d 6f 64 65 2e 20 4e 6f 74 20  =none mode. Not 
102c0 69 64 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a  ideal..      */.
102d0 20 20 20 20 20 20 69 6e 74 20 6e 53 7a 3b 0a 20        int nSz;. 
102e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
102f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
10300 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10310 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
10320 74 3c 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  t<=pIter->pLeaf-
10330 3e 6e 6e 20 29 3b 0a 20 20 20 20 20 20 66 74 73  >nn );.      fts
10340 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32  5FastGetVarint32
10350 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70  (pIter->pLeaf->p
10360 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  , pIter->iLeafOf
10370 66 73 65 74 2c 20 6e 53 7a 29 3b 0a 20 20 20 20  fset, nSz);.    
10380 20 20 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20    pIter->bDel = 
10390 28 6e 53 7a 20 26 20 30 78 30 30 30 31 29 3b 0a  (nSz & 0x0001);.
103a0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f        pIter->nPo
103b0 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a 20 20 20 20  s = nSz>>1;.    
103c0 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 49 74    assert_nc( pIt
103d0 65 72 2d 3e 6e 50 6f 73 3e 3d 30 20 29 3b 0a 20  er->nPos>=0 );. 
103e0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66     }.  }.}..#def
103f0 69 6e 65 20 53 57 41 50 56 41 4c 28 54 2c 20 61  ine SWAPVAL(T, a
10400 2c 20 62 29 20 7b 20 54 20 74 6d 70 3b 20 74 6d  , b) { T tmp; tm
10410 70 3d 61 3b 20 61 3d 62 3b 20 62 3d 74 6d 70 3b  p=a; a=b; b=tmp;
10420 20 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35   }..#define fts5
10430 49 6e 64 65 78 53 6b 69 70 56 61 72 69 6e 74 28  IndexSkipVarint(
10440 61 2c 20 69 4f 66 66 29 20 7b 20 20 20 20 20 20  a, iOff) {      
10450 20 20 20 20 20 20 5c 0a 20 20 69 6e 74 20 69 45        \.  int iE
10460 6e 64 20 3d 20 69 4f 66 66 2b 39 3b 20 20 20 20  nd = iOff+9;    
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10480 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 77 68            \.  wh
10490 69 6c 65 28 20 28 61 5b 69 4f 66 66 2b 2b 5d 20  ile( (a[iOff++] 
104a0 26 20 30 78 38 30 29 20 26 26 20 69 4f 66 66 3c  & 0x80) && iOff<
104b0 69 45 6e 64 20 29 3b 20 20 20 20 20 20 20 5c 0a  iEnd );       \.
104c0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f  }../*.** Iterato
104d0 72 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c  r pIter currentl
104e0 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
104f0 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 61  first rowid in a
10500 20 64 6f 63 6c 69 73 74 2e 20 54 68 69 73 0a 2a   doclist. This.*
10510 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  * function sets 
10520 74 68 65 20 69 74 65 72 61 74 6f 72 20 75 70 20  the iterator up 
10530 73 6f 20 74 68 61 74 20 69 74 65 72 61 74 65 73  so that iterates
10540 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
10550 72 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 65  r through.** the
10560 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61   doclist..*/.sta
10570 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
10580 49 74 65 72 52 65 76 65 72 73 65 28 46 74 73 35  IterReverse(Fts5
10590 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
105a0 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
105b0 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
105c0 70 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e  pDlidx = pIter->
105d0 70 44 6c 69 64 78 3b 0a 20 20 46 74 73 35 44 61  pDlidx;.  Fts5Da
105e0 74 61 20 2a 70 4c 61 73 74 20 3d 20 30 3b 0a 20  ta *pLast = 0;. 
105f0 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20   int pgnoLast = 
10600 30 3b 0a 0a 20 20 69 66 28 20 70 44 6c 69 64 78  0;..  if( pDlidx
10610 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67   ){.    int iSeg
10620 69 64 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67  id = pIter->pSeg
10630 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 70 67  ->iSegid;.    pg
10640 6e 6f 4c 61 73 74 20 3d 20 66 74 73 35 44 6c 69  noLast = fts5Dli
10650 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
10660 78 29 3b 0a 20 20 20 20 70 4c 61 73 74 20 3d 20  x);.    pLast = 
10670 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
10680 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
10690 49 44 28 69 53 65 67 69 64 2c 20 70 67 6e 6f 4c  ID(iSegid, pgnoL
106a0 61 73 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ast));.  }else{.
106b0 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c      Fts5Data *pL
106c0 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  eaf = pIter->pLe
106d0 61 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  af;         /* C
106e0 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61  urrent leaf data
106f0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72   */..    /* Curr
10700 65 6e 74 6c 79 2c 20 46 74 73 35 53 65 67 49 74  ently, Fts5SegIt
10710 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70  er.iLeafOffset p
10720 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
10730 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20 2a  st byte of.    *
10740 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  * position-list 
10750 63 6f 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20  content for the 
10760 63 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 20 42  current rowid. B
10770 61 63 6b 20 69 74 20 75 70 20 73 6f 20 74 68 61  ack it up so tha
10780 74 20 69 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  t it.    ** poin
10790 74 73 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ts to the start 
107a0 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d  of the position-
107b0 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e  list size field.
107c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 50 6f 73   */.    int iPos
107d0 6c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 49  list;.    if( pI
107e0 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
107f0 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66  no==pIter->iLeaf
10800 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 69 50  Pgno ){.      iP
10810 6f 73 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e  oslist = pIter->
10820 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b  iTermLeafOffset;
10830 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10840 20 20 69 50 6f 73 6c 69 73 74 20 3d 20 34 3b 0a    iPoslist = 4;.
10850 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 49 6e      }.    fts5In
10860 64 65 78 53 6b 69 70 56 61 72 69 6e 74 28 70 4c  dexSkipVarint(pL
10870 65 61 66 2d 3e 70 2c 20 69 50 6f 73 6c 69 73 74  eaf->p, iPoslist
10880 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  );.    pIter->iL
10890 65 61 66 4f 66 66 73 65 74 20 3d 20 69 50 6f 73  eafOffset = iPos
108a0 6c 69 73 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  list;..    /* If
108b0 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   this condition 
108c0 69 73 20 74 72 75 65 20 74 68 65 6e 20 74 68 65  is true then the
108d0 20 6c 61 72 67 65 73 74 20 72 6f 77 69 64 20 66   largest rowid f
108e0 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  or the current. 
108f0 20 20 20 2a 2a 20 74 65 72 6d 20 6d 61 79 20 6e     ** term may n
10900 6f 74 20 62 65 20 73 74 6f 72 65 64 20 6f 6e 20  ot be stored on 
10910 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
10920 2e 20 53 6f 20 73 65 61 72 63 68 20 66 6f 72 77  . So search forw
10930 61 72 64 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65  ard to.    ** se
10940 65 20 77 68 65 72 65 20 73 61 69 64 20 72 6f 77  e where said row
10950 69 64 20 72 65 61 6c 6c 79 20 69 73 2e 20 20 2a  id really is.  *
10960 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  /.    if( pIter-
10970 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3e 3d  >iEndofDoclist>=
10980 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
10990 0a 20 20 20 20 20 20 69 6e 74 20 70 67 6e 6f 3b  .      int pgno;
109a0 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
109b0 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
109c0 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 3b  g = pIter->pSeg;
109d0 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  ..      /* The l
109e0 61 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65  ast rowid in the
109f0 20 64 6f 63 6c 69 73 74 20 6d 61 79 20 6e 6f 74   doclist may not
10a00 20 62 65 20 6f 6e 20 74 68 65 20 63 75 72 72 65   be on the curre
10a10 6e 74 20 70 61 67 65 2e 20 53 65 61 72 63 68 0a  nt page. Search.
10a20 20 20 20 20 20 20 2a 2a 20 66 6f 72 77 61 72 64        ** forward
10a30 20 74 6f 20 66 69 6e 64 20 74 68 65 20 70 61 67   to find the pag
10a40 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
10a50 20 6c 61 73 74 20 72 6f 77 69 64 2e 20 20 2a 2f   last rowid.  */
10a60 0a 20 20 20 20 20 20 66 6f 72 28 70 67 6e 6f 3d  .      for(pgno=
10a70 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
10a80 2b 31 3b 20 21 70 2d 3e 72 63 20 26 26 20 70 67  +1; !p->rc && pg
10a90 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  no<=pSeg->pgnoLa
10aa0 73 74 3b 20 70 67 6e 6f 2b 2b 29 7b 0a 20 20 20  st; pgno++){.   
10ab0 20 20 20 20 20 69 36 34 20 69 41 62 73 20 3d 20       i64 iAbs = 
10ac0 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
10ad0 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  ID(pSeg->iSegid,
10ae0 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
10af0 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77 20 3d  Fts5Data *pNew =
10b00 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
10b10 20 69 41 62 73 29 3b 0a 20 20 20 20 20 20 20 20   iAbs);.        
10b20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
10b30 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64        int iRowid
10b40 2c 20 62 54 65 72 6d 6c 65 73 73 3b 0a 20 20 20  , bTermless;.   
10b50 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 3d 20         iRowid = 
10b60 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77  fts5LeafFirstRow
10b70 69 64 4f 66 66 28 70 4e 65 77 29 3b 0a 20 20 20  idOff(pNew);.   
10b80 20 20 20 20 20 20 20 62 54 65 72 6d 6c 65 73 73         bTermless
10b90 20 3d 20 66 74 73 35 4c 65 61 66 49 73 54 65 72   = fts5LeafIsTer
10ba0 6d 6c 65 73 73 28 70 4e 65 77 29 3b 0a 20 20 20  mless(pNew);.   
10bb0 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69         if( iRowi
10bc0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
10bd0 20 53 57 41 50 56 41 4c 28 46 74 73 35 44 61 74   SWAPVAL(Fts5Dat
10be0 61 2a 2c 20 70 4e 65 77 2c 20 70 4c 61 73 74 29  a*, pNew, pLast)
10bf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 67  ;.            pg
10c00 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 3b 0a 20  noLast = pgno;. 
10c10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
10c20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
10c30 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  ease(pNew);.    
10c40 20 20 20 20 20 20 69 66 28 20 62 54 65 72 6d 6c        if( bTerml
10c50 65 73 73 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ess==0 ) break;.
10c60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10c70 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
10c80 2a 20 49 66 20 70 4c 61 73 74 20 69 73 20 4e 55  * If pLast is NU
10c90 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  LL at this point
10ca0 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20  , then the last 
10cb0 72 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 64  rowid for this d
10cc0 6f 63 6c 69 73 74 0a 20 20 2a 2a 20 6c 69 65 73  oclist.  ** lies
10cd0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 63 75 72   on the page cur
10ce0 72 65 6e 74 6c 79 20 69 6e 64 69 63 61 74 65 64  rently indicated
10cf0 20 62 79 20 74 68 65 20 69 74 65 72 61 74 6f 72   by the iterator
10d00 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 0a  . In this case .
10d10 20 20 2a 2a 20 70 49 74 65 72 2d 3e 69 4c 65 61    ** pIter->iLea
10d20 66 4f 66 66 73 65 74 20 69 73 20 61 6c 72 65 61  fOffset is alrea
10d30 64 79 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  dy set to point 
10d40 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d  to the position-
10d50 6c 69 73 74 20 73 69 7a 65 0a 20 20 2a 2a 20 66  list size.  ** f
10d60 69 65 6c 64 20 61 73 73 6f 63 69 61 74 65 64 20  ield associated 
10d70 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 72  with the first r
10d80 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e  elevant rowid on
10d90 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 0a   the page..  **.
10da0 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 61 73    ** Or, if pLas
10db0 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74  t is non-NULL, t
10dc0 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 70 61  hen it is the pa
10dd0 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
10de0 20 74 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20 72   the last.  ** r
10df0 6f 77 69 64 2e 20 49 6e 20 74 68 69 73 20 63 61  owid. In this ca
10e00 73 65 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65  se configure the
10e10 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61   iterator so tha
10e20 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  t it points to t
10e30 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 72 6f  he.  ** first ro
10e40 77 69 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65  wid on this page
10e50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61  ..  */.  if( pLa
10e60 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f  st ){.    int iO
10e70 66 66 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61  ff;.    fts5Data
10e80 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
10e90 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72  Leaf);.    pIter
10ea0 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 61 73 74 3b  ->pLeaf = pLast;
10eb0 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
10ec0 66 50 67 6e 6f 20 3d 20 70 67 6e 6f 4c 61 73 74  fPgno = pgnoLast
10ed0 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73  ;.    iOff = fts
10ee0 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
10ef0 66 66 28 70 4c 61 73 74 29 3b 0a 20 20 20 20 69  ff(pLast);.    i
10f00 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
10f10 72 69 6e 74 28 26 70 4c 61 73 74 2d 3e 70 5b 69  rint(&pLast->p[i
10f20 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  Off], (u64*)&pIt
10f30 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
10f40 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
10f50 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20  set = iOff;..   
10f60 20 69 66 28 20 66 74 73 35 4c 65 61 66 49 73 54   if( fts5LeafIsT
10f70 65 72 6d 6c 65 73 73 28 70 4c 61 73 74 29 20 29  ermless(pLast) )
10f80 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  {.      pIter->i
10f90 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70  EndofDoclist = p
10fa0 4c 61 73 74 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20  Last->nn+1;.    
10fb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74  }else{.      pIt
10fc0 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
10fd0 74 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  t = fts5LeafFirs
10fe0 74 54 65 72 6d 4f 66 66 28 70 4c 61 73 74 29 3b  tTermOff(pLast);
10ff0 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 0a 20 20 66  .    }..  }..  f
11000 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
11010 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74  eInitPage(p, pIt
11020 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74  er);.}../*.** It
11030 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75 72  erator pIter cur
11040 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
11050 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
11060 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 0a 2a   of a doclist..*
11070 2a 20 54 68 65 72 65 20 69 73 20 61 20 64 6f 63  * There is a doc
11080 6c 69 73 74 2d 69 6e 64 65 78 20 61 73 73 6f 63  list-index assoc
11090 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66  iated with the f
110a0 69 6e 61 6c 20 74 65 72 6d 20 6f 6e 20 74 68 65  inal term on the
110b0 20 63 75 72 72 65 6e 74 20 0a 2a 2a 20 70 61 67   current .** pag
110c0 65 2e 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  e. If the curren
110d0 74 20 74 65 72 6d 20 69 73 20 74 68 65 20 6c 61  t term is the la
110e0 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 70  st term on the p
110f0 61 67 65 2c 20 6c 6f 61 64 20 74 68 65 20 0a 2a  age, load the .*
11100 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  * doclist-index 
11110 66 72 6f 6d 20 64 69 73 6b 20 61 6e 64 20 69 6e  from disk and in
11120 69 74 69 61 6c 69 7a 65 20 61 6e 20 69 74 65 72  itialize an iter
11130 61 74 6f 72 20 61 74 20 28 70 49 74 65 72 2d 3e  ator at (pIter->
11140 70 44 6c 69 64 78 29 2e 0a 2a 2f 0a 73 74 61 74  pDlidx)..*/.stat
11150 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
11160 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 46 74 73  terLoadDlidx(Fts
11170 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
11180 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
11190 20 20 69 6e 74 20 69 53 65 67 20 3d 20 70 49 74    int iSeg = pIt
111a0 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64  er->pSeg->iSegid
111b0 3b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28  ;.  int bRev = (
111c0 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
111d0 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
111e0 52 53 45 29 3b 0a 20 20 46 74 73 35 44 61 74 61  RSE);.  Fts5Data
111f0 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d   *pLeaf = pIter-
11200 3e 70 4c 65 61 66 3b 20 2f 2a 20 43 75 72 72 65  >pLeaf; /* Curre
11210 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  nt leaf data */.
11220 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
11230 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
11240 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29  EGITER_ONETERM )
11250 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
11260 72 2d 3e 70 44 6c 69 64 78 3d 3d 30 20 29 3b 0a  r->pDlidx==0 );.
11270 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
11280 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69  he current docli
11290 73 74 20 65 6e 64 73 20 6f 6e 20 74 68 69 73 20  st ends on this 
112a0 70 61 67 65 2e 20 49 66 20 69 74 20 64 6f 65 73  page. If it does
112b0 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 65 61  , return.  ** ea
112c0 72 6c 79 20 77 69 74 68 6f 75 74 20 6c 6f 61 64  rly without load
112d0 69 6e 67 20 74 68 65 20 64 6f 63 6c 69 73 74 2d  ing the doclist-
112e0 69 6e 64 65 78 20 28 61 73 20 69 74 20 62 65 6c  index (as it bel
112f0 6f 6e 67 73 20 74 6f 20 61 20 64 69 66 66 65 72  ongs to a differ
11300 65 6e 74 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 2a  ent.  ** term. *
11310 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69  /.  if( pIter->i
11320 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70 49  TermLeafPgno==pI
11330 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 0a  ter->iLeafPgno .
11340 20 20 20 26 26 20 70 49 74 65 72 2d 3e 69 45 6e     && pIter->iEn
11350 64 6f 66 44 6f 63 6c 69 73 74 3c 70 4c 65 61 66  dofDoclist<pLeaf
11360 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 29 7b 0a 20  ->szLeaf .  ){. 
11370 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
11380 20 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20    pIter->pDlidx 
11390 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 49  = fts5DlidxIterI
113a0 6e 69 74 28 70 2c 20 62 52 65 76 2c 20 69 53 65  nit(p, bRev, iSe
113b0 67 2c 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  g, pIter->iTermL
113c0 65 61 66 50 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  eafPgno);.}../*.
113d0 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20  ** The iterator 
113e0 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
113f0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
11400 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 63  ment currently c
11410 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6e 6f 20 76 61  ontains.** no va
11420 6c 69 64 20 76 61 6c 75 65 73 20 65 78 63 65 70  lid values excep
11430 74 20 66 6f 72 20 74 68 65 20 46 74 73 35 53 65  t for the Fts5Se
11440 67 49 74 65 72 2e 70 4c 65 61 66 20 6d 65 6d 62  gIter.pLeaf memb
11450 65 72 20 76 61 72 69 61 62 6c 65 2e 20 54 68 69  er variable. Thi
11460 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65  s.** function se
11470 61 72 63 68 65 73 20 74 68 65 20 6c 65 61 66 20  arches the leaf 
11480 70 61 67 65 20 66 6f 72 20 61 20 74 65 72 6d 20  page for a term 
11490 6d 61 74 63 68 69 6e 67 20 28 70 54 65 72 6d 2f  matching (pTerm/
114a0 6e 54 65 72 6d 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  nTerm)..**.** If
114b0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74   the specified t
114c0 65 72 6d 20 69 73 20 66 6f 75 6e 64 20 6f 6e 20  erm is found on 
114d0 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74  the page, then t
114e0 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c  he iterator is l
114f0 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  eft.** pointing 
11500 74 6f 20 69 74 2e 20 49 66 20 61 72 67 75 6d 65  to it. If argume
11510 6e 74 20 62 47 65 20 69 73 20 7a 65 72 6f 20 61  nt bGe is zero a
11520 6e 64 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e  nd the term is n
11530 6f 74 20 66 6f 75 6e 64 2c 0a 2a 2a 20 74 68 65  ot found,.** the
11540 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66   iterator is lef
11550 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 45 4f  t pointing at EO
11560 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 47 65 20  F..**.** If bGe 
11570 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
11580 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
11590 72 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c  rm is not found,
115a0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 69 74 65   then the.** ite
115b0 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  rator is left po
115c0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 73 6d  inting to the sm
115d0 61 6c 6c 65 73 74 20 74 65 72 6d 20 69 6e 20 74  allest term in t
115e0 68 65 20 73 65 67 6d 65 6e 74 20 74 68 61 74 0a  he segment that.
115f0 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ** is larger tha
11600 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
11610 74 65 72 6d 2c 20 65 76 65 6e 20 69 66 20 74 68  term, even if th
11620 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 6f  is term is not o
11630 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  n the.** current
11640 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
11650 20 76 6f 69 64 20 66 74 73 35 4c 65 61 66 53 65   void fts5LeafSe
11660 65 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ek(.  Fts5Index 
11670 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
11680 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 61        /* Leave a
11690 6e 79 20 65 72 72 6f 72 20 63 6f 64 65 20 68 65  ny error code he
116a0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 47 65 2c  re */.  int bGe,
116b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116c0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
116d0 66 6f 72 20 61 20 3e 3d 20 73 65 61 72 63 68 20  for a >= search 
116e0 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
116f0 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
11700 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
11710 20 74 6f 20 73 65 65 6b 20 2a 2f 0a 20 20 63 6f   to seek */.  co
11720 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69  nst u8 *pTerm, i
11730 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20 2f 2a  nt nTerm      /*
11740 20 54 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   Term to search 
11750 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  for */.){.  int 
11760 69 4f 66 66 3b 0a 20 20 63 6f 6e 73 74 20 75 38  iOff;.  const u8
11770 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65   *a = pIter->pLe
11780 61 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 73 7a 4c  af->p;.  int szL
11790 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  eaf = pIter->pLe
117a0 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 69 6e  af->szLeaf;.  in
117b0 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  t n = pIter->pLe
117c0 61 66 2d 3e 6e 6e 3b 0a 0a 20 20 69 6e 74 20 6e  af->nn;..  int n
117d0 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 69 6e 74  Match = 0;.  int
117e0 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 69 6e   nKeep = 0;.  in
117f0 74 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e  t nNew = 0;.  in
11800 74 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 69 6e  t iTermOff;.  in
11810 74 20 69 50 67 69 64 78 3b 20 20 20 20 20 20 20  t iPgidx;       
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11830 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20   Current offset 
11840 69 6e 20 70 67 69 64 78 20 2a 2f 0a 20 20 69 6e  in pgidx */.  in
11850 74 20 62 45 6e 64 4f 66 50 61 67 65 20 3d 20 30  t bEndOfPage = 0
11860 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
11870 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
11880 0a 0a 20 20 69 50 67 69 64 78 20 3d 20 73 7a 4c  ..  iPgidx = szL
11890 65 61 66 3b 0a 20 20 69 50 67 69 64 78 20 2b 3d  eaf;.  iPgidx +=
118a0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
118b0 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 69 54 65  (&a[iPgidx], iTe
118c0 72 6d 4f 66 66 29 3b 0a 20 20 69 4f 66 66 20 3d  rmOff);.  iOff =
118d0 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 69 66 28   iTermOff;.  if(
118e0 20 69 4f 66 66 3e 6e 20 29 7b 0a 20 20 20 20 70   iOff>n ){.    p
118f0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
11900 55 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  UPT;.    return;
11910 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31  .  }..  while( 1
11920 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75   ){..    /* Figu
11930 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
11940 6e 65 77 20 62 79 74 65 73 20 61 72 65 20 69 6e  new bytes are in
11950 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20   this term */.  
11960 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72    fts5FastGetVar
11970 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e  int32(a, iOff, n
11980 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 6e 4b  New);.    if( nK
11990 65 65 70 3c 6e 4d 61 74 63 68 20 29 7b 0a 20 20  eep<nMatch ){.  
119a0 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f      goto search_
119b0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
119c0 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 65 70     assert( nKeep
119d0 3e 3d 6e 4d 61 74 63 68 20 29 3b 0a 20 20 20 20  >=nMatch );.    
119e0 69 66 28 20 6e 4b 65 65 70 3d 3d 6e 4d 61 74 63  if( nKeep==nMatc
119f0 68 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  h ){.      int n
11a00 43 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Cmp;.      int i
11a10 3b 0a 20 20 20 20 20 20 6e 43 6d 70 20 3d 20 4d  ;.      nCmp = M
11a20 49 4e 28 6e 4e 65 77 2c 20 6e 54 65 72 6d 2d 6e  IN(nNew, nTerm-n
11a30 4d 61 74 63 68 29 3b 0a 20 20 20 20 20 20 66 6f  Match);.      fo
11a40 72 28 69 3d 30 3b 20 69 3c 6e 43 6d 70 3b 20 69  r(i=0; i<nCmp; i
11a50 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
11a60 20 61 5b 69 4f 66 66 2b 69 5d 21 3d 70 54 65 72   a[iOff+i]!=pTer
11a70 6d 5b 6e 4d 61 74 63 68 2b 69 5d 20 29 20 62 72  m[nMatch+i] ) br
11a80 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
11a90 20 20 20 6e 4d 61 74 63 68 20 2b 3d 20 69 3b 0a     nMatch += i;.
11aa0 0a 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d  .      if( nTerm
11ab0 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20  ==nMatch ){.    
11ac0 20 20 20 20 69 66 28 20 69 3d 3d 6e 4e 65 77 20      if( i==nNew 
11ad0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
11ae0 6f 20 73 65 61 72 63 68 5f 73 75 63 63 65 73 73  o search_success
11af0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
11b00 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
11b10 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20  search_failed;. 
11b20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11b30 65 6c 73 65 20 69 66 28 20 69 3c 6e 4e 65 77 20  else if( i<nNew 
11b40 26 26 20 61 5b 69 4f 66 66 2b 69 5d 3e 70 54 65  && a[iOff+i]>pTe
11b50 72 6d 5b 6e 4d 61 74 63 68 5d 20 29 7b 0a 20 20  rm[nMatch] ){.  
11b60 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63        goto searc
11b70 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  h_failed;.      
11b80 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
11b90 20 69 50 67 69 64 78 3e 3d 6e 20 29 7b 0a 20 20   iPgidx>=n ){.  
11ba0 20 20 20 20 62 45 6e 64 4f 66 50 61 67 65 20 3d      bEndOfPage =
11bb0 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
11bc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 50 67 69  .    }..    iPgi
11bd0 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  dx += fts5GetVar
11be0 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 5d  int32(&a[iPgidx]
11bf0 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 69 54  , nKeep);.    iT
11c00 65 72 6d 4f 66 66 20 2b 3d 20 6e 4b 65 65 70 3b  ermOff += nKeep;
11c10 0a 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72  .    iOff = iTer
11c20 6d 4f 66 66 3b 0a 0a 20 20 20 20 69 66 28 20 69  mOff;..    if( i
11c30 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20  Off>=n ){.      
11c40 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
11c50 52 55 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  RUPT;.      retu
11c60 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rn;.    }..    /
11c70 2a 20 52 65 61 64 20 74 68 65 20 6e 4b 65 65 70  * Read the nKeep
11c80 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6e 65   field of the ne
11c90 78 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  xt term. */.    
11ca0 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
11cb0 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e 4b 65  t32(a, iOff, nKe
11cc0 65 70 29 3b 0a 20 20 7d 0a 0a 20 73 65 61 72 63  ep);.  }.. searc
11cd0 68 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  h_failed:.  if( 
11ce0 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74  bGe==0 ){.    ft
11cf0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
11d00 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
11d10 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
11d20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  0;.    return;. 
11d30 20 7d 65 6c 73 65 20 69 66 28 20 62 45 6e 64 4f   }else if( bEndO
11d40 66 50 61 67 65 20 29 7b 0a 20 20 20 20 64 6f 20  fPage ){.    do 
11d50 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
11d60 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
11d70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Iter);.      if(
11d80 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
11d90 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
11da0 20 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61   a = pIter->pLea
11db0 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69 66 28 20  f->p;.      if( 
11dc0 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65  fts5LeafIsTermle
11dd0 73 73 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  ss(pIter->pLeaf)
11de0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
11df0 50 67 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70  Pgidx = pIter->p
11e00 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20  Leaf->szLeaf;.  
11e10 20 20 20 20 20 20 69 50 67 69 64 78 20 2b 3d 20        iPgidx += 
11e20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
11e30 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70  &pIter->pLeaf->p
11e40 5b 69 50 67 69 64 78 5d 2c 20 69 4f 66 66 29 3b  [iPgidx], iOff);
11e50 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66  .        if( iOf
11e60 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 70 49 74  f<4 || iOff>=pIt
11e70 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  er->pLeaf->szLea
11e80 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  f ){.          p
11e90 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
11ea0 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72  UPT;.          r
11eb0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
11ec0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
11ed0 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20 20 20  nKeep = 0;.     
11ee0 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20 3d 20       iTermOff = 
11ef0 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20  iOff;.          
11f00 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  n = pIter->pLeaf
11f10 2d 3e 6e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  ->nn;.          
11f20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
11f30 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
11f40 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , nNew);.       
11f50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
11f60 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11f70 7d 77 68 69 6c 65 28 20 31 20 29 3b 0a 20 20 7d  }while( 1 );.  }
11f80 0a 0a 20 73 65 61 72 63 68 5f 73 75 63 63 65 73  .. search_succes
11f90 73 3a 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  s:.  pIter->iLea
11fa0 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 20 2b  fOffset = iOff +
11fb0 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70 49 74   nNew;.  if( pIt
11fc0 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3e  er->iLeafOffset>
11fd0 6e 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  n ){.    p->rc =
11fe0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
11ff0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
12000 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
12010 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d  fOffset = pIter-
12020 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
12030 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
12040 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c  Pgno = pIter->iL
12050 65 61 66 50 67 6e 6f 3b 0a 0a 20 20 66 74 73 35  eafPgno;..  fts5
12060 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
12070 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
12080 6e 4b 65 65 70 2c 20 70 54 65 72 6d 29 3b 0a 20  nKeep, pTerm);. 
12090 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
120a0 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
120b0 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77  Iter->term, nNew
120c0 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 0a 20 20  , &a[iOff]);..  
120d0 69 66 28 20 69 50 67 69 64 78 3e 3d 6e 20 29 7b  if( iPgidx>=n ){
120e0 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64  .    pIter->iEnd
120f0 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 49 74 65  ofDoclist = pIte
12100 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a  r->pLeaf->nn+1;.
12110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
12120 20 6e 45 78 74 72 61 3b 0a 20 20 20 20 69 50 67   nExtra;.    iPg
12130 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61  idx += fts5GetVa
12140 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78  rint32(&a[iPgidx
12150 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  ], nExtra);.    
12160 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
12170 6c 69 73 74 20 3d 20 69 54 65 72 6d 4f 66 66 20  list = iTermOff 
12180 2b 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 20 20  + nExtra;.  }.  
12190 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
121a0 20 3d 20 69 50 67 69 64 78 3b 0a 0a 20 20 66 74   = iPgidx;..  ft
121b0 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77  s5SegIterLoadRow
121c0 69 64 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  id(p, pIter);.  
121d0 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
121e0 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d  Pos(p, pIter);.}
121f0 0a 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  ..static sqlite3
12200 5f 73 74 6d 74 20 2a 66 74 73 35 49 64 78 53 65  _stmt *fts5IdxSe
12210 6c 65 63 74 53 74 6d 74 28 46 74 73 35 49 6e 64  lectStmt(Fts5Ind
12220 65 78 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  ex *p){.  if( p-
12230 3e 70 49 64 78 53 65 6c 65 63 74 3d 3d 30 20 29  >pIdxSelect==0 )
12240 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  {.    Fts5Config
12250 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
12260 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35  Config;.    fts5
12270 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74  IndexPrepareStmt
12280 28 70 2c 20 26 70 2d 3e 70 49 64 78 53 65 6c 65  (p, &p->pIdxSele
12290 63 74 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  ct, sqlite3_mpri
122a0 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
122b0 53 45 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d  SELECT pgno FROM
122c0 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27 20 57   '%q'.'%q_idx' W
122d0 48 45 52 45 20 22 0a 20 20 20 20 20 20 20 20 20  HERE ".         
122e0 20 22 73 65 67 69 64 3d 3f 20 41 4e 44 20 74 65   "segid=? AND te
122f0 72 6d 3c 3d 3f 20 4f 52 44 45 52 20 42 59 20 74  rm<=? ORDER BY t
12300 65 72 6d 20 44 45 53 43 20 4c 49 4d 49 54 20 31  erm DESC LIMIT 1
12310 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ",.          pCo
12320 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66  nfig->zDb, pConf
12330 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29  ig->zName.    ))
12340 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
12350 2d 3e 70 49 64 78 53 65 6c 65 63 74 3b 0a 7d 0a  ->pIdxSelect;.}.
12360 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
12370 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70 49 74  e the object pIt
12380 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  er to point to t
12390 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20  erm pTerm/nTerm 
123a0 77 69 74 68 69 6e 20 73 65 67 6d 65 6e 74 0a 2a  within segment.*
123b0 2a 20 70 53 65 67 2e 20 49 66 20 74 68 65 72 65  * pSeg. If there
123c0 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d   is no such term
123d0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 74   in the index, t
123e0 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 73  he iterator is s
123f0 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  et to EOF..**.**
12400 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
12410 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72  urs, Fts5Index.r
12420 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61  c is set to an a
12430 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
12440 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e   code. If .** an
12450 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
12460 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
12470 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
12480 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
12490 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
124a0 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
124b0 74 65 72 53 65 65 6b 49 6e 69 74 28 0a 20 20 46  terSeekInit(.  F
124c0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
124d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
124e0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a  * FTS5 backend *
124f0 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
12500 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20  erm, int nTerm, 
12510 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
12520 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  eek to */.  int 
12530 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
12540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
12550 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58  ask of FTS5INDEX
12560 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
12570 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
12580 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20  ment *pSeg,     
12590 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
125a0 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46  f segment */.  F
125b0 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
125c0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r              /
125d0 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75  * Object to popu
125e0 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  late */.){.  int
125f0 20 69 50 67 20 3d 20 31 3b 0a 20 20 69 6e 74 20   iPg = 1;.  int 
12600 62 47 65 20 3d 20 28 66 6c 61 67 73 20 26 20 46  bGe = (flags & F
12610 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
12620 43 41 4e 29 3b 0a 20 20 69 6e 74 20 62 44 6c 69  CAN);.  int bDli
12630 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  dx = 0;         
12640 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
12650 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64 6f  if there is a do
12660 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 20  clist-index */. 
12670 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
12680 49 64 78 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a  IdxSelect = 0;..
12690 20 20 61 73 73 65 72 74 28 20 62 47 65 3d 3d 30    assert( bGe==0
126a0 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53   || (flags & FTS
126b0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
126c0 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  C)==0 );.  asser
126d0 74 28 20 70 54 65 72 6d 20 26 26 20 6e 54 65 72  t( pTerm && nTer
126e0 6d 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  m );.  memset(pI
126f0 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
12700 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72  pIter));.  pIter
12710 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 0a  ->pSeg = pSeg;..
12720 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
12730 73 65 74 73 20 73 74 61 63 6b 20 76 61 72 69 61  sets stack varia
12740 62 6c 65 20 69 50 67 20 74 6f 20 74 68 65 20 6c  ble iPg to the l
12750 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
12760 74 68 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63 6f  that may.  ** co
12770 6e 74 61 69 6e 20 74 65 72 6d 20 28 70 54 65 72  ntain term (pTer
12780 6d 2f 6e 54 65 72 6d 29 2c 20 69 66 20 69 74 20  m/nTerm), if it 
12790 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  is present in th
127a0 65 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20  e segment. */.  
127b0 70 49 64 78 53 65 6c 65 63 74 20 3d 20 66 74 73  pIdxSelect = fts
127c0 35 49 64 78 53 65 6c 65 63 74 53 74 6d 74 28 70  5IdxSelectStmt(p
127d0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29  );.  if( p->rc )
127e0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
127f0 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 49 64 78  e3_bind_int(pIdx
12800 53 65 6c 65 63 74 2c 20 31 2c 20 70 53 65 67 2d  Select, 1, pSeg-
12810 3e 69 53 65 67 69 64 29 3b 0a 20 20 73 71 6c 69  >iSegid);.  sqli
12820 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 49  te3_bind_blob(pI
12830 64 78 53 65 6c 65 63 74 2c 20 32 2c 20 70 54 65  dxSelect, 2, pTe
12840 72 6d 2c 20 6e 54 65 72 6d 2c 20 53 51 4c 49 54  rm, nTerm, SQLIT
12850 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28  E_STATIC);.  if(
12860 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
12870 69 74 65 33 5f 73 74 65 70 28 70 49 64 78 53 65  ite3_step(pIdxSe
12880 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 36 34  lect) ){.    i64
12890 20 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63   val = sqlite3_c
128a0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 49 64 78 53 65  olumn_int(pIdxSe
128b0 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 50  lect, 0);.    iP
128c0 67 20 3d 20 28 69 6e 74 29 28 76 61 6c 3e 3e 31  g = (int)(val>>1
128d0 29 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20  );.    bDlidx = 
128e0 28 76 61 6c 20 26 20 30 78 30 30 30 31 29 3b 0a  (val & 0x0001);.
128f0 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71    }.  p->rc = sq
12900 6c 69 74 65 33 5f 72 65 73 65 74 28 70 49 64 78  lite3_reset(pIdx
12910 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74  Select);.  sqlit
12920 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 49 64  e3_bind_null(pId
12930 78 53 65 6c 65 63 74 2c 20 32 29 3b 0a 0a 20 20  xSelect, 2);..  
12940 69 66 28 20 69 50 67 3c 70 53 65 67 2d 3e 70 67  if( iPg<pSeg->pg
12950 6e 6f 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69  noFirst ){.    i
12960 50 67 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46  Pg = pSeg->pgnoF
12970 69 72 73 74 3b 0a 20 20 20 20 62 44 6c 69 64 78  irst;.    bDlidx
12980 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 49 74   = 0;.  }..  pIt
12990 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  er->iLeafPgno = 
129a0 69 50 67 20 2d 20 31 3b 0a 20 20 66 74 73 35 53  iPg - 1;.  fts5S
129b0 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70  egIterNextPage(p
129c0 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 69 66 28  , pIter);..  if(
129d0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b   pIter->pLeaf ){
129e0 0a 20 20 20 20 66 74 73 35 4c 65 61 66 53 65 65  .    fts5LeafSee
129f0 6b 28 70 2c 20 62 47 65 2c 20 70 49 74 65 72 2c  k(p, bGe, pIter,
12a00 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   pTerm, nTerm);.
12a10 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
12a20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
12a30 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 74  Ge==0 ){.    pIt
12a40 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53  er->flags |= FTS
12a50 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
12a60 4d 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  M;.    if( pIter
12a70 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ->pLeaf ){.     
12a80 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53   if( flags & FTS
12a90 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
12aa0 43 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  C ){.        pIt
12ab0 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53  er->flags |= FTS
12ac0 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
12ad0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  E;.      }.     
12ae0 20 69 66 28 20 62 44 6c 69 64 78 20 29 7b 0a 20   if( bDlidx ){. 
12af0 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
12b00 65 72 4c 6f 61 64 44 6c 69 64 78 28 70 2c 20 70  erLoadDlidx(p, p
12b10 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
12b20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26       if( flags &
12b30 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
12b40 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20  _DESC ){.       
12b50 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
12b60 72 73 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  rse(p, pIter);. 
12b70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
12b80 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 53  ..  fts5SegIterS
12b90 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29  etNext(p, pIter)
12ba0 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 3a 0a  ;..  /* Either:.
12bb0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 29 20 61    **.  **   1) a
12bc0 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
12bd0 72 72 65 64 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  rred, or.  **   
12be0 32 29 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  2) the iterator 
12bf0 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46 2c 20 6f  points to EOF, o
12c00 72 0a 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20  r.  **   3) the 
12c10 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20  iterator points 
12c20 74 6f 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68  to an entry with
12c30 20 74 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65   term (pTerm/nTe
12c40 72 6d 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 34  rm), or.  **   4
12c50 29 20 74 68 65 20 46 54 53 35 49 4e 44 45 58 5f  ) the FTS5INDEX_
12c60 51 55 45 52 59 5f 53 43 41 4e 20 66 6c 61 67 20  QUERY_SCAN flag 
12c70 77 61 73 20 73 65 74 20 61 6e 64 20 74 68 65 20  was set and the 
12c80 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 0a  iterator points.
12c90 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 61 6e 20    **      to an 
12ca0 65 6e 74 72 79 20 77 69 74 68 20 61 20 74 65 72  entry with a ter
12cb0 6d 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  m greater than o
12cc0 72 20 65 71 75 61 6c 20 74 6f 20 28 70 54 65 72  r equal to (pTer
12cd0 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20 2a 2f 0a 20  m/nTerm)..  */. 
12ce0 20 61 73 73 65 72 74 5f 6e 63 28 20 70 2d 3e 72   assert_nc( p->r
12cf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20  c!=SQLITE_OK    
12d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 7c 7c     /* 1 */.   ||
12d30 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12d70 2a 20 32 20 2a 2f 0a 20 20 20 7c 7c 20 66 74 73  * 2 */.   || fts
12d80 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c  5BufferCompareBl
12d90 6f 62 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  ob(&pIter->term,
12da0 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3d 3d   pTerm, nTerm)==
12db0 30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20  0          /* 3 
12dc0 2a 2f 0a 20 20 20 7c 7c 20 28 62 47 65 20 26 26  */.   || (bGe &&
12dd0 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61   fts5BufferCompa
12de0 72 65 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e 74  reBlob(&pIter->t
12df0 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  erm, pTerm, nTer
12e00 6d 29 3e 30 29 20 20 2f 2a 20 34 20 2a 2f 0a 20  m)>0)  /* 4 */. 
12e10 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   );.}../*.** Ini
12e20 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65  tialize the obje
12e30 63 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e  ct pIter to poin
12e40 74 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f  t to term pTerm/
12e50 6e 54 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65  nTerm within the
12e60 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  .** in-memory ha
12e70 73 68 20 74 61 62 6c 65 2e 20 49 66 20 74 68 65  sh table. If the
12e80 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65  re is no such te
12e90 72 6d 20 69 6e 20 74 68 65 20 68 61 73 68 2d 74  rm in the hash-t
12ea0 61 62 6c 65 2c 20 74 68 65 20 0a 2a 2a 20 69 74  able, the .** it
12eb0 65 72 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f  erator is set to
12ec0 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61   EOF..**.** If a
12ed0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
12ee0 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20  Fts5Index.rc is 
12ef0 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70  set to an approp
12f00 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
12f10 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f  . If .** an erro
12f20 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
12f30 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
12f40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
12f50 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
12f60 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
12f70 69 64 20 66 74 73 35 53 65 67 49 74 65 72 48 61  id fts5SegIterHa
12f80 73 68 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e  shInit(.  Fts5In
12f90 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
12fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
12fb0 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63  5 backend */.  c
12fc0 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20  onst u8 *pTerm, 
12fd0 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f  int nTerm,     /
12fe0 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74  * Term to seek t
12ff0 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  o */.  int flags
13000 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13010 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
13020 66 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20  f FTS5INDEX_XXX 
13030 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53  flags */.  Fts5S
13040 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  egIter *pIter   
13050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
13060 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ject to populate
13070 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
13080 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20  8 *pList = 0;.  
13090 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20  int nList = 0;. 
130a0 20 63 6f 6e 73 74 20 75 38 20 2a 7a 20 3d 20 30   const u8 *z = 0
130b0 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a  ;.  int n = 0;..
130c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61    assert( p->pHa
130d0 73 68 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  sh );.  assert( 
130e0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
130f0 20 29 3b 0a 0a 20 20 69 66 28 20 70 54 65 72 6d   );..  if( pTerm
13100 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
13110 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
13120 53 43 41 4e 29 20 29 7b 0a 20 20 20 20 70 2d 3e  SCAN) ){.    p->
13130 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
13140 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70 2d 3e  HashScanInit(p->
13150 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68  pHash, (const ch
13160 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d  ar*)pTerm, nTerm
13170 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
13180 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28  s5HashScanEntry(
13190 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74  p->pHash, (const
131a0 20 63 68 61 72 2a 2a 29 26 7a 2c 20 26 70 4c 69   char**)&z, &pLi
131b0 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20  st, &nList);.   
131c0 20 6e 20 3d 20 28 7a 20 3f 20 28 69 6e 74 29 73   n = (z ? (int)s
131d0 74 72 6c 65 6e 28 28 63 6f 6e 73 74 20 63 68 61  trlen((const cha
131e0 72 2a 29 7a 29 20 3a 20 30 29 3b 0a 20 20 7d 65  r*)z) : 0);.  }e
131f0 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  lse{.    pIter->
13200 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
13210 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20  GITER_ONETERM;. 
13220 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
13230 73 68 51 75 65 72 79 28 70 2d 3e 70 48 61 73 68  shQuery(p->pHash
13240 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  , (const char*)p
13250 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 70 4c  Term, nTerm, &pL
13260 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20  ist, &nList);.  
13270 20 20 7a 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20    z = pTerm;.   
13280 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 7d 0a   n = nTerm;.  }.
13290 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
132a0 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c      Fts5Data *pL
132b0 65 61 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eaf;.    sqlite3
132c0 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  Fts5BufferSet(&p
132d0 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65  ->rc, &pIter->te
132e0 72 6d 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 70  rm, n, z);.    p
132f0 4c 65 61 66 20 3d 20 66 74 73 35 49 64 78 4d 61  Leaf = fts5IdxMa
13300 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46  lloc(p, sizeof(F
13310 74 73 35 44 61 74 61 29 29 3b 0a 20 20 20 20 69  ts5Data));.    i
13320 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 72 65  f( pLeaf==0 ) re
13330 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 61 66 2d  turn;.    pLeaf-
13340 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b  >p = (u8*)pList;
13350 0a 20 20 20 20 70 4c 65 61 66 2d 3e 6e 6e 20 3d  .    pLeaf->nn =
13360 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d   pLeaf->szLeaf =
13370 20 6e 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65   nList;.    pIte
13380 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 65 61 66  r->pLeaf = pLeaf
13390 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
133a0 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47  afOffset = fts5G
133b0 65 74 56 61 72 69 6e 74 28 70 4c 65 61 66 2d 3e  etVarint(pLeaf->
133c0 70 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  p, (u64*)&pIter-
133d0 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 49  >iRowid);.    pI
133e0 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
133f0 73 74 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e 3b 0a  st = pLeaf->nn;.
13400 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
13410 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
13420 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 70  _DESC ){.      p
13430 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46  Iter->flags |= F
13440 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
13450 52 53 45 3b 0a 20 20 20 20 20 20 66 74 73 35 53  RSE;.      fts5S
13460 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69  egIterReverseIni
13470 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
13480 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13490 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
134a0 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
134b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74  .    }.  }..  ft
134c0 73 35 53 65 67 49 74 65 72 53 65 74 4e 65 78 74  s5SegIterSetNext
134d0 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f  (p, pIter);.}../
134e0 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20 69 74  *.** Zero the it
134f0 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
13500 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
13510 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
13520 69 64 20 66 74 73 35 53 65 67 49 74 65 72 43 6c  id fts5SegIterCl
13530 65 61 72 28 46 74 73 35 53 65 67 49 74 65 72 20  ear(Fts5SegIter 
13540 2a 70 49 74 65 72 29 7b 0a 20 20 66 74 73 35 42  *pIter){.  fts5B
13550 75 66 66 65 72 46 72 65 65 28 26 70 49 74 65 72  ufferFree(&pIter
13560 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 44  ->term);.  fts5D
13570 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
13580 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 66 74 73 35  ->pLeaf);.  fts5
13590 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
135a0 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20  r->pNextLeaf);. 
135b0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
135c0 65 65 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78  ee(pIter->pDlidx
135d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
135e0 65 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f  e(pIter->aRowidO
135f0 66 66 73 65 74 29 3b 0a 20 20 6d 65 6d 73 65 74  ffset);.  memset
13600 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
13610 66 28 46 74 73 35 53 65 67 49 74 65 72 29 29 3b  f(Fts5SegIter));
13620 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
13630 45 5f 44 45 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54  E_DEBUG../*.** T
13640 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
13650 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
13660 74 68 65 20 62 69 67 20 61 73 73 65 72 74 28 29  the big assert()
13670 20 70 72 6f 63 65 64 75 72 65 20 69 6d 70 6c 65   procedure imple
13680 6d 65 6e 74 65 64 20 62 79 0a 2a 2a 20 66 74 73  mented by.** fts
13690 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
136a0 53 65 74 75 70 28 29 2e 20 49 74 20 65 6e 73 75  Setup(). It ensu
136b0 72 65 73 20 74 68 61 74 20 74 68 65 20 72 65 73  res that the res
136c0 75 6c 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74  ult currently st
136d0 6f 72 65 64 0a 2a 2a 20 69 6e 20 2a 70 52 65 73  ored.** in *pRes
136e0 20 69 73 20 74 68 65 20 63 6f 72 72 65 63 74 20   is the correct 
136f0 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  result of compar
13700 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
13710 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 74 68 65  positions of the
13720 0a 2a 2a 20 74 77 6f 20 69 74 65 72 61 74 6f 72  .** two iterator
13730 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
13740 64 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70  d fts5AssertComp
13750 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 0a 20 20  arisonResult(.  
13760 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c  Fts5Iter *pIter,
13770 20 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20   .  Fts5SegIter 
13780 2a 70 31 2c 0a 20 20 46 74 73 35 53 65 67 49 74  *p1,.  Fts5SegIt
13790 65 72 20 2a 70 32 2c 0a 20 20 46 74 73 35 43 52  er *p2,.  Fts5CR
137a0 65 73 75 6c 74 20 2a 70 52 65 73 0a 29 7b 0a 20  esult *pRes.){. 
137b0 20 69 6e 74 20 69 31 20 3d 20 70 31 20 2d 20 70   int i1 = p1 - p
137c0 49 74 65 72 2d 3e 61 53 65 67 3b 0a 20 20 69 6e  Iter->aSeg;.  in
137d0 74 20 69 32 20 3d 20 70 32 20 2d 20 70 49 74 65  t i2 = p2 - pIte
137e0 72 2d 3e 61 53 65 67 3b 0a 0a 20 20 69 66 28 20  r->aSeg;..  if( 
137f0 70 31 2d 3e 70 4c 65 61 66 20 7c 7c 20 70 32 2d  p1->pLeaf || p2-
13800 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 69 66  >pLeaf ){.    if
13810 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  ( p1->pLeaf==0 )
13820 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
13830 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32  pRes->iFirst==i2
13840 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
13850 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  ( p2->pLeaf==0 )
13860 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
13870 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31  pRes->iFirst==i1
13880 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
13890 20 20 20 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20       int nMin = 
138a0 4d 49 4e 28 70 31 2d 3e 74 65 72 6d 2e 6e 2c 20  MIN(p1->term.n, 
138b0 70 32 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20  p2->term.n);.   
138c0 20 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d     int res = mem
138d0 63 6d 70 28 70 31 2d 3e 74 65 72 6d 2e 70 2c 20  cmp(p1->term.p, 
138e0 70 32 2d 3e 74 65 72 6d 2e 70 2c 20 6e 4d 69 6e  p2->term.p, nMin
138f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  );.      if( res
13900 3d 3d 30 20 29 20 72 65 73 20 3d 20 70 31 2d 3e  ==0 ) res = p1->
13910 74 65 72 6d 2e 6e 20 2d 20 70 32 2d 3e 74 65 72  term.n - p2->ter
13920 6d 2e 6e 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  m.n;..      if( 
13930 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
13940 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
13950 62 54 65 72 6d 45 71 3d 3d 31 20 29 3b 0a 20 20  bTermEq==1 );.  
13960 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31        assert( p1
13970 2d 3e 69 52 6f 77 69 64 21 3d 70 32 2d 3e 69 52  ->iRowid!=p2->iR
13980 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  owid );.        
13990 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77  res = ((p1->iRow
139a0 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29  id > p2->iRowid)
139b0 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f  ==pIter->bRev) ?
139c0 20 2d 31 20 3a 20 31 3b 0a 20 20 20 20 20 20 7d   -1 : 1;.      }
139d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
139e0 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72  sert( pRes->bTer
139f0 6d 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  mEq==0 );.      
13a00 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  }..      if( res
13a10 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  <0 ){.        as
13a20 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72  sert( pRes->iFir
13a30 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 20 20  st==i1 );.      
13a40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
13a50 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69  ssert( pRes->iFi
13a60 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 20  rst==i2 );.     
13a70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
13a80 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
13a90 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75  ion is a no-op u
13aa0 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f 44 45 42  nless SQLITE_DEB
13ab0 55 47 20 69 73 20 64 65 66 69 6e 65 64 20 77 68  UG is defined wh
13ac0 65 6e 20 74 68 69 73 20 6d 6f 64 75 6c 65 0a 2a  en this module.*
13ad0 2a 20 69 73 20 63 6f 6d 70 69 6c 65 64 2e 20 49  * is compiled. I
13ae0 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69  n that case, thi
13af0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 73  s function is es
13b00 73 65 6e 74 69 61 6c 6c 79 20 61 6e 20 61 73 73  sentially an ass
13b10 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d  ert() .** statem
13b20 65 6e 74 20 75 73 65 64 20 74 6f 20 76 65 72 69  ent used to veri
13b30 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  fy that the cont
13b40 65 6e 74 73 20 6f 66 20 74 68 65 20 70 49 74 65  ents of the pIte
13b50 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61 72 72 61  r->aFirst[] arra
13b60 79 0a 2a 2a 20 61 72 65 20 63 6f 72 72 65 63 74  y.** are correct
13b70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13b80 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69   fts5AssertMulti
13b90 49 74 65 72 53 65 74 75 70 28 46 74 73 35 49 6e  IterSetup(Fts5In
13ba0 64 65 78 20 2a 70 2c 20 46 74 73 35 49 74 65 72  dex *p, Fts5Iter
13bb0 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
13bc0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
13bd0 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49   ){.    Fts5SegI
13be0 74 65 72 20 2a 70 46 69 72 73 74 20 3d 20 26 70  ter *pFirst = &p
13bf0 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
13c00 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
13c10 72 73 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20 69  rst ];.    int i
13c20 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ;..    assert( (
13c30 70 46 69 72 73 74 2d 3e 70 4c 65 61 66 3d 3d 30  pFirst->pLeaf==0
13c40 29 3d 3d 70 49 74 65 72 2d 3e 62 61 73 65 2e 62  )==pIter->base.b
13c50 45 6f 66 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  Eof );..    /* C
13c60 68 65 63 6b 20 74 68 61 74 20 70 49 74 65 72 2d  heck that pIter-
13c70 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20 69 73  >iSwitchRowid is
13c80 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
13c90 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
13ca0 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69  i<pIter->nSeg; i
13cb0 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  ++){.      Fts5S
13cc0 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49  egIter *p1 = &pI
13cd0 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20  ter->aSeg[i];.  
13ce0 20 20 20 20 61 73 73 65 72 74 28 20 70 31 3d 3d      assert( p1==
13cf0 70 46 69 72 73 74 20 0a 20 20 20 20 20 20 20 20  pFirst .        
13d00 20 20 20 7c 7c 20 70 31 2d 3e 70 4c 65 61 66 3d     || p1->pLeaf=
13d10 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  =0 .           |
13d20 7c 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  | fts5BufferComp
13d30 61 72 65 28 26 70 46 69 72 73 74 2d 3e 74 65 72  are(&pFirst->ter
13d40 6d 2c 20 26 70 31 2d 3e 74 65 72 6d 29 20 0a 20  m, &p1->term) . 
13d50 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 31 2d            || p1-
13d60 3e 69 52 6f 77 69 64 3d 3d 70 49 74 65 72 2d 3e  >iRowid==pIter->
13d70 69 53 77 69 74 63 68 52 6f 77 69 64 0a 20 20 20  iSwitchRowid.   
13d80 20 20 20 20 20 20 20 20 7c 7c 20 28 70 31 2d 3e          || (p1->
13d90 69 52 6f 77 69 64 3c 70 49 74 65 72 2d 3e 69 53  iRowid<pIter->iS
13da0 77 69 74 63 68 52 6f 77 69 64 29 3d 3d 70 49 74  witchRowid)==pIt
13db0 65 72 2d 3e 62 52 65 76 0a 20 20 20 20 20 20 29  er->bRev.      )
13dc0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
13dd0 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
13de0 53 65 67 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20  Seg; i+=2){.    
13df0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
13e00 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  1 = &pIter->aSeg
13e10 5b 69 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53  [i];.      Fts5S
13e20 65 67 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49  egIter *p2 = &pI
13e30 74 65 72 2d 3e 61 53 65 67 5b 69 2b 31 5d 3b 0a  ter->aSeg[i+1];.
13e40 20 20 20 20 20 20 46 74 73 35 43 52 65 73 75 6c        Fts5CResul
13e50 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72  t *pRes = &pIter
13e60 2d 3e 61 46 69 72 73 74 5b 28 70 49 74 65 72 2d  ->aFirst[(pIter-
13e70 3e 6e 53 65 67 20 2b 20 69 29 20 2f 20 32 5d 3b  >nSeg + i) / 2];
13e80 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65 72  .      fts5Asser
13e90 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c  tComparisonResul
13ea0 74 28 70 49 74 65 72 2c 20 70 31 2c 20 70 32 2c  t(pIter, p1, p2,
13eb0 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20   pRes);.    }.. 
13ec0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 28 70     for(i=1; i<(p
13ed0 49 74 65 72 2d 3e 6e 53 65 67 20 2f 20 32 29 3b  Iter->nSeg / 2);
13ee0 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46 74   i+=2){.      Ft
13ef0 73 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20  s5SegIter *p1 = 
13f00 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
13f10 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32 5d  ter->aFirst[i*2]
13f20 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20  .iFirst ];.     
13f30 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32   Fts5SegIter *p2
13f40 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
13f50 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
13f60 2a 32 2b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  *2+1].iFirst ];.
13f70 20 20 20 20 20 20 46 74 73 35 43 52 65 73 75 6c        Fts5CResul
13f80 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72  t *pRes = &pIter
13f90 2d 3e 61 46 69 72 73 74 5b 69 5d 3b 0a 20 20 20  ->aFirst[i];.   
13fa0 20 20 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d     fts5AssertCom
13fb0 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 70 49  parisonResult(pI
13fc0 74 65 72 2c 20 70 31 2c 20 70 32 2c 20 70 52 65  ter, p1, p2, pRe
13fd0 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  s);.    }.  }.}.
13fe0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66  #else.# define f
13ff0 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74  ts5AssertMultiIt
14000 65 72 53 65 74 75 70 28 78 2c 79 29 0a 23 65 6e  erSetup(x,y).#en
14010 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68  dif../*.** Do th
14020 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6e 65 63  e comparison nec
14030 65 73 73 61 72 79 20 74 6f 20 70 6f 70 75 6c 61  essary to popula
14040 74 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  te pIter->aFirst
14050 5b 69 4f 75 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66  [iOut]..**.** If
14060 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   the returned va
14070 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  lue is non-zero,
14080 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
14090 69 6e 64 65 78 20 6f 66 20 61 6e 20 65 6e 74 72  index of an entr
140a0 79 0a 2a 2a 20 69 6e 20 74 68 65 20 70 49 74 65  y.** in the pIte
140b0 72 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 20  r->aSeg[] array 
140c0 74 68 61 74 20 69 73 20 28 61 29 20 6e 6f 74 20  that is (a) not 
140d0 61 74 20 45 4f 46 2c 20 61 6e 64 20 28 62 29 20  at EOF, and (b) 
140e0 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61  pointing.** to a
140f0 20 6b 65 79 20 74 68 61 74 20 69 73 20 61 20 64   key that is a d
14100 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74  uplicate of anot
14110 68 65 72 2c 20 68 69 67 68 65 72 20 70 72 69 6f  her, higher prio
14120 72 69 74 79 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e  rity, .** segmen
14130 74 2d 69 74 65 72 61 74 6f 72 20 69 6e 20 74 68  t-iterator in th
14140 65 20 70 53 65 67 2d 3e 61 53 65 67 5b 5d 20 61  e pSeg->aSeg[] a
14150 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
14160 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65  int fts5MultiIte
14170 72 44 6f 43 6f 6d 70 61 72 65 28 46 74 73 35 49  rDoCompare(Fts5I
14180 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20  ter *pIter, int 
14190 69 4f 75 74 29 7b 0a 20 20 69 6e 74 20 69 31 3b  iOut){.  int i1;
141a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
141c0 78 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 46  x of left-hand F
141d0 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20  ts5SegIter */.  
141e0 69 6e 74 20 69 32 3b 20 20 20 20 20 20 20 20 20  int i2;         
141f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14200 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68  /* Index of righ
14210 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74  t-hand Fts5SegIt
14220 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 73  er */.  int iRes
14230 3b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  ;.  Fts5SegIter 
14240 2a 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  *p1;            
14250 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64      /* Left-hand
14260 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a   Fts5SegIter */.
14270 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
14280 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
14290 20 20 2f 2a 20 52 69 67 68 74 2d 68 61 6e 64 20    /* Right-hand 
142a0 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20  Fts5SegIter */. 
142b0 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52   Fts5CResult *pR
142c0 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69  es = &pIter->aFi
142d0 72 73 74 5b 69 4f 75 74 5d 3b 0a 0a 20 20 61 73  rst[iOut];..  as
142e0 73 65 72 74 28 20 69 4f 75 74 3c 70 49 74 65 72  sert( iOut<pIter
142f0 2d 3e 6e 53 65 67 20 26 26 20 69 4f 75 74 3e 30  ->nSeg && iOut>0
14300 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
14310 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20 7c 7c 20  ter->bRev==0 || 
14320 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 31 20 29  pIter->bRev==1 )
14330 3b 0a 0a 20 20 69 66 28 20 69 4f 75 74 3e 3d 28  ;..  if( iOut>=(
14340 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 29  pIter->nSeg/2) )
14350 7b 0a 20 20 20 20 69 31 20 3d 20 28 69 4f 75 74  {.    i1 = (iOut
14360 20 2d 20 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32   - pIter->nSeg/2
14370 29 20 2a 20 32 3b 0a 20 20 20 20 69 32 20 3d 20  ) * 2;.    i2 = 
14380 69 31 20 2b 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  i1 + 1;.  }else{
14390 0a 20 20 20 20 69 31 20 3d 20 70 49 74 65 72 2d  .    i1 = pIter-
143a0 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a 32 5d 2e  >aFirst[iOut*2].
143b0 69 46 69 72 73 74 3b 0a 20 20 20 20 69 32 20 3d  iFirst;.    i2 =
143c0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
143d0 4f 75 74 2a 32 2b 31 5d 2e 69 46 69 72 73 74 3b  Out*2+1].iFirst;
143e0 0a 20 20 7d 0a 20 20 70 31 20 3d 20 26 70 49 74  .  }.  p1 = &pIt
143f0 65 72 2d 3e 61 53 65 67 5b 69 31 5d 3b 0a 20 20  er->aSeg[i1];.  
14400 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p2 = &pIter->aSe
14410 67 5b 69 32 5d 3b 0a 0a 20 20 70 52 65 73 2d 3e  g[i2];..  pRes->
14420 62 54 65 72 6d 45 71 20 3d 20 30 3b 0a 20 20 69  bTermEq = 0;.  i
14430 66 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20  f( p1->pLeaf==0 
14440 29 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){           /* 
14450 49 66 20 70 31 20 69 73 20 61 74 20 45 4f 46 20  If p1 is at EOF 
14460 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69 32  */.    iRes = i2
14470 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32  ;.  }else if( p2
14480 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20  ->pLeaf==0 ){   
14490 20 20 2f 2a 20 49 66 20 70 32 20 69 73 20 61 74    /* If p2 is at
144a0 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73   EOF */.    iRes
144b0 20 3d 20 69 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = i1;.  }else{.
144c0 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 66 74      int res = ft
144d0 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28  s5BufferCompare(
144e0 26 70 31 2d 3e 74 65 72 6d 2c 20 26 70 32 2d 3e  &p1->term, &p2->
144f0 74 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  term);.    if( r
14500 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  es==0 ){.      a
14510 73 73 65 72 74 28 20 69 32 3e 69 31 20 29 3b 0a  ssert( i2>i1 );.
14520 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 32        assert( i2
14530 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65  !=0 );.      pRe
14540 73 2d 3e 62 54 65 72 6d 45 71 20 3d 20 31 3b 0a  s->bTermEq = 1;.
14550 20 20 20 20 20 20 69 66 28 20 70 31 2d 3e 69 52        if( p1->iR
14560 6f 77 69 64 3d 3d 70 32 2d 3e 69 52 6f 77 69 64  owid==p2->iRowid
14570 20 29 7b 0a 20 20 20 20 20 20 20 20 70 31 2d 3e   ){.        p1->
14580 62 44 65 6c 20 3d 20 70 32 2d 3e 62 44 65 6c 3b  bDel = p2->bDel;
14590 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
145a0 69 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i2;.      }.    
145b0 20 20 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52    res = ((p1->iR
145c0 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69  owid > p2->iRowi
145d0 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29  d)==pIter->bRev)
145e0 20 3f 20 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20   ? -1 : +1;.    
145f0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 65  }.    assert( re
14600 73 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  s!=0 );.    if( 
14610 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  res<0 ){.      i
14620 52 65 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65  Res = i1;.    }e
14630 6c 73 65 7b 0a 20 20 20 20 20 20 69 52 65 73 20  lse{.      iRes 
14640 3d 20 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = i2;.    }.  }.
14650 0a 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20  .  pRes->iFirst 
14660 3d 20 28 75 31 36 29 69 52 65 73 3b 0a 20 20 72  = (u16)iRes;.  r
14670 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
14680 2a 20 4d 6f 76 65 20 74 68 65 20 73 65 67 2d 69  * Move the seg-i
14690 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ter so that it p
146a0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
146b0 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65  st rowid on page
146c0 20 69 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49   iLeafPgno..** I
146d0 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 66  t is an error if
146e0 20 6c 65 61 66 20 69 4c 65 61 66 50 67 6e 6f 20   leaf iLeafPgno 
146f0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f  does not exist o
14700 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f  r contains no ro
14710 77 69 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wids..*/.static 
14720 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
14730 47 6f 74 6f 50 61 67 65 28 0a 20 20 46 74 73 35  GotoPage(.  Fts5
14740 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
14750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
14760 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
14770 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ct */.  Fts5SegI
14780 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
14790 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
147a0 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a  tor to advance *
147b0 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e  /.  int iLeafPgn
147c0 6f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  o.){.  assert( i
147d0 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e  LeafPgno>pIter->
147e0 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20  iLeafPgno );..  
147f0 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49  if( iLeafPgno>pI
14800 74 65 72 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c  ter->pSeg->pgnoL
14810 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ast ){.    p->rc
14820 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
14830 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74  .  }else{.    ft
14840 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
14850 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b  ter->pNextLeaf);
14860 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4e 65 78  .    pIter->pNex
14870 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70  tLeaf = 0;.    p
14880 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
14890 3d 20 69 4c 65 61 66 50 67 6e 6f 2d 31 3b 0a 20  = iLeafPgno-1;. 
148a0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
148b0 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
148c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
148d0 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
148e0 7c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  | pIter->iLeafPg
148f0 6e 6f 3d 3d 69 4c 65 61 66 50 67 6e 6f 20 29 3b  no==iLeafPgno );
14900 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ..    if( p->rc=
14910 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14920 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
14930 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65      u8 *a = pIte
14940 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20  r->pLeaf->p;.   
14950 20 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72     int n = pIter
14960 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b  ->pLeaf->szLeaf;
14970 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66  ..      iOff = f
14980 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69  ts5LeafFirstRowi
14990 64 4f 66 66 28 70 49 74 65 72 2d 3e 70 4c 65 61  dOff(pIter->pLea
149a0 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f  f);.      if( iO
149b0 66 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20  ff<4 || iOff>=n 
149c0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63  ){.        p->rc
149d0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
149e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
149f0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
14a00 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
14a10 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  Off], (u64*)&pIt
14a20 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
14a30 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
14a40 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
14a50 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
14a60 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
14a70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
14a80 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
14a90 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74  * Advance the it
14aa0 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
14ab0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
14ac0 6d 65 6e 74 20 75 6e 74 69 6c 20 69 74 20 69 73  ment until it is
14ad0 20 61 74 20 6f 72 20 0a 2a 2a 20 70 61 73 74 20   at or .** past 
14ae0 72 6f 77 69 64 20 69 46 72 6f 6d 2e 20 52 65 67  rowid iFrom. Reg
14af0 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
14b00 61 6c 75 65 20 6f 66 20 69 46 72 6f 6d 2c 20 74  alue of iFrom, t
14b10 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a 2a  he iterator is.*
14b20 2a 20 61 6c 77 61 79 73 20 61 64 76 61 6e 63 65  * always advance
14b30 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e  d at least once.
14b40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14b50 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 46  fts5SegIterNextF
14b60 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rom(.  Fts5Index
14b70 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
14b80 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
14b90 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
14ba0 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
14bb0 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
14bc0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
14bd0 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69  o advance */.  i
14be0 36 34 20 69 4d 61 74 63 68 20 20 20 20 20 20 20  64 iMatch       
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14c00 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72 61 74  * Advance iterat
14c10 6f 72 20 61 74 20 6c 65 61 73 74 20 74 68 69 73  or at least this
14c20 20 66 61 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   far */.){.  int
14c30 20 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e   bRev = (pIter->
14c40 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
14c50 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20  ITER_REVERSE);. 
14c60 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
14c70 70 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e  pDlidx = pIter->
14c80 70 44 6c 69 64 78 3b 0a 20 20 69 6e 74 20 69 4c  pDlidx;.  int iL
14c90 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d  eafPgno = pIter-
14ca0 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e  >iLeafPgno;.  in
14cb0 74 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 0a 20 20  t bMove = 1;..  
14cc0 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66  assert( pIter->f
14cd0 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
14ce0 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20  TER_ONETERM );. 
14cf0 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
14d00 70 44 6c 69 64 78 20 29 3b 0a 20 20 61 73 73 65  pDlidx );.  asse
14d10 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  rt( pIter->pLeaf
14d20 20 29 3b 0a 0a 20 20 69 66 28 20 62 52 65 76 3d   );..  if( bRev=
14d30 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  =0 ){.    while(
14d40 20 21 66 74 73 35 44 6c 69 64 78 49 74 65 72 45   !fts5DlidxIterE
14d50 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 20 26 26  of(p, pDlidx) &&
14d60 20 69 4d 61 74 63 68 3e 66 74 73 35 44 6c 69 64   iMatch>fts5Dlid
14d70 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64  xIterRowid(pDlid
14d80 78 29 20 29 7b 0a 20 20 20 20 20 20 69 4c 65 61  x) ){.      iLea
14d90 66 50 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64  fPgno = fts5Dlid
14da0 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
14db0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  );.      fts5Dli
14dc0 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44  dxIterNext(p, pD
14dd0 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lidx);.    }.   
14de0 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4c 65 61   assert_nc( iLea
14df0 66 50 67 6e 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c  fPgno>=pIter->iL
14e00 65 61 66 50 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63  eafPgno || p->rc
14e10 20 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 65 61   );.    if( iLea
14e20 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65  fPgno>pIter->iLe
14e30 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  afPgno ){.      
14e40 66 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50  fts5SegIterGotoP
14e50 61 67 65 28 70 2c 20 70 49 74 65 72 2c 20 69 4c  age(p, pIter, iL
14e60 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20  eafPgno);.      
14e70 62 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d  bMove = 0;.    }
14e80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
14e90 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4e 65  sert( pIter->pNe
14ea0 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20  xtLeaf==0 );.   
14eb0 20 61 73 73 65 72 74 28 20 69 4d 61 74 63 68 3c   assert( iMatch<
14ec0 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 29 3b  pIter->iRowid );
14ed0 0a 20 20 20 20 77 68 69 6c 65 28 20 21 66 74 73  .    while( !fts
14ee0 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
14ef0 20 70 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74   pDlidx) && iMat
14f00 63 68 3c 66 74 73 35 44 6c 69 64 78 49 74 65 72  ch<fts5DlidxIter
14f10 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b  Rowid(pDlidx) ){
14f20 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
14f30 49 74 65 72 50 72 65 76 28 70 2c 20 70 44 6c 69  IterPrev(p, pDli
14f40 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dx);.    }.    i
14f50 4c 65 61 66 50 67 6e 6f 20 3d 20 66 74 73 35 44  LeafPgno = fts5D
14f60 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
14f70 69 64 78 29 3b 0a 0a 20 20 20 20 61 73 73 65 72  idx);..    asser
14f80 74 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  t( fts5DlidxIter
14f90 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 20 7c  Eof(p, pDlidx) |
14fa0 7c 20 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 49 74  | iLeafPgno<=pIt
14fb0 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b  er->iLeafPgno );
14fc0 0a 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66 50  ..    if( iLeafP
14fd0 67 6e 6f 3c 70 49 74 65 72 2d 3e 69 4c 65 61 66  gno<pIter->iLeaf
14fe0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 49  Pgno ){.      pI
14ff0 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d  ter->iLeafPgno =
15000 20 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 0a 20 20   iLeafPgno+1;.  
15010 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52      fts5SegIterR
15020 65 76 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c  everseNewPage(p,
15030 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 62   pIter);.      b
15040 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Move = 0;.    }.
15050 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69    }..  do{.    i
15060 66 28 20 62 4d 6f 76 65 20 26 26 20 70 2d 3e 72  f( bMove && p->r
15070 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
15080 49 74 65 72 2d 3e 78 4e 65 78 74 28 70 2c 20 70  Iter->xNext(p, p
15090 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66  Iter, 0);.    if
150a0 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
150b0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
150c0 66 28 20 62 52 65 76 3d 3d 30 20 26 26 20 70 49  f( bRev==0 && pI
150d0 74 65 72 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d 61  ter->iRowid>=iMa
150e0 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  tch ) break;.   
150f0 20 69 66 28 20 62 52 65 76 21 3d 30 20 26 26 20   if( bRev!=0 && 
15100 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69  pIter->iRowid<=i
15110 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20  Match ) break;. 
15120 20 20 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 20 20     bMove = 1;.  
15130 7d 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53  }while( p->rc==S
15140 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 7d 0a 0a 0a  QLITE_OK );.}...
15150 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 69  /*.** Free the i
15160 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70  terator object p
15170 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
15180 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
15190 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
151a0 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 46  5MultiIterFree(F
151b0 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ts5Iter *pIter){
151c0 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a  .  if( pIter ){.
151d0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
151e0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
151f0 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSeg; i++){.   
15200 20 20 20 66 74 73 35 53 65 67 49 74 65 72 43 6c     fts5SegIterCl
15210 65 61 72 28 26 70 49 74 65 72 2d 3e 61 53 65 67  ear(&pIter->aSeg
15220 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
15230 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
15240 65 61 73 65 28 70 49 74 65 72 2d 3e 70 53 74 72  ease(pIter->pStr
15250 75 63 74 29 3b 0a 20 20 20 20 66 74 73 35 42 75  uct);.    fts5Bu
15260 66 66 65 72 46 72 65 65 28 26 70 49 74 65 72 2d  fferFree(&pIter-
15270 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 73  >poslist);.    s
15280 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
15290 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  r);.  }.}..stati
152a0 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
152b0 49 74 65 72 41 64 76 61 6e 63 65 64 28 0a 20 20  IterAdvanced(.  
152c0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152e0 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
152f0 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
15300 6e 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20  n */.  Fts5Iter 
15310 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
15320 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
15330 6f 72 20 74 6f 20 75 70 64 61 74 65 20 61 46 69  or to update aFi
15340 72 73 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20  rst[] array for 
15350 2a 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65  */.  int iChange
15360 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
15370 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
15380 20 73 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75   sub-iterator ju
15390 73 74 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20  st advanced */. 
153a0 20 69 6e 74 20 69 4d 69 6e 73 65 74 20 20 20 20   int iMinset    
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153c0 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 65 6e 74 72   /* Minimum entr
153d0 79 20 69 6e 20 61 46 69 72 73 74 5b 5d 20 74 6f  y in aFirst[] to
153e0 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   set */.){.  int
153f0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 28 70 49 74   i;.  for(i=(pIt
15400 65 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65  er->nSeg+iChange
15410 64 29 2f 32 3b 20 69 3e 3d 69 4d 69 6e 73 65 74  d)/2; i>=iMinset
15420 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   && p->rc==SQLIT
15430 45 5f 4f 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20  E_OK; i=i/2){.  
15440 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 69    int iEq;.    i
15450 66 28 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75  f( (iEq = fts5Mu
15460 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65  ltiIterDoCompare
15470 28 70 49 74 65 72 2c 20 69 29 29 20 29 7b 0a 20  (pIter, i)) ){. 
15480 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72       Fts5SegIter
15490 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
154a0 3e 61 53 65 67 5b 69 45 71 5d 3b 0a 20 20 20 20  >aSeg[iEq];.    
154b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
154c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
154d0 20 20 20 20 70 53 65 67 2d 3e 78 4e 65 78 74 28      pSeg->xNext(
154e0 70 2c 20 70 53 65 67 2c 20 30 29 3b 0a 20 20 20  p, pSeg, 0);.   
154f0 20 20 20 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53     i = pIter->nS
15500 65 67 20 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a  eg + iEq;.    }.
15510 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62    }.}../*.** Sub
15520 2d 69 74 65 72 61 74 6f 72 20 69 43 68 61 6e 67  -iterator iChang
15530 65 64 20 6f 66 20 69 74 65 72 61 74 6f 72 20 70  ed of iterator p
15540 49 74 65 72 20 68 61 73 20 6a 75 73 74 20 62 65  Iter has just be
15550 65 6e 20 61 64 76 61 6e 63 65 64 2e 20 49 74 20  en advanced. It 
15560 73 74 69 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 73 20  still.** points 
15570 74 6f 20 74 68 65 20 73 61 6d 65 20 74 65 72 6d  to the same term
15580 20 74 68 6f 75 67 68 20 2d 20 6a 75 73 74 20 61   though - just a
15590 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 69 64   different rowid
155a0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  . This function.
155b0 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75  ** attempts to u
155c0 70 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  pdate the conten
155d0 74 73 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d  ts of the pIter-
155e0 3e 61 46 69 72 73 74 5b 5d 20 61 63 63 6f 72 64  >aFirst[] accord
155f0 69 6e 67 6c 79 2e 0a 2a 2a 20 49 66 20 69 74 20  ingly..** If it 
15600 64 6f 65 73 20 73 6f 20 73 75 63 63 65 73 73 66  does so successf
15610 75 6c 6c 79 2c 20 30 20 69 73 20 72 65 74 75 72  ully, 0 is retur
15620 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 31  ned. Otherwise 1
15630 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 2d 7a  ..**.** If non-z
15640 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ero is returned,
15650 20 74 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   the caller shou
15660 6c 64 20 63 61 6c 6c 20 66 74 73 35 4d 75 6c 74  ld call fts5Mult
15670 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 29 0a  iIterAdvanced().
15680 2a 2a 20 6f 6e 20 74 68 65 20 69 74 65 72 61 74  ** on the iterat
15690 6f 72 20 69 6e 73 74 65 61 64 2e 20 54 68 61 74  or instead. That
156a0 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74   function does t
156b0 68 65 20 73 61 6d 65 20 61 73 20 74 68 69 73 20  he same as this 
156c0 6f 6e 65 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74  one, except.** t
156d0 68 61 74 20 69 74 20 64 65 61 6c 73 20 77 69 74  hat it deals wit
156e0 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74  h more complicat
156f0 65 64 20 63 61 73 65 73 20 61 73 20 77 65 6c 6c  ed cases as well
15700 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74  ..*/ .static int
15710 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
15720 76 61 6e 63 65 52 6f 77 69 64 28 0a 20 20 46 74  vanceRowid(.  Ft
15730 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  s5Iter *pIter,  
15740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15750 20 49 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64   Iterator to upd
15760 61 74 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72  ate aFirst[] arr
15770 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ay for */.  int 
15780 69 43 68 61 6e 67 65 64 2c 20 20 20 20 20 20 20  iChanged,       
15790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
157a0 6e 64 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72  ndex of sub-iter
157b0 61 74 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63  ator just advanc
157c0 65 64 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ed */.  Fts5SegI
157d0 74 65 72 20 2a 2a 70 70 46 69 72 73 74 0a 29 7b  ter **ppFirst.){
157e0 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
157f0 70 4e 65 77 20 3d 20 26 70 49 74 65 72 2d 3e 61  pNew = &pIter->a
15800 53 65 67 5b 69 43 68 61 6e 67 65 64 5d 3b 0a 0a  Seg[iChanged];..
15810 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77    if( pNew->iRow
15820 69 64 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69 74  id==pIter->iSwit
15830 63 68 52 6f 77 69 64 0a 20 20 20 7c 7c 20 28 70  chRowid.   || (p
15840 4e 65 77 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65  New->iRowid<pIte
15850 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29  r->iSwitchRowid)
15860 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 0a 20 20  ==pIter->bRev.  
15870 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
15880 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
15890 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d 3e  Other = &pIter->
158a0 61 53 65 67 5b 69 43 68 61 6e 67 65 64 20 5e 20  aSeg[iChanged ^ 
158b0 30 78 30 30 30 31 5d 3b 0a 20 20 20 20 70 49 74  0x0001];.    pIt
158c0 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
158d0 20 3d 20 70 49 74 65 72 2d 3e 62 52 65 76 20 3f   = pIter->bRev ?
158e0 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20   SMALLEST_INT64 
158f0 3a 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b  : LARGEST_INT64;
15900 0a 20 20 20 20 66 6f 72 28 69 3d 28 70 49 74 65  .    for(i=(pIte
15910 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64  r->nSeg+iChanged
15920 29 2f 32 3b 20 31 3b 20 69 3d 69 2f 32 29 7b 0a  )/2; 1; i=i/2){.
15930 20 20 20 20 20 20 46 74 73 35 43 52 65 73 75 6c        Fts5CResul
15940 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72  t *pRes = &pIter
15950 2d 3e 61 46 69 72 73 74 5b 69 5d 3b 0a 0a 20 20  ->aFirst[i];..  
15960 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
15970 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20 20 20 20  ->pLeaf );.     
15980 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62   assert( pRes->b
15990 54 65 72 6d 45 71 3d 3d 30 20 7c 7c 20 70 4f 74  TermEq==0 || pOt
159a0 68 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20  her->pLeaf );.. 
159b0 20 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 62       if( pRes->b
159c0 54 65 72 6d 45 71 20 29 7b 0a 20 20 20 20 20 20  TermEq ){.      
159d0 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77    if( pNew->iRow
159e0 69 64 3d 3d 70 4f 74 68 65 72 2d 3e 69 52 6f 77  id==pOther->iRow
159f0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
15a00 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
15a10 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 74    }else if( (pOt
15a20 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70 4e 65 77  her->iRowid>pNew
15a30 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  ->iRowid)==pIter
15a40 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ->bRev ){.      
15a50 20 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74      pIter->iSwit
15a60 63 68 52 6f 77 69 64 20 3d 20 70 4f 74 68 65 72  chRowid = pOther
15a70 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  ->iRowid;.      
15a80 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 74 68 65      pNew = pOthe
15a90 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  r;.        }else
15aa0 20 69 66 28 20 28 70 4f 74 68 65 72 2d 3e 69 52   if( (pOther->iR
15ab0 6f 77 69 64 3e 70 49 74 65 72 2d 3e 69 53 77 69  owid>pIter->iSwi
15ac0 74 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  tchRowid)==pIter
15ad0 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ->bRev ){.      
15ae0 20 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74      pIter->iSwit
15af0 63 68 52 6f 77 69 64 20 3d 20 70 4f 74 68 65 72  chRowid = pOther
15b00 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  ->iRowid;.      
15b10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
15b20 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d    pRes->iFirst =
15b30 20 28 75 31 36 29 28 70 4e 65 77 20 2d 20 70 49   (u16)(pNew - pI
15b40 74 65 72 2d 3e 61 53 65 67 29 3b 0a 20 20 20 20  ter->aSeg);.    
15b50 20 20 69 66 28 20 69 3d 3d 31 20 29 20 62 72 65    if( i==1 ) bre
15b60 61 6b 3b 0a 0a 20 20 20 20 20 20 70 4f 74 68 65  ak;..      pOthe
15b70 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  r = &pIter->aSeg
15b80 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
15b90 69 20 5e 20 30 78 30 30 30 31 5d 2e 69 46 69 72  i ^ 0x0001].iFir
15ba0 73 74 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  st ];.    }.  }.
15bb0 0a 20 20 2a 70 70 46 69 72 73 74 20 3d 20 70 4e  .  *ppFirst = pN
15bc0 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ew;.  return 0;.
15bd0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
15be0 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 76 61 72   pIter->bEof var
15bf0 69 61 62 6c 65 20 62 61 73 65 64 20 6f 6e 20 74  iable based on t
15c00 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
15c10 73 75 62 2d 69 74 65 72 61 74 6f 72 73 2e 0a 2a  sub-iterators..*
15c20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
15c30 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f  s5MultiIterSetEo
15c40 66 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  f(Fts5Iter *pIte
15c50 72 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65  r){.  Fts5SegIte
15c60 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72  r *pSeg = &pIter
15c70 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
15c80 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
15c90 5d 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65  ];.  pIter->base
15ca0 2e 62 45 6f 66 20 3d 20 70 53 65 67 2d 3e 70 4c  .bEof = pSeg->pL
15cb0 65 61 66 3d 3d 30 3b 0a 20 20 70 49 74 65 72 2d  eaf==0;.  pIter-
15cc0 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20  >iSwitchRowid = 
15cd0 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 7d 0a  pSeg->iRowid;.}.
15ce0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
15cf0 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20  iterator to the 
15d00 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a  next entry. .**.
15d10 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
15d20 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
15d30 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20  code is left in 
15d40 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 74  Fts5Index.rc. It
15d50 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73   is not .** cons
15d60 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20  idered an error 
15d70 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
15d80 72 65 61 63 68 65 73 20 45 4f 46 2c 20 6f 72 20  reaches EOF, or 
15d90 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
15da0 20 61 74 20 0a 2a 2a 20 45 4f 46 20 77 68 65 6e   at .** EOF when
15db0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
15dc0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
15dd0 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
15de0 74 69 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74  tiIterNext(.  Ft
15df0 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
15e00 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 0a  ts5Iter *pIter,.
15e10 20 20 69 6e 74 20 62 46 72 6f 6d 2c 20 20 20 20    int bFrom,    
15e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e30 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 72 67    /* True if arg
15e40 75 6d 65 6e 74 20 69 46 72 6f 6d 20 69 73 20 76  ument iFrom is v
15e50 61 6c 69 64 20 2a 2f 0a 20 20 69 36 34 20 69 46  alid */.  i64 iF
15e60 72 6f 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  rom             
15e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76            /* Adv
15e80 61 6e 63 65 20 61 74 20 6c 65 61 73 74 20 61 73  ance at least as
15e90 20 66 61 72 20 61 73 20 74 68 69 73 20 2a 2f 0a   far as this */.
15ea0 29 7b 0a 20 20 69 6e 74 20 62 55 73 65 46 72 6f  ){.  int bUseFro
15eb0 6d 20 3d 20 62 46 72 6f 6d 3b 0a 20 20 61 73 73  m = bFrom;.  ass
15ec0 65 72 74 28 20 70 49 74 65 72 2d 3e 62 61 73 65  ert( pIter->base
15ed0 2e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 77 68  .bEof==0 );.  wh
15ee0 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
15ef0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
15f00 20 69 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d   iFirst = pIter-
15f10 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
15f20 74 3b 0a 20 20 20 20 69 6e 74 20 62 4e 65 77 54  t;.    int bNewT
15f30 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 46 74 73  erm = 0;.    Fts
15f40 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
15f50 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 46   &pIter->aSeg[iF
15f60 69 72 73 74 5d 3b 0a 20 20 20 20 61 73 73 65 72  irst];.    asser
15f70 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
15f80 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 62  _OK );.    if( b
15f90 55 73 65 46 72 6f 6d 20 26 26 20 70 53 65 67 2d  UseFrom && pSeg-
15fa0 3e 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20  >pDlidx ){.     
15fb0 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
15fc0 46 72 6f 6d 28 70 2c 20 70 53 65 67 2c 20 69 46  From(p, pSeg, iF
15fd0 72 6f 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rom);.    }else{
15fe0 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 78 4e 65  .      pSeg->xNe
15ff0 78 74 28 70 2c 20 70 53 65 67 2c 20 26 62 4e 65  xt(p, pSeg, &bNe
16000 77 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20  wTerm);.    }.. 
16010 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65     if( pSeg->pLe
16020 61 66 3d 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72  af==0 || bNewTer
16030 6d 20 0a 20 20 20 20 20 7c 7c 20 66 74 73 35 4d  m .     || fts5M
16040 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52  ultiIterAdvanceR
16050 6f 77 69 64 28 70 49 74 65 72 2c 20 69 46 69 72  owid(pIter, iFir
16060 73 74 2c 20 26 70 53 65 67 29 0a 20 20 20 20 29  st, &pSeg).    )
16070 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  {.      fts5Mult
16080 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c  iIterAdvanced(p,
16090 20 70 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20   pIter, iFirst, 
160a0 31 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  1);.      fts5Mu
160b0 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 70 49  ltiIterSetEof(pI
160c0 74 65 72 29 3b 0a 20 20 20 20 20 20 70 53 65 67  ter);.      pSeg
160d0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
160e0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
160f0 2e 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20  .iFirst];.      
16100 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d  if( pSeg->pLeaf=
16110 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
16120 20 7d 0a 0a 20 20 20 20 66 74 73 35 41 73 73 65   }..    fts5Asse
16130 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70  rtMultiIterSetup
16140 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
16150 61 73 73 65 72 74 28 20 70 53 65 67 3d 3d 26 70  assert( pSeg==&p
16160 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72  Iter->aSeg[pIter
16170 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
16180 73 74 5d 20 26 26 20 70 53 65 67 2d 3e 70 4c 65  st] && pSeg->pLe
16190 61 66 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  af );.    if( pI
161a0 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79 3d  ter->bSkipEmpty=
161b0 3d 30 20 7c 7c 20 70 53 65 67 2d 3e 6e 50 6f 73  =0 || pSeg->nPos
161c0 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
161d0 3e 78 53 65 74 4f 75 74 70 75 74 73 28 70 49 74  >xSetOutputs(pIt
161e0 65 72 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20  er, pSeg);.     
161f0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
16200 20 20 20 62 55 73 65 46 72 6f 6d 20 3d 20 30 3b     bUseFrom = 0;
16210 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
16220 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
16230 72 4e 65 78 74 32 28 0a 20 20 46 74 73 35 49 6e  rNext2(.  Fts5In
16240 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49  dex *p, .  Fts5I
16250 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e  ter *pIter,.  in
16260 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20  t *pbNewTerm    
16270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16280 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20 2a 6d   OUT: True if *m
16290 69 67 68 74 2a 20 62 65 20 6e 65 77 20 74 65 72  ight* be new ter
162a0 6d 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  m */.){.  assert
162b0 28 20 70 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d  ( pIter->bSkipEm
162c0 70 74 79 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  pty );.  if( p->
162d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
162e0 0a 20 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20  .    *pbNewTerm 
162f0 3d 20 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  = 0;.    do{.   
16300 20 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20     int iFirst = 
16310 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
16320 2e 69 46 69 72 73 74 3b 0a 20 20 20 20 20 20 46  .iFirst;.      F
16330 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
16340 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
16350 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 69  iFirst];.      i
16360 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b  nt bNewTerm = 0;
16370 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
16380 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
16390 20 29 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   );.      pSeg->
163a0 78 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 26  xNext(p, pSeg, &
163b0 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 20  bNewTerm);.     
163c0 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66   if( pSeg->pLeaf
163d0 3d 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d 20  ==0 || bNewTerm 
163e0 0a 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35 4d  .       || fts5M
163f0 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52  ultiIterAdvanceR
16400 6f 77 69 64 28 70 49 74 65 72 2c 20 69 46 69 72  owid(pIter, iFir
16410 73 74 2c 20 26 70 53 65 67 29 0a 20 20 20 20 20  st, &pSeg).     
16420 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
16430 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
16440 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72  d(p, pIter, iFir
16450 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  st, 1);.        
16460 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74  fts5MultiIterSet
16470 45 6f 66 28 70 49 74 65 72 29 3b 0a 20 20 20 20  Eof(pIter);.    
16480 20 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d      *pbNewTerm =
16490 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
164a0 20 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74    fts5AssertMult
164b0 69 49 74 65 72 53 65 74 75 70 28 70 2c 20 70 49  iIterSetup(p, pI
164c0 74 65 72 29 3b 0a 0a 20 20 20 20 7d 77 68 69 6c  ter);..    }whil
164d0 65 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  e( fts5MultiIter
164e0 49 73 45 6d 70 74 79 28 70 2c 20 70 49 74 65 72  IsEmpty(p, pIter
164f0 29 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ) );.  }.}..stat
16500 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72  ic void fts5Iter
16510 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6f 70 28  SetOutputs_Noop(
16520 46 74 73 35 49 74 65 72 20 2a 70 55 6e 75 73 65  Fts5Iter *pUnuse
16530 64 31 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  d1, Fts5SegIter 
16540 2a 70 55 6e 75 73 65 64 32 29 7b 0a 20 20 55 4e  *pUnused2){.  UN
16550 55 53 45 44 5f 50 41 52 41 4d 32 28 70 55 6e 75  USED_PARAM2(pUnu
16560 73 65 64 31 2c 20 70 55 6e 75 73 65 64 32 29 3b  sed1, pUnused2);
16570 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 49  .}..static Fts5I
16580 74 65 72 20 2a 66 74 73 35 4d 75 6c 74 69 49 74  ter *fts5MultiIt
16590 65 72 41 6c 6c 6f 63 28 0a 20 20 46 74 73 35 49  erAlloc(.  Fts5I
165a0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
165b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
165c0 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
165d0 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
165e0 20 20 69 6e 74 20 6e 53 65 67 0a 29 7b 0a 20 20    int nSeg.){.  
165f0 46 74 73 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a  Fts5Iter *pNew;.
16600 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20    int nSlot;    
16610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16620 20 20 2f 2a 20 50 6f 77 65 72 20 6f 66 20 74 77    /* Power of tw
16630 6f 20 3e 3d 20 6e 53 65 67 20 2a 2f 0a 0a 20 20  o >= nSeg */..  
16640 66 6f 72 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c  for(nSlot=2; nSl
16650 6f 74 3c 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e  ot<nSeg; nSlot=n
16660 53 6c 6f 74 2a 32 29 3b 0a 20 20 70 4e 65 77 20  Slot*2);.  pNew 
16670 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  = fts5IdxMalloc(
16680 70 2c 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  p, .      sizeof
16690 28 46 74 73 35 49 74 65 72 29 20 2b 20 20 20 20  (Fts5Iter) +    
166a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
166b0 20 70 4e 65 77 20 2a 2f 0a 20 20 20 20 20 20 73   pNew */.      s
166c0 69 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74 65  izeof(Fts5SegIte
166d0 72 29 20 2a 20 28 6e 53 6c 6f 74 2d 31 29 20 2b  r) * (nSlot-1) +
166e0 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 53 65 67     /* pNew->aSeg
166f0 5b 5d 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65  [] */.      size
16700 6f 66 28 46 74 73 35 43 52 65 73 75 6c 74 29 20  of(Fts5CResult) 
16710 2a 20 6e 53 6c 6f 74 20 20 20 20 20 20 20 20 20  * nSlot         
16720 2f 2a 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b  /* pNew->aFirst[
16730 5d 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20  ] */.  );.  if( 
16740 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 4e 65 77  pNew ){.    pNew
16750 2d 3e 6e 53 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a  ->nSeg = nSlot;.
16760 20 20 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74      pNew->aFirst
16770 20 3d 20 28 46 74 73 35 43 52 65 73 75 6c 74 2a   = (Fts5CResult*
16780 29 26 70 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c  )&pNew->aSeg[nSl
16790 6f 74 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  ot];.    pNew->p
167a0 49 6e 64 65 78 20 3d 20 70 3b 0a 20 20 20 20 70  Index = p;.    p
167b0 4e 65 77 2d 3e 78 53 65 74 4f 75 74 70 75 74 73  New->xSetOutputs
167c0 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75   = fts5IterSetOu
167d0 74 70 75 74 73 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a  tputs_Noop;.  }.
167e0 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
167f0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
16800 73 35 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63  s5PoslistCallbac
16810 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  k(.  Fts5Index *
16820 70 55 6e 75 73 65 64 2c 20 0a 20 20 76 6f 69 64  pUnused, .  void
16830 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63   *pContext, .  c
16840 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c  onst u8 *pChunk,
16850 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20   int nChunk.){. 
16860 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 55   UNUSED_PARAM(pU
16870 6e 75 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74  nused);.  assert
16880 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29  _nc( nChunk>=0 )
16890 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30  ;.  if( nChunk>0
168a0 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66   ){.    fts5Buff
168b0 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
168c0 28 28 46 74 73 35 42 75 66 66 65 72 2a 29 70 43  ((Fts5Buffer*)pC
168d0 6f 6e 74 65 78 74 2c 20 70 43 68 75 6e 6b 2c 20  ontext, pChunk, 
168e0 6e 43 68 75 6e 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a  nChunk);.  }.}..
168f0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
16900 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74  oslistCallbackCt
16910 78 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63  x PoslistCallbac
16920 6b 43 74 78 3b 0a 73 74 72 75 63 74 20 50 6f 73  kCtx;.struct Pos
16930 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20  listCallbackCtx 
16940 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  {.  Fts5Buffer *
16950 70 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20  pBuf;           
16960 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f      /* Append to
16970 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a   this buffer */.
16980 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
16990 6f 6c 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  olset;          
169a0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61    /* Restrict ma
169b0 74 63 68 65 73 20 74 6f 20 74 68 69 73 20 63 6f  tches to this co
169c0 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 53  lumn */.  int eS
169d0 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  tate;           
169e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
169f0 20 61 62 6f 76 65 20 2a 2f 0a 7d 3b 0a 0a 74 79   above */.};..ty
16a00 70 65 64 65 66 20 73 74 72 75 63 74 20 50 6f 73  pedef struct Pos
16a10 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78 20 50  listOffsetsCtx P
16a20 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78  oslistOffsetsCtx
16a30 3b 0a 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74  ;.struct Poslist
16a40 4f 66 66 73 65 74 73 43 74 78 20 7b 0a 20 20 46  OffsetsCtx {.  F
16a50 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b  ts5Buffer *pBuf;
16a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16a70 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73  * Append to this
16a80 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 46 74 73   buffer */.  Fts
16a90 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
16aa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16ab0 52 65 73 74 72 69 63 74 20 6d 61 74 63 68 65 73  Restrict matches
16ac0 20 74 6f 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20   to this column 
16ad0 2a 2f 0a 20 20 69 6e 74 20 69 52 65 61 64 3b 0a  */.  int iRead;.
16ae0 20 20 69 6e 74 20 69 57 72 69 74 65 3b 0a 7d 3b    int iWrite;.};
16af0 0a 0a 2f 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 4d 61  ../*.** TODO: Ma
16b00 6b 65 20 74 68 69 73 20 6d 6f 72 65 20 65 66 66  ke this more eff
16b10 69 63 69 65 6e 74 21 0a 2a 2f 0a 73 74 61 74 69  icient!.*/.stati
16b20 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 43  c int fts5IndexC
16b30 6f 6c 73 65 74 54 65 73 74 28 46 74 73 35 43 6f  olsetTest(Fts5Co
16b40 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 69  lset *pColset, i
16b50 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  nt iCol){.  int 
16b60 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
16b70 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69  pColset->nCol; i
16b80 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f  ++){.    if( pCo
16b90 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 3d 3d  lset->aiCol[i]==
16ba0 69 43 6f 6c 20 29 20 72 65 74 75 72 6e 20 31 3b  iCol ) return 1;
16bb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
16bc0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
16bd0 66 74 73 35 50 6f 73 6c 69 73 74 4f 66 66 73 65  fts5PoslistOffse
16be0 74 73 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74  tsCallback(.  Ft
16bf0 73 35 49 6e 64 65 78 20 2a 70 55 6e 75 73 65 64  s5Index *pUnused
16c00 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74  , .  void *pCont
16c10 65 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  ext, .  const u8
16c20 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43   *pChunk, int nC
16c30 68 75 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73  hunk.){.  Poslis
16c40 74 4f 66 66 73 65 74 73 43 74 78 20 2a 70 43 74  tOffsetsCtx *pCt
16c50 78 20 3d 20 28 50 6f 73 6c 69 73 74 4f 66 66 73  x = (PoslistOffs
16c60 65 74 73 43 74 78 2a 29 70 43 6f 6e 74 65 78 74  etsCtx*)pContext
16c70 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
16c80 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 61 73 73  (pUnused);.  ass
16c90 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d  ert_nc( nChunk>=
16ca0 30 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e  0 );.  if( nChun
16cb0 6b 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  k>0 ){.    int i
16cc0 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
16cd0 20 69 3c 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20   i<nChunk ){.   
16ce0 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20     int iVal;.   
16cf0 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
16d00 61 72 69 6e 74 33 32 28 26 70 43 68 75 6e 6b 5b  arint32(&pChunk[
16d10 69 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20  i], iVal);.     
16d20 20 69 56 61 6c 20 2b 3d 20 70 43 74 78 2d 3e 69   iVal += pCtx->i
16d30 52 65 61 64 20 2d 20 32 3b 0a 20 20 20 20 20 20  Read - 2;.      
16d40 70 43 74 78 2d 3e 69 52 65 61 64 20 3d 20 69 56  pCtx->iRead = iV
16d50 61 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74  al;.      if( ft
16d60 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73  s5IndexColsetTes
16d70 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c  t(pCtx->pColset,
16d80 20 69 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20   iVal) ){.      
16d90 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
16da0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 43 74  AppendVarint(pCt
16db0 78 2d 3e 70 42 75 66 2c 20 69 56 61 6c 20 2b 20  x->pBuf, iVal + 
16dc0 32 20 2d 20 70 43 74 78 2d 3e 69 57 72 69 74 65  2 - pCtx->iWrite
16dd0 29 3b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d  );.        pCtx-
16de0 3e 69 57 72 69 74 65 20 3d 20 69 56 61 6c 3b 0a  >iWrite = iVal;.
16df0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16e00 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
16e10 20 66 74 73 35 50 6f 73 6c 69 73 74 46 69 6c 74   fts5PoslistFilt
16e20 65 72 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74  erCallback(.  Ft
16e30 73 35 49 6e 64 65 78 20 2a 70 55 6e 75 73 65 64  s5Index *pUnused
16e40 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65  ,.  void *pConte
16e50 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20  xt, .  const u8 
16e60 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68  *pChunk, int nCh
16e70 75 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74  unk.){.  Poslist
16e80 43 61 6c 6c 62 61 63 6b 43 74 78 20 2a 70 43 74  CallbackCtx *pCt
16e90 78 20 3d 20 28 50 6f 73 6c 69 73 74 43 61 6c 6c  x = (PoslistCall
16ea0 62 61 63 6b 43 74 78 2a 29 70 43 6f 6e 74 65 78  backCtx*)pContex
16eb0 74 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  t;.  UNUSED_PARA
16ec0 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 61 73  M(pUnused);.  as
16ed0 73 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e  sert_nc( nChunk>
16ee0 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75  =0 );.  if( nChu
16ef0 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53  nk>0 ){.    /* S
16f00 65 61 72 63 68 20 74 68 72 6f 75 67 68 20 74 6f  earch through to
16f10 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20   find the first 
16f20 76 61 72 69 6e 74 20 77 69 74 68 20 76 61 6c 75  varint with valu
16f30 65 20 31 2e 20 54 68 69 73 20 69 73 20 74 68 65  e 1. This is the
16f40 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66  .    ** start of
16f50 20 74 68 65 20 6e 65 78 74 20 63 6f 6c 75 6d 6e   the next column
16f60 73 20 68 69 74 73 2e 20 2a 2f 0a 20 20 20 20 69  s hits. */.    i
16f70 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e  nt i = 0;.    in
16f80 74 20 69 53 74 61 72 74 20 3d 20 30 3b 0a 0a 20  t iStart = 0;.. 
16f90 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53 74     if( pCtx->eSt
16fa0 61 74 65 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  ate==2 ){.      
16fb0 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  int iCol;.      
16fc0 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
16fd0 74 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69  t32(pChunk, i, i
16fe0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Col);.      if( 
16ff0 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54  fts5IndexColsetT
17000 65 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65  est(pCtx->pColse
17010 74 2c 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20  t, iCol) ){.    
17020 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65      pCtx->eState
17030 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66 74   = 1;.        ft
17040 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
17050 6e 64 56 61 72 69 6e 74 28 70 43 74 78 2d 3e 70  ndVarint(pCtx->p
17060 42 75 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Buf, 1);.      }
17070 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
17080 74 78 2d 3e 65 53 74 61 74 65 20 3d 20 30 3b 0a  tx->eState = 0;.
17090 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
170a0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 77 68     do {.      wh
170b0 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20 26 26  ile( i<nChunk &&
170c0 20 70 43 68 75 6e 6b 5b 69 5d 21 3d 30 78 30 31   pChunk[i]!=0x01
170d0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
170e0 65 28 20 70 43 68 75 6e 6b 5b 69 5d 20 26 20 30  e( pChunk[i] & 0
170f0 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20  x80 ) i++;.     
17100 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     i++;.      }.
17110 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
17120 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
17130 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
17140 41 70 70 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d  AppendBlob(pCtx-
17150 3e 70 42 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69  >pBuf, &pChunk[i
17160 53 74 61 72 74 5d 2c 20 69 2d 69 53 74 61 72 74  Start], i-iStart
17170 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17180 20 69 66 28 20 69 3c 6e 43 68 75 6e 6b 20 29 7b   if( i<nChunk ){
17190 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
171a0 6c 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  l;.        iStar
171b0 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 69  t = i;.        i
171c0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ++;.        if( 
171d0 69 3e 3d 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20  i>=nChunk ){.   
171e0 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74         pCtx->eSt
171f0 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20  ate = 2;.       
17200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17210 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72    fts5FastGetVar
17220 69 6e 74 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c  int32(pChunk, i,
17230 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   iCol);.        
17240 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d    pCtx->eState =
17250 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74   fts5IndexColset
17260 54 65 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73  Test(pCtx->pCols
17270 65 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20  et, iCol);.     
17280 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65       if( pCtx->e
17290 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  State ){.       
172a0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
172b0 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 43  afeAppendBlob(pC
172c0 74 78 2d 3e 70 42 75 66 2c 20 26 70 43 68 75 6e  tx->pBuf, &pChun
172d0 6b 5b 69 53 74 61 72 74 5d 2c 20 69 2d 69 53 74  k[iStart], i-iSt
172e0 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  art);.          
172f0 20 20 69 53 74 61 72 74 20 3d 20 69 3b 0a 20 20    iStart = i;.  
17300 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17310 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
17320 7d 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b  }while( i<nChunk
17330 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   );.  }.}..stati
17340 63 20 76 6f 69 64 20 66 74 73 35 43 68 75 6e 6b  c void fts5Chunk
17350 49 74 65 72 61 74 65 28 0a 20 20 46 74 73 35 49  Iterate(.  Fts5I
17360 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
17370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
17380 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dex object */.  
17390 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
173a0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
173b0 2f 2a 20 50 6f 73 6c 69 73 74 20 6f 66 20 74 68  /* Poslist of th
173c0 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  is iterator */. 
173d0 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20   void *pCtx,    
173e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173f0 20 2f 2a 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e   /* Context poin
17400 74 65 72 20 66 6f 72 20 78 43 68 75 6e 6b 20 63  ter for xChunk c
17410 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69  allback */.  voi
17420 64 20 28 2a 78 43 68 75 6e 6b 29 28 46 74 73 35  d (*xChunk)(Fts5
17430 49 6e 64 65 78 2a 2c 20 76 6f 69 64 2a 2c 20 63  Index*, void*, c
17440 6f 6e 73 74 20 75 38 2a 2c 20 69 6e 74 29 0a 29  onst u8*, int).)
17450 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70  {.  int nRem = p
17460 53 65 67 2d 3e 6e 50 6f 73 3b 20 20 20 20 20 20  Seg->nPos;      
17470 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17480 20 62 79 74 65 73 20 73 74 69 6c 6c 20 74 6f 20   bytes still to 
17490 63 6f 6d 65 20 2a 2f 0a 20 20 46 74 73 35 44 61  come */.  Fts5Da
174a0 74 61 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20  ta *pData = 0;. 
174b0 20 75 38 20 2a 70 43 68 75 6e 6b 20 3d 20 26 70   u8 *pChunk = &p
174c0 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53  Seg->pLeaf->p[pS
174d0 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d  eg->iLeafOffset]
174e0 3b 0a 20 20 69 6e 74 20 6e 43 68 75 6e 6b 20 3d  ;.  int nChunk =
174f0 20 4d 49 4e 28 6e 52 65 6d 2c 20 70 53 65 67 2d   MIN(nRem, pSeg-
17500 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2d  >pLeaf->szLeaf -
17510 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73   pSeg->iLeafOffs
17520 65 74 29 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 20  et);.  int pgno 
17530 3d 20 70 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e  = pSeg->iLeafPgn
17540 6f 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 53 61 76  o;.  int pgnoSav
17550 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69  e = 0;..  /* Thi
17560 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
17570 6e 6f 74 6d 77 6f 72 6b 20 77 69 74 68 20 64 65  notmwork with de
17580 74 61 69 6c 3d 6e 6f 6e 65 20 64 61 74 61 62 61  tail=none databa
17590 73 65 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ses. */.  assert
175a0 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  ( p->pConfig->eD
175b0 65 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41  etail!=FTS5_DETA
175c0 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 69 66  IL_NONE );..  if
175d0 28 20 28 70 53 65 67 2d 3e 66 6c 61 67 73 20 26  ( (pSeg->flags &
175e0 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
175f0 56 45 52 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20  VERSE)==0 ){.   
17600 20 70 67 6e 6f 53 61 76 65 20 3d 20 70 67 6e 6f   pgnoSave = pgno
17610 2b 31 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  +1;.  }..  while
17620 28 20 31 20 29 7b 0a 20 20 20 20 78 43 68 75 6e  ( 1 ){.    xChun
17630 6b 28 70 2c 20 70 43 74 78 2c 20 70 43 68 75 6e  k(p, pCtx, pChun
17640 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20 20 20 20  k, nChunk);.    
17650 6e 52 65 6d 20 2d 3d 20 6e 43 68 75 6e 6b 3b 0a  nRem -= nChunk;.
17660 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
17670 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20  ase(pData);.    
17680 69 66 28 20 6e 52 65 6d 3c 3d 30 20 29 7b 0a 20  if( nRem<=0 ){. 
17690 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
176a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 67 6e  }else{.      pgn
176b0 6f 2b 2b 3b 0a 20 20 20 20 20 20 70 44 61 74 61  o++;.      pData
176c0 20 3d 20 66 74 73 35 4c 65 61 66 52 65 61 64 28   = fts5LeafRead(
176d0 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  p, FTS5_SEGMENT_
176e0 52 4f 57 49 44 28 70 53 65 67 2d 3e 70 53 65 67  ROWID(pSeg->pSeg
176f0 2d 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f 29 29  ->iSegid, pgno))
17700 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74  ;.      if( pDat
17710 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  a==0 ) break;.  
17720 20 20 20 20 70 43 68 75 6e 6b 20 3d 20 26 70 44      pChunk = &pD
17730 61 74 61 2d 3e 70 5b 34 5d 3b 0a 20 20 20 20 20  ata->p[4];.     
17740 20 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52   nChunk = MIN(nR
17750 65 6d 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61  em, pData->szLea
17760 66 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 69 66  f - 4);.      if
17770 28 20 70 67 6e 6f 3d 3d 70 67 6e 6f 53 61 76 65  ( pgno==pgnoSave
17780 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
17790 72 74 28 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c  rt( pSeg->pNextL
177a0 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  eaf==0 );.      
177b0 20 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61    pSeg->pNextLea
177c0 66 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 20  f = pData;.     
177d0 20 20 20 70 44 61 74 61 20 3d 20 30 3b 0a 20 20     pData = 0;.  
177e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
177f0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f  }../*.** Iterato
17800 72 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c  r pIter currentl
17810 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61  y points to a va
17820 6c 69 64 20 65 6e 74 72 79 20 28 6e 6f 74 20 45  lid entry (not E
17830 4f 46 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  OF). This.** fun
17840 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 74 68  ction appends th
17850 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
17860 64 61 74 61 20 66 6f 72 20 74 68 65 20 63 75 72  data for the cur
17870 72 65 6e 74 20 65 6e 74 72 79 20 74 6f 0a 2a 2a  rent entry to.**
17880 20 62 75 66 66 65 72 20 70 42 75 66 2e 20 49 74   buffer pBuf. It
17890 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61   does not make a
178a0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73   copy of the pos
178b0 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a  ition-list size.
178c0 2a 2a 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61  ** field..*/.sta
178d0 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
178e0 69 74 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46  iterPoslist(.  F
178f0 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46  ts5Index *p,.  F
17900 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
17910 2c 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  ,.  Fts5Colset *
17920 70 43 6f 6c 73 65 74 2c 0a 20 20 46 74 73 35 42  pColset,.  Fts5B
17930 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20  uffer *pBuf.){. 
17940 20 69 66 28 20 30 3d 3d 66 74 73 35 42 75 66 66   if( 0==fts5Buff
17950 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70  erGrow(&p->rc, p
17960 42 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 29  Buf, pSeg->nPos)
17970 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c   ){.    if( pCol
17980 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  set==0 ){.      
17990 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65  fts5ChunkIterate
179a0 28 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a  (p, pSeg, (void*
179b0 29 70 42 75 66 2c 20 66 74 73 35 50 6f 73 6c 69  )pBuf, fts5Posli
179c0 73 74 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  stCallback);.   
179d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
179e0 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  ( p->pConfig->eD
179f0 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
17a00 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20  IL_FULL ){.     
17a10 20 20 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61     PoslistCallba
17a20 63 6b 43 74 78 20 73 43 74 78 3b 0a 20 20 20 20  ckCtx sCtx;.    
17a30 20 20 20 20 73 43 74 78 2e 70 42 75 66 20 3d 20      sCtx.pBuf = 
17a40 70 42 75 66 3b 0a 20 20 20 20 20 20 20 20 73 43  pBuf;.        sC
17a50 74 78 2e 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f  tx.pColset = pCo
17a60 6c 73 65 74 3b 0a 20 20 20 20 20 20 20 20 73 43  lset;.        sC
17a70 74 78 2e 65 53 74 61 74 65 20 3d 20 66 74 73 35  tx.eState = fts5
17a80 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28  IndexColsetTest(
17a90 70 43 6f 6c 73 65 74 2c 20 30 29 3b 0a 20 20 20  pColset, 0);.   
17aa0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 43 74       assert( sCt
17ab0 78 2e 65 53 74 61 74 65 3d 3d 30 20 7c 7c 20 73  x.eState==0 || s
17ac0 43 74 78 2e 65 53 74 61 74 65 3d 3d 31 20 29 3b  Ctx.eState==1 );
17ad0 0a 20 20 20 20 20 20 20 20 66 74 73 35 43 68 75  .        fts5Chu
17ae0 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65  nkIterate(p, pSe
17af0 67 2c 20 28 76 6f 69 64 2a 29 26 73 43 74 78 2c  g, (void*)&sCtx,
17b00 20 66 74 73 35 50 6f 73 6c 69 73 74 46 69 6c 74   fts5PoslistFilt
17b10 65 72 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  erCallback);.   
17b20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17b30 20 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73    PoslistOffsets
17b40 43 74 78 20 73 43 74 78 3b 0a 20 20 20 20 20 20  Ctx sCtx;.      
17b50 20 20 6d 65 6d 73 65 74 28 26 73 43 74 78 2c 20    memset(&sCtx, 
17b60 30 2c 20 73 69 7a 65 6f 66 28 73 43 74 78 29 29  0, sizeof(sCtx))
17b70 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 70  ;.        sCtx.p
17b80 42 75 66 20 3d 20 70 42 75 66 3b 0a 20 20 20 20  Buf = pBuf;.    
17b90 20 20 20 20 73 43 74 78 2e 70 43 6f 6c 73 65 74      sCtx.pColset
17ba0 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20   = pColset;.    
17bb0 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65      fts5ChunkIte
17bc0 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20 28 76  rate(p, pSeg, (v
17bd0 6f 69 64 2a 29 26 73 43 74 78 2c 20 66 74 73 35  oid*)&sCtx, fts5
17be0 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 61  PoslistOffsetsCa
17bf0 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 7d  llback);.      }
17c00 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
17c10 0a 2a 2a 20 49 4e 2f 4f 55 54 20 70 61 72 61 6d  .** IN/OUT param
17c20 65 74 65 72 20 28 2a 70 61 29 20 70 6f 69 6e 74  eter (*pa) point
17c30 73 20 74 6f 20 61 20 70 6f 73 69 74 69 6f 6e 20  s to a position 
17c40 6c 69 73 74 20 6e 20 62 79 74 65 73 20 69 6e 20  list n bytes in 
17c50 73 69 7a 65 2e 20 49 66 0a 2a 2a 20 74 68 65 20  size. If.** the 
17c60 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f  position list co
17c70 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66  ntains entries f
17c80 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20  or column iCol, 
17c90 74 68 65 6e 20 28 2a 70 61 29 20 69 73 20 73 65  then (*pa) is se
17ca0 74 0a 2a 2a 20 74 6f 20 70 6f 69 6e 74 20 74 6f  t.** to point to
17cb0 20 74 68 65 20 73 75 62 2d 70 6f 73 69 74 69 6f   the sub-positio
17cc0 6e 2d 6c 69 73 74 20 66 6f 72 20 74 68 61 74 20  n-list for that 
17cd0 63 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 6e  column and the n
17ce0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 79 74 65  umber of.** byte
17cf0 73 20 69 6e 20 69 74 20 72 65 74 75 72 6e 65 64  s in it returned
17d00 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 61 72 67  . Or, if the arg
17d10 75 6d 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c  ument position l
17d20 69 73 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ist does not.** 
17d30 63 6f 6e 74 61 69 6e 20 61 6e 79 20 65 6e 74 72  contain any entr
17d40 69 65 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69  ies for column i
17d50 43 6f 6c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  Col, return 0..*
17d60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
17d70 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c  5IndexExtractCol
17d80 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70  (.  const u8 **p
17d90 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
17da0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
17db0 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 6c 69 73  ointer to poslis
17dc0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  t */.  int n,   
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17de0 20 20 20 20 20 20 20 2f 2a 20 49 4e 3a 20 53 69         /* IN: Si
17df0 7a 65 20 6f 66 20 70 6f 73 6c 69 73 74 20 69 6e  ze of poslist in
17e00 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
17e10 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20  iCol            
17e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
17e30 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74  olumn to extract
17e40 20 66 72 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f   from poslist */
17e50 0a 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 72 65  .){.  int iCurre
17e60 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
17e70 20 20 20 20 20 20 2f 2a 20 41 6e 79 74 68 69 6e        /* Anythin
17e80 67 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  g before the fir
17e90 73 74 20 30 78 30 31 20 69 73 20 63 6f 6c 20 30  st 0x01 is col 0
17ea0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
17eb0 70 20 3d 20 2a 70 61 3b 0a 20 20 63 6f 6e 73 74  p = *pa;.  const
17ec0 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 5b 6e   u8 *pEnd = &p[n
17ed0 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ];         /* On
17ee0 65 20 62 79 74 65 20 70 61 73 74 20 65 6e 64 20  e byte past end 
17ef0 6f 66 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  of position list
17f00 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 69 43   */..  while( iC
17f10 6f 6c 3e 69 43 75 72 72 65 6e 74 20 29 7b 0a 20  ol>iCurrent ){. 
17f20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f     /* Advance po
17f30 69 6e 74 65 72 20 70 20 75 6e 74 69 6c 20 69 74  inter p until it
17f40 20 70 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64 20   points to pEnd 
17f50 6f 72 20 61 6e 20 30 78 30 31 20 62 79 74 65 20  or an 0x01 byte 
17f60 74 68 61 74 20 69 73 0a 20 20 20 20 2a 2a 20 6e  that is.    ** n
17f70 6f 74 20 70 61 72 74 20 6f 66 20 61 20 76 61 72  ot part of a var
17f80 69 6e 74 2e 20 4e 6f 74 65 20 74 68 61 74 20 69  int. Note that i
17f90 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
17fa0 65 20 66 6f 72 20 61 20 6e 65 67 61 74 69 76 65  e for a negative
17fb0 0a 20 20 20 20 2a 2a 20 6f 72 20 65 78 74 72 65  .    ** or extre
17fc0 6d 65 6c 79 20 6c 61 72 67 65 20 76 61 72 69 6e  mely large varin
17fd0 74 20 74 6f 20 6f 63 63 75 72 20 77 69 74 68 69  t to occur withi
17fe0 6e 20 61 6e 20 75 6e 63 6f 72 72 75 70 74 65 64  n an uncorrupted
17ff0 20 70 6f 73 69 74 69 6f 6e 20 0a 20 20 20 20 2a   position .    *
18000 2a 20 6c 69 73 74 2e 20 53 6f 20 74 68 65 20 6c  * list. So the l
18010 61 73 74 20 62 79 74 65 20 6f 66 20 65 61 63 68  ast byte of each
18020 20 76 61 72 69 6e 74 20 6d 61 79 20 62 65 20 61   varint may be a
18030 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61  ssumed to have a
18040 20 63 6c 65 61 72 0a 20 20 20 20 2a 2a 20 30 78   clear.    ** 0x
18050 38 30 20 62 69 74 2e 20 20 2a 2f 0a 20 20 20 20  80 bit.  */.    
18060 77 68 69 6c 65 28 20 2a 70 21 3d 30 78 30 31 20  while( *p!=0x01 
18070 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ){.      while( 
18080 2a 70 2b 2b 20 26 20 30 78 38 30 20 29 3b 0a 20  *p++ & 0x80 );. 
18090 20 20 20 20 20 69 66 28 20 70 3e 3d 70 45 6e 64       if( p>=pEnd
180a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
180b0 20 7d 0a 20 20 20 20 2a 70 61 20 3d 20 70 2b 2b   }.    *pa = p++
180c0 3b 0a 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d  ;.    iCurrent =
180d0 20 2a 70 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69   *p++;.    if( i
180e0 43 75 72 72 65 6e 74 20 26 20 30 78 38 30 20 29  Current & 0x80 )
180f0 7b 0a 20 20 20 20 20 20 70 2d 2d 3b 0a 20 20 20  {.      p--;.   
18100 20 20 20 70 20 2b 3d 20 66 74 73 35 47 65 74 56     p += fts5GetV
18110 61 72 69 6e 74 33 32 28 70 2c 20 69 43 75 72 72  arint32(p, iCurr
18120 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
18130 20 20 69 66 28 20 69 43 6f 6c 21 3d 69 43 75 72    if( iCol!=iCur
18140 72 65 6e 74 20 29 20 72 65 74 75 72 6e 20 30 3b  rent ) return 0;
18150 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 70  ..  /* Advance p
18160 6f 69 6e 74 65 72 20 70 20 75 6e 74 69 6c 20 69  ointer p until i
18170 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64  t points to pEnd
18180 20 6f 72 20 61 6e 20 30 78 30 31 20 62 79 74 65   or an 0x01 byte
18190 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6e 6f   that is.  ** no
181a0 74 20 70 61 72 74 20 6f 66 20 61 20 76 61 72 69  t part of a vari
181b0 6e 74 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70  nt */.  while( p
181c0 3c 70 45 6e 64 20 26 26 20 2a 70 21 3d 30 78 30  <pEnd && *p!=0x0
181d0 31 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  1 ){.    while( 
181e0 2a 70 2b 2b 20 26 20 30 78 38 30 20 29 3b 0a 20  *p++ & 0x80 );. 
181f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 20 2d   }..  return p -
18200 20 28 2a 70 61 29 3b 0a 7d 0a 0a 73 74 61 74 69   (*pa);.}..stati
18210 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
18220 45 78 74 72 61 63 74 43 6f 6c 73 65 74 28 0a 20  ExtractColset(. 
18230 20 69 6e 74 20 2a 70 52 63 2c 0a 20 20 46 74 73   int *pRc,.  Fts
18240 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
18250 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
18260 43 6f 6c 73 65 74 20 74 6f 20 66 69 6c 74 65 72  Colset to filter
18270 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75   on */.  const u
18280 38 20 2a 70 50 6f 73 2c 20 69 6e 74 20 6e 50 6f  8 *pPos, int nPo
18290 73 2c 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69  s,       /* Posi
182a0 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 46  tion list */.  F
182b0 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 20  ts5Buffer *pBuf 
182c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
182d0 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20  * Output buffer 
182e0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52 63  */.){.  if( *pRc
182f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18300 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 74     int i;.    ft
18310 73 35 42 75 66 66 65 72 5a 65 72 6f 28 70 42 75  s5BufferZero(pBu
18320 66 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  f);.    for(i=0;
18330 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c   i<pColset->nCol
18340 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
18350 6e 73 74 20 75 38 20 2a 70 53 75 62 20 3d 20 70  nst u8 *pSub = p
18360 50 6f 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  Pos;.      int n
18370 53 75 62 20 3d 20 66 74 73 35 49 6e 64 65 78 45  Sub = fts5IndexE
18380 78 74 72 61 63 74 43 6f 6c 28 26 70 53 75 62 2c  xtractCol(&pSub,
18390 20 6e 50 6f 73 2c 20 70 43 6f 6c 73 65 74 2d 3e   nPos, pColset->
183a0 61 69 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  aiCol[i]);.     
183b0 20 69 66 28 20 6e 53 75 62 20 29 7b 0a 20 20 20   if( nSub ){.   
183c0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
183d0 70 70 65 6e 64 42 6c 6f 62 28 70 52 63 2c 20 70  ppendBlob(pRc, p
183e0 42 75 66 2c 20 6e 53 75 62 2c 20 70 53 75 62 29  Buf, nSub, pSub)
183f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18400 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65    }.}../*.** xSe
18410 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63  tOutputs callbac
18420 6b 20 75 73 65 64 20 62 79 20 64 65 74 61 69 6c  k used by detail
18430 3d 6e 6f 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2f  =none tables..*/
18440 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
18450 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
18460 4e 6f 6e 65 28 46 74 73 35 49 74 65 72 20 2a 70  None(Fts5Iter *p
18470 49 74 65 72 2c 20 46 74 73 35 53 65 67 49 74 65  Iter, Fts5SegIte
18480 72 20 2a 70 53 65 67 29 7b 0a 20 20 61 73 73 65  r *pSeg){.  asse
18490 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  rt( pIter->pInde
184a0 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  x->pConfig->eDet
184b0 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
184c0 5f 4e 4f 4e 45 20 29 3b 0a 20 20 70 49 74 65 72  _NONE );.  pIter
184d0 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20  ->base.iRowid = 
184e0 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20  pSeg->iRowid;.  
184f0 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74  pIter->base.nDat
18500 61 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a  a = pSeg->nPos;.
18510 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74  }../*.** xSetOut
18520 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73  puts callback us
18530 65 64 20 62 79 20 64 65 74 61 69 6c 3d 66 75 6c  ed by detail=ful
18540 6c 20 61 6e 64 20 64 65 74 61 69 6c 3d 63 6f 6c  l and detail=col
18550 20 74 61 62 6c 65 73 20 77 68 65 6e 20 6e 6f 0a   tables when no.
18560 2a 2a 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72  ** column filter
18570 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64 2e  s are specified.
18580 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18590 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
185a0 74 73 5f 4e 6f 63 6f 6c 73 65 74 28 46 74 73 35  ts_Nocolset(Fts5
185b0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73  Iter *pIter, Fts
185c0 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b  5SegIter *pSeg){
185d0 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69  .  pIter->base.i
185e0 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52  Rowid = pSeg->iR
185f0 6f 77 69 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62  owid;.  pIter->b
18600 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 53 65 67  ase.nData = pSeg
18610 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 61 73 73 65 72  ->nPos;..  asser
18620 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  t( pIter->pIndex
18630 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
18640 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il!=FTS5_DETAIL_
18650 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74  NONE );.  assert
18660 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74  ( pIter->pColset
18670 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ==0 );..  if( pS
18680 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b  eg->iLeafOffset+
18690 70 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67  pSeg->nPos<=pSeg
186a0 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  ->pLeaf->szLeaf 
186b0 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 64 61  ){.    /* All da
186c0 74 61 20 69 73 20 73 74 6f 72 65 64 20 6f 6e 20  ta is stored on 
186d0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
186e0 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
186f0 75 74 70 75 74 20 0a 20 20 20 20 2a 2a 20 76 61  utput .    ** va
18700 72 69 61 62 6c 65 73 20 74 6f 20 70 6f 69 6e 74  riables to point
18710 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f   into the body o
18720 66 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63  f the page objec
18730 74 2e 20 2a 2f 0a 20 20 20 20 70 49 74 65 72 2d  t. */.    pIter-
18740 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 26 70  >base.pData = &p
18750 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53  Seg->pLeaf->p[pS
18760 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d  eg->iLeafOffset]
18770 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
18780 2a 20 54 68 65 20 64 61 74 61 20 69 73 20 64 69  * The data is di
18790 73 74 72 69 62 75 74 65 64 20 6f 76 65 72 20 74  stributed over t
187a0 77 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73  wo or more pages
187b0 2e 20 43 6f 70 79 20 69 74 20 69 6e 74 6f 20 74  . Copy it into t
187c0 68 65 0a 20 20 20 20 2a 2a 20 46 74 73 35 49 74  he.    ** Fts5It
187d0 65 72 2e 70 6f 73 6c 69 73 74 20 62 75 66 66 65  er.poslist buffe
187e0 72 20 61 6e 64 20 74 68 65 6e 20 73 65 74 20 74  r and then set t
187f0 68 65 20 6f 75 74 70 75 74 20 70 6f 69 6e 74 65  he output pointe
18800 72 20 74 6f 20 70 6f 69 6e 74 0a 20 20 20 20 2a  r to point.    *
18810 2a 20 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  * to this buffer
18820 2e 20 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75  .  */.    fts5Bu
18830 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d  fferZero(&pIter-
18840 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 66  >poslist);.    f
18850 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
18860 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c  t(pIter->pIndex,
18870 20 70 53 65 67 2c 20 30 2c 20 26 70 49 74 65 72   pSeg, 0, &pIter
18880 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  ->poslist);.    
18890 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74  pIter->base.pDat
188a0 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  a = pIter->posli
188b0 73 74 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  st.p;.  }.}../*.
188c0 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20 63  ** xSetOutputs c
188d0 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 77 68 65  allback used whe
188e0 6e 20 74 68 65 20 46 74 73 35 43 6f 6c 73 65 74  n the Fts5Colset
188f0 20 6f 62 6a 65 63 74 20 68 61 73 20 6e 43 6f 6c   object has nCol
18900 3d 3d 30 20 28 6d 61 74 63 68 0a 2a 2a 20 61 67  ==0 (match.** ag
18910 61 69 6e 73 74 20 6e 6f 20 63 6f 6c 75 6d 6e 73  ainst no columns
18920 20 61 74 20 61 6c 6c 29 2e 0a 2a 2f 0a 73 74 61   at all)..*/.sta
18930 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65  tic void fts5Ite
18940 72 53 65 74 4f 75 74 70 75 74 73 5f 5a 65 72 6f  rSetOutputs_Zero
18950 43 6f 6c 73 65 74 28 46 74 73 35 49 74 65 72 20  Colset(Fts5Iter 
18960 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65 67 49  *pIter, Fts5SegI
18970 74 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 55 4e  ter *pSeg){.  UN
18980 55 53 45 44 5f 50 41 52 41 4d 28 70 53 65 67 29  USED_PARAM(pSeg)
18990 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e  ;.  pIter->base.
189a0 6e 44 61 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  nData = 0;.}../*
189b0 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20  .** xSetOutputs 
189c0 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79  callback used by
189d0 20 64 65 74 61 69 6c 3d 63 6f 6c 20 77 68 65 6e   detail=col when
189e0 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6c 75   there is a colu
189f0 6d 6e 20 66 69 6c 74 65 72 0a 2a 2a 20 61 6e 64  mn filter.** and
18a00 20 74 68 65 72 65 20 61 72 65 20 31 30 30 20 6f   there are 100 o
18a10 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 2e 20  r more columns. 
18a20 41 6c 73 6f 20 63 61 6c 6c 65 64 20 61 73 20 61  Also called as a
18a30 20 66 61 6c 6c 62 61 63 6b 20 66 72 6f 6d 0a 2a   fallback from.*
18a40 2a 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  * fts5IterSetOut
18a50 70 75 74 73 5f 43 6f 6c 31 30 30 20 69 66 20 74  puts_Col100 if t
18a60 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20 73  he column-list s
18a70 70 61 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  pans more than o
18a80 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ne page..*/.stat
18a90 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72  ic void fts5Iter
18aa0 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 28 46  SetOutputs_Col(F
18ab0 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20  ts5Iter *pIter, 
18ac0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
18ad0 67 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72  g){.  fts5Buffer
18ae0 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73  Zero(&pIter->pos
18af0 6c 69 73 74 29 3b 0a 20 20 66 74 73 35 53 65 67  list);.  fts5Seg
18b00 69 74 65 72 50 6f 73 6c 69 73 74 28 70 49 74 65  iterPoslist(pIte
18b10 72 2d 3e 70 49 6e 64 65 78 2c 20 70 53 65 67 2c  r->pIndex, pSeg,
18b20 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2c   pIter->pColset,
18b30 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74   &pIter->poslist
18b40 29 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65  );.  pIter->base
18b50 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e  .iRowid = pSeg->
18b60 69 52 6f 77 69 64 3b 0a 20 20 70 49 74 65 72 2d  iRowid;.  pIter-
18b70 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49  >base.pData = pI
18b80 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
18b90 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44    pIter->base.nD
18ba0 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73  ata = pIter->pos
18bb0 6c 69 73 74 2e 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  list.n;.}../*.**
18bc0 20 78 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c   xSetOutputs cal
18bd0 6c 62 61 63 6b 20 75 73 65 64 20 77 68 65 6e 3a  lback used when:
18be0 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 64 65 74 61   .**.**   * deta
18bf0 69 6c 3d 63 6f 6c 2c 0a 2a 2a 20 20 20 2a 20 74  il=col,.**   * t
18c00 68 65 72 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e  here is a column
18c10 20 66 69 6c 74 65 72 2c 20 61 6e 64 0a 2a 2a 20   filter, and.** 
18c20 20 20 2a 20 74 68 65 20 74 61 62 6c 65 20 63 6f    * the table co
18c30 6e 74 61 69 6e 73 20 31 30 30 20 6f 72 20 66 65  ntains 100 or fe
18c40 77 65 72 20 63 6f 6c 75 6d 6e 73 2e 20 0a 2a 2a  wer columns. .**
18c50 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 70 6f 69  .** The last poi
18c60 6e 74 20 69 73 20 74 6f 20 65 6e 73 75 72 65 20  nt is to ensure 
18c70 61 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  all column numbe
18c80 72 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 73  rs are stored as
18c90 20 0a 2a 2a 20 73 69 6e 67 6c 65 2d 62 79 74 65   .** single-byte
18ca0 20 76 61 72 69 6e 74 73 2e 0a 2a 2f 0a 73 74 61   varints..*/.sta
18cb0 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65  tic void fts5Ite
18cc0 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 31  rSetOutputs_Col1
18cd0 30 30 28 46 74 73 35 49 74 65 72 20 2a 70 49 74  00(Fts5Iter *pIt
18ce0 65 72 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  er, Fts5SegIter 
18cf0 2a 70 53 65 67 29 7b 0a 0a 20 20 61 73 73 65 72  *pSeg){..  asser
18d00 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  t( pIter->pIndex
18d10 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
18d20 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
18d30 43 4f 4c 55 4d 4e 53 20 29 3b 0a 20 20 61 73 73  COLUMNS );.  ass
18d40 65 72 74 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c  ert( pIter->pCol
18d50 73 65 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  set );..  if( pS
18d60 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b  eg->iLeafOffset+
18d70 70 53 65 67 2d 3e 6e 50 6f 73 3e 70 53 65 67 2d  pSeg->nPos>pSeg-
18d80 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
18d90 7b 0a 20 20 20 20 66 74 73 35 49 74 65 72 53 65  {.    fts5IterSe
18da0 74 4f 75 74 70 75 74 73 5f 43 6f 6c 28 70 49 74  tOutputs_Col(pIt
18db0 65 72 2c 20 70 53 65 67 29 3b 0a 20 20 7d 65 6c  er, pSeg);.  }el
18dc0 73 65 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20  se{.    u8 *a = 
18dd0 28 75 38 2a 29 26 70 53 65 67 2d 3e 70 4c 65 61  (u8*)&pSeg->pLea
18de0 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66  f->p[pSeg->iLeaf
18df0 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 75 38 20  Offset];.    u8 
18e00 2a 70 45 6e 64 20 3d 20 28 75 38 2a 29 26 61 5b  *pEnd = (u8*)&a[
18e10 70 53 65 67 2d 3e 6e 50 6f 73 5d 3b 20 0a 20 20  pSeg->nPos]; .  
18e20 20 20 69 6e 74 20 69 50 72 65 76 20 3d 20 30 3b    int iPrev = 0;
18e30 0a 20 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 20  .    int *aiCol 
18e40 3d 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74  = pIter->pColset
18e50 2d 3e 61 69 43 6f 6c 3b 0a 20 20 20 20 69 6e 74  ->aiCol;.    int
18e60 20 2a 61 69 43 6f 6c 45 6e 64 20 3d 20 26 61 69   *aiColEnd = &ai
18e70 43 6f 6c 5b 70 49 74 65 72 2d 3e 70 43 6f 6c 73  Col[pIter->pCols
18e80 65 74 2d 3e 6e 43 6f 6c 5d 3b 0a 0a 20 20 20 20  et->nCol];..    
18e90 75 38 20 2a 61 4f 75 74 20 3d 20 70 49 74 65 72  u8 *aOut = pIter
18ea0 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20  ->poslist.p;.   
18eb0 20 69 6e 74 20 69 50 72 65 76 4f 75 74 20 3d 20   int iPrevOut = 
18ec0 30 3b 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 62  0;..    pIter->b
18ed0 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65  ase.iRowid = pSe
18ee0 67 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 20 20  g->iRowid;..    
18ef0 77 68 69 6c 65 28 20 61 3c 70 45 6e 64 20 29 7b  while( a<pEnd ){
18f00 0a 20 20 20 20 20 20 69 50 72 65 76 20 2b 3d 20  .      iPrev += 
18f10 28 69 6e 74 29 61 2b 2b 5b 30 5d 20 2d 20 32 3b  (int)a++[0] - 2;
18f20 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 61  .      while( *a
18f30 69 43 6f 6c 3c 69 50 72 65 76 20 29 7b 0a 20 20  iCol<iPrev ){.  
18f40 20 20 20 20 20 20 61 69 43 6f 6c 2b 2b 3b 0a 20        aiCol++;. 
18f50 20 20 20 20 20 20 20 69 66 28 20 61 69 43 6f 6c         if( aiCol
18f60 3d 3d 61 69 43 6f 6c 45 6e 64 20 29 20 67 6f 74  ==aiColEnd ) got
18f70 6f 20 73 65 74 6f 75 74 70 75 74 73 5f 63 6f 6c  o setoutputs_col
18f80 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
18f90 20 20 20 20 69 66 28 20 2a 61 69 43 6f 6c 3d 3d      if( *aiCol==
18fa0 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  iPrev ){.       
18fb0 20 2a 61 4f 75 74 2b 2b 20 3d 20 28 75 38 29 28   *aOut++ = (u8)(
18fc0 28 69 50 72 65 76 20 2d 20 69 50 72 65 76 4f 75  (iPrev - iPrevOu
18fd0 74 29 20 2b 20 32 29 3b 0a 20 20 20 20 20 20 20  t) + 2);.       
18fe0 20 69 50 72 65 76 4f 75 74 20 3d 20 69 50 72 65   iPrevOut = iPre
18ff0 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  v;.      }.    }
19000 0a 0a 73 65 74 6f 75 74 70 75 74 73 5f 63 6f 6c  ..setoutputs_col
19010 5f 6f 75 74 3a 0a 20 20 20 20 70 49 74 65 72 2d  _out:.    pIter-
19020 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49  >base.pData = pI
19030 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
19040 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e      pIter->base.
19050 6e 44 61 74 61 20 3d 20 61 4f 75 74 20 2d 20 70  nData = aOut - p
19060 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b  Iter->poslist.p;
19070 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53  .  }.}../*.** xS
19080 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61  etOutputs callba
19090 63 6b 20 75 73 65 64 20 62 79 20 64 65 74 61 69  ck used by detai
190a0 6c 3d 66 75 6c 6c 20 77 68 65 6e 20 74 68 65 72  l=full when ther
190b0 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 66 69  e is a column fi
190c0 6c 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lter..*/.static 
190d0 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65 74  void fts5IterSet
190e0 4f 75 74 70 75 74 73 5f 46 75 6c 6c 28 46 74 73  Outputs_Full(Fts
190f0 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74  5Iter *pIter, Ft
19100 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29  s5SegIter *pSeg)
19110 7b 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  {.  Fts5Colset *
19120 70 43 6f 6c 73 65 74 20 3d 20 70 49 74 65 72 2d  pColset = pIter-
19130 3e 70 43 6f 6c 73 65 74 3b 0a 20 20 70 49 74 65  >pColset;.  pIte
19140 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d  r->base.iRowid =
19150 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 0a   pSeg->iRowid;..
19160 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
19170 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67  >pIndex->pConfig
19180 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
19190 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 3b 0a 20  DETAIL_FULL );. 
191a0 20 61 73 73 65 72 74 28 20 70 43 6f 6c 73 65 74   assert( pColset
191b0 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d   );..  if( pSeg-
191c0 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70 53 65  >iLeafOffset+pSe
191d0 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e 70  g->nPos<=pSeg->p
191e0 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
191f0 20 20 20 20 2f 2a 20 41 6c 6c 20 64 61 74 61 20      /* All data 
19200 69 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65  is stored on the
19210 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 50   current page. P
19220 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 75 74 70  opulate the outp
19230 75 74 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  ut .    ** varia
19240 62 6c 65 73 20 74 6f 20 70 6f 69 6e 74 20 69 6e  bles to point in
19250 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74  to the body of t
19260 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 2e 20  he page object. 
19270 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20  */.    const u8 
19280 2a 61 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61  *a = &pSeg->pLea
19290 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66  f->p[pSeg->iLeaf
192a0 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 69 66 28  Offset];.    if(
192b0 20 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d   pColset->nCol==
192c0 31 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72  1 ){.      pIter
192d0 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 66  ->base.nData = f
192e0 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43  ts5IndexExtractC
192f0 6f 6c 28 26 61 2c 20 70 53 65 67 2d 3e 6e 50 6f  ol(&a, pSeg->nPo
19300 73 2c 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c  s,pColset->aiCol
19310 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 49 74 65  [0]);.      pIte
19320 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20  r->base.pData = 
19330 61 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  a;.    }else{.  
19340 20 20 20 20 69 6e 74 20 2a 70 52 63 20 3d 20 26      int *pRc = &
19350 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72  pIter->pIndex->r
19360 63 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  c;.      fts5Buf
19370 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e  ferZero(&pIter->
19380 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  poslist);.      
19390 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74  fts5IndexExtract
193a0 43 6f 6c 73 65 74 28 70 52 63 2c 20 70 43 6f 6c  Colset(pRc, pCol
193b0 73 65 74 2c 20 61 2c 20 70 53 65 67 2d 3e 6e 50  set, a, pSeg->nP
193c0 6f 73 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c  os, &pIter->posl
193d0 69 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65  ist);.      pIte
193e0 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20  r->base.pData = 
193f0 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70  pIter->poslist.p
19400 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62  ;.      pIter->b
19410 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 49 74 65  ase.nData = pIte
19420 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20  r->poslist.n;.  
19430 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
19440 20 2f 2a 20 54 68 65 20 64 61 74 61 20 69 73 20   /* The data is 
19450 64 69 73 74 72 69 62 75 74 65 64 20 6f 76 65 72  distributed over
19460 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67   two or more pag
19470 65 73 2e 20 43 6f 70 79 20 69 74 20 69 6e 74 6f  es. Copy it into
19480 20 74 68 65 0a 20 20 20 20 2a 2a 20 46 74 73 35   the.    ** Fts5
19490 49 74 65 72 2e 70 6f 73 6c 69 73 74 20 62 75 66  Iter.poslist buf
194a0 66 65 72 20 61 6e 64 20 74 68 65 6e 20 73 65 74  fer and then set
194b0 20 74 68 65 20 6f 75 74 70 75 74 20 70 6f 69 6e   the output poin
194c0 74 65 72 20 74 6f 20 70 6f 69 6e 74 0a 20 20 20  ter to point.   
194d0 20 2a 2a 20 74 6f 20 74 68 69 73 20 62 75 66 66   ** to this buff
194e0 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66 74 73 35  er.  */.    fts5
194f0 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65  BufferZero(&pIte
19500 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
19510 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c   fts5SegiterPosl
19520 69 73 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  ist(pIter->pInde
19530 78 2c 20 70 53 65 67 2c 20 70 43 6f 6c 73 65 74  x, pSeg, pColset
19540 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  , &pIter->poslis
19550 74 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62  t);.    pIter->b
19560 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65  ase.pData = pIte
19570 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20  r->poslist.p;.  
19580 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44    pIter->base.nD
19590 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73  ata = pIter->pos
195a0 6c 69 73 74 2e 6e 3b 0a 20 20 7d 0a 7d 0a 0a 73  list.n;.  }.}..s
195b0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
195c0 74 65 72 53 65 74 4f 75 74 70 75 74 43 62 28 69  terSetOutputCb(i
195d0 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 49 74 65  nt *pRc, Fts5Ite
195e0 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
195f0 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
19600 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66   ){.    Fts5Conf
19610 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 49  ig *pConfig = pI
19620 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f  ter->pIndex->pCo
19630 6e 66 69 67 3b 0a 20 20 20 20 69 66 28 20 70 43  nfig;.    if( pC
19640 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
19650 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
19660 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
19670 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66  >xSetOutputs = f
19680 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
19690 73 5f 4e 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20  s_None;.    }.. 
196a0 20 20 20 65 6c 73 65 20 69 66 28 20 70 49 74 65     else if( pIte
196b0 72 2d 3e 70 43 6f 6c 73 65 74 3d 3d 30 20 29 7b  r->pColset==0 ){
196c0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53  .      pIter->xS
196d0 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35  etOutputs = fts5
196e0 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e  IterSetOutputs_N
196f0 6f 63 6f 6c 73 65 74 3b 0a 20 20 20 20 7d 0a 0a  ocolset;.    }..
19700 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 49 74      else if( pIt
19710 65 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f  er->pColset->nCo
19720 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49  l==0 ){.      pI
19730 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73  ter->xSetOutputs
19740 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75   = fts5IterSetOu
19750 74 70 75 74 73 5f 5a 65 72 6f 43 6f 6c 73 65 74  tputs_ZeroColset
19760 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c 73  ;.    }..    els
19770 65 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65  e if( pConfig->e
19780 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
19790 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  AIL_FULL ){.    
197a0 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74    pIter->xSetOut
197b0 70 75 74 73 20 3d 20 66 74 73 35 49 74 65 72 53  puts = fts5IterS
197c0 65 74 4f 75 74 70 75 74 73 5f 46 75 6c 6c 3b 0a  etOutputs_Full;.
197d0 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65 7b      }..    else{
197e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
197f0 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d  Config->eDetail=
19800 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 43 4f 4c  =FTS5_DETAIL_COL
19810 55 4d 4e 53 20 29 3b 0a 20 20 20 20 20 20 69 66  UMNS );.      if
19820 28 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3c  ( pConfig->nCol<
19830 3d 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  =100 ){.        
19840 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75  pIter->xSetOutpu
19850 74 73 20 3d 20 66 74 73 35 49 74 65 72 53 65 74  ts = fts5IterSet
19860 4f 75 74 70 75 74 73 5f 43 6f 6c 31 30 30 3b 0a  Outputs_Col100;.
19870 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
19880 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 70 52  ts5BufferSize(pR
19890 63 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  c, &pIter->posli
198a0 73 74 2c 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f  st, pConfig->nCo
198b0 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  l);.      }else{
198c0 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
198d0 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74  xSetOutputs = ft
198e0 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
198f0 5f 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _Col;.      }.  
19900 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a    }.  }.}.../*.*
19910 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
19920 20 46 74 73 35 49 74 65 72 20 6f 62 6a 65 63 74   Fts5Iter object
19930 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
19940 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 75  object will be u
19950 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
19960 68 72 6f 75 67 68 20 64 61 74 61 20 69 6e 20 73  hrough data in s
19970 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74  tructure pStruct
19980 2e 0a 2a 2a 20 49 66 20 69 4c 65 76 65 6c 20 69  ..** If iLevel i
19990 73 20 2d 76 65 2c 20 74 68 65 6e 20 61 6c 6c 20  s -ve, then all 
199a0 64 61 74 61 20 69 6e 20 61 6c 6c 20 73 65 67 6d  data in all segm
199b0 65 6e 74 73 20 69 73 20 6d 65 72 67 65 64 2e 20  ents is merged. 
199c0 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c 0a 2a 2a  Or, if iLevel.**
199d0 20 69 73 20 7a 65 72 6f 20 6f 72 20 67 72 65 61   is zero or grea
199e0 74 65 72 2c 20 64 61 74 61 20 66 72 6f 6d 20 74  ter, data from t
199f0 68 65 20 66 69 72 73 74 20 6e 53 65 67 6d 65 6e  he first nSegmen
19a00 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65  t segments on le
19a10 76 65 6c 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73  vel iLevel.** is
19a20 20 6d 65 72 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   merged..**.** T
19a30 68 65 20 69 74 65 72 61 74 6f 72 20 69 6e 69 74  he iterator init
19a40 69 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ially points to 
19a50 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 2f 72  the first term/r
19a60 6f 77 69 64 20 65 6e 74 72 79 20 69 6e 20 74 68  owid entry in th
19a70 65 20 0a 2a 2a 20 69 74 65 72 61 74 65 64 20 64  e .** iterated d
19a80 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ata..*/.static v
19a90 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
19aa0 72 4e 65 77 28 0a 20 20 46 74 73 35 49 6e 64 65  rNew(.  Fts5Inde
19ab0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
19ac0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
19ad0 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61  backend to itera
19ae0 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46  te within */.  F
19af0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
19b00 74 72 75 63 74 2c 20 20 20 20 20 20 20 20 20 2f  truct,         /
19b10 2a 20 53 74 72 75 63 74 75 72 65 20 6f 66 20 73  * Structure of s
19b20 70 65 63 69 66 69 63 20 69 6e 64 65 78 20 2a 2f  pecific index */
19b30 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
19b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b50 20 20 20 2f 2a 20 46 54 53 35 49 4e 44 45 58 5f     /* FTS5INDEX_
19b60 51 55 45 52 59 5f 58 58 58 20 66 6c 61 67 73 20  QUERY_XXX flags 
19b70 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  */.  Fts5Colset 
19b80 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20  *pColset,       
19b90 20 20 20 20 20 2f 2a 20 43 6f 6c 73 65 74 20 74       /* Colset t
19ba0 6f 20 66 69 6c 74 65 72 20 6f 6e 20 28 6f 72 20  o filter on (or 
19bb0 4e 55 4c 4c 29 20 2a 2f 0a 20 20 63 6f 6e 73 74  NULL) */.  const
19bc0 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
19bd0 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65  nTerm,     /* Te
19be0 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f  rm to seek to (o
19bf0 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69  r NULL/0) */.  i
19c00 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
19c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19c20 2a 20 4c 65 76 65 6c 20 74 6f 20 69 74 65 72 61  * Level to itera
19c30 74 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20  te (-1 for all) 
19c40 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  */.  int nSegmen
19c50 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
19c60 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19c70 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65  f segments to me
19c80 72 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20  rge (iLevel>=0) 
19c90 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a 2a  */.  Fts5Iter **
19ca0 70 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  ppOut           
19cb0 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65       /* New obje
19cc0 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ct */.){.  int n
19cd0 53 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Seg = 0;        
19ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19cf0 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 2d  mber of segment-
19d00 69 74 65 72 73 20 69 6e 20 75 73 65 20 2a 2f 0a  iters in use */.
19d10 20 20 69 6e 74 20 69 49 74 65 72 20 3d 20 30 3b    int iIter = 0;
19d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d30 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 53    /* */.  int iS
19d40 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
19d50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
19d60 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
19d70 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f  ough segments */
19d80 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
19d90 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46  Level *pLvl;.  F
19da0 74 73 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a  ts5Iter *pNew;..
19db0 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
19dc0 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30 29  ==0 && nTerm==0)
19dd0 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b 0a   || iLevel<0 );.
19de0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
19df0 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
19e00 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65 72 61   multi-seg-itera
19e10 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  tor. */.  if( p-
19e20 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
19e30 7b 0a 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c  {.    if( iLevel
19e40 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  <0 ){.      asse
19e50 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65  rt( pStruct->nSe
19e60 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63  gment==fts5Struc
19e70 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74  tureCountSegment
19e80 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20  s(pStruct) );.  
19e90 20 20 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75      nSeg = pStru
19ea0 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20  ct->nSegment;.  
19eb0 20 20 20 20 6e 53 65 67 20 2b 3d 20 28 70 2d 3e      nSeg += (p->
19ec0 70 48 61 73 68 20 3f 20 31 20 3a 20 30 29 3b 0a  pHash ? 1 : 0);.
19ed0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19ee0 20 6e 53 65 67 20 3d 20 4d 49 4e 28 70 53 74 72   nSeg = MIN(pStr
19ef0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76  uct->aLevel[iLev
19f00 65 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65 67 6d 65  el].nSeg, nSegme
19f10 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nt);.    }.  }. 
19f20 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77 20 3d   *ppOut = pNew =
19f30 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c   fts5MultiIterAl
19f40 6c 6f 63 28 70 2c 20 6e 53 65 67 29 3b 0a 20 20  loc(p, nSeg);.  
19f50 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
19f60 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e 62 52  turn;.  pNew->bR
19f70 65 76 20 3d 20 28 30 21 3d 28 66 6c 61 67 73 20  ev = (0!=(flags 
19f80 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
19f90 59 5f 44 45 53 43 29 29 3b 0a 20 20 70 4e 65 77  Y_DESC));.  pNew
19fa0 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 3d 20 28  ->bSkipEmpty = (
19fb0 30 21 3d 28 66 6c 61 67 73 20 26 20 46 54 53 35  0!=(flags & FTS5
19fc0 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b 49 50  INDEX_QUERY_SKIP
19fd0 45 4d 50 54 59 29 29 3b 0a 20 20 70 4e 65 77 2d  EMPTY));.  pNew-
19fe0 3e 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75  >pStruct = pStru
19ff0 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 43 6f 6c  ct;.  pNew->pCol
1a000 73 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20  set = pColset;. 
1a010 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1a020 66 28 70 53 74 72 75 63 74 29 3b 0a 20 20 69 66  f(pStruct);.  if
1a030 28 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  ( (flags & FTS5I
1a040 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54  NDEX_QUERY_NOOUT
1a050 50 55 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66  PUT)==0 ){.    f
1a060 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
1a070 43 62 28 26 70 2d 3e 72 63 2c 20 70 4e 65 77 29  Cb(&p->rc, pNew)
1a080 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
1a090 69 61 6c 69 7a 65 20 65 61 63 68 20 6f 66 20 74  ialize each of t
1a0a0 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 73 65 67  he component seg
1a0b0 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73 2e 20  ment iterators. 
1a0c0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  */.  if( p->rc==
1a0d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a0e0 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b   if( iLevel<0 ){
1a0f0 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
1a100 74 75 72 65 4c 65 76 65 6c 20 2a 70 45 6e 64 20  tureLevel *pEnd 
1a110 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
1a120 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  el[pStruct->nLev
1a130 65 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  el];.      if( p
1a140 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20 20 20 20  ->pHash ){.     
1a150 20 20 20 2f 2a 20 41 64 64 20 61 20 73 65 67 6d     /* Add a segm
1a160 65 6e 74 20 69 74 65 72 61 74 6f 72 20 66 6f 72  ent iterator for
1a170 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
1a180 74 65 6e 74 73 20 6f 66 20 74 68 65 20 68 61 73  tents of the has
1a190 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  h table. */.    
1a1a0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
1a1b0 2a 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e  *pIter = &pNew->
1a1c0 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20  aSeg[iIter++];. 
1a1d0 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
1a1e0 65 72 48 61 73 68 49 6e 69 74 28 70 2c 20 70 54  erHashInit(p, pT
1a1f0 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67  erm, nTerm, flag
1a200 73 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  s, pIter);.     
1a210 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 76   }.      for(pLv
1a220 6c 3d 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  l=&pStruct->aLev
1a230 65 6c 5b 30 5d 3b 20 70 4c 76 6c 3c 70 45 6e 64  el[0]; pLvl<pEnd
1a240 3b 20 70 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; pLvl++){.     
1a250 20 20 20 66 6f 72 28 69 53 65 67 3d 70 4c 76 6c     for(iSeg=pLvl
1a260 2d 3e 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d  ->nSeg-1; iSeg>=
1a270 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20  0; iSeg--){.    
1a280 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
1a290 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
1a2a0 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69   = &pLvl->aSeg[i
1a2b0 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Seg];.          
1a2c0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
1a2d0 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67  er = &pNew->aSeg
1a2e0 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20  [iIter++];.     
1a2f0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
1a300 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1a310 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74   fts5SegIterInit
1a320 28 70 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29  (p, pSeg, pIter)
1a330 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1a340 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  e{.            f
1a350 74 73 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e  ts5SegIterSeekIn
1a360 69 74 28 70 2c 20 70 54 65 72 6d 2c 20 6e 54 65  it(p, pTerm, nTe
1a370 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53 65 67 2c  rm, flags, pSeg,
1a380 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20   pIter);.       
1a390 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1a3a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1a3b0 7b 0a 20 20 20 20 20 20 70 4c 76 6c 20 3d 20 26  {.      pLvl = &
1a3c0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1a3d0 69 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 20 20 66  iLevel];.      f
1a3e0 6f 72 28 69 53 65 67 3d 6e 53 65 67 2d 31 3b 20  or(iSeg=nSeg-1; 
1a3f0 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29  iSeg>=0; iSeg--)
1a400 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  {.        fts5Se
1a410 67 49 74 65 72 49 6e 69 74 28 70 2c 20 26 70 4c  gIterInit(p, &pL
1a420 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2c 20  vl->aSeg[iSeg], 
1a430 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65  &pNew->aSeg[iIte
1a440 72 2b 2b 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r++]);.      }. 
1a450 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1a460 20 69 49 74 65 72 3d 3d 6e 53 65 67 20 29 3b 0a   iIter==nSeg );.
1a470 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1a480 20 61 62 6f 76 65 20 77 61 73 20 73 75 63 63 65   above was succe
1a490 73 73 66 75 6c 2c 20 65 61 63 68 20 63 6f 6d 70  ssful, each comp
1a4a0 6f 6e 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20  onent iterators 
1a4b0 6e 6f 77 20 70 6f 69 6e 74 73 20 0a 20 20 2a 2a  now points .  **
1a4c0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
1a4d0 74 72 79 20 69 6e 20 69 74 73 20 73 65 67 6d 65  try in its segme
1a4e0 6e 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  nt. In this case
1a4f0 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
1a500 0a 20 20 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61  .  ** aFirst[] a
1a510 72 72 61 79 2e 20 4f 72 2c 20 69 66 20 61 6e 20  rray. Or, if an 
1a520 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
1a530 65 64 2c 20 66 72 65 65 20 74 68 65 20 69 74 65  ed, free the ite
1a540 72 61 74 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65 63  rator.  ** objec
1a550 74 20 61 6e 64 20 73 65 74 20 74 68 65 20 6f 75  t and set the ou
1a560 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f  tput variable to
1a570 20 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28   NULL.  */.  if(
1a580 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1a590 4b 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 49 74  K ){.    for(iIt
1a5a0 65 72 3d 70 4e 65 77 2d 3e 6e 53 65 67 2d 31 3b  er=pNew->nSeg-1;
1a5b0 20 69 49 74 65 72 3e 30 3b 20 69 49 74 65 72 2d   iIter>0; iIter-
1a5c0 2d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 45  -){.      int iE
1a5d0 71 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 45  q;.      if( (iE
1a5e0 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  q = fts5MultiIte
1a5f0 72 44 6f 43 6f 6d 70 61 72 65 28 70 4e 65 77 2c  rDoCompare(pNew,
1a600 20 69 49 74 65 72 29 29 20 29 7b 0a 20 20 20 20   iIter)) ){.    
1a610 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
1a620 2a 70 53 65 67 20 3d 20 26 70 4e 65 77 2d 3e 61  *pSeg = &pNew->a
1a630 53 65 67 5b 69 45 71 5d 3b 0a 20 20 20 20 20 20  Seg[iEq];.      
1a640 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1a650 49 54 45 5f 4f 4b 20 29 20 70 53 65 67 2d 3e 78  ITE_OK ) pSeg->x
1a660 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29  Next(p, pSeg, 0)
1a670 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  ;.        fts5Mu
1a680 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28  ltiIterAdvanced(
1a690 70 2c 20 70 4e 65 77 2c 20 69 45 71 2c 20 69 49  p, pNew, iEq, iI
1a6a0 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
1a6b0 20 20 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74    }.    fts5Mult
1a6c0 69 49 74 65 72 53 65 74 45 6f 66 28 70 4e 65 77  iIterSetEof(pNew
1a6d0 29 3b 0a 20 20 20 20 66 74 73 35 41 73 73 65 72  );.    fts5Asser
1a6e0 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28  tMultiIterSetup(
1a6f0 70 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69  p, pNew);..    i
1a700 66 28 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d  f( pNew->bSkipEm
1a710 70 74 79 20 26 26 20 66 74 73 35 4d 75 6c 74 69  pty && fts5Multi
1a720 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70  IterIsEmpty(p, p
1a730 4e 65 77 29 20 29 7b 0a 20 20 20 20 20 20 66 74  New) ){.      ft
1a740 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
1a750 70 2c 20 70 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  p, pNew, 0, 0);.
1a760 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e      }else if( pN
1a770 65 77 2d 3e 62 61 73 65 2e 62 45 6f 66 3d 3d 30  ew->base.bEof==0
1a780 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65   ){.      Fts5Se
1a790 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
1a7a0 4e 65 77 2d 3e 61 53 65 67 5b 70 4e 65 77 2d 3e  New->aSeg[pNew->
1a7b0 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
1a7c0 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 78  ];.      pNew->x
1a7d0 53 65 74 4f 75 74 70 75 74 73 28 70 4e 65 77 2c  SetOutputs(pNew,
1a7e0 20 70 53 65 67 29 3b 0a 20 20 20 20 7d 0a 0a 20   pSeg);.    }.. 
1a7f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
1a800 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 4e  MultiIterFree(pN
1a810 65 77 29 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20  ew);.    *ppOut 
1a820 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
1a830 2a 20 43 72 65 61 74 65 20 61 6e 20 46 74 73 35  * Create an Fts5
1a840 49 74 65 72 20 74 68 61 74 20 69 74 65 72 61 74  Iter that iterat
1a850 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 64  es through the d
1a860 6f 63 6c 69 73 74 20 70 72 6f 76 69 64 65 64 0a  oclist provided.
1a870 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ** as the second
1a880 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
1a890 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
1a8a0 6c 74 69 49 74 65 72 4e 65 77 32 28 0a 20 20 46  ltiIterNew2(.  F
1a8b0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a8d0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74  * FTS5 backend t
1a8e0 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
1a8f0 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a   */.  Fts5Data *
1a900 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  pData,          
1a910 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74        /* Doclist
1a920 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
1a930 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65  ugh */.  int bDe
1a940 73 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sc,             
1a950 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1a960 20 66 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20   for descending 
1a970 72 6f 77 69 64 20 6f 72 64 65 72 20 2a 2f 0a 20  rowid order */. 
1a980 20 46 74 73 35 49 74 65 72 20 2a 2a 70 70 4f 75   Fts5Iter **ppOu
1a990 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1a9a0 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a   /* New object *
1a9b0 2f 0a 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20  /.){.  Fts5Iter 
1a9c0 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20  *pNew;.  pNew = 
1a9d0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c  fts5MultiIterAll
1a9e0 6f 63 28 70 2c 20 32 29 3b 0a 20 20 69 66 28 20  oc(p, 2);.  if( 
1a9f0 70 4e 65 77 20 29 7b 0a 20 20 20 20 46 74 73 35  pNew ){.    Fts5
1aa00 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d  SegIter *pIter =
1aa10 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 31 5d 3b   &pNew->aSeg[1];
1aa20 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61  ..    pIter->fla
1aa30 67 73 20 3d 20 46 54 53 35 5f 53 45 47 49 54 45  gs = FTS5_SEGITE
1aa40 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69  R_ONETERM;.    i
1aa50 66 28 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66  f( pData->szLeaf
1aa60 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  >0 ){.      pIte
1aa70 72 2d 3e 70 4c 65 61 66 20 3d 20 70 44 61 74 61  r->pLeaf = pData
1aa80 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  ;.      pIter->i
1aa90 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73  LeafOffset = fts
1aaa0 35 47 65 74 56 61 72 69 6e 74 28 70 44 61 74 61  5GetVarint(pData
1aab0 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ->p, (u64*)&pIte
1aac0 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
1aad0 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
1aae0 6f 63 6c 69 73 74 20 3d 20 70 44 61 74 61 2d 3e  oclist = pData->
1aaf0 6e 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  nn;.      pNew->
1ab00 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
1ab10 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
1ab20 62 44 65 73 63 20 29 7b 0a 20 20 20 20 20 20 20  bDesc ){.       
1ab30 20 70 4e 65 77 2d 3e 62 52 65 76 20 3d 20 31 3b   pNew->bRev = 1;
1ab40 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
1ab50 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
1ab60 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20  GITER_REVERSE;. 
1ab70 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
1ab80 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
1ab90 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
1aba0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1abb0 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
1abc0 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
1abd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1abe0 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Data = 0;.    }e
1abf0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
1ac00 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20 31 3b 0a  >base.bEof = 1;.
1ac10 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 65      }.    fts5Se
1ac20 67 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20  gIterSetNext(p, 
1ac30 70 49 74 65 72 29 3b 0a 0a 20 20 20 20 2a 70 70  pIter);..    *pp
1ac40 4f 75 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  Out = pNew;.  }.
1ac50 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
1ac60 73 65 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a  se(pData);.}../*
1ac70 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1ac80 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
1ac90 69 73 20 61 74 20 45 4f 46 20 6f 72 20 69 66 20  is at EOF or if 
1aca0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  an error has occ
1acb0 75 72 72 65 64 2e 20 0a 2a 2a 20 46 61 6c 73 65  urred. .** False
1acc0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
1acd0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75  tatic int fts5Mu
1ace0 6c 74 69 49 74 65 72 45 6f 66 28 46 74 73 35 49  ltiIterEof(Fts5I
1acf0 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49 74 65  ndex *p, Fts5Ite
1ad00 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73  r *pIter){.  ass
1ad10 65 72 74 28 20 70 2d 3e 72 63 20 0a 20 20 20 20  ert( p->rc .    
1ad20 20 20 7c 7c 20 28 70 49 74 65 72 2d 3e 61 53 65    || (pIter->aSe
1ad30 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
1ad40 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65  [1].iFirst ].pLe
1ad50 61 66 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62  af==0)==pIter->b
1ad60 61 73 65 2e 62 45 6f 66 20 0a 20 20 29 3b 0a 20  ase.bEof .  );. 
1ad70 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c   return (p->rc |
1ad80 7c 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45  | pIter->base.bE
1ad90 6f 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  of);.}../*.** Re
1ada0 74 75 72 6e 20 74 68 65 20 72 6f 77 69 64 20 6f  turn the rowid o
1adb0 66 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  f the entry that
1adc0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 63 75   the iterator cu
1add0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 0a 2a  rrently points.*
1ade0 2a 20 74 6f 2e 20 49 66 20 74 68 65 20 69 74 65  * to. If the ite
1adf0 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20  rator points to 
1ae00 45 4f 46 20 77 68 65 6e 20 74 68 69 73 20 66 75  EOF when this fu
1ae10 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1ae20 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
1ae30 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  are undefined..*
1ae40 2f 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73  /.static i64 fts
1ae50 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28  5MultiIterRowid(
1ae60 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29  Fts5Iter *pIter)
1ae70 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  {.  assert( pIte
1ae80 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
1ae90 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
1aea0 20 5d 2e 70 4c 65 61 66 20 29 3b 0a 20 20 72 65   ].pLeaf );.  re
1aeb0 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 53 65 67  turn pIter->aSeg
1aec0 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
1aed0 31 5d 2e 69 46 69 72 73 74 20 5d 2e 69 52 6f 77  1].iFirst ].iRow
1aee0 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  id;.}../*.** Mov
1aef0 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74  e the iterator t
1af00 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
1af10 20 61 74 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67   at or following
1af20 20 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74   iMatch..*/.stat
1af30 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
1af40 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20  iIterNextFrom(. 
1af50 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1af60 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65    Fts5Iter *pIte
1af70 72 2c 20 0a 20 20 69 36 34 20 69 4d 61 74 63 68  r, .  i64 iMatch
1af80 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20 31 20 29  .){.  while( 1 )
1af90 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  {.    i64 iRowid
1afa0 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  ;.    fts5MultiI
1afb0 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
1afc0 2c 20 31 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20  , 1, iMatch);.  
1afd0 20 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49    if( fts5MultiI
1afe0 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29  terEof(p, pIter)
1aff0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 52   ) break;.    iR
1b000 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69  owid = fts5Multi
1b010 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29  IterRowid(pIter)
1b020 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
1b030 3e 62 52 65 76 3d 3d 30 20 26 26 20 69 52 6f 77  >bRev==0 && iRow
1b040 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65  id>=iMatch ) bre
1b050 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ak;.    if( pIte
1b060 72 2d 3e 62 52 65 76 21 3d 30 20 26 26 20 69 52  r->bRev!=0 && iR
1b070 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62  owid<=iMatch ) b
1b080 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  reak;.  }.}../*.
1b090 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
1b0a0 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
1b0b0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
1b0c0 65 72 6d 20 61 73 73 6f 63 69 61 74 65 64 20 77  erm associated w
1b0d0 69 74 68 20 74 68 65 20 0a 2a 2a 20 65 6e 74 72  ith the .** entr
1b0e0 79 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61  y that the itera
1b0f0 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  tor currently po
1b100 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  ints to..*/.stat
1b110 69 63 20 63 6f 6e 73 74 20 75 38 20 2a 66 74 73  ic const u8 *fts
1b120 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 46  5MultiIterTerm(F
1b130 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20  ts5Iter *pIter, 
1b140 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35  int *pn){.  Fts5
1b150 53 65 67 49 74 65 72 20 2a 70 20 3d 20 26 70 49  SegIter *p = &pI
1b160 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
1b170 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
1b180 73 74 20 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d  st ];.  *pn = p-
1b190 3e 74 65 72 6d 2e 6e 3b 0a 20 20 72 65 74 75 72  >term.n;.  retur
1b1a0 6e 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a  n p->term.p;.}..
1b1b0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
1b1c0 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64 20   new segment-id 
1b1d0 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75 72  for the structur
1b1e0 65 20 70 53 74 72 75 63 74 2e 20 54 68 65 20 6e  e pStruct. The n
1b1f0 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 69 64  ew segment.** id
1b200 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
1b210 20 31 20 61 6e 64 20 36 35 33 33 35 20 69 6e 63   1 and 65335 inc
1b220 6c 75 73 69 76 65 2c 20 61 6e 64 20 6d 75 73 74  lusive, and must
1b230 20 6e 6f 74 20 62 65 20 75 73 65 64 20 62 79 20   not be used by 
1b240 0a 2a 2a 20 61 6e 79 20 63 75 72 72 65 6e 74 6c  .** any currentl
1b250 79 20 65 78 69 73 74 69 6e 67 20 73 65 67 6d 65  y existing segme
1b260 6e 74 2e 20 49 66 20 61 20 66 72 65 65 20 73 65  nt. If a free se
1b270 67 6d 65 6e 74 20 69 64 20 63 61 6e 6e 6f 74 20  gment id cannot 
1b280 62 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c  be found,.** SQL
1b290 49 54 45 5f 46 55 4c 4c 20 69 73 20 72 65 74 75  ITE_FULL is retu
1b2a0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rned..**.** If a
1b2b0 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
1b2c0 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
1b2d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1b2e0 20 6e 6f 2d 6f 70 2e 20 30 20 69 73 20 0a 2a 2a   no-op. 0 is .**
1b2f0 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68 69   returned in thi
1b300 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  s case..*/.stati
1b310 63 20 69 6e 74 20 66 74 73 35 41 6c 6c 6f 63 61  c int fts5Alloca
1b320 74 65 53 65 67 69 64 28 46 74 73 35 49 6e 64 65  teSegid(Fts5Inde
1b330 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74  x *p, Fts5Struct
1b340 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
1b350 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 30 3b   int iSegid = 0;
1b360 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
1b370 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b380 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65  if( pStruct->nSe
1b390 67 6d 65 6e 74 3e 3d 46 54 53 35 5f 4d 41 58 5f  gment>=FTS5_MAX_
1b3a0 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20 20 20 20  SEGMENT ){.     
1b3b0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
1b3c0 46 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  FULL;.    }else{
1b3d0 0a 20 20 20 20 20 20 2f 2a 20 46 54 53 35 5f 4d  .      /* FTS5_M
1b3e0 41 58 5f 53 45 47 4d 45 4e 54 20 69 73 20 63 75  AX_SEGMENT is cu
1b3f0 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
1b400 61 73 20 32 30 30 30 2e 20 53 6f 20 74 68 65 20  as 2000. So the 
1b410 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20  following.      
1b420 2a 2a 20 61 72 72 61 79 20 69 73 20 36 33 20 65  ** array is 63 e
1b430 6c 65 6d 65 6e 74 73 2c 20 6f 72 20 32 35 32 20  lements, or 252 
1b440 62 79 74 65 73 2c 20 69 6e 20 73 69 7a 65 2e 20  bytes, in size. 
1b450 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 61 55   */.      u32 aU
1b460 73 65 64 5b 28 46 54 53 35 5f 4d 41 58 5f 53 45  sed[(FTS5_MAX_SE
1b470 47 4d 45 4e 54 2b 33 31 29 20 2f 20 33 32 5d 3b  GMENT+31) / 32];
1b480 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c  .      int iLvl,
1b490 20 69 53 65 67 3b 0a 20 20 20 20 20 20 69 6e 74   iSeg;.      int
1b4a0 20 69 3b 0a 20 20 20 20 20 20 75 33 32 20 6d 61   i;.      u32 ma
1b4b0 73 6b 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  sk;.      memset
1b4c0 28 61 55 73 65 64 2c 20 30 2c 20 73 69 7a 65 6f  (aUsed, 0, sizeo
1b4d0 66 28 61 55 73 65 64 29 29 3b 0a 20 20 20 20 20  f(aUsed));.     
1b4e0 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
1b4f0 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
1b500 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
1b510 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
1b520 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c  iSeg<pStruct->aL
1b530 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
1b540 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
1b550 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53      int iId = pS
1b560 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
1b570 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e 69  vl].aSeg[iSeg].i
1b580 53 65 67 69 64 3b 0a 20 20 20 20 20 20 20 20 20  Segid;.         
1b590 20 69 66 28 20 69 49 64 3c 3d 46 54 53 35 5f 4d   if( iId<=FTS5_M
1b5a0 41 58 5f 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20  AX_SEGMENT ){.  
1b5b0 20 20 20 20 20 20 20 20 20 20 61 55 73 65 64 5b            aUsed[
1b5c0 28 69 49 64 2d 31 29 20 2f 20 33 32 5d 20 7c 3d  (iId-1) / 32] |=
1b5d0 20 28 75 33 32 29 31 20 3c 3c 20 28 28 69 49 64   (u32)1 << ((iId
1b5e0 2d 31 29 20 25 20 33 32 29 3b 0a 20 20 20 20 20  -1) % 32);.     
1b5f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1b600 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1b610 66 6f 72 28 69 3d 30 3b 20 61 55 73 65 64 5b 69  for(i=0; aUsed[i
1b620 5d 3d 3d 30 78 46 46 46 46 46 46 46 46 3b 20 69  ]==0xFFFFFFFF; i
1b630 2b 2b 29 3b 0a 20 20 20 20 20 20 6d 61 73 6b 20  ++);.      mask 
1b640 3d 20 61 55 73 65 64 5b 69 5d 3b 0a 20 20 20 20  = aUsed[i];.    
1b650 20 20 66 6f 72 28 69 53 65 67 69 64 3d 30 3b 20    for(iSegid=0; 
1b660 6d 61 73 6b 20 26 20 28 28 75 33 32 29 31 20 3c  mask & ((u32)1 <
1b670 3c 20 69 53 65 67 69 64 29 3b 20 69 53 65 67 69  < iSegid); iSegi
1b680 64 2b 2b 29 3b 0a 20 20 20 20 20 20 69 53 65 67  d++);.      iSeg
1b690 69 64 20 2b 3d 20 31 20 2b 20 69 2a 33 32 3b 0a  id += 1 + i*32;.
1b6a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1b6b0 45 42 55 47 0a 20 20 20 20 20 20 66 6f 72 28 69  EBUG.      for(i
1b6c0 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72  Lvl=0; iLvl<pStr
1b6d0 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
1b6e0 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  l++){.        fo
1b6f0 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70  r(iSeg=0; iSeg<p
1b700 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1b710 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b  Lvl].nSeg; iSeg+
1b720 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  +){.          as
1b730 73 65 72 74 5f 6e 63 28 20 69 53 65 67 69 64 21  sert_nc( iSegid!
1b740 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  =pStruct->aLevel
1b750 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67  [iLvl].aSeg[iSeg
1b760 5d 2e 69 53 65 67 69 64 20 29 3b 0a 20 20 20 20  ].iSegid );.    
1b770 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1b780 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69      assert_nc( i
1b790 53 65 67 69 64 3e 30 20 26 26 20 69 53 65 67 69  Segid>0 && iSegi
1b7a0 64 3c 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d  d<=FTS5_MAX_SEGM
1b7b0 45 4e 54 20 29 3b 0a 0a 20 20 20 20 20 20 7b 0a  ENT );..      {.
1b7c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1b7d0 73 74 6d 74 20 2a 70 49 64 78 53 65 6c 65 63 74  stmt *pIdxSelect
1b7e0 20 3d 20 66 74 73 35 49 64 78 53 65 6c 65 63 74   = fts5IdxSelect
1b7f0 53 74 6d 74 28 70 29 3b 0a 20 20 20 20 20 20 20  Stmt(p);.       
1b800 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1b810 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1b820 20 20 20 75 38 20 61 42 6c 6f 62 5b 32 5d 20 3d     u8 aBlob[2] =
1b830 20 7b 30 78 66 66 2c 20 30 78 66 66 7d 3b 0a 20   {0xff, 0xff};. 
1b840 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b850 5f 62 69 6e 64 5f 69 6e 74 28 70 49 64 78 53 65  _bind_int(pIdxSe
1b860 6c 65 63 74 2c 20 31 2c 20 69 53 65 67 69 64 29  lect, 1, iSegid)
1b870 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1b880 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 49  te3_bind_blob(pI
1b890 64 78 53 65 6c 65 63 74 2c 20 32 2c 20 61 42 6c  dxSelect, 2, aBl
1b8a0 6f 62 2c 20 32 2c 20 53 51 4c 49 54 45 5f 53 54  ob, 2, SQLITE_ST
1b8b0 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  ATIC);.         
1b8c0 20 61 73 73 65 72 74 5f 6e 63 28 20 73 71 6c 69   assert_nc( sqli
1b8d0 74 65 33 5f 73 74 65 70 28 70 49 64 78 53 65 6c  te3_step(pIdxSel
1b8e0 65 63 74 29 21 3d 53 51 4c 49 54 45 5f 52 4f 57  ect)!=SQLITE_ROW
1b8f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   );.          p-
1b900 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
1b910 73 65 74 28 70 49 64 78 53 65 6c 65 63 74 29 3b  set(pIdxSelect);
1b920 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1b930 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 49 64  e3_bind_null(pId
1b940 78 53 65 6c 65 63 74 2c 20 32 29 3b 0a 20 20 20  xSelect, 2);.   
1b950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
1b960 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
1b970 0a 20 20 72 65 74 75 72 6e 20 69 53 65 67 69 64  .  return iSegid
1b980 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61  ;.}../*.** Disca
1b990 72 64 20 61 6c 6c 20 64 61 74 61 20 63 75 72 72  rd all data curr
1b9a0 65 6e 74 6c 79 20 63 61 63 68 65 64 20 69 6e 20  ently cached in 
1b9b0 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65 73 2e  the hash-tables.
1b9c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b9d0 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64  fts5IndexDiscard
1b9e0 44 61 74 61 28 46 74 73 35 49 6e 64 65 78 20 2a  Data(Fts5Index *
1b9f0 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
1ba00 3e 70 48 61 73 68 20 7c 7c 20 70 2d 3e 6e 50 65  >pHash || p->nPe
1ba10 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b 0a  ndingData==0 );.
1ba20 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68 20 29    if( p->pHash )
1ba30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
1ba40 35 48 61 73 68 43 6c 65 61 72 28 70 2d 3e 70 48  5HashClear(p->pH
1ba50 61 73 68 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65  ash);.    p->nPe
1ba60 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20  ndingData = 0;. 
1ba70 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
1ba80 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
1ba90 68 65 20 70 72 65 66 69 78 2c 20 69 6e 20 62 79  he prefix, in by
1baa0 74 65 73 2c 20 74 68 61 74 20 62 75 66 66 65 72  tes, that buffer
1bab0 20 0a 2a 2a 20 28 70 4e 65 77 2f 3c 6c 65 6e 67   .** (pNew/<leng
1bac0 74 68 2d 75 6e 6b 6e 6f 77 6e 3e 29 20 73 68 61  th-unknown>) sha
1bad0 72 65 73 20 77 69 74 68 20 62 75 66 66 65 72 20  res with buffer 
1bae0 28 70 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a 2a 2a 0a  (pOld/nOld)..**.
1baf0 2a 2a 20 42 75 66 66 65 72 20 28 70 4e 65 77 2f  ** Buffer (pNew/
1bb00 3c 6c 65 6e 67 74 68 2d 75 6e 6b 6e 6f 77 6e 3e  <length-unknown>
1bb10 29 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  ) is guaranteed 
1bb20 74 6f 20 62 65 20 67 72 65 61 74 65 72 20 0a 2a  to be greater .*
1bb30 2a 20 74 68 61 6e 20 62 75 66 66 65 72 20 28 70  * than buffer (p
1bb40 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a 2a 2f 0a 73 74  Old/nOld)..*/.st
1bb50 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 72 65  atic int fts5Pre
1bb60 66 69 78 43 6f 6d 70 72 65 73 73 28 69 6e 74 20  fixCompress(int 
1bb70 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a  nOld, const u8 *
1bb80 70 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a  pOld, const u8 *
1bb90 70 4e 65 77 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pNew){.  int i;.
1bba0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
1bbb0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
1bbc0 20 70 4f 6c 64 5b 69 5d 21 3d 70 4e 65 77 5b 69   pOld[i]!=pNew[i
1bbd0 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ] ) break;.  }. 
1bbe0 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 73 74   return i;.}..st
1bbf0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1bc00 69 74 65 44 6c 69 64 78 43 6c 65 61 72 28 0a 20  iteDlidxClear(. 
1bc10 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1bc20 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1bc30 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20  *pWriter,.  int 
1bc40 62 46 6c 75 73 68 20 20 20 20 20 20 20 20 20 20  bFlush          
1bc50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1bc60 66 20 74 72 75 65 2c 20 77 72 69 74 65 20 64 6c  f true, write dl
1bc70 69 64 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 29  idx to disk */.)
1bc80 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
1bc90 65 72 74 28 20 62 46 6c 75 73 68 3d 3d 30 20 7c  ert( bFlush==0 |
1bca0 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69  | (pWriter->nDli
1bcb0 64 78 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d  dx>0 && pWriter-
1bcc0 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e  >aDlidx[0].buf.n
1bcd0 3e 30 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  >0) );.  for(i=0
1bce0 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c  ; i<pWriter->nDl
1bcf0 69 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  idx; i++){.    F
1bd00 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a  ts5DlidxWriter *
1bd10 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65  pDlidx = &pWrite
1bd20 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20  r->aDlidx[i];.  
1bd30 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75    if( pDlidx->bu
1bd40 66 2e 6e 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  f.n==0 ) break;.
1bd50 20 20 20 20 69 66 28 20 62 46 6c 75 73 68 20 29      if( bFlush )
1bd60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1bd70 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 21 3d 30 20  pDlidx->pgno!=0 
1bd80 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  );.      fts5Dat
1bd90 61 57 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20  aWrite(p, .     
1bda0 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f       FTS5_DLIDX_
1bdb0 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69  ROWID(pWriter->i
1bdc0 53 65 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78  Segid, i, pDlidx
1bdd0 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20  ->pgno),.       
1bde0 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70     pDlidx->buf.p
1bdf0 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a  , pDlidx->buf.n.
1be00 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
1be10 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1be20 66 66 65 72 5a 65 72 6f 28 26 70 44 6c 69 64 78  fferZero(&pDlidx
1be30 2d 3e 62 75 66 29 3b 0a 20 20 20 20 70 44 6c 69  ->buf);.    pDli
1be40 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d  dx->bPrevValid =
1be50 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
1be60 20 47 72 6f 77 20 74 68 65 20 70 57 72 69 74 65   Grow the pWrite
1be70 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 61 72 72 61  r->aDlidx[] arra
1be80 79 20 74 6f 20 61 74 20 6c 65 61 73 74 20 6e 4c  y to at least nL
1be90 76 6c 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 73  vl elements in s
1bea0 69 7a 65 2e 0a 2a 2a 20 41 6e 79 20 6e 65 77 20  ize..** Any new 
1beb0 61 72 72 61 79 20 65 6c 65 6d 65 6e 74 73 20 61  array elements a
1bec0 72 65 20 7a 65 72 6f 65 64 20 62 65 66 6f 72 65  re zeroed before
1bed0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
1bee0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 57 72  tatic int fts5Wr
1bef0 69 74 65 44 6c 69 64 78 47 72 6f 77 28 0a 20 20  iteDlidxGrow(.  
1bf00 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20  Fts5Index *p,.  
1bf10 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1bf20 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 4c  Writer,.  int nL
1bf30 76 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  vl.){.  if( p->r
1bf40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1bf50 6e 4c 76 6c 3e 3d 70 57 72 69 74 65 72 2d 3e 6e  nLvl>=pWriter->n
1bf60 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73  Dlidx ){.    Fts
1bf70 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44  5DlidxWriter *aD
1bf80 6c 69 64 78 20 3d 20 28 46 74 73 35 44 6c 69 64  lidx = (Fts5Dlid
1bf90 78 57 72 69 74 65 72 2a 29 73 71 6c 69 74 65 33  xWriter*)sqlite3
1bfa0 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  _realloc(.      
1bfb0 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64    pWriter->aDlid
1bfc0 78 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  x, sizeof(Fts5Dl
1bfd0 69 64 78 57 72 69 74 65 72 29 20 2a 20 6e 4c 76  idxWriter) * nLv
1bfe0 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  l.    );.    if(
1bff0 20 61 44 6c 69 64 78 3d 3d 30 20 29 7b 0a 20 20   aDlidx==0 ){.  
1c000 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
1c010 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
1c020 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
1c030 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
1c040 73 35 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a  s5DlidxWriter) *
1c050 20 28 6e 4c 76 6c 20 2d 20 70 57 72 69 74 65 72   (nLvl - pWriter
1c060 2d 3e 6e 44 6c 69 64 78 29 3b 0a 20 20 20 20 20  ->nDlidx);.     
1c070 20 6d 65 6d 73 65 74 28 26 61 44 6c 69 64 78 5b   memset(&aDlidx[
1c080 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 5d  pWriter->nDlidx]
1c090 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  , 0, nByte);.   
1c0a0 20 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69     pWriter->aDli
1c0b0 64 78 20 3d 20 61 44 6c 69 64 78 3b 0a 20 20 20  dx = aDlidx;.   
1c0c0 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69     pWriter->nDli
1c0d0 64 78 20 3d 20 6e 4c 76 6c 3b 0a 20 20 20 20 7d  dx = nLvl;.    }
1c0e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d  .  }.  return p-
1c0f0 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  >rc;.}../*.** If
1c100 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63   the current doc
1c110 6c 69 73 74 2d 69 6e 64 65 78 20 61 63 63 75 6d  list-index accum
1c120 75 6c 61 74 69 6e 67 20 69 6e 20 70 57 72 69 74  ulating in pWrit
1c130 65 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 69 73 20  er->aDlidx[] is 
1c140 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 2c  large.** enough,
1c150 20 66 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73   flush it to dis
1c160 6b 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20  k and return 1. 
1c170 4f 74 68 65 72 77 69 73 65 20 64 69 73 63 61 72  Otherwise discar
1c180 64 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e 0a  d it and return.
1c190 2a 2a 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  ** zero..*/.stat
1c1a0 69 63 20 69 6e 74 20 66 74 73 35 57 72 69 74 65  ic int fts5Write
1c1b0 46 6c 75 73 68 44 6c 69 64 78 28 46 74 73 35 49  FlushDlidx(Fts5I
1c1c0 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
1c1d0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
1c1e0 7b 0a 20 20 69 6e 74 20 62 46 6c 61 67 20 3d 20  {.  int bFlag = 
1c1f0 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  0;..  /* If ther
1c200 65 20 77 65 72 65 20 46 54 53 35 5f 4d 49 4e 5f  e were FTS5_MIN_
1c210 44 4c 49 44 58 5f 53 49 5a 45 20 6f 72 20 6d 6f  DLIDX_SIZE or mo
1c220 72 65 20 65 6d 70 74 79 20 6c 65 61 66 20 70 61  re empty leaf pa
1c230 67 65 73 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  ges written.  **
1c240 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1c250 2c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65  , also write the
1c260 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 74   doclist-index t
1c270 6f 20 64 69 73 6b 2e 20 20 2a 2f 0a 20 20 69 66  o disk.  */.  if
1c280 28 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  ( pWriter->aDlid
1c290 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 26 26 20  x[0].buf.n>0 && 
1c2a0 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e  pWriter->nEmpty>
1c2b0 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f  =FTS5_MIN_DLIDX_
1c2c0 53 49 5a 45 20 29 7b 0a 20 20 20 20 62 46 6c 61  SIZE ){.    bFla
1c2d0 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 74 73  g = 1;.  }.  fts
1c2e0 35 57 72 69 74 65 44 6c 69 64 78 43 6c 65 61 72  5WriteDlidxClear
1c2f0 28 70 2c 20 70 57 72 69 74 65 72 2c 20 62 46 6c  (p, pWriter, bFl
1c300 61 67 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  ag);.  pWriter->
1c310 6e 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20 72 65  nEmpty = 0;.  re
1c320 74 75 72 6e 20 62 46 6c 61 67 3b 0a 7d 0a 0a 2f  turn bFlag;.}../
1c330 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1c340 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
1c350 6e 65 76 65 72 20 70 72 6f 63 65 73 73 69 6e 67  never processing
1c360 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20   of the doclist 
1c370 66 6f 72 20 74 68 65 20 0a 2a 2a 20 6c 61 73 74  for the .** last
1c380 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 70 61   term on leaf pa
1c390 67 65 20 28 70 57 72 69 74 65 72 2d 3e 69 42 74  ge (pWriter->iBt
1c3a0 50 61 67 65 29 20 69 73 20 63 6f 6d 70 6c 65 74  Page) is complet
1c3b0 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ed. .**.** The d
1c3c0 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6f 72  oclist-index for
1c3d0 20 74 68 61 74 20 74 65 72 6d 20 69 73 20 63 75   that term is cu
1c3e0 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
1c3f0 6e 2d 6d 65 6d 6f 72 79 20 77 69 74 68 69 6e 20  n-memory within 
1c400 74 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 57 72  the.** Fts5SegWr
1c410 69 74 65 72 2e 61 44 6c 69 64 78 5b 5d 20 61 72  iter.aDlidx[] ar
1c420 72 61 79 2e 20 49 66 20 69 74 20 69 73 20 6c 61  ray. If it is la
1c430 72 67 65 20 65 6e 6f 75 67 68 2c 20 74 68 69 73  rge enough, this
1c440 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 77 72 69   function.** wri
1c450 74 65 73 20 69 74 20 6f 75 74 20 74 6f 20 64 69  tes it out to di
1c460 73 6b 2e 20 4f 72 2c 20 69 66 20 69 74 20 69 73  sk. Or, if it is
1c470 20 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 62 6f   too small to bo
1c480 74 68 65 72 20 77 69 74 68 2c 20 64 69 73 63 61  ther with, disca
1c490 72 64 73 0a 2a 2a 20 69 74 2e 0a 2a 2a 0a 2a 2a  rds.** it..**.**
1c4a0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 2e 62   Fts5SegWriter.b
1c4b0 74 74 65 72 6d 20 63 75 72 72 65 6e 74 6c 79 20  tterm currently 
1c4c0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 72  contains the fir
1c4d0 73 74 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20  st term on page 
1c4e0 69 42 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  iBtPage..*/.stat
1c4f0 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
1c500 65 46 6c 75 73 68 42 74 72 65 65 28 46 74 73 35  eFlushBtree(Fts5
1c510 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
1c520 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
1c530 29 7b 0a 20 20 69 6e 74 20 62 46 6c 61 67 3b 0a  ){.  int bFlag;.
1c540 0a 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74  .  assert( pWrit
1c550 65 72 2d 3e 69 42 74 50 61 67 65 20 7c 7c 20 70  er->iBtPage || p
1c560 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3d 3d  Writer->nEmpty==
1c570 30 20 29 3b 0a 20 20 69 66 28 20 70 57 72 69 74  0 );.  if( pWrit
1c580 65 72 2d 3e 69 42 74 50 61 67 65 3d 3d 30 20 29  er->iBtPage==0 )
1c590 20 72 65 74 75 72 6e 3b 0a 20 20 62 46 6c 61 67   return;.  bFlag
1c5a0 20 3d 20 66 74 73 35 57 72 69 74 65 46 6c 75 73   = fts5WriteFlus
1c5b0 68 44 6c 69 64 78 28 70 2c 20 70 57 72 69 74 65  hDlidx(p, pWrite
1c5c0 72 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63  r);..  if( p->rc
1c5d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c5e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1c5f0 20 3d 20 28 70 57 72 69 74 65 72 2d 3e 62 74 74   = (pWriter->btt
1c600 65 72 6d 2e 6e 3e 30 3f 28 63 6f 6e 73 74 20 63  erm.n>0?(const c
1c610 68 61 72 2a 29 70 57 72 69 74 65 72 2d 3e 62 74  har*)pWriter->bt
1c620 74 65 72 6d 2e 70 3a 22 22 29 3b 0a 20 20 20 20  term.p:"");.    
1c630 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1c640 20 77 61 73 20 61 6c 72 65 61 64 79 20 64 6f 6e   was already don
1c650 65 20 69 6e 20 66 74 73 35 57 72 69 74 65 49 6e  e in fts5WriteIn
1c660 69 74 28 29 3a 20 2a 2f 0a 20 20 20 20 2f 2a 20  it(): */.    /* 
1c670 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
1c680 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20  (p->pIdxWriter, 
1c690 31 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67  1, pWriter->iSeg
1c6a0 69 64 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  id); */.    sqli
1c6b0 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d  te3_bind_blob(p-
1c6c0 3e 70 49 64 78 57 72 69 74 65 72 2c 20 32 2c 20  >pIdxWriter, 2, 
1c6d0 7a 2c 20 70 57 72 69 74 65 72 2d 3e 62 74 74 65  z, pWriter->btte
1c6e0 72 6d 2e 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41  rm.n, SQLITE_STA
1c6f0 54 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  TIC);.    sqlite
1c700 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e  3_bind_int64(p->
1c710 70 49 64 78 57 72 69 74 65 72 2c 20 33 2c 20 62  pIdxWriter, 3, b
1c720 46 6c 61 67 20 2b 20 28 28 69 36 34 29 70 57 72  Flag + ((i64)pWr
1c730 69 74 65 72 2d 3e 69 42 74 50 61 67 65 3c 3c 31  iter->iBtPage<<1
1c740 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ));.    sqlite3_
1c750 73 74 65 70 28 70 2d 3e 70 49 64 78 57 72 69 74  step(p->pIdxWrit
1c760 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  er);.    p->rc =
1c770 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
1c780 2d 3e 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20  ->pIdxWriter);. 
1c790 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
1c7a0 6e 75 6c 6c 28 70 2d 3e 70 49 64 78 57 72 69 74  null(p->pIdxWrit
1c7b0 65 72 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 70 57  er, 2);.  }.  pW
1c7c0 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20 3d  riter->iBtPage =
1c7d0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
1c7e0 73 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  s is called once
1c7f0 20 66 6f 72 20 65 61 63 68 20 6c 65 61 66 20 70   for each leaf p
1c800 61 67 65 20 65 78 63 65 70 74 20 74 68 65 20 66  age except the f
1c810 69 72 73 74 20 74 68 61 74 20 63 6f 6e 74 61 69  irst that contai
1c820 6e 73 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f  ns.** at least o
1c830 6e 65 20 74 65 72 6d 2e 20 41 72 67 75 6d 65 6e  ne term. Argumen
1c840 74 20 28 6e 54 65 72 6d 2f 70 54 65 72 6d 29 20  t (nTerm/pTerm) 
1c850 69 73 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79  is the split-key
1c860 20 2d 20 61 20 74 65 72 6d 20 74 68 61 74 0a 2a   - a term that.*
1c870 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  * is larger than
1c880 20 61 6c 6c 20 74 65 72 6d 73 20 77 72 69 74 74   all terms writt
1c890 65 6e 20 74 6f 20 65 61 72 6c 69 65 72 20 6c 65  en to earlier le
1c8a0 61 76 65 73 2c 20 61 6e 64 20 65 71 75 61 6c 20  aves, and equal 
1c8b0 74 6f 20 6f 72 0a 2a 2a 20 73 6d 61 6c 6c 65 72  to or.** smaller
1c8c0 20 74 68 61 6e 20 74 68 65 20 66 69 72 73 74 20   than the first 
1c8d0 74 65 72 6d 20 6f 6e 20 74 68 65 20 6e 65 77 20  term on the new 
1c8e0 6c 65 61 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  leaf..**.** If a
1c8f0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1c900 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
1c910 20 6c 65 66 74 20 69 6e 20 46 74 73 35 49 6e 64   left in Fts5Ind
1c920 65 78 2e 72 63 2e 20 49 66 20 61 6e 20 65 72 72  ex.rc. If an err
1c930 6f 72 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  or.** has alread
1c940 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
1c950 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1c960 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
1c970 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
1c980 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
1c990 42 74 72 65 65 54 65 72 6d 28 0a 20 20 46 74 73  BtreeTerm(.  Fts
1c9a0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c9c0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
1c9d0 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
1c9e0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
1c9f0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1ca00 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
1ca10 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20  nt nTerm, const 
1ca20 75 38 20 2a 70 54 65 72 6d 20 20 20 20 20 20 2f  u8 *pTerm      /
1ca30 2a 20 46 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  * First term on 
1ca40 6e 65 77 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  new page */.){. 
1ca50 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 42   fts5WriteFlushB
1ca60 74 72 65 65 28 70 2c 20 70 57 72 69 74 65 72 29  tree(p, pWriter)
1ca70 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
1ca80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ca90 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
1caa0 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e  ->rc, &pWriter->
1cab0 62 74 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70  btterm, nTerm, p
1cac0 54 65 72 6d 29 3b 0a 20 20 20 20 70 57 72 69 74  Term);.    pWrit
1cad0 65 72 2d 3e 69 42 74 50 61 67 65 20 3d 20 70 57  er->iBtPage = pW
1cae0 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67  riter->writer.pg
1caf0 6e 6f 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  no;.  }.}../*.**
1cb00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1cb10 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 66 6c  s called when fl
1cb20 75 73 68 69 6e 67 20 61 20 6c 65 61 66 20 70 61  ushing a leaf pa
1cb30 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
1cb40 20 6e 6f 0a 2a 2a 20 74 65 72 6d 73 20 61 74 20   no.** terms at 
1cb50 61 6c 6c 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a  all to disk..*/.
1cb60 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1cb70 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d  WriteBtreeNoTerm
1cb80 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1cb90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1cba0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
1cbb0 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
1cbc0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1cbd0 57 72 69 74 65 72 20 20 20 20 20 20 20 20 20 20  Writer          
1cbe0 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74  /* Writer object
1cbf0 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74   */.){.  /* If t
1cc00 68 65 72 65 20 77 65 72 65 20 6e 6f 20 72 6f 77  here were no row
1cc10 69 64 73 20 6f 6e 20 74 68 65 20 6c 65 61 66 20  ids on the leaf 
1cc20 70 61 67 65 20 65 69 74 68 65 72 20 61 6e 64 20  page either and 
1cc30 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  the doclist-inde
1cc40 78 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61  x.  ** has alrea
1cc50 64 79 20 62 65 65 6e 20 73 74 61 72 74 65 64 2c  dy been started,
1cc60 20 61 70 70 65 6e 64 20 61 6e 20 30 78 30 30 20   append an 0x00 
1cc70 62 79 74 65 20 74 6f 20 69 74 2e 20 20 2a 2f 0a  byte to it.  */.
1cc80 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
1cc90 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
1cca0 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c   && pWriter->aDl
1ccb0 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 29  idx[0].buf.n>0 )
1ccc0 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 57  {.    Fts5DlidxW
1ccd0 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  riter *pDlidx = 
1cce0 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78  &pWriter->aDlidx
1ccf0 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [0];.    assert(
1cd00 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61   pDlidx->bPrevVa
1cd10 6c 69 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  lid );.    sqlit
1cd20 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
1cd30 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1cd40 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 30   &pDlidx->buf, 0
1cd50 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63  );.  }..  /* Inc
1cd60 72 65 6d 65 6e 74 20 74 68 65 20 22 6e 75 6d 62  rement the "numb
1cd70 65 72 20 6f 66 20 73 65 71 75 65 6e 74 69 61 6c  er of sequential
1cd80 20 6c 65 61 76 65 73 20 77 69 74 68 6f 75 74 20   leaves without 
1cd90 61 20 74 65 72 6d 22 20 63 6f 75 6e 74 65 72 2e  a term" counter.
1cda0 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e   */.  pWriter->n
1cdb0 45 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a 73 74 61 74  Empty++;.}..stat
1cdc0 69 63 20 69 36 34 20 66 74 73 35 44 6c 69 64 78  ic i64 fts5Dlidx
1cdd0 45 78 74 72 61 63 74 46 69 72 73 74 52 6f 77 69  ExtractFirstRowi
1cde0 64 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 42  d(Fts5Buffer *pB
1cdf0 75 66 29 7b 0a 20 20 69 36 34 20 69 52 6f 77 69  uf){.  i64 iRowi
1ce00 64 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a  d;.  int iOff;..
1ce10 20 20 69 4f 66 66 20 3d 20 31 20 2b 20 66 74 73    iOff = 1 + fts
1ce20 35 47 65 74 56 61 72 69 6e 74 28 26 70 42 75 66  5GetVarint(&pBuf
1ce30 2d 3e 70 5b 31 5d 2c 20 28 75 36 34 2a 29 26 69  ->p[1], (u64*)&i
1ce40 52 6f 77 69 64 29 3b 0a 20 20 66 74 73 35 47 65  Rowid);.  fts5Ge
1ce50 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70  tVarint(&pBuf->p
1ce60 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
1ce70 52 6f 77 69 64 29 3b 0a 20 20 72 65 74 75 72 6e  Rowid);.  return
1ce80 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a   iRowid;.}../*.*
1ce90 2a 20 52 6f 77 69 64 20 69 52 6f 77 69 64 20 68  * Rowid iRowid h
1cea0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 70 70  as just been app
1ceb0 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 75 72  ended to the cur
1cec0 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 2e 20  rent leaf page. 
1ced0 49 74 20 69 73 20 74 68 65 0a 2a 2a 20 66 69 72  It is the.** fir
1cee0 73 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  st on the page. 
1cef0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70  This function ap
1cf00 70 65 6e 64 73 20 61 6e 20 61 70 70 72 6f 70 72  pends an appropr
1cf10 69 61 74 65 20 65 6e 74 72 79 20 74 6f 20 74 68  iate entry to th
1cf20 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64 6f 63  e current.** doc
1cf30 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2f 0a 73  list-index..*/.s
1cf40 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
1cf50 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28  riteDlidxAppend(
1cf60 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1cf70 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
1cf80 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69  r *pWriter, .  i
1cf90 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69  64 iRowid.){.  i
1cfa0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 44 6f 6e  nt i;.  int bDon
1cfb0 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  e = 0;..  for(i=
1cfc0 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  0; p->rc==SQLITE
1cfd0 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d 30 3b  _OK && bDone==0;
1cfe0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 69   i++){.    i64 i
1cff0 56 61 6c 3b 0a 20 20 20 20 46 74 73 35 44 6c 69  Val;.    Fts5Dli
1d000 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78  dxWriter *pDlidx
1d010 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c   = &pWriter->aDl
1d020 69 64 78 5b 69 5d 3b 0a 0a 20 20 20 20 69 66 28  idx[i];..    if(
1d030 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3e 3d   pDlidx->buf.n>=
1d040 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a  p->pConfig->pgsz
1d050 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
1d060 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74   current doclist
1d070 2d 69 6e 64 65 78 20 70 61 67 65 20 69 73 20 66  -index page is f
1d080 75 6c 6c 2e 20 57 72 69 74 65 20 69 74 20 74 6f  ull. Write it to
1d090 20 64 69 73 6b 20 61 6e 64 20 70 75 73 68 0a 20   disk and push. 
1d0a0 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79 20 6f       ** a copy o
1d0b0 66 20 69 52 6f 77 69 64 20 28 77 68 69 63 68 20  f iRowid (which 
1d0c0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
1d0d0 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74  first rowid on t
1d0e0 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 2a 2a  he next.      **
1d0f0 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 6c   doclist-index l
1d100 65 61 66 20 70 61 67 65 29 20 75 70 20 69 6e 74  eaf page) up int
1d110 6f 20 74 68 65 20 6e 65 78 74 20 6c 65 76 65 6c  o the next level
1d120 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 0a   of the b-tree .
1d130 20 20 20 20 20 20 2a 2a 20 68 69 65 72 61 72 63        ** hierarc
1d140 68 79 2e 20 49 66 20 74 68 65 20 6e 6f 64 65 20  hy. If the node 
1d150 62 65 69 6e 67 20 66 6c 75 73 68 65 64 20 69 73  being flushed is
1d160 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72   currently the r
1d170 6f 6f 74 20 6e 6f 64 65 2c 0a 20 20 20 20 20 20  oot node,.      
1d180 2a 2a 20 61 6c 73 6f 20 70 75 73 68 20 69 74 73  ** also push its
1d190 20 66 69 72 73 74 20 72 6f 77 69 64 20 75 70 77   first rowid upw
1d1a0 61 72 64 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ards. */.      p
1d1b0 44 6c 69 64 78 2d 3e 62 75 66 2e 70 5b 30 5d 20  Dlidx->buf.p[0] 
1d1c0 3d 20 30 78 30 31 3b 20 20 20 20 2f 2a 20 4e 6f  = 0x01;    /* No
1d1d0 74 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20  t the root node 
1d1e0 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  */.      fts5Dat
1d1f0 61 57 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20  aWrite(p, .     
1d200 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f       FTS5_DLIDX_
1d210 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69  ROWID(pWriter->i
1d220 53 65 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78  Segid, i, pDlidx
1d230 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20  ->pgno),.       
1d240 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70     pDlidx->buf.p
1d250 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a  , pDlidx->buf.n.
1d260 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 66        );.      f
1d270 74 73 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f  ts5WriteDlidxGro
1d280 77 28 70 2c 20 70 57 72 69 74 65 72 2c 20 69 2b  w(p, pWriter, i+
1d290 32 29 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78  2);.      pDlidx
1d2a0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c   = &pWriter->aDl
1d2b0 69 64 78 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  idx[i];.      if
1d2c0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1d2d0 4f 4b 20 26 26 20 70 44 6c 69 64 78 5b 31 5d 2e  OK && pDlidx[1].
1d2e0 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  buf.n==0 ){.    
1d2f0 20 20 20 20 69 36 34 20 69 46 69 72 73 74 20 3d      i64 iFirst =
1d300 20 66 74 73 35 44 6c 69 64 78 45 78 74 72 61 63   fts5DlidxExtrac
1d310 74 46 69 72 73 74 52 6f 77 69 64 28 26 70 44 6c  tFirstRowid(&pDl
1d320 69 64 78 2d 3e 62 75 66 29 3b 0a 0a 20 20 20 20  idx->buf);..    
1d330 20 20 20 20 2f 2a 20 54 68 69 73 20 77 61 73 20      /* This was 
1d340 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 50  the root node. P
1d350 75 73 68 20 69 74 73 20 66 69 72 73 74 20 72 6f  ush its first ro
1d360 77 69 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65  wid up to the ne
1d370 77 20 72 6f 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  w root. */.     
1d380 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 70 67 6e     pDlidx[1].pgn
1d390 6f 20 3d 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f  o = pDlidx->pgno
1d3a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1d3b0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
1d3c0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1d3d0 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20  &pDlidx[1].buf, 
1d3e0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
1d3f0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
1d400 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1d410 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66  , &pDlidx[1].buf
1d420 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 3b  , pDlidx->pgno);
1d430 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d440 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
1d450 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1d460 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 69  pDlidx[1].buf, i
1d470 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20  First);.        
1d480 70 44 6c 69 64 78 5b 31 5d 2e 62 50 72 65 76 56  pDlidx[1].bPrevV
1d490 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  alid = 1;.      
1d4a0 20 20 70 44 6c 69 64 78 5b 31 5d 2e 69 50 72 65    pDlidx[1].iPre
1d4b0 76 20 3d 20 69 46 69 72 73 74 3b 0a 20 20 20 20  v = iFirst;.    
1d4c0 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74    }..      sqlit
1d4d0 65 33 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f  e3Fts5BufferZero
1d4e0 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a  (&pDlidx->buf);.
1d4f0 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50        pDlidx->bP
1d500 72 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  revValid = 0;.  
1d510 20 20 20 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f      pDlidx->pgno
1d520 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
1d530 20 20 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a       bDone = 1;.
1d540 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
1d550 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69  Dlidx->bPrevVali
1d560 64 20 29 7b 0a 20 20 20 20 20 20 69 56 61 6c 20  d ){.      iVal 
1d570 3d 20 69 52 6f 77 69 64 20 2d 20 70 44 6c 69 64  = iRowid - pDlid
1d580 78 2d 3e 69 50 72 65 76 3b 0a 20 20 20 20 7d 65  x->iPrev;.    }e
1d590 6c 73 65 7b 0a 20 20 20 20 20 20 69 36 34 20 69  lse{.      i64 i
1d5a0 50 67 6e 6f 20 3d 20 28 69 3d 3d 30 20 3f 20 70  Pgno = (i==0 ? p
1d5b0 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70  Writer->writer.p
1d5c0 67 6e 6f 20 3a 20 70 44 6c 69 64 78 5b 2d 31 5d  gno : pDlidx[-1]
1d5d0 2e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 61 73  .pgno);.      as
1d5e0 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 62 75  sert( pDlidx->bu
1d5f0 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  f.n==0 );.      
1d600 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1d610 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1d620 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62  ->rc, &pDlidx->b
1d630 75 66 2c 20 21 62 44 6f 6e 65 29 3b 0a 20 20 20  uf, !bDone);.   
1d640 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1d650 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1d660 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
1d670 2d 3e 62 75 66 2c 20 69 50 67 6e 6f 29 3b 0a 20  ->buf, iPgno);. 
1d680 20 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77       iVal = iRow
1d690 69 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  id;.    }..    s
1d6a0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1d6b0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1d6c0 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75  >rc, &pDlidx->bu
1d6d0 66 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 70 44  f, iVal);.    pD
1d6e0 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64  lidx->bPrevValid
1d6f0 20 3d 20 31 3b 0a 20 20 20 20 70 44 6c 69 64 78   = 1;.    pDlidx
1d700 2d 3e 69 50 72 65 76 20 3d 20 69 52 6f 77 69 64  ->iPrev = iRowid
1d710 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
1d720 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 6c  void fts5WriteFl
1d730 75 73 68 4c 65 61 66 28 46 74 73 35 49 6e 64 65  ushLeaf(Fts5Inde
1d740 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69  x *p, Fts5SegWri
1d750 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20  ter *pWriter){. 
1d760 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
1d770 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30   zero[] = { 0x00
1d780 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
1d790 30 30 20 7d 3b 0a 20 20 46 74 73 35 50 61 67 65  00 };.  Fts5Page
1d7a0 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20  Writer *pPage = 
1d7b0 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  &pWriter->writer
1d7c0 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a  ;.  i64 iRowid;.
1d7d0 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67  .  assert( (pPag
1d7e0 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30 29 3d 3d  e->pgidx.n==0)==
1d7f0 28 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74  (pWriter->bFirst
1d800 54 65 72 6d 49 6e 50 61 67 65 29 20 29 3b 0a 0a  TermInPage) );..
1d810 20 20 2f 2a 20 53 65 74 20 74 68 65 20 73 7a 4c    /* Set the szL
1d820 65 61 66 20 68 65 61 64 65 72 20 66 69 65 6c 64  eaf header field
1d830 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  . */.  assert( 0
1d840 3d 3d 66 74 73 35 47 65 74 55 31 36 28 26 70 50  ==fts5GetU16(&pP
1d850 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 29 20 29  age->buf.p[2]) )
1d860 3b 0a 20 20 66 74 73 35 50 75 74 55 31 36 28 26  ;.  fts5PutU16(&
1d870 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 2c  pPage->buf.p[2],
1d880 20 28 75 31 36 29 70 50 61 67 65 2d 3e 62 75 66   (u16)pPage->buf
1d890 2e 6e 29 3b 0a 0a 20 20 69 66 28 20 70 57 72 69  .n);..  if( pWri
1d8a0 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49  ter->bFirstTermI
1d8b0 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20  nPage ){.    /* 
1d8c0 4e 6f 20 74 65 72 6d 20 77 61 73 20 77 72 69 74  No term was writ
1d8d0 74 65 6e 20 74 6f 20 74 68 69 73 20 70 61 67 65  ten to this page
1d8e0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
1d8f0 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d   pPage->pgidx.n=
1d900 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 35 57 72  =0 );.    fts5Wr
1d910 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 70  iteBtreeNoTerm(p
1d920 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 65  , pWriter);.  }e
1d930 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41 70 70 65  lse{.    /* Appe
1d940 6e 64 20 74 68 65 20 70 67 69 64 78 20 74 6f 20  nd the pgidx to 
1d950 74 68 65 20 70 61 67 65 20 62 75 66 66 65 72 2e  the page buffer.
1d960 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20   Set the szLeaf 
1d970 68 65 61 64 65 72 20 66 69 65 6c 64 2e 20 2a 2f  header field. */
1d980 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
1d990 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1d9a0 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 70  , &pPage->buf, p
1d9b0 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 2c 20 70  Page->pgidx.n, p
1d9c0 50 61 67 65 2d 3e 70 67 69 64 78 2e 70 29 3b 0a  Page->pgidx.p);.
1d9d0 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
1d9e0 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20  the page out to 
1d9f0 64 69 73 6b 20 2a 2f 0a 20 20 69 52 6f 77 69 64  disk */.  iRowid
1da00 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
1da10 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69  ROWID(pWriter->i
1da20 53 65 67 69 64 2c 20 70 50 61 67 65 2d 3e 70 67  Segid, pPage->pg
1da30 6e 6f 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57  no);.  fts5DataW
1da40 72 69 74 65 28 70 2c 20 69 52 6f 77 69 64 2c 20  rite(p, iRowid, 
1da50 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50  pPage->buf.p, pP
1da60 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20  age->buf.n);..  
1da70 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1da80 65 20 6e 65 78 74 20 70 61 67 65 2e 20 2a 2f 0a  e next page. */.
1da90 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
1daa0 28 26 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20  (&pPage->buf);. 
1dab0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
1dac0 26 70 50 61 67 65 2d 3e 70 67 69 64 78 29 3b 0a  &pPage->pgidx);.
1dad0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1dae0 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
1daf0 70 50 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a  pPage->buf, 4, z
1db00 65 72 6f 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69  ero);.  pPage->i
1db10 50 72 65 76 50 67 69 64 78 20 3d 20 30 3b 0a 20  PrevPgidx = 0;. 
1db20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a   pPage->pgno++;.
1db30 0a 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74  .  /* Increase t
1db40 68 65 20 6c 65 61 76 65 73 20 77 72 69 74 74 65  he leaves writte
1db50 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70  n counter */.  p
1db60 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69  Writer->nLeafWri
1db70 74 74 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68  tten++;..  /* Th
1db80 65 20 6e 65 77 20 6c 65 61 66 20 68 6f 6c 64 73  e new leaf holds
1db90 20 6e 6f 20 74 65 72 6d 73 20 6f 72 20 72 6f 77   no terms or row
1dba0 69 64 73 20 2a 2f 0a 20 20 70 57 72 69 74 65 72  ids */.  pWriter
1dbb0 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
1dbc0 67 65 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65  ge = 1;.  pWrite
1dbd0 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
1dbe0 50 61 67 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  Page = 1;.}../*.
1dbf0 2a 2a 20 41 70 70 65 6e 64 20 74 65 72 6d 20 70  ** Append term p
1dc00 54 65 72 6d 2f 6e 54 65 72 6d 20 74 6f 20 74 68  Term/nTerm to th
1dc10 65 20 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20  e segment being 
1dc20 77 72 69 74 74 65 6e 20 62 79 20 74 68 65 20 77  written by the w
1dc30 72 69 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20  riter passed.** 
1dc40 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
1dc50 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
1dc60 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1dc70 2c 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e  , set the Fts5In
1dc80 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64  dex.rc error cod
1dc90 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  e. If an error h
1dca0 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  as .** already o
1dcb0 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75  ccurred, this fu
1dcc0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
1dcd0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
1dce0 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e  d fts5WriteAppen
1dcf0 64 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64  dTerm(.  Fts5Ind
1dd00 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65  ex *p, .  Fts5Se
1dd10 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
1dd20 2c 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63  ,.  int nTerm, c
1dd30 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20 0a  onst u8 *pTerm .
1dd40 29 7b 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78  ){.  int nPrefix
1dd50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dd60 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
1dd70 20 70 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73   prefix compress
1dd80 69 6f 6e 20 66 6f 72 20 74 65 72 6d 20 2a 2f 0a  ion for term */.
1dd90 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
1dda0 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74   *pPage = &pWrit
1ddb0 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 46 74  er->writer;.  Ft
1ddc0 73 35 42 75 66 66 65 72 20 2a 70 50 67 69 64 78  s5Buffer *pPgidx
1ddd0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69   = &pWriter->wri
1dde0 74 65 72 2e 70 67 69 64 78 3b 0a 20 20 69 6e 74  ter.pgidx;.  int
1ddf0 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 70 50 61 67   nMin = MIN(pPag
1de00 65 2d 3e 74 65 72 6d 2e 6e 2c 20 6e 54 65 72 6d  e->term.n, nTerm
1de10 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  );..  assert( p-
1de20 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1de30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1de40 65 2d 3e 62 75 66 2e 6e 3e 3d 34 20 29 3b 0a 20  e->buf.n>=4 );. 
1de50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
1de60 62 75 66 2e 6e 3e 34 20 7c 7c 20 70 57 72 69 74  buf.n>4 || pWrit
1de70 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
1de80 50 61 67 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Page );..  /* If
1de90 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
1dea0 66 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2c 20  f page is full, 
1deb0 66 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b  flush it to disk
1dec0 2e 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 61 67  . */.  if( (pPag
1ded0 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 67 69 64  e->buf.n + pPgid
1dee0 78 2d 3e 6e 20 2b 20 6e 54 65 72 6d 20 2b 20 32  x->n + nTerm + 2
1def0 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  )>=p->pConfig->p
1df00 67 73 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70  gsz ){.    if( p
1df10 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b  Page->buf.n>4 ){
1df20 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
1df30 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
1df40 69 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  iter);.      if(
1df50 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
1df60 4b 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  K ) return;.    
1df70 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  }.    fts5Buffer
1df80 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 70 50  Grow(&p->rc, &pP
1df90 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 2b  age->buf, nTerm+
1dfa0 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e  FTS5_DATA_PADDIN
1dfb0 47 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  G);.  }.  .  /* 
1dfc0 54 4f 44 4f 31 3a 20 55 70 64 61 74 69 6e 67 20  TODO1: Updating 
1dfd0 70 67 69 64 78 20 68 65 72 65 2e 20 2a 2f 0a 20  pgidx here. */. 
1dfe0 20 70 50 67 69 64 78 2d 3e 6e 20 2b 3d 20 73 71   pPgidx->n += sq
1dff0 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72 69  lite3Fts5PutVari
1e000 6e 74 28 0a 20 20 20 20 20 20 26 70 50 67 69 64  nt(.      &pPgid
1e010 78 2d 3e 70 5b 70 50 67 69 64 78 2d 3e 6e 5d 2c  x->p[pPgidx->n],
1e020 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2d 20   pPage->buf.n - 
1e030 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64  pPage->iPrevPgid
1e040 78 0a 20 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  x.  );.  pPage->
1e050 69 50 72 65 76 50 67 69 64 78 20 3d 20 70 50 61  iPrevPgidx = pPa
1e060 67 65 2d 3e 62 75 66 2e 6e 3b 0a 23 69 66 20 30  ge->buf.n;.#if 0
1e070 0a 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70  .  fts5PutU16(&p
1e080 50 67 69 64 78 2d 3e 70 5b 70 50 67 69 64 78 2d  Pgidx->p[pPgidx-
1e090 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  >n], pPage->buf.
1e0a0 6e 29 3b 0a 20 20 70 50 67 69 64 78 2d 3e 6e 20  n);.  pPgidx->n 
1e0b0 2b 3d 20 32 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  += 2;.#endif..  
1e0c0 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
1e0d0 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b  rstTermInPage ){
1e0e0 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 30  .    nPrefix = 0
1e0f0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
1e100 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20  >pgno!=1 ){.    
1e110 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
1e120 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 61   first term on a
1e130 20 6c 65 61 66 20 74 68 61 74 20 69 73 20 6e 6f   leaf that is no
1e140 74 20 74 68 65 20 6c 65 66 74 6d 6f 73 74 20 6c  t the leftmost l
1e150 65 61 66 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  eaf in.      ** 
1e160 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  the segment b-tr
1e170 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ee. In this case
1e180 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
1e190 20 74 6f 20 61 64 64 20 61 20 74 65 72 6d 20 74   to add a term t
1e1a0 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 62  o.      ** the b
1e1b0 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79 20  -tree hierarchy 
1e1c0 74 68 61 74 20 69 73 20 28 61 29 20 6c 61 72 67  that is (a) larg
1e1d0 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67  er than the larg
1e1e0 65 73 74 20 74 65 72 6d 20 0a 20 20 20 20 20 20  est term .      
1e1f0 2a 2a 20 61 6c 72 65 61 64 79 20 77 72 69 74 74  ** already writt
1e200 65 6e 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e  en to the segmen
1e210 74 20 61 6e 64 20 28 62 29 20 73 6d 61 6c 6c 65  t and (b) smalle
1e220 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
1e230 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  to.      ** this
1e240 20 74 65 72 6d 2e 20 49 6e 20 6f 74 68 65 72 20   term. In other 
1e250 77 6f 72 64 73 2c 20 61 20 70 72 65 66 69 78 20  words, a prefix 
1e260 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  of (pTerm/nTerm)
1e270 20 74 68 61 74 20 69 73 20 6f 6e 65 0a 20 20 20   that is one.   
1e280 20 20 20 2a 2a 20 62 79 74 65 20 6c 6f 6e 67 65     ** byte longe
1e290 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 6e 67 65  r than the longe
1e2a0 73 74 20 70 72 65 66 69 78 20 28 70 54 65 72 6d  st prefix (pTerm
1e2b0 2f 6e 54 65 72 6d 29 20 73 68 61 72 65 73 20 77  /nTerm) shares w
1e2c0 69 74 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ith the.      **
1e2d0 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 2e 20   previous term. 
1e2e0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1e2f0 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 65 20  ** Usually, the 
1e300 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69 73  previous term is
1e310 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 50   available in pP
1e320 61 67 65 2d 3e 74 65 72 6d 2e 20 54 68 65 20 65  age->term. The e
1e330 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 20 20 2a  xception.      *
1e340 2a 20 69 73 20 69 66 20 74 68 69 73 20 69 73 20  * is if this is 
1e350 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 77  the first term w
1e360 72 69 74 74 65 6e 20 69 6e 20 61 6e 20 69 6e 63  ritten in an inc
1e370 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20 73  remental-merge s
1e380 74 65 70 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e  tep..      ** In
1e390 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70   this case the p
1e3a0 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69 73 20  revious term is 
1e3b0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 73  not available, s
1e3c0 6f 20 6a 75 73 74 20 77 72 69 74 65 20 61 0a 20  o just write a. 
1e3d0 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20       ** copy of 
1e3e0 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 69 6e  (pTerm/nTerm) in
1e3f0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 6e 6f  to the parent no
1e400 64 65 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67  de. This is slig
1e410 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20 69 6e  htly.      ** in
1e420 65 66 66 69 63 69 65 6e 74 2c 20 62 75 74 20 73  efficient, but s
1e430 74 69 6c 6c 20 63 6f 72 72 65 63 74 2e 20 20 2a  till correct.  *
1e440 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  /.      int n = 
1e450 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28  nTerm;.      if(
1e460 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 20 29   pPage->term.n )
1e470 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 31 20  {.        n = 1 
1e480 2b 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70  + fts5PrefixComp
1e490 72 65 73 73 28 6e 4d 69 6e 2c 20 70 50 61 67 65  ress(nMin, pPage
1e4a0 2d 3e 74 65 72 6d 2e 70 2c 20 70 54 65 72 6d 29  ->term.p, pTerm)
1e4b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e4c0 66 74 73 35 57 72 69 74 65 42 74 72 65 65 54 65  fts5WriteBtreeTe
1e4d0 72 6d 28 70 2c 20 70 57 72 69 74 65 72 2c 20 6e  rm(p, pWriter, n
1e4e0 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
1e4f0 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
1e500 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 20  E_OK ) return;. 
1e510 20 20 20 20 20 70 50 61 67 65 20 3d 20 26 70 57       pPage = &pW
1e520 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20  riter->writer;. 
1e530 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1e540 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73 35    nPrefix = fts5
1e550 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 6e  PrefixCompress(n
1e560 4d 69 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d  Min, pPage->term
1e570 2e 70 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  .p, pTerm);.    
1e580 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1e590 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1e5a0 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 50 72 65  pPage->buf, nPre
1e5b0 66 69 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  fix);.  }..  /* 
1e5c0 41 70 70 65 6e 64 20 74 68 65 20 6e 75 6d 62 65  Append the numbe
1e5d0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65  r of bytes of ne
1e5e0 77 20 64 61 74 61 2c 20 74 68 65 6e 20 74 68 65  w data, then the
1e5f0 20 74 65 72 6d 20 64 61 74 61 20 69 74 73 65 6c   term data itsel
1e600 66 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61  f.  ** to the pa
1e610 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66  ge. */.  fts5Buf
1e620 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1e630 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1e640 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72  buf, nTerm - nPr
1e650 65 66 69 78 29 3b 0a 20 20 66 74 73 35 42 75 66  efix);.  fts5Buf
1e660 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1e670 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
1e680 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66  f, nTerm - nPref
1e690 69 78 2c 20 26 70 54 65 72 6d 5b 6e 50 72 65 66  ix, &pTerm[nPref
1e6a0 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20 55 70 64 61  ix]);..  /* Upda
1e6b0 74 65 20 74 68 65 20 46 74 73 35 50 61 67 65 57  te the Fts5PageW
1e6c0 72 69 74 65 72 2e 74 65 72 6d 20 66 69 65 6c 64  riter.term field
1e6d0 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65  . */.  fts5Buffe
1e6e0 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rSet(&p->rc, &pP
1e6f0 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54 65 72 6d  age->term, nTerm
1e700 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70 57 72 69  , pTerm);.  pWri
1e710 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49  ter->bFirstTermI
1e720 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 70 57  nPage = 0;..  pW
1e730 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1e740 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  idInPage = 0;.  
1e750 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
1e760 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20  owidInDoclist = 
1e770 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  1;..  assert( p-
1e780 3e 72 63 20 7c 7c 20 28 70 57 72 69 74 65 72 2d  >rc || (pWriter-
1e790 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20 70 57 72  >nDlidx>0 && pWr
1e7a0 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e  iter->aDlidx[0].
1e7b0 62 75 66 2e 6e 3d 3d 30 29 20 29 3b 0a 20 20 70  buf.n==0) );.  p
1e7c0 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30  Writer->aDlidx[0
1e7d0 5d 2e 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  ].pgno = pPage->
1e7e0 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pgno;.}../*.** A
1e7f0 70 70 65 6e 64 20 61 20 72 6f 77 69 64 20 61 6e  ppend a rowid an
1e800 64 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  d position-list 
1e810 73 69 7a 65 20 66 69 65 6c 64 20 74 6f 20 74 68  size field to th
1e820 65 20 77 72 69 74 65 72 73 20 6f 75 74 70 75 74  e writers output
1e830 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
1e840 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e  d fts5WriteAppen
1e850 64 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e  dRowid(.  Fts5In
1e860 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
1e870 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
1e880 72 2c 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a  r,.  i64 iRowid.
1e890 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
1e8a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e8b0 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
1e8c0 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65  *pPage = &pWrite
1e8d0 72 2d 3e 77 72 69 74 65 72 3b 0a 0a 20 20 20 20  r->writer;..    
1e8e0 69 66 28 20 28 70 50 61 67 65 2d 3e 62 75 66 2e  if( (pPage->buf.
1e8f0 6e 20 2b 20 70 50 61 67 65 2d 3e 70 67 69 64 78  n + pPage->pgidx
1e900 2e 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d  .n)>=p->pConfig-
1e910 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 66  >pgsz ){.      f
1e920 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
1e930 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  f(p, pWriter);. 
1e940 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1e950 74 68 69 73 20 69 73 20 74 6f 20 62 65 20 74 68  this is to be th
1e960 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 77 72  e first rowid wr
1e970 69 74 74 65 6e 20 74 6f 20 74 68 65 20 70 61 67  itten to the pag
1e980 65 2c 20 73 65 74 20 74 68 65 20 0a 20 20 20 20  e, set the .    
1e990 2a 2a 20 72 6f 77 69 64 2d 70 6f 69 6e 74 65 72  ** rowid-pointer
1e9a0 20 69 6e 20 74 68 65 20 70 61 67 65 2d 68 65 61   in the page-hea
1e9b0 64 65 72 2e 20 41 6c 73 6f 20 61 70 70 65 6e 64  der. Also append
1e9c0 20 61 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20   a value to the 
1e9d0 64 6c 69 64 78 0a 20 20 20 20 2a 2a 20 62 75 66  dlidx.    ** buf
1e9e0 66 65 72 2c 20 69 6e 20 63 61 73 65 20 61 20 64  fer, in case a d
1e9f0 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 73 20  oclist-index is 
1ea00 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20  required.  */.  
1ea10 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
1ea20 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
1ea30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 50 75   ){.      fts5Pu
1ea40 74 55 31 36 28 70 50 61 67 65 2d 3e 62 75 66 2e  tU16(pPage->buf.
1ea50 70 2c 20 28 75 31 36 29 70 50 61 67 65 2d 3e 62  p, (u16)pPage->b
1ea60 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73  uf.n);.      fts
1ea70 35 57 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e  5WriteDlidxAppen
1ea80 64 28 70 2c 20 70 57 72 69 74 65 72 2c 20 69 52  d(p, pWriter, iR
1ea90 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  owid);.    }..  
1eaa0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
1eab0 6f 77 69 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  owid. */.    if(
1eac0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1ead0 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 7c  RowidInDoclist |
1eae0 7c 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  | pWriter->bFirs
1eaf0 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a  tRowidInPage ){.
1eb00 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1eb10 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1eb20 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
1eb30 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  , iRowid);.    }
1eb40 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1eb50 72 74 5f 6e 63 28 20 70 2d 3e 72 63 20 7c 7c 20  rt_nc( p->rc || 
1eb60 69 52 6f 77 69 64 3e 70 57 72 69 74 65 72 2d 3e  iRowid>pWriter->
1eb70 69 50 72 65 76 52 6f 77 69 64 20 29 3b 0a 20 20  iPrevRowid );.  
1eb80 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1eb90 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1eba0 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
1ebb0 69 52 6f 77 69 64 20 2d 20 70 57 72 69 74 65 72  iRowid - pWriter
1ebc0 2d 3e 69 50 72 65 76 52 6f 77 69 64 29 3b 0a 20  ->iPrevRowid);. 
1ebd0 20 20 20 7d 0a 20 20 20 20 70 57 72 69 74 65 72     }.    pWriter
1ebe0 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 3d 20 69  ->iPrevRowid = i
1ebf0 52 6f 77 69 64 3b 0a 20 20 20 20 70 57 72 69 74  Rowid;.    pWrit
1ec00 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
1ec10 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b 0a 20 20  nDoclist = 0;.  
1ec20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
1ec30 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30  tRowidInPage = 0
1ec40 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
1ec50 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70  void fts5WriteAp
1ec60 70 65 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28  pendPoslistData(
1ec70 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1ec80 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
1ec90 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 63  r *pWriter, .  c
1eca0 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20  onst u8 *aData, 
1ecb0 0a 20 20 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a  .  int nData.){.
1ecc0 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
1ecd0 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74   *pPage = &pWrit
1ece0 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 63 6f  er->writer;.  co
1ecf0 6e 73 74 20 75 38 20 2a 61 20 3d 20 61 44 61 74  nst u8 *a = aDat
1ed00 61 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 6e 44 61  a;.  int n = nDa
1ed10 74 61 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  ta;.  .  assert(
1ed20 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73   p->pConfig->pgs
1ed30 7a 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  z>0 );.  while( 
1ed40 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1ed50 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67 65   .     && (pPage
1ed60 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d  ->buf.n + pPage-
1ed70 3e 70 67 69 64 78 2e 6e 20 2b 20 6e 29 3e 3d 70  >pgidx.n + n)>=p
1ed80 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
1ed90 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52  .  ){.    int nR
1eda0 65 71 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  eq = p->pConfig-
1edb0 3e 70 67 73 7a 20 2d 20 70 50 61 67 65 2d 3e 62  >pgsz - pPage->b
1edc0 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 70 67  uf.n - pPage->pg
1edd0 69 64 78 2e 6e 3b 0a 20 20 20 20 69 6e 74 20 6e  idx.n;.    int n
1ede0 43 6f 70 79 20 3d 20 30 3b 0a 20 20 20 20 77 68  Copy = 0;.    wh
1edf0 69 6c 65 28 20 6e 43 6f 70 79 3c 6e 52 65 71 20  ile( nCopy<nReq 
1ee00 29 7b 0a 20 20 20 20 20 20 69 36 34 20 64 75 6d  ){.      i64 dum
1ee10 6d 79 3b 0a 20 20 20 20 20 20 6e 43 6f 70 79 20  my;.      nCopy 
1ee20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
1ee30 28 26 61 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34  (&a[nCopy], (u64
1ee40 2a 29 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d  *)&dummy);.    }
1ee50 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
1ee60 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1ee70 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
1ee80 43 6f 70 79 2c 20 61 29 3b 0a 20 20 20 20 61 20  Copy, a);.    a 
1ee90 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20  += nCopy;.    n 
1eea0 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74  -= nCopy;.    ft
1eeb0 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
1eec0 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
1eed0 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  }.  if( n>0 ){. 
1eee0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1eef0 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1ef00 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 2c 20  &pPage->buf, n, 
1ef10 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  a);.  }.}../*.**
1ef20 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20   Flush any data 
1ef30 63 61 63 68 65 64 20 62 79 20 74 68 65 20 77 72  cached by the wr
1ef40 69 74 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74  iter object to t
1ef50 68 65 20 64 61 74 61 62 61 73 65 2e 20 46 72 65  he database. Fre
1ef60 65 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  e any.** allocat
1ef70 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20  ions associated 
1ef80 77 69 74 68 20 74 68 65 20 77 72 69 74 65 72 2e  with the writer.
1ef90 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1efa0 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28  fts5WriteFinish(
1efb0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1efc0 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
1efd0 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20  r *pWriter,     
1efe0 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
1eff0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ject */.  int *p
1f000 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20  nLeaf           
1f010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1f020 3a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  : Number of leaf
1f030 20 70 61 67 65 73 20 69 6e 20 62 2d 74 72 65 65   pages in b-tree
1f040 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
1f050 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
1f060 20 2a 70 4c 65 61 66 20 3d 20 26 70 57 72 69 74   *pLeaf = &pWrit
1f070 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69 66  er->writer;.  if
1f080 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1f090 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
1f0a0 28 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 3e 3d 31  ( pLeaf->pgno>=1
1f0b0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61   );.    if( pLea
1f0c0 66 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20  f->buf.n>4 ){.  
1f0d0 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
1f0e0 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65  shLeaf(p, pWrite
1f0f0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  r);.    }.    *p
1f100 6e 4c 65 61 66 20 3d 20 70 4c 65 61 66 2d 3e 70  nLeaf = pLeaf->p
1f110 67 6e 6f 2d 31 3b 0a 20 20 20 20 69 66 28 20 70  gno-1;.    if( p
1f120 4c 65 61 66 2d 3e 70 67 6e 6f 3e 31 20 29 7b 0a  Leaf->pgno>1 ){.
1f130 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46        fts5WriteF
1f140 6c 75 73 68 42 74 72 65 65 28 70 2c 20 70 57 72  lushBtree(p, pWr
1f150 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  iter);.    }.  }
1f160 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
1f170 65 28 26 70 4c 65 61 66 2d 3e 74 65 72 6d 29 3b  e(&pLeaf->term);
1f180 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
1f190 65 28 26 70 4c 65 61 66 2d 3e 62 75 66 29 3b 0a  e(&pLeaf->buf);.
1f1a0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
1f1b0 28 26 70 4c 65 61 66 2d 3e 70 67 69 64 78 29 3b  (&pLeaf->pgidx);
1f1c0 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
1f1d0 65 28 26 70 57 72 69 74 65 72 2d 3e 62 74 74 65  e(&pWriter->btte
1f1e0 72 6d 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  rm);..  for(i=0;
1f1f0 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69   i<pWriter->nDli
1f200 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  dx; i++){.    sq
1f210 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46  lite3Fts5BufferF
1f220 72 65 65 28 26 70 57 72 69 74 65 72 2d 3e 61 44  ree(&pWriter->aD
1f230 6c 69 64 78 5b 69 5d 2e 62 75 66 29 3b 0a 20 20  lidx[i].buf);.  
1f240 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
1f250 28 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78  (pWriter->aDlidx
1f260 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
1f270 64 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28  d fts5WriteInit(
1f280 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1f290 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
1f2a0 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69  r *pWriter, .  i
1f2b0 6e 74 20 69 53 65 67 69 64 0a 29 7b 0a 20 20 63  nt iSegid.){.  c
1f2c0 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66 66 65 72  onst int nBuffer
1f2d0 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70   = p->pConfig->p
1f2e0 67 73 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f  gsz + FTS5_DATA_
1f2f0 50 41 44 44 49 4e 47 3b 0a 0a 20 20 6d 65 6d 73  PADDING;..  mems
1f300 65 74 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73  et(pWriter, 0, s
1f310 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72 69  izeof(Fts5SegWri
1f320 74 65 72 29 29 3b 0a 20 20 70 57 72 69 74 65 72  ter));.  pWriter
1f330 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69  ->iSegid = iSegi
1f340 64 3b 0a 0a 20 20 66 74 73 35 57 72 69 74 65 44  d;..  fts5WriteD
1f350 6c 69 64 78 47 72 6f 77 28 70 2c 20 70 57 72 69  lidxGrow(p, pWri
1f360 74 65 72 2c 20 31 29 3b 0a 20 20 70 57 72 69 74  ter, 1);.  pWrit
1f370 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20  er->writer.pgno 
1f380 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  = 1;.  pWriter->
1f390 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
1f3a0 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d   = 1;.  pWriter-
1f3b0 3e 69 42 74 50 61 67 65 20 3d 20 31 3b 0a 0a 20  >iBtPage = 1;.. 
1f3c0 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72   assert( pWriter
1f3d0 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e 6e 3d 3d  ->writer.buf.n==
1f3e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1f3f0 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70  Writer->writer.p
1f400 67 69 64 78 2e 6e 3d 3d 30 20 29 3b 0a 0a 20 20  gidx.n==0 );..  
1f410 2f 2a 20 47 72 6f 77 20 74 68 65 20 74 77 6f 20  /* Grow the two 
1f420 62 75 66 66 65 72 73 20 74 6f 20 70 67 73 7a 20  buffers to pgsz 
1f430 2b 20 70 61 64 64 69 6e 67 20 62 79 74 65 73 20  + padding bytes 
1f440 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 73 71  in size. */.  sq
1f450 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
1f460 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 70 57 72  ize(&p->rc, &pWr
1f470 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69  iter->writer.pgi
1f480 64 78 2c 20 6e 42 75 66 66 65 72 29 3b 0a 20 20  dx, nBuffer);.  
1f490 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1f4a0 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 70  rSize(&p->rc, &p
1f4b0 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62  Writer->writer.b
1f4c0 75 66 2c 20 6e 42 75 66 66 65 72 29 3b 0a 0a 20  uf, nBuffer);.. 
1f4d0 20 69 66 28 20 70 2d 3e 70 49 64 78 57 72 69 74   if( p->pIdxWrit
1f4e0 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73  er==0 ){.    Fts
1f4f0 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
1f500 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
1f510 20 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70     fts5IndexPrep
1f520 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70  areStmt(p, &p->p
1f530 49 64 78 57 72 69 74 65 72 2c 20 73 71 6c 69 74  IdxWriter, sqlit
1f540 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
1f550 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
1f560 54 4f 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27  TO '%q'.'%q_idx'
1f570 28 73 65 67 69 64 2c 74 65 72 6d 2c 70 67 6e 6f  (segid,term,pgno
1f580 29 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 29 22  ) VALUES(?,?,?)"
1f590 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  , .          pCo
1f5a0 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66  nfig->zDb, pConf
1f5b0 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29  ig->zName.    ))
1f5c0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
1f5d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f5e0 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
1f5f0 7a 65 20 74 68 65 20 34 2d 62 79 74 65 20 6c 65  ze the 4-byte le
1f600 61 66 2d 70 61 67 65 20 68 65 61 64 65 72 20 74  af-page header t
1f610 6f 20 30 78 30 30 2e 20 2a 2f 0a 20 20 20 20 6d  o 0x00. */.    m
1f620 65 6d 73 65 74 28 70 57 72 69 74 65 72 2d 3e 77  emset(pWriter->w
1f630 72 69 74 65 72 2e 62 75 66 2e 70 2c 20 30 2c 20  riter.buf.p, 0, 
1f640 34 29 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d  4);.    pWriter-
1f650 3e 77 72 69 74 65 72 2e 62 75 66 2e 6e 20 3d 20  >writer.buf.n = 
1f660 34 3b 0a 0a 20 20 20 20 2f 2a 20 42 69 6e 64 20  4;..    /* Bind 
1f670 74 68 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70  the current outp
1f680 75 74 20 73 65 67 6d 65 6e 74 20 69 64 20 74 6f  ut segment id to
1f690 20 74 68 65 20 69 6e 64 65 78 2d 77 72 69 74 65   the index-write
1f6a0 72 2e 20 54 68 69 73 20 69 73 20 61 6e 0a 20 20  r. This is an.  
1f6b0 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f    ** optimizatio
1f6c0 6e 20 6f 76 65 72 20 62 69 6e 64 69 6e 67 20 74  n over binding t
1f6d0 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 6f 76  he same value ov
1f6e0 65 72 20 61 6e 64 20 6f 76 65 72 20 61 73 20 72  er and over as r
1f6f0 6f 77 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 69  ows are.    ** i
1f700 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 25 5f 69  nserted into %_i
1f710 64 78 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  dx by the curren
1f720 74 20 77 72 69 74 65 72 2e 20 20 2a 2f 0a 20 20  t writer.  */.  
1f730 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
1f740 6e 74 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72  nt(p->pIdxWriter
1f750 2c 20 31 2c 20 70 57 72 69 74 65 72 2d 3e 69 53  , 1, pWriter->iS
1f760 65 67 69 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  egid);.  }.}../*
1f770 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
1f780 65 72 20 77 61 73 20 75 73 65 64 20 74 6f 20 69  er was used to i
1f790 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
1f7a0 68 65 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  he input segment
1f7b0 73 20 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e  s of on an.** in
1f7c0 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20  cremental merge 
1f7d0 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
1f7e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1f7f0 65 64 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d  ed if the increm
1f800 65 6e 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73  ental.** merge s
1f810 74 65 70 20 68 61 73 20 66 69 6e 69 73 68 65 64  tep has finished
1f820 20 62 75 74 20 74 68 65 20 69 6e 70 75 74 20 68   but the input h
1f830 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70  as not been comp
1f840 6c 65 74 65 6c 79 20 65 78 68 61 75 73 74 65 64  letely exhausted
1f850 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1f860 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74   fts5TrimSegment
1f870 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  s(Fts5Index *p, 
1f880 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29  Fts5Iter *pIter)
1f890 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73  {.  int i;.  Fts
1f8a0 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d  5Buffer buf;.  m
1f8b0 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73  emset(&buf, 0, s
1f8c0 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
1f8d0 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ));.  for(i=0; i
1f8e0 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b  <pIter->nSeg; i+
1f8f0 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49  +){.    Fts5SegI
1f900 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
1f910 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20  er->aSeg[i];.   
1f920 20 69 66 28 20 70 53 65 67 2d 3e 70 53 65 67 3d   if( pSeg->pSeg=
1f930 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e  =0 ){.      /* n
1f940 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  o-op */.    }els
1f950 65 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61  e if( pSeg->pLea
1f960 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  f==0 ){.      /*
1f970 20 41 6c 6c 20 6b 65 79 73 20 66 72 6f 6d 20 74   All keys from t
1f980 68 69 73 20 69 6e 70 75 74 20 73 65 67 6d 65 6e  his input segmen
1f990 74 20 68 61 76 65 20 62 65 65 6e 20 74 72 61 6e  t have been tran
1f9a0 73 66 65 72 65 64 20 74 6f 20 74 68 65 20 6f 75  sfered to the ou
1f9b0 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2a 20 53  tput..      ** S
1f9c0 65 74 20 62 6f 74 68 20 74 68 65 20 66 69 72 73  et both the firs
1f9d0 74 20 61 6e 64 20 6c 61 73 74 20 70 61 67 65 2d  t and last page-
1f9e0 6e 75 6d 62 65 72 73 20 74 6f 20 30 20 74 6f 20  numbers to 0 to 
1f9f0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
1fa00 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65  e.      ** segme
1fa10 6e 74 20 69 73 20 6e 6f 77 20 65 6d 70 74 79 2e  nt is now empty.
1fa20 20 2a 2f 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   */.      pSeg->
1fa30 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d  pSeg->pgnoLast =
1fa40 20 30 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   0;.      pSeg->
1fa50 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
1fa60 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1fa70 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d        int iOff =
1fa80 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66   pSeg->iTermLeaf
1fa90 4f 66 66 73 65 74 3b 20 20 20 20 20 2f 2a 20 4f  Offset;     /* O
1faa0 66 66 73 65 74 20 6f 6e 20 6e 65 77 20 66 69 72  ffset on new fir
1fab0 73 74 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a  st leaf page */.
1fac0 20 20 20 20 20 20 69 36 34 20 69 4c 65 61 66 52        i64 iLeafR
1fad0 6f 77 69 64 3b 0a 20 20 20 20 20 20 46 74 73 35  owid;.      Fts5
1fae0 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20  Data *pData;.   
1faf0 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53 65     int iId = pSe
1fb00 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b  g->pSeg->iSegid;
1fb10 0a 20 20 20 20 20 20 75 38 20 61 48 64 72 5b 34  .      u8 aHdr[4
1fb20 5d 20 3d 20 7b 30 78 30 30 2c 20 30 78 30 30 2c  ] = {0x00, 0x00,
1fb30 20 30 78 30 30 2c 20 30 78 30 30 7d 3b 0a 0a 20   0x00, 0x00};.. 
1fb40 20 20 20 20 20 69 4c 65 61 66 52 6f 77 69 64 20       iLeafRowid 
1fb50 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
1fb60 4f 57 49 44 28 69 49 64 2c 20 70 53 65 67 2d 3e  OWID(iId, pSeg->
1fb70 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a  iTermLeafPgno);.
1fb80 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 66 74        pData = ft
1fb90 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4c  s5DataRead(p, iL
1fba0 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  eafRowid);.     
1fbb0 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20   if( pData ){.  
1fbc0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1fbd0 5a 65 72 6f 28 26 62 75 66 29 3b 0a 20 20 20 20  Zero(&buf);.    
1fbe0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 47 72      fts5BufferGr
1fbf0 6f 77 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ow(&p->rc, &buf,
1fc00 20 70 44 61 74 61 2d 3e 6e 6e 29 3b 0a 20 20 20   pData->nn);.   
1fc10 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1fc20 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1fc30 2c 20 26 62 75 66 2c 20 73 69 7a 65 6f 66 28 61  , &buf, sizeof(a
1fc40 48 64 72 29 2c 20 61 48 64 72 29 3b 0a 20 20 20  Hdr), aHdr);.   
1fc50 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1fc60 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1fc70 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e  rc, &buf, pSeg->
1fc80 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 20  term.n);.       
1fc90 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1fca0 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62  dBlob(&p->rc, &b
1fcb0 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e  uf, pSeg->term.n
1fcc0 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 29 3b  , pSeg->term.p);
1fcd0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1fce0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1fcf0 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44 61 74  ->rc, &buf, pDat
1fd00 61 2d 3e 73 7a 4c 65 61 66 2d 69 4f 66 66 2c 20  a->szLeaf-iOff, 
1fd10 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 29  &pData->p[iOff])
1fd20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
1fd30 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1fd40 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  {.          /* S
1fd50 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20 66 69  et the szLeaf fi
1fd60 65 6c 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  eld */.         
1fd70 20 66 74 73 35 50 75 74 55 31 36 28 26 62 75 66   fts5PutU16(&buf
1fd80 2e 70 5b 32 5d 2c 20 28 75 31 36 29 62 75 66 2e  .p[2], (u16)buf.
1fd90 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  n);.        }.. 
1fda0 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 75 70         /* Set up
1fdb0 20 74 68 65 20 6e 65 77 20 70 61 67 65 2d 69 6e   the new page-in
1fdc0 64 65 78 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  dex array */.   
1fdd0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1fde0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1fdf0 72 63 2c 20 26 62 75 66 2c 20 34 29 3b 0a 20 20  rc, &buf, 4);.  
1fe00 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e        if( pSeg->
1fe10 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 53 65 67 2d  iLeafPgno==pSeg-
1fe20 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 0a  >iTermLeafPgno .
1fe30 20 20 20 20 20 20 20 20 20 26 26 20 70 53 65 67           && pSeg
1fe40 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3c  ->iEndofDoclist<
1fe50 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 0a 20  pData->szLeaf . 
1fe60 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
1fe70 20 20 20 20 69 6e 74 20 6e 44 69 66 66 20 3d 20      int nDiff = 
1fe80 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 2d 20  pData->szLeaf - 
1fe90 70 53 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  pSeg->iEndofDocl
1fea0 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ist;.          f
1feb0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1fec0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
1fed0 75 66 2c 20 62 75 66 2e 6e 20 2d 20 31 20 2d 20  uf, buf.n - 1 - 
1fee0 6e 44 69 66 66 20 2d 20 34 29 3b 0a 20 20 20 20  nDiff - 4);.    
1fef0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1ff00 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1ff10 63 2c 20 26 62 75 66 2c 20 0a 20 20 20 20 20 20  c, &buf, .      
1ff20 20 20 20 20 20 20 20 20 70 44 61 74 61 2d 3e 6e          pData->n
1ff30 6e 20 2d 20 70 53 65 67 2d 3e 69 50 67 69 64 78  n - pSeg->iPgidx
1ff40 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b 70  Off, &pData->p[p
1ff50 53 65 67 2d 3e 69 50 67 69 64 78 4f 66 66 5d 0a  Seg->iPgidxOff].
1ff60 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
1ff70 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1ff80 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1ff90 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
1ffa0 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f  pSeg->pSeg->pgno
1ffb0 46 69 72 73 74 20 3d 20 70 53 65 67 2d 3e 69 54  First = pSeg->iT
1ffc0 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20  ermLeafPgno;.   
1ffd0 20 20 20 20 20 66 74 73 35 44 61 74 61 44 65 6c       fts5DataDel
1ffe0 65 74 65 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ete(p, FTS5_SEGM
1fff0 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 31  ENT_ROWID(iId, 1
20000 29 2c 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a  ), iLeafRowid);.
20010 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
20020 57 72 69 74 65 28 70 2c 20 69 4c 65 61 66 52 6f  Write(p, iLeafRo
20030 77 69 64 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e  wid, buf.p, buf.
20040 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
20050 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66  }.  }.  fts5Buff
20060 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a  erFree(&buf);.}.
20070 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
20080 35 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62  5MergeChunkCallb
20090 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ack(.  Fts5Index
200a0 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43   *p, .  void *pC
200b0 74 78 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20  tx, .  const u8 
200c0 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68  *pChunk, int nCh
200d0 75 6e 6b 0a 29 7b 0a 20 20 46 74 73 35 53 65 67  unk.){.  Fts5Seg
200e0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20  Writer *pWriter 
200f0 3d 20 28 46 74 73 35 53 65 67 57 72 69 74 65 72  = (Fts5SegWriter
20100 2a 29 70 43 74 78 3b 0a 20 20 66 74 73 35 57 72  *)pCtx;.  fts5Wr
20110 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  iteAppendPoslist
20120 44 61 74 61 28 70 2c 20 70 57 72 69 74 65 72 2c  Data(p, pWriter,
20130 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29   pChunk, nChunk)
20140 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74  ;.}../*.**.*/.st
20150 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
20160 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 0a 20  dexMergeLevel(. 
20170 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
20180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20190 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
201a0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
201b0 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53  5Structure **ppS
201c0 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20  truct,       /* 
201d0 49 4e 2f 4f 55 54 3a 20 53 74 75 63 74 75 72 65  IN/OUT: Stucture
201e0 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   of index */.  i
201f0 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20  nt iLvl,        
20200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20210 2a 20 4c 65 76 65 6c 20 74 6f 20 72 65 61 64 20  * Level to read 
20220 69 6e 70 75 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  input from */.  
20230 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20 20 20 20  int *pnRem      
20240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20250 2f 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20 74  /* Write up to t
20260 68 69 73 20 6d 61 6e 79 20 6f 75 74 70 75 74 20  his many output 
20270 6c 65 61 76 65 73 20 2a 2f 0a 29 7b 0a 20 20 46  leaves */.){.  F
20280 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
20290 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
202a0 74 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  t;.  Fts5Structu
202b0 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
202c0 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
202d0 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74 73 35 53 74  [iLvl];.  Fts5St
202e0 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
202f0 76 6c 4f 75 74 3b 0a 20 20 46 74 73 35 49 74 65  vlOut;.  Fts5Ite
20300 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 20 20 20  r *pIter = 0;   
20310 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
20320 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 64 61  to read input da
20330 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d  ta */.  int nRem
20340 20 3d 20 70 6e 52 65 6d 20 3f 20 2a 70 6e 52 65   = pnRem ? *pnRe
20350 6d 20 3a 20 30 3b 20 20 2f 2a 20 4f 75 74 70 75  m : 0;  /* Outpu
20360 74 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66  t leaf pages lef
20370 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  t to write */.  
20380 69 6e 74 20 6e 49 6e 70 75 74 3b 20 20 20 20 20  int nInput;     
20390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70  /* Number of inp
203b0 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  ut segments */. 
203c0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77   Fts5SegWriter w
203d0 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  riter;          
203e0 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63   /* Writer objec
203f0 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  t */.  Fts5Struc
20400 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
20410 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  g;     /* Output
20420 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74   segment */.  Ft
20430 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 0a 20  s5Buffer term;. 
20440 20 69 6e 74 20 62 4f 6c 64 65 73 74 3b 20 20 20   int bOldest;   
20450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20460 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
20470 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 69  output segment i
20480 73 20 74 68 65 20 6f 6c 64 65 73 74 20 2a 2f 0a  s the oldest */.
20490 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20    int eDetail = 
204a0 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
204b0 61 69 6c 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  ail;.  const int
204c0 20 66 6c 61 67 73 20 3d 20 46 54 53 35 49 4e 44   flags = FTS5IND
204d0 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55  EX_QUERY_NOOUTPU
204e0 54 3b 0a 20 20 69 6e 74 20 62 54 65 72 6d 57 72  T;.  int bTermWr
204f0 69 74 74 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  itten = 0;      
20500 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
20510 63 75 72 72 65 6e 74 20 74 65 72 6d 20 61 6c 72  current term alr
20520 65 61 64 79 20 6f 75 74 70 75 74 20 2a 2f 0a 0a  eady output */..
20530 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70    assert( iLvl<p
20540 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29  Struct->nLevel )
20550 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c  ;.  assert( pLvl
20560 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e  ->nMerge<=pLvl->
20570 6e 53 65 67 20 29 3b 0a 0a 20 20 6d 65 6d 73 65  nSeg );..  memse
20580 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69  t(&writer, 0, si
20590 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72 69 74  zeof(Fts5SegWrit
205a0 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  er));.  memset(&
205b0 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  term, 0, sizeof(
205c0 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20  Fts5Buffer));.  
205d0 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  if( pLvl->nMerge
205e0 20 29 7b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20   ){.    pLvlOut 
205f0 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
20600 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 20 20 20 20  el[iLvl+1];.    
20610 61 73 73 65 72 74 28 20 70 4c 76 6c 4f 75 74 2d  assert( pLvlOut-
20620 3e 6e 53 65 67 3e 30 20 29 3b 0a 20 20 20 20 6e  >nSeg>0 );.    n
20630 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d  Input = pLvl->nM
20640 65 72 67 65 3b 0a 20 20 20 20 70 53 65 67 20 3d  erge;.    pSeg =
20650 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b   &pLvlOut->aSeg[
20660 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d  pLvlOut->nSeg-1]
20670 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  ;..    fts5Write
20680 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c  Init(p, &writer,
20690 20 70 53 65 67 2d 3e 69 53 65 67 69 64 29 3b 0a   pSeg->iSegid);.
206a0 20 20 20 20 77 72 69 74 65 72 2e 77 72 69 74 65      writer.write
206b0 72 2e 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70  r.pgno = pSeg->p
206c0 67 6e 6f 4c 61 73 74 2b 31 3b 0a 20 20 20 20 77  gnoLast+1;.    w
206d0 72 69 74 65 72 2e 69 42 74 50 61 67 65 20 3d 20  riter.iBtPage = 
206e0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
206f0 69 6e 74 20 69 53 65 67 69 64 20 3d 20 66 74 73  int iSegid = fts
20700 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70  5AllocateSegid(p
20710 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 20  , pStruct);..   
20720 20 2f 2a 20 45 78 74 65 6e 64 20 74 68 65 20 46   /* Extend the F
20730 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a  ts5Structure obj
20740 65 63 74 20 61 73 20 72 65 71 75 69 72 65 64 20  ect as required 
20750 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 6f 75  to ensure the ou
20760 74 70 75 74 0a 20 20 20 20 2a 2a 20 73 65 67 6d  tput.    ** segm
20770 65 6e 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20  ent exists. */. 
20780 20 20 20 69 66 28 20 69 4c 76 6c 3d 3d 70 53 74     if( iLvl==pSt
20790 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d 31 20 29  ruct->nLevel-1 )
207a0 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75  {.      fts5Stru
207b0 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26 70  ctureAddLevel(&p
207c0 2d 3e 72 63 2c 20 70 70 53 74 72 75 63 74 29 3b  ->rc, ppStruct);
207d0 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 20 3d  .      pStruct =
207e0 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20   *ppStruct;.    
207f0 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  }.    fts5Struct
20800 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26  ureExtendLevel(&
20810 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20  p->rc, pStruct, 
20820 69 4c 76 6c 2b 31 2c 20 31 2c 20 30 29 3b 0a 20  iLvl+1, 1, 0);. 
20830 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72     if( p->rc ) r
20840 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 76 6c 20  eturn;.    pLvl 
20850 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
20860 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 70 4c  el[iLvl];.    pL
20870 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74  vlOut = &pStruct
20880 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d  ->aLevel[iLvl+1]
20890 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  ;..    fts5Write
208a0 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c  Init(p, &writer,
208b0 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20 2f   iSegid);..    /
208c0 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 73 65  * Add the new se
208d0 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 6f 75 74  gment to the out
208e0 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  put level */.   
208f0 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74   pSeg = &pLvlOut
20900 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e  ->aSeg[pLvlOut->
20910 6e 53 65 67 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f  nSeg];.    pLvlO
20920 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20  ut->nSeg++;.    
20930 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
20940 3d 20 31 3b 0a 20 20 20 20 70 53 65 67 2d 3e 69  = 1;.    pSeg->i
20950 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a  Segid = iSegid;.
20960 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65      pStruct->nSe
20970 67 6d 65 6e 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  gment++;..    /*
20980 20 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d   Read input from
20990 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e   all segments in
209a0 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c   the input level
209b0 20 2a 2f 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d   */.    nInput =
209c0 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 7d   pLvl->nSeg;.  }
209d0 0a 20 20 62 4f 6c 64 65 73 74 20 3d 20 28 70 4c  .  bOldest = (pL
209e0 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d 31 20 26  vlOut->nSeg==1 &
209f0 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  & pStruct->nLeve
20a00 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a 20 20 61  l==iLvl+2);..  a
20a10 73 73 65 72 74 28 20 69 4c 76 6c 3e 3d 30 20 29  ssert( iLvl>=0 )
20a20 3b 0a 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74  ;.  for(fts5Mult
20a30 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72  iIterNew(p, pStr
20a40 75 63 74 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30  uct, flags, 0, 0
20a50 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e 49 6e 70 75  , 0, iLvl, nInpu
20a60 74 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20  t, &pIter);.    
20a70 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45    fts5MultiIterE
20a80 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b  of(p, pIter)==0;
20a90 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
20aa0 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
20ab0 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20  r, 0, 0).  ){.  
20ac0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
20ad0 53 65 67 49 74 65 72 20 3d 20 26 70 49 74 65 72  SegIter = &pIter
20ae0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
20af0 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
20b00 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b  ];.    int nPos;
20b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b20 20 20 20 20 20 2f 2a 20 70 6f 73 69 74 69 6f 6e       /* position
20b30 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64  -list size field
20b40 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e   value */.    in
20b50 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 63 6f 6e  t nTerm;.    con
20b60 73 74 20 75 38 20 2a 70 54 65 72 6d 3b 0a 0a 20  st u8 *pTerm;.. 
20b70 20 20 20 70 54 65 72 6d 20 3d 20 66 74 73 35 4d     pTerm = fts5M
20b80 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49 74  ultiIterTerm(pIt
20b90 65 72 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20  er, &nTerm);.   
20ba0 20 69 66 28 20 6e 54 65 72 6d 21 3d 74 65 72 6d   if( nTerm!=term
20bb0 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 65  .n || memcmp(pTe
20bc0 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65 72  rm, term.p, nTer
20bd0 6d 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m) ){.      if( 
20be0 70 6e 52 65 6d 20 26 26 20 77 72 69 74 65 72 2e  pnRem && writer.
20bf0 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e 52 65  nLeafWritten>nRe
20c00 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  m ){.        bre
20c10 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
20c20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
20c30 26 70 2d 3e 72 63 2c 20 26 74 65 72 6d 2c 20 6e  &p->rc, &term, n
20c40 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
20c50 20 20 20 20 62 54 65 72 6d 57 72 69 74 74 65 6e      bTermWritten
20c60 20 3d 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   =0;.    }..    
20c70 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6b 65 79  /* Check for key
20c80 20 61 6e 6e 69 68 69 6c 61 74 69 6f 6e 2e 20 2a   annihilation. *
20c90 2f 0a 20 20 20 20 69 66 28 20 70 53 65 67 49 74  /.    if( pSegIt
20ca0 65 72 2d 3e 6e 50 6f 73 3d 3d 30 20 26 26 20 28  er->nPos==0 && (
20cb0 62 4f 6c 64 65 73 74 20 7c 7c 20 70 53 65 67 49  bOldest || pSegI
20cc0 74 65 72 2d 3e 62 44 65 6c 3d 3d 30 29 20 29 20  ter->bDel==0) ) 
20cd0 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 69  continue;..    i
20ce0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
20cf0 5f 4f 4b 20 26 26 20 62 54 65 72 6d 57 72 69 74  _OK && bTermWrit
20d00 74 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ten==0 ){.      
20d10 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 65 77  /* This is a new
20d20 20 74 65 72 6d 2e 20 41 70 70 65 6e 64 20 61 20   term. Append a 
20d30 74 65 72 6d 20 74 6f 20 74 68 65 20 6f 75 74 70  term to the outp
20d40 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20  ut segment. */. 
20d50 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70       fts5WriteAp
20d60 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72 69  pendTerm(p, &wri
20d70 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  ter, nTerm, pTer
20d80 6d 29 3b 0a 20 20 20 20 20 20 62 54 65 72 6d 57  m);.      bTermW
20d90 72 69 74 74 65 6e 20 3d 20 31 3b 0a 20 20 20 20  ritten = 1;.    
20da0 7d 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  }..    /* Append
20db0 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20 74 68   the rowid to th
20dc0 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  e output */.    
20dd0 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53  /* WRITEPOSLISTS
20de0 49 5a 45 20 2a 2f 0a 20 20 20 20 66 74 73 35 57  IZE */.    fts5W
20df0 72 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28  riteAppendRowid(
20e00 70 2c 20 26 77 72 69 74 65 72 2c 20 66 74 73 35  p, &writer, fts5
20e10 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70  MultiIterRowid(p
20e20 49 74 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28  Iter));..    if(
20e30 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44   eDetail==FTS5_D
20e40 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
20e50 20 20 20 20 69 66 28 20 70 53 65 67 49 74 65 72      if( pSegIter
20e60 2d 3e 62 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ->bDel ){.      
20e70 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
20e80 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
20e90 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e   &writer.writer.
20ea0 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  buf, 0);.       
20eb0 20 69 66 28 20 70 53 65 67 49 74 65 72 2d 3e 6e   if( pSegIter->n
20ec0 50 6f 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Pos>0 ){.       
20ed0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
20ee0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
20ef0 2c 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72  , &writer.writer
20f00 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20  .buf, 0);.      
20f10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
20f20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
20f30 41 70 70 65 6e 64 20 74 68 65 20 70 6f 73 69 74  Append the posit
20f40 69 6f 6e 2d 6c 69 73 74 20 64 61 74 61 20 74 6f  ion-list data to
20f50 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20   the output */. 
20f60 20 20 20 20 20 6e 50 6f 73 20 3d 20 70 53 65 67       nPos = pSeg
20f70 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 20 2b 20 70  Iter->nPos*2 + p
20f80 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 3b 0a 20  SegIter->bDel;. 
20f90 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
20fa0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
20fb0 72 63 2c 20 26 77 72 69 74 65 72 2e 77 72 69 74  rc, &writer.writ
20fc0 65 72 2e 62 75 66 2c 20 6e 50 6f 73 29 3b 0a 20  er.buf, nPos);. 
20fd0 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74       fts5ChunkIt
20fe0 65 72 61 74 65 28 70 2c 20 70 53 65 67 49 74 65  erate(p, pSegIte
20ff0 72 2c 20 28 76 6f 69 64 2a 29 26 77 72 69 74 65  r, (void*)&write
21000 72 2c 20 66 74 73 35 4d 65 72 67 65 43 68 75 6e  r, fts5MergeChun
21010 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  kCallback);.    
21020 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73  }.  }..  /* Flus
21030 68 20 74 68 65 20 6c 61 73 74 20 6c 65 61 66 20  h the last leaf 
21040 70 61 67 65 20 74 6f 20 64 69 73 6b 2e 20 53 65  page to disk. Se
21050 74 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  t the output seg
21060 6d 65 6e 74 20 62 2d 74 72 65 65 20 68 65 69 67  ment b-tree heig
21070 68 74 0a 20 20 2a 2a 20 61 6e 64 20 6c 61 73 74  ht.  ** and last
21080 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
21090 72 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  r at the same ti
210a0 6d 65 2e 20 20 2a 2f 0a 20 20 66 74 73 35 57 72  me.  */.  fts5Wr
210b0 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72  iteFinish(p, &wr
210c0 69 74 65 72 2c 20 26 70 53 65 67 2d 3e 70 67 6e  iter, &pSeg->pgn
210d0 6f 4c 61 73 74 29 3b 0a 0a 20 20 69 66 28 20 66  oLast);..  if( f
210e0 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
210f0 70 2c 20 70 49 74 65 72 29 20 29 7b 0a 20 20 20  p, pIter) ){.   
21100 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20   int i;..    /* 
21110 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e  Remove the redun
21120 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72  dant segments fr
21130 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61  om the %_data ta
21140 62 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ble */.    for(i
21150 3d 30 3b 20 69 3c 6e 49 6e 70 75 74 3b 20 69 2b  =0; i<nInput; i+
21160 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61  +){.      fts5Da
21170 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28  taRemoveSegment(
21180 70 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d  p, pLvl->aSeg[i]
21190 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20 7d 0a  .iSegid);.    }.
211a0 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  .    /* Remove t
211b0 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67  he redundant seg
211c0 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 69  ments from the i
211d0 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  nput level */.  
211e0 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67    if( pLvl->nSeg
211f0 21 3d 6e 49 6e 70 75 74 20 29 7b 0a 20 20 20 20  !=nInput ){.    
21200 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 28 70    int nMove = (p
21210 4c 76 6c 2d 3e 6e 53 65 67 20 2d 20 6e 49 6e 70  Lvl->nSeg - nInp
21220 75 74 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  ut) * sizeof(Fts
21230 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
21240 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76  t);.      memmov
21250 65 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 26 70  e(pLvl->aSeg, &p
21260 4c 76 6c 2d 3e 61 53 65 67 5b 6e 49 6e 70 75 74  Lvl->aSeg[nInput
21270 5d 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 7d  ], nMove);.    }
21280 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53  .    pStruct->nS
21290 65 67 6d 65 6e 74 20 2d 3d 20 6e 49 6e 70 75 74  egment -= nInput
212a0 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67  ;.    pLvl->nSeg
212b0 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20   -= nInput;.    
212c0 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 30  pLvl->nMerge = 0
212d0 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e  ;.    if( pSeg->
212e0 70 67 6e 6f 4c 61 73 74 3d 3d 30 20 29 7b 0a 20  pgnoLast==0 ){. 
212f0 20 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53       pLvlOut->nS
21300 65 67 2d 2d 3b 0a 20 20 20 20 20 20 70 53 74 72  eg--;.      pStr
21310 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2d 2d 3b  uct->nSegment--;
21320 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
21330 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 67      assert( pSeg
21340 2d 3e 70 67 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a  ->pgnoLast>0 );.
21350 20 20 20 20 66 74 73 35 54 72 69 6d 53 65 67 6d      fts5TrimSegm
21360 65 6e 74 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  ents(p, pIter);.
21370 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65      pLvl->nMerge
21380 20 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a   = nInput;.  }..
21390 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46    fts5MultiIterF
213a0 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 66 74  ree(pIter);.  ft
213b0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65  s5BufferFree(&te
213c0 72 6d 29 3b 0a 20 20 69 66 28 20 70 6e 52 65 6d  rm);.  if( pnRem
213d0 20 29 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69   ) *pnRem -= wri
213e0 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e  ter.nLeafWritten
213f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 75 70  ;.}../*.** Do up
21400 20 74 6f 20 6e 50 67 20 70 61 67 65 73 20 6f 66   to nPg pages of
21410 20 61 75 74 6f 6d 65 72 67 65 20 77 6f 72 6b 20   automerge work 
21420 6f 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  on the index..**
21430 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
21440 69 66 20 61 6e 79 20 63 68 61 6e 67 65 73 20 77  if any changes w
21450 65 72 65 20 61 63 74 75 61 6c 6c 79 20 6d 61 64  ere actually mad
21460 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  e, or false othe
21470 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
21480 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 4d 65   int fts5IndexMe
21490 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rge(.  Fts5Index
214a0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
214b0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
214c0 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
214d0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
214e0 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20   **ppStruct,    
214f0 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75     /* IN/OUT: Cu
21500 72 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20  rrent structure 
21510 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  of index */.  in
21520 74 20 6e 50 67 2c 20 20 20 20 20 20 20 20 20 20  t nPg,          
21530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21540 20 50 61 67 65 73 20 6f 66 20 77 6f 72 6b 20 74   Pages of work t
21550 6f 20 64 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  o do */.  int nM
21560 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  in              
21570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e            /* Min
21580 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
21590 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67 65  egments to merge
215a0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65   */.){.  int nRe
215b0 6d 20 3d 20 6e 50 67 3b 0a 20 20 69 6e 74 20 62  m = nPg;.  int b
215c0 52 65 74 20 3d 20 30 3b 0a 20 20 46 74 73 35 53  Ret = 0;.  Fts5S
215d0 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
215e0 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
215f0 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 26   while( nRem>0 &
21600 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
21610 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c  OK ){.    int iL
21620 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  vl;             
21630 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72        /* To iter
21640 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65  ate through leve
21650 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  ls */.    int iB
21660 65 73 74 4c 76 6c 20 3d 20 30 3b 20 20 20 20 20  estLvl = 0;     
21670 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f        /* Level o
21680 66 66 65 72 69 6e 67 20 74 68 65 20 6d 6f 73 74  ffering the most
21690 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
216a0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 65 73 74  */.    int nBest
216b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
216c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
216d0 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f  input segments o
216e0 6e 20 62 65 73 74 20 6c 65 76 65 6c 20 2a 2f 0a  n best level */.
216f0 0a 20 20 20 20 2f 2a 20 53 65 74 20 69 42 65 73  .    /* Set iBes
21700 74 4c 76 6c 20 74 6f 20 74 68 65 20 6c 65 76 65  tLvl to the leve
21710 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20  l to read input 
21720 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 2e 20 2a  segments from. *
21730 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  /.    assert( pS
21740 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20  truct->nLevel>0 
21750 29 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  );.    for(iLvl=
21760 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
21770 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
21780 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  {.      Fts5Stru
21790 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
217a0 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
217b0 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20  vel[iLvl];.     
217c0 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67   if( pLvl->nMerg
217d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
217e0 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42   pLvl->nMerge>nB
217f0 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  est ){.         
21800 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c   iBestLvl = iLvl
21810 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 65 73  ;.          nBes
21820 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  t = pLvl->nMerge
21830 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21840 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
21850 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76   }.      if( pLv
21860 6c 2d 3e 6e 53 65 67 3e 6e 42 65 73 74 20 29 7b  l->nSeg>nBest ){
21870 0a 20 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d  .        nBest =
21880 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20   pLvl->nSeg;.   
21890 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20       iBestLvl = 
218a0 69 4c 76 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iLvl;.      }.  
218b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
218c0 42 65 73 74 20 69 73 20 73 74 69 6c 6c 20 30 2c  Best is still 0,
218d0 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20   then the index 
218e0 6d 75 73 74 20 62 65 20 65 6d 70 74 79 2e 20 2a  must be empty. *
218f0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
21900 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 69 4c  DEBUG.    for(iL
21910 76 6c 3d 30 3b 20 6e 42 65 73 74 3d 3d 30 20 26  vl=0; nBest==0 &
21920 26 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  & iLvl<pStruct->
21930 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
21940 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21950 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
21960 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a  Lvl].nSeg==0 );.
21970 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
21980 20 20 69 66 28 20 6e 42 65 73 74 3c 6e 4d 69 6e    if( nBest<nMin
21990 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65   && pStruct->aLe
219a0 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d  vel[iBestLvl].nM
219b0 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erge==0 ){.     
219c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
219d0 20 20 62 52 65 74 20 3d 20 31 3b 0a 20 20 20 20    bRet = 1;.    
219e0 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65  fts5IndexMergeLe
219f0 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74 2c  vel(p, &pStruct,
21a00 20 69 42 65 73 74 4c 76 6c 2c 20 26 6e 52 65 6d   iBestLvl, &nRem
21a10 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
21a20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
21a30 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
21a40 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d  BestLvl].nMerge=
21a50 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  =0 ){.      fts5
21a60 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
21a70 28 70 2c 20 69 42 65 73 74 4c 76 6c 2b 31 2c 20  (p, iBestLvl+1, 
21a80 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a  pStruct);.    }.
21a90 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74 20    }.  *ppStruct 
21aa0 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 72 65 74  = pStruct;.  ret
21ab0 75 72 6e 20 62 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn bRet;.}../*.
21ac0 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 6e 4c  ** A total of nL
21ad0 65 61 66 20 6c 65 61 66 20 70 61 67 65 73 20 6f  eaf leaf pages o
21ae0 66 20 64 61 74 61 20 68 61 73 20 6a 75 73 74 20  f data has just 
21af0 62 65 65 6e 20 66 6c 75 73 68 65 64 20 74 6f 20  been flushed to 
21b00 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73 65 67  a level-0.** seg
21b10 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74  ment. This funct
21b20 69 6f 6e 20 75 70 64 61 74 65 73 20 74 68 65 20  ion updates the 
21b30 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 61 63  write-counter ac
21b40 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20 69  cordingly and, i
21b50 66 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2c 20  f.** necessary, 
21b60 70 65 72 66 6f 72 6d 73 20 69 6e 63 72 65 6d 65  performs increme
21b70 6e 74 61 6c 20 6d 65 72 67 65 20 77 6f 72 6b 2e  ntal merge work.
21b80 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
21b90 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74  or occurs, set t
21ba0 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  he Fts5Index.rc 
21bb0 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61  error code. If a
21bc0 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20  n error has .** 
21bd0 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
21be0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
21bf0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
21c00 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
21c10 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28 0a 20  ndexAutomerge(. 
21c20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
21c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c40 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
21c50 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
21c60 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53  5Structure **ppS
21c70 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20  truct,       /* 
21c80 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20  IN/OUT: Current 
21c90 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64  structure of ind
21ca0 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61  ex */.  int nLea
21cb0 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
21cc0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21cd0 72 20 6f 66 20 6f 75 74 70 75 74 20 6c 65 61 76  r of output leav
21ce0 65 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  es just written 
21cf0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  */.){.  if( p->r
21d00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21d10 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74  p->pConfig->nAut
21d20 6f 6d 65 72 67 65 3e 30 20 29 7b 0a 20 20 20 20  omerge>0 ){.    
21d30 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
21d40 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
21d50 63 74 3b 0a 20 20 20 20 75 36 34 20 6e 57 72 69  ct;.    u64 nWri
21d60 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
21d70 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
21d80 20 76 61 6c 75 65 20 6f 66 20 77 72 69 74 65 2d   value of write-
21d90 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
21da0 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20 20  nt nWork;       
21db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21dc0 4e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 2d 71  Number of work-q
21dd0 75 61 6e 74 61 20 74 6f 20 70 65 72 66 6f 72 6d  uanta to perform
21de0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d   */.    int nRem
21df0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21e00 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21e10 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65  of leaf pages le
21e20 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 0a  ft to write */..
21e30 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
21e40 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 2e  e write-counter.
21e50 20 57 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c   While doing so,
21e60 20 73 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20   set nWork. */. 
21e70 20 20 20 6e 57 72 69 74 65 20 3d 20 70 53 74 72     nWrite = pStr
21e80 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74  uct->nWriteCount
21e90 65 72 3b 0a 20 20 20 20 6e 57 6f 72 6b 20 3d 20  er;.    nWork = 
21ea0 28 69 6e 74 29 28 28 28 6e 57 72 69 74 65 20 2b  (int)(((nWrite +
21eb0 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e 57 6f   nLeaf) / p->nWo
21ec0 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72 69 74  rkUnit) - (nWrit
21ed0 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74  e / p->nWorkUnit
21ee0 29 29 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d  ));.    pStruct-
21ef0 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20 2b  >nWriteCounter +
21f00 3d 20 6e 4c 65 61 66 3b 0a 20 20 20 20 6e 52 65  = nLeaf;.    nRe
21f10 6d 20 3d 20 28 69 6e 74 29 28 70 2d 3e 6e 57 6f  m = (int)(p->nWo
21f20 72 6b 55 6e 69 74 20 2a 20 6e 57 6f 72 6b 20 2a  rkUnit * nWork *
21f30 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
21f40 29 3b 0a 0a 20 20 20 20 66 74 73 35 49 6e 64 65  );..    fts5Inde
21f50 78 4d 65 72 67 65 28 70 2c 20 70 70 53 74 72 75  xMerge(p, ppStru
21f60 63 74 2c 20 6e 52 65 6d 2c 20 70 2d 3e 70 43 6f  ct, nRem, p->pCo
21f70 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65  nfig->nAutomerge
21f80 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
21f90 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 43   void fts5IndexC
21fa0 72 69 73 69 73 6d 65 72 67 65 28 0a 20 20 46 74  risismerge(.  Ft
21fb0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
21fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21fd0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
21fe0 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
21ff0 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75  ructure **ppStru
22000 63 74 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ct        /* IN/
22010 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72  OUT: Current str
22020 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20  ucture of index 
22030 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  */.){.  const in
22040 74 20 6e 43 72 69 73 69 73 20 3d 20 70 2d 3e 70  t nCrisis = p->p
22050 43 6f 6e 66 69 67 2d 3e 6e 43 72 69 73 69 73 4d  Config->nCrisisM
22060 65 72 67 65 3b 0a 20 20 46 74 73 35 53 74 72 75  erge;.  Fts5Stru
22070 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
22080 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 69 6e   *ppStruct;.  in
22090 74 20 69 4c 76 6c 20 3d 20 30 3b 0a 0a 20 20 61  t iLvl = 0;..  a
220a0 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
220b0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 72 75  LITE_OK || pStru
220c0 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a  ct->nLevel>0 );.
220d0 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
220e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 74  SQLITE_OK && pSt
220f0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
22100 6c 5d 2e 6e 53 65 67 3e 3d 6e 43 72 69 73 69 73  l].nSeg>=nCrisis
22110 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65   ){.    fts5Inde
22120 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26  xMergeLevel(p, &
22130 70 53 74 72 75 63 74 2c 20 69 4c 76 6c 2c 20 30  pStruct, iLvl, 0
22140 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22150 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
22160 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  || pStruct->nLev
22170 65 6c 3e 28 69 4c 76 6c 2b 31 29 20 29 3b 0a 20  el>(iLvl+1) );. 
22180 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
22190 50 72 6f 6d 6f 74 65 28 70 2c 20 69 4c 76 6c 2b  Promote(p, iLvl+
221a0 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20  1, pStruct);.   
221b0 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 2a   iLvl++;.  }.  *
221c0 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75  ppStruct = pStru
221d0 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  ct;.}..static in
221e0 74 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  t fts5IndexRetur
221f0 6e 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  n(Fts5Index *p){
22200 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72  .  int rc = p->r
22210 63 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  c;.  p->rc = SQL
22220 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e  ITE_OK;.  return
22230 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20   rc;.}..typedef 
22240 73 74 72 75 63 74 20 46 74 73 35 46 6c 75 73 68  struct Fts5Flush
22250 43 74 78 20 46 74 73 35 46 6c 75 73 68 43 74 78  Ctx Fts5FlushCtx
22260 3b 0a 73 74 72 75 63 74 20 46 74 73 35 46 6c 75  ;.struct Fts5Flu
22270 73 68 43 74 78 20 7b 0a 20 20 46 74 73 35 49 6e  shCtx {.  Fts5In
22280 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 46 74 73  dex *pIdx;.  Fts
22290 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65  5SegWriter write
222a0 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75  r; .};../*.** Bu
222b0 66 66 65 72 20 61 42 75 66 5b 5d 20 63 6f 6e 74  ffer aBuf[] cont
222c0 61 69 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 76  ains a list of v
222d0 61 72 69 6e 74 73 2c 20 61 6c 6c 20 73 6d 61 6c  arints, all smal
222e0 6c 20 65 6e 6f 75 67 68 20 74 6f 20 66 69 74 0a  l enough to fit.
222f0 2a 2a 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69  ** in a 32-bit i
22300 6e 74 65 67 65 72 2e 20 52 65 74 75 72 6e 20 74  nteger. Return t
22310 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6c  he size of the l
22320 61 72 67 65 73 74 20 70 72 65 66 69 78 20 6f 66  argest prefix of
22330 20 74 68 69 73 20 0a 2a 2a 20 6c 69 73 74 20 6e   this .** list n
22340 4d 61 78 20 62 79 74 65 73 20 6f 72 20 6c 65 73  Max bytes or les
22350 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.st
22360 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f 73  atic int fts5Pos
22370 6c 69 73 74 50 72 65 66 69 78 28 63 6f 6e 73 74  listPrefix(const
22380 20 75 38 20 2a 61 42 75 66 2c 20 69 6e 74 20 6e   u8 *aBuf, int n
22390 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b  Max){.  int ret;
223a0 0a 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20  .  u32 dummy;.  
223b0 72 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72  ret = fts5GetVar
223c0 69 6e 74 33 32 28 61 42 75 66 2c 20 64 75 6d 6d  int32(aBuf, dumm
223d0 79 29 3b 0a 20 20 69 66 28 20 72 65 74 3c 6e 4d  y);.  if( ret<nM
223e0 61 78 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  ax ){.    while(
223f0 20 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20   1 ){.      int 
22400 69 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e  i = fts5GetVarin
22410 74 33 32 28 26 61 42 75 66 5b 72 65 74 5d 2c 20  t32(&aBuf[ret], 
22420 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69 66  dummy);.      if
22430 28 20 28 72 65 74 20 2b 20 69 29 20 3e 20 6e 4d  ( (ret + i) > nM
22440 61 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ax ) break;.    
22450 20 20 72 65 74 20 2b 3d 20 69 3b 0a 20 20 20 20    ret += i;.    
22460 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
22470 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75  et;.}../*.** Flu
22480 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  sh the contents 
22490 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  of in-memory has
224a0 68 20 74 61 62 6c 65 20 69 48 61 73 68 20 74 6f  h table iHash to
224b0 20 61 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 0a   a new level-0 .
224c0 2a 2a 20 73 65 67 6d 65 6e 74 20 6f 6e 20 64 69  ** segment on di
224d0 73 6b 2e 20 41 6c 73 6f 20 75 70 64 61 74 65 20  sk. Also update 
224e0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
224f0 67 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f  g structure reco
22500 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rd..**.** If an 
22510 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
22520 74 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e  t the Fts5Index.
22530 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  rc error code. I
22540 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
22550 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
22560 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
22570 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
22580 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
22590 73 35 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 46  s5FlushOneHash(F
225a0 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
225b0 46 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 20  Fts5Hash *pHash 
225c0 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 46 74  = p->pHash;.  Ft
225d0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
225e0 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 53 65 67  ruct;.  int iSeg
225f0 69 64 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61  id;.  int pgnoLa
22600 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
22610 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
22620 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
22630 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 0a   in segment */..
22640 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 72 65    /* Obtain a re
22650 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69  ference to the i
22660 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 61  ndex structure a
22670 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  nd allocate a ne
22680 77 20 73 65 67 6d 65 6e 74 2d 69 64 0a 20 20 2a  w segment-id.  *
22690 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6c 65  * for the new le
226a0 76 65 6c 2d 30 20 73 65 67 6d 65 6e 74 2e 20 20  vel-0 segment.  
226b0 2a 2f 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66  */.  pStruct = f
226c0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
226d0 28 70 29 3b 0a 20 20 69 53 65 67 69 64 20 3d 20  (p);.  iSegid = 
226e0 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69  fts5AllocateSegi
226f0 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  d(p, pStruct);. 
22700 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e   fts5StructureIn
22710 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 0a 20 20  validate(p);..  
22720 69 66 28 20 69 53 65 67 69 64 20 29 7b 0a 20 20  if( iSegid ){.  
22730 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a    const int pgsz
22740 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70   = p->pConfig->p
22750 67 73 7a 3b 0a 20 20 20 20 69 6e 74 20 65 44 65  gsz;.    int eDe
22760 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  tail = p->pConfi
22770 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 20 20  g->eDetail;.    
22780 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
22790 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a  ment *pSeg;   /*
227a0 20 4e 65 77 20 73 65 67 6d 65 6e 74 20 77 69 74   New segment wit
227b0 68 69 6e 20 70 53 74 72 75 63 74 20 2a 2f 0a 20  hin pStruct */. 
227c0 20 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70     Fts5Buffer *p
227d0 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Buf;            
227e0 20 2f 2a 20 42 75 66 66 65 72 20 69 6e 20 77 68   /* Buffer in wh
227f0 69 63 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20  ich to assemble 
22800 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20  leaf page */.   
22810 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 50 67   Fts5Buffer *pPg
22820 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f  idx;           /
22830 2a 20 42 75 66 66 65 72 20 69 6e 20 77 68 69 63  * Buffer in whic
22840 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 70 67  h to assemble pg
22850 69 64 78 20 2a 2f 0a 0a 20 20 20 20 46 74 73 35  idx */..    Fts5
22860 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65 72  SegWriter writer
22870 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 49  ;.    fts5WriteI
22880 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20  nit(p, &writer, 
22890 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20 70 42  iSegid);..    pB
228a0 75 66 20 3d 20 26 77 72 69 74 65 72 2e 77 72 69  uf = &writer.wri
228b0 74 65 72 2e 62 75 66 3b 0a 20 20 20 20 70 50 67  ter.buf;.    pPg
228c0 69 64 78 20 3d 20 26 77 72 69 74 65 72 2e 77 72  idx = &writer.wr
228d0 69 74 65 72 2e 70 67 69 64 78 3b 0a 0a 20 20 20  iter.pgidx;..   
228e0 20 2f 2a 20 66 74 73 35 57 72 69 74 65 49 6e 69   /* fts5WriteIni
228f0 74 28 29 20 73 68 6f 75 6c 64 20 68 61 76 65 20  t() should have 
22900 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20  initialized the 
22910 62 75 66 66 65 72 73 20 74 6f 20 28 6d 6f 73 74  buffers to (most
22920 20 6c 69 6b 65 6c 79 29 0a 20 20 20 20 2a 2a 20   likely).    ** 
22930 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63  the maximum spac
22940 65 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  e required. */. 
22950 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
22960 20 7c 7c 20 70 42 75 66 2d 3e 6e 53 70 61 63 65   || pBuf->nSpace
22970 3e 3d 28 70 67 73 7a 20 2b 20 46 54 53 35 5f 44  >=(pgsz + FTS5_D
22980 41 54 41 5f 50 41 44 44 49 4e 47 29 20 29 3b 0a  ATA_PADDING) );.
22990 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
229a0 63 20 7c 7c 20 70 50 67 69 64 78 2d 3e 6e 53 70  c || pPgidx->nSp
229b0 61 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46 54 53  ace>=(pgsz + FTS
229c0 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29 20  5_DATA_PADDING) 
229d0 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e  );..    /* Begin
229e0 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
229f0 68 20 68 61 73 68 20 74 61 62 6c 65 20 65 6e 74  h hash table ent
22a00 72 69 65 73 2e 20 54 68 69 73 20 6c 6f 6f 70 20  ries. This loop 
22a10 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
22a20 63 68 0a 20 20 20 20 2a 2a 20 74 65 72 6d 2f 64  ch.    ** term/d
22a30 6f 63 6c 69 73 74 20 63 75 72 72 65 6e 74 6c 79  oclist currently
22a40 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74   stored within t
22a50 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a  he hash table. *
22a60 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  /.    if( p->rc=
22a70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22a80 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
22a90 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 49  te3Fts5HashScanI
22aa0 6e 69 74 28 70 48 61 73 68 2c 20 30 2c 20 30 29  nit(pHash, 0, 0)
22ab0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
22ac0 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
22ad0 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  _OK && 0==sqlite
22ae0 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6f 66  3Fts5HashScanEof
22af0 28 70 48 61 73 68 29 20 29 7b 0a 20 20 20 20 20  (pHash) ){.     
22b00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
22b10 72 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rm;          /* 
22b20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
22b30 67 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20  g term */.      
22b40 63 6f 6e 73 74 20 75 38 20 2a 70 44 6f 63 6c 69  const u8 *pDocli
22b50 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  st;         /* P
22b60 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73  ointer to doclis
22b70 74 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20  t for this term 
22b80 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 6f  */.      int nDo
22b90 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  clist;          
22ba0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
22bb0 64 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65 73  doclist in bytes
22bc0 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72   */..      /* Wr
22bd0 69 74 65 20 74 68 65 20 74 65 72 6d 20 66 6f 72  ite the term for
22be0 20 74 68 69 73 20 65 6e 74 72 79 20 74 6f 20 64   this entry to d
22bf0 69 73 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  isk. */.      sq
22c00 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
22c10 6e 45 6e 74 72 79 28 70 48 61 73 68 2c 20 26 7a  nEntry(pHash, &z
22c20 54 65 72 6d 2c 20 26 70 44 6f 63 6c 69 73 74 2c  Term, &pDoclist,
22c30 20 26 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20   &nDoclist);.   
22c40 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65     fts5WriteAppe
22c50 6e 64 54 65 72 6d 28 70 2c 20 26 77 72 69 74 65  ndTerm(p, &write
22c60 72 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  r, (int)strlen(z
22c70 54 65 72 6d 29 2c 20 28 63 6f 6e 73 74 20 75 38  Term), (const u8
22c80 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  *)zTerm);.      
22c90 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
22ca0 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 0a 20  E_OK ) break;.. 
22cb0 20 20 20 20 20 61 73 73 65 72 74 28 20 77 72 69       assert( wri
22cc0 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49  ter.bFirstRowidI
22cd0 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nPage==0 );.    
22ce0 20 20 69 66 28 20 70 67 73 7a 3e 3d 28 70 42 75    if( pgsz>=(pBu
22cf0 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e  f->n + pPgidx->n
22d00 20 2b 20 6e 44 6f 63 6c 69 73 74 20 2b 20 31 29   + nDoclist + 1)
22d10 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
22d20 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73  he entire doclis
22d30 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
22d40 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20  e current leaf. 
22d50 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  */.        fts5B
22d60 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
22d70 6c 6f 62 28 70 42 75 66 2c 20 70 44 6f 63 6c 69  lob(pBuf, pDocli
22d80 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  st, nDoclist);. 
22d90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22da0 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
22db0 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20   0;.        i64 
22dc0 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20  iDelta = 0;.    
22dd0 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30      int iOff = 0
22de0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
22df0 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74  e entire doclist
22e00 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e   will not fit on
22e10 20 74 68 69 73 20 6c 65 61 66 2e 20 54 68 65 20   this leaf. The 
22e20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 20  following .     
22e30 20 20 20 2a 2a 20 6c 6f 6f 70 20 69 74 65 72 61     ** loop itera
22e40 74 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  tes through the 
22e50 70 6f 73 6c 69 73 74 73 20 74 68 61 74 20 6d 61  poslists that ma
22e60 6b 65 20 75 70 20 74 68 65 20 63 75 72 72 65 6e  ke up the curren
22e70 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f  t .        ** do
22e80 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20  clist.  */.     
22e90 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
22ea0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f  =SQLITE_OK && iO
22eb0 66 66 3c 6e 44 6f 63 6c 69 73 74 20 29 7b 0a 20  ff<nDoclist ){. 
22ec0 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d           iOff +=
22ed0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
22ee0 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20  pDoclist[iOff], 
22ef0 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a  (u64*)&iDelta);.
22f00 20 20 20 20 20 20 20 20 20 20 69 52 6f 77 69 64            iRowid
22f10 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20   += iDelta;.    
22f20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
22f30 20 69 66 28 20 77 72 69 74 65 72 2e 62 46 69 72   if( writer.bFir
22f40 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b  stRowidInPage ){
22f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
22f60 35 50 75 74 55 31 36 28 26 70 42 75 66 2d 3e 70  5PutU16(&pBuf->p
22f70 5b 30 5d 2c 20 28 75 31 36 29 70 42 75 66 2d 3e  [0], (u16)pBuf->
22f80 6e 29 3b 20 20 20 2f 2a 20 66 69 72 73 74 20 72  n);   /* first r
22f90 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 2a 2f 0a  owid on page */.
22fa0 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66              pBuf
22fb0 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
22fc0 73 35 50 75 74 56 61 72 69 6e 74 28 26 70 42 75  s5PutVarint(&pBu
22fd0 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69  f->p[pBuf->n], i
22fe0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
22ff0 20 20 20 20 77 72 69 74 65 72 2e 62 46 69 72 73      writer.bFirs
23000 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30  tRowidInPage = 0
23010 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  ;.            ft
23020 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70 65  s5WriteDlidxAppe
23030 6e 64 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69  nd(p, &writer, i
23040 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
23050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23060 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20       pBuf->n += 
23070 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61  sqlite3Fts5PutVa
23080 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42  rint(&pBuf->p[pB
23090 75 66 2d 3e 6e 5d 2c 20 69 44 65 6c 74 61 29 3b  uf->n], iDelta);
230a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
230b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
230c0 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53  Buf->n<=pBuf->nS
230d0 70 61 63 65 20 29 3b 0a 0a 20 20 20 20 20 20 20  pace );..       
230e0 20 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d     if( eDetail==
230f0 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
23100 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23110 69 66 28 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73  if( iOff<nDoclis
23120 74 20 26 26 20 70 44 6f 63 6c 69 73 74 5b 69 4f  t && pDoclist[iO
23130 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ff]==0 ){.      
23140 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 70 5b          pBuf->p[
23150 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a  pBuf->n++] = 0;.
23160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 4f                iO
23170 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ff++;.          
23180 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 44 6f      if( iOff<nDo
23190 63 6c 69 73 74 20 26 26 20 70 44 6f 63 6c 69 73  clist && pDoclis
231a0 74 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20  t[iOff]==0 ){.  
231b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 42                pB
231c0 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d  uf->p[pBuf->n++]
231d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
231e0 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20        iOff++;.  
231f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
23200 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23210 20 20 20 20 20 20 20 20 69 66 28 20 28 70 42 75          if( (pBu
23220 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e  f->n + pPgidx->n
23230 29 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20 20  )>=pgsz ){.     
23240 20 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69           fts5Wri
23250 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 26  teFlushLeaf(p, &
23260 77 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20  writer);.       
23270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23290 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a      int bDummy;.
232a0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
232b0 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20  nPos;.          
232c0 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 66 74    int nCopy = ft
232d0 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65  s5GetPoslistSize
232e0 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d  (&pDoclist[iOff]
232f0 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79  , &nPos, &bDummy
23300 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  );.            n
23310 43 6f 70 79 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20  Copy += nPos;.  
23320 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
23330 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d  Buf->n + pPgidx-
23340 3e 6e 20 2b 20 6e 43 6f 70 79 29 20 3c 3d 20 70  >n + nCopy) <= p
23350 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  gsz ){.         
23360 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69       /* The enti
23370 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20  re poslist will 
23380 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65  fit on the curre
23390 6e 74 20 6c 65 61 66 2e 20 53 6f 20 63 6f 70 79  nt leaf. So copy
233a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
233b0 2a 20 69 74 20 69 6e 20 6f 6e 65 20 67 6f 2e 20  * it in one go. 
233c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
233d0 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
233e0 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20  ppendBlob(pBuf, 
233f0 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c  &pDoclist[iOff],
23400 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20   nCopy);.       
23410 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
23430 20 65 6e 74 69 72 65 20 70 6f 73 6c 69 73 74 20   entire poslist 
23440 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20  will not fit on 
23450 74 68 69 73 20 6c 65 61 66 2e 20 53 6f 20 69 74  this leaf. So it
23460 20 6e 65 65 64 73 0a 20 20 20 20 20 20 20 20 20   needs.         
23470 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 62 72       ** to be br
23480 6f 6b 65 6e 20 69 6e 74 6f 20 73 65 63 74 69 6f  oken into sectio
23490 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 71 75 61  ns. The only qua
234a0 6c 69 66 69 63 61 74 69 6f 6e 20 62 65 69 6e 67  lification being
234b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
234c0 2a 20 74 68 61 74 20 65 61 63 68 20 76 61 72 69  * that each vari
234d0 6e 74 20 6d 75 73 74 20 62 65 20 73 74 6f 72 65  nt must be store
234e0 64 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 2e 20  d contiguously. 
234f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
23500 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73    const u8 *pPos
23510 6c 69 73 74 20 3d 20 26 70 44 6f 63 6c 69 73 74  list = &pDoclist
23520 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 20 20  [iOff];.        
23530 20 20 20 20 20 20 69 6e 74 20 69 50 6f 73 20 3d        int iPos =
23540 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
23550 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
23560 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23570 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
23580 20 6e 53 70 61 63 65 20 3d 20 70 67 73 7a 20 2d   nSpace = pgsz -
23590 20 70 42 75 66 2d 3e 6e 20 2d 20 70 50 67 69 64   pBuf->n - pPgid
235a0 78 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  x->n;.          
235b0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b        int n = 0;
235c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
235d0 20 69 66 28 20 28 6e 43 6f 70 79 20 2d 20 69 50   if( (nCopy - iP
235e0 6f 73 29 3c 3d 6e 53 70 61 63 65 20 29 7b 0a 20  os)<=nSpace ){. 
235f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23600 20 6e 20 3d 20 6e 43 6f 70 79 20 2d 20 69 50 6f   n = nCopy - iPo
23610 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s;.             
23620 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23630 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
23640 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65 66 69  fts5PoslistPrefi
23650 78 28 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73  x(&pPoslist[iPos
23660 5d 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 20 20  ], nSpace);.    
23670 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
23680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
23690 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 20  sert( n>0 );.   
236a0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73               fts
236b0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
236c0 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 50 6f  dBlob(pBuf, &pPo
236d0 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 29 3b  slist[iPos], n);
236e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
236f0 20 69 50 6f 73 20 2b 3d 20 6e 3b 0a 20 20 20 20   iPos += n;.    
23700 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
23710 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64  (pBuf->n + pPgid
23720 78 2d 3e 6e 29 3e 3d 70 67 73 7a 20 29 7b 0a 20  x->n)>=pgsz ){. 
23730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23740 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
23750 65 61 66 28 70 2c 20 26 77 72 69 74 65 72 29 3b  eaf(p, &writer);
23760 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23770 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
23780 20 20 20 69 66 28 20 69 50 6f 73 3e 3d 6e 43 6f     if( iPos>=nCo
23790 70 79 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  py ) break;.    
237a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
237b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
237c0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 43        iOff += nC
237d0 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  opy;.          }
237e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
237f0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44   }..      /* TOD
23800 4f 32 3a 20 44 6f 63 6c 69 73 74 20 74 65 72 6d  O2: Doclist term
23810 69 6e 61 74 6f 72 20 77 72 69 74 74 65 6e 20 68  inator written h
23820 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  ere. */.      /*
23830 20 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e   pBuf->p[pBuf->n
23840 2b 2b 5d 20 3d 20 27 5c 30 27 3b 20 2a 2f 0a 20  ++] = '\0'; */. 
23850 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 75       assert( pBu
23860 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61  f->n<=pBuf->nSpa
23870 63 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ce );.      if( 
23880 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
23890 20 29 20 73 71 6c 69 74 65 33 46 74 73 35 48 61   ) sqlite3Fts5Ha
238a0 73 68 53 63 61 6e 4e 65 78 74 28 70 48 61 73 68  shScanNext(pHash
238b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
238c0 69 74 65 33 46 74 73 35 48 61 73 68 43 6c 65 61  ite3Fts5HashClea
238d0 72 28 70 48 61 73 68 29 3b 0a 20 20 20 20 66 74  r(pHash);.    ft
238e0 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c  s5WriteFinish(p,
238f0 20 26 77 72 69 74 65 72 2c 20 26 70 67 6e 6f 4c   &writer, &pgnoL
23900 61 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70  ast);..    /* Up
23910 64 61 74 65 20 74 68 65 20 46 74 73 35 53 74 72  date the Fts5Str
23920 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 77 72  ucture. It is wr
23930 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68  itten back to th
23940 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74 68  e database by th
23950 65 0a 20 20 20 20 2a 2a 20 66 74 73 35 53 74 72  e.    ** fts5Str
23960 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 29 20  uctureRelease() 
23970 63 61 6c 6c 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a  call below.  */.
23980 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74 2d      if( pStruct-
23990 3e 6e 4c 65 76 65 6c 3d 3d 30 20 29 7b 0a 20 20  >nLevel==0 ){.  
239a0 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
239b0 65 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63  eAddLevel(&p->rc
239c0 2c 20 26 70 53 74 72 75 63 74 29 3b 0a 20 20 20  , &pStruct);.   
239d0 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63   }.    fts5Struc
239e0 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28  tureExtendLevel(
239f0 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c  &p->rc, pStruct,
23a00 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69   0, 1, 0);.    i
23a10 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
23a20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 53 65  _OK ){.      pSe
23a30 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  g = &pStruct->aL
23a40 65 76 65 6c 5b 30 5d 2e 61 53 65 67 5b 20 70 53  evel[0].aSeg[ pS
23a50 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d  truct->aLevel[0]
23a60 2e 6e 53 65 67 2b 2b 20 5d 3b 0a 20 20 20 20 20  .nSeg++ ];.     
23a70 20 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20   pSeg->iSegid = 
23a80 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 70 53  iSegid;.      pS
23a90 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20  eg->pgnoFirst = 
23aa0 31 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70  1;.      pSeg->p
23ab0 67 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 4c 61  gnoLast = pgnoLa
23ac0 73 74 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63  st;.      pStruc
23ad0 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20  t->nSegment++;. 
23ae0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72     }.    fts5Str
23af0 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c  ucturePromote(p,
23b00 20 30 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20   0, pStruct);.  
23b10 7d 0a 0a 20 20 66 74 73 35 49 6e 64 65 78 41 75  }..  fts5IndexAu
23b20 74 6f 6d 65 72 67 65 28 70 2c 20 26 70 53 74 72  tomerge(p, &pStr
23b30 75 63 74 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a  uct, pgnoLast);.
23b40 20 20 66 74 73 35 49 6e 64 65 78 43 72 69 73 69    fts5IndexCrisi
23b50 73 6d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75  smerge(p, &pStru
23b60 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63  ct);.  fts5Struc
23b70 74 75 72 65 57 72 69 74 65 28 70 2c 20 70 53 74  tureWrite(p, pSt
23b80 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72  ruct);.  fts5Str
23b90 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
23ba0 74 72 75 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  truct);.}../*.**
23bb0 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20   Flush any data 
23bc0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e  stored in the in
23bd0 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62  -memory hash tab
23be0 6c 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  les to the datab
23bf0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ase..*/.static v
23c00 6f 69 64 20 66 74 73 35 49 6e 64 65 78 46 6c 75  oid fts5IndexFlu
23c10 73 68 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  sh(Fts5Index *p)
23c20 7b 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 74  {.  /* Unless it
23c30 20 69 73 20 65 6d 70 74 79 2c 20 66 6c 75 73 68   is empty, flush
23c40 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
23c50 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 66 28  to disk */.  if(
23c60 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
23c70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
23c80 70 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20 20 20  p->pHash );.    
23c90 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
23ca0 3d 20 30 3b 0a 20 20 20 20 66 74 73 35 46 6c 75  = 0;.    fts5Flu
23cb0 73 68 4f 6e 65 48 61 73 68 28 70 29 3b 0a 20 20  shOneHash(p);.  
23cc0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35  }.}..static Fts5
23cd0 53 74 72 75 63 74 75 72 65 20 2a 66 74 73 35 49  Structure *fts5I
23ce0 6e 64 65 78 4f 70 74 69 6d 69 7a 65 53 74 72 75  ndexOptimizeStru
23cf0 63 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ct(.  Fts5Index 
23d00 2a 70 2c 20 0a 20 20 46 74 73 35 53 74 72 75 63  *p, .  Fts5Struc
23d10 74 75 72 65 20 2a 70 53 74 72 75 63 74 0a 29 7b  ture *pStruct.){
23d20 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
23d30 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e   *pNew = 0;.  in
23d40 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  t nByte = sizeof
23d50 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29 3b  (Fts5Structure);
23d60 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 70 53  .  int nSeg = pS
23d70 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b  truct->nSegment;
23d80 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
23d90 46 69 67 75 72 65 20 6f 75 74 20 69 66 20 74 68  Figure out if th
23da0 69 73 20 73 74 72 75 63 74 75 72 65 20 72 65 71  is structure req
23db0 75 69 72 65 73 20 6f 70 74 69 6d 69 7a 61 74 69  uires optimizati
23dc0 6f 6e 2e 20 41 20 73 74 72 75 63 74 75 72 65 20  on. A structure 
23dd0 64 6f 65 73 0a 20 20 2a 2a 20 6e 6f 74 20 72 65  does.  ** not re
23de0 71 75 69 72 65 20 6f 70 74 69 6d 69 7a 61 74 69  quire optimizati
23df0 6f 6e 20 69 66 20 65 69 74 68 65 72 3a 0a 20 20  on if either:.  
23e00 2a 2a 0a 20 20 2a 2a 20 20 2b 20 69 74 20 63 6f  **.  **  + it co
23e10 6e 73 69 73 74 73 20 6f 66 20 66 65 77 65 72 20  nsists of fewer 
23e20 74 68 61 6e 20 74 77 6f 20 73 65 67 6d 65 6e 74  than two segment
23e30 73 2c 20 6f 72 20 0a 20 20 2a 2a 20 20 2b 20 61  s, or .  **  + a
23e40 6c 6c 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20  ll segments are 
23e50 6f 6e 20 74 68 65 20 73 61 6d 65 20 6c 65 76 65  on the same leve
23e60 6c 2c 20 6f 72 0a 20 20 2a 2a 20 20 2b 20 61 6c  l, or.  **  + al
23e70 6c 20 73 65 67 6d 65 6e 74 73 20 65 78 63 65 70  l segments excep
23e80 74 20 6f 6e 65 20 61 72 65 20 63 75 72 72 65 6e  t one are curren
23e90 74 6c 79 20 69 6e 70 75 74 73 20 74 6f 20 61 20  tly inputs to a 
23ea0 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e  merge operation.
23eb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68  .  **.  ** In th
23ec0 65 20 66 69 72 73 74 20 63 61 73 65 2c 20 72 65  e first case, re
23ed0 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 20 74 68  turn NULL. In th
23ee0 65 20 73 65 63 6f 6e 64 2c 20 69 6e 63 72 65 6d  e second, increm
23ef0 65 6e 74 20 74 68 65 20 72 65 66 2d 63 6f 75 6e  ent the ref-coun
23f00 74 0a 20 20 2a 2a 20 6f 6e 20 2a 70 53 74 72 75  t.  ** on *pStru
23f10 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  ct and return a 
23f20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 69 6e  copy of the poin
23f30 74 65 72 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a  ter to it..  */.
23f40 20 20 69 66 28 20 6e 53 65 67 3c 32 20 29 20 72    if( nSeg<2 ) r
23f50 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69  eturn 0;.  for(i
23f60 3d 30 3b 20 69 3c 70 53 74 72 75 63 74 2d 3e 6e  =0; i<pStruct->n
23f70 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  Level; i++){.   
23f80 20 69 6e 74 20 6e 54 68 69 73 20 3d 20 70 53 74   int nThis = pSt
23f90 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  ruct->aLevel[i].
23fa0 6e 53 65 67 3b 0a 20 20 20 20 69 66 28 20 6e 54  nSeg;.    if( nT
23fb0 68 69 73 3d 3d 6e 53 65 67 20 7c 7c 20 28 6e 54  his==nSeg || (nT
23fc0 68 69 73 3d 3d 6e 53 65 67 2d 31 20 26 26 20 70  his==nSeg-1 && p
23fd0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
23fe0 5d 2e 6e 4d 65 72 67 65 3d 3d 6e 54 68 69 73 29  ].nMerge==nThis)
23ff0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74   ){.      fts5St
24000 72 75 63 74 75 72 65 52 65 66 28 70 53 74 72 75  ructureRef(pStru
24010 63 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ct);.      retur
24020 6e 20 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d  n pStruct;.    }
24030 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
24040 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  ruct->aLevel[i].
24050 6e 4d 65 72 67 65 3c 3d 6e 54 68 69 73 20 29 3b  nMerge<=nThis );
24060 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65 20 2b 3d  .  }..  nByte +=
24070 20 28 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65   (pStruct->nLeve
24080 6c 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 46 74  l+1) * sizeof(Ft
24090 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
240a0 29 3b 0a 20 20 70 4e 65 77 20 3d 20 28 46 74 73  );.  pNew = (Fts
240b0 35 53 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69  5Structure*)sqli
240c0 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
240d0 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29  o(&p->rc, nByte)
240e0 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b  ;..  if( pNew ){
240f0 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
24100 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20  reLevel *pLvl;. 
24110 20 20 20 6e 42 79 74 65 20 3d 20 6e 53 65 67 20     nByte = nSeg 
24120 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
24130 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a  uctureSegment);.
24140 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c      pNew->nLevel
24150 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76   = pStruct->nLev
24160 65 6c 2b 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  el+1;.    pNew->
24170 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 4e  nRef = 1;.    pN
24180 65 77 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  ew->nWriteCounte
24190 72 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57 72  r = pStruct->nWr
241a0 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20  iteCounter;.    
241b0 70 4c 76 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 4c  pLvl = &pNew->aL
241c0 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c  evel[pStruct->nL
241d0 65 76 65 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 2d  evel];.    pLvl-
241e0 3e 61 53 65 67 20 3d 20 28 46 74 73 35 53 74 72  >aSeg = (Fts5Str
241f0 75 63 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 73  uctureSegment*)s
24200 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
24210 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79  Zero(&p->rc, nBy
24220 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 76  te);.    if( pLv
24230 6c 2d 3e 61 53 65 67 20 29 7b 0a 20 20 20 20 20  l->aSeg ){.     
24240 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b   int iLvl, iSeg;
24250 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 4f  .      int iSegO
24260 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a  ut = 0;.      /*
24270 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
24280 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 2c 20 66   all segments, f
24290 72 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65  rom oldest to ne
242a0 77 65 73 74 2e 20 41 64 64 20 74 68 65 6d 20 74  west. Add them t
242b0 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e  o.      ** the n
242c0 65 77 20 46 74 73 35 4c 65 76 65 6c 20 6f 62 6a  ew Fts5Level obj
242d0 65 63 74 20 73 6f 20 74 68 61 74 20 70 4c 76 6c  ect so that pLvl
242e0 2d 3e 61 53 65 67 5b 30 5d 20 69 73 20 74 68 65  ->aSeg[0] is the
242f0 20 6f 6c 64 65 73 74 0a 20 20 20 20 20 20 2a 2a   oldest.      **
24300 20 73 65 67 6d 65 6e 74 20 69 6e 20 74 68 65 20   segment in the 
24310 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20  data structure. 
24320 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 4c   */.      for(iL
24330 76 6c 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl=pStruct->nLev
24340 65 6c 2d 31 3b 20 69 4c 76 6c 3e 3d 30 3b 20 69  el-1; iLvl>=0; i
24350 4c 76 6c 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  Lvl--){.        
24360 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67  for(iSeg=0; iSeg
24370 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  <pStruct->aLevel
24380 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65  [iLvl].nSeg; iSe
24390 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g++){.          
243a0 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 4f  pLvl->aSeg[iSegO
243b0 75 74 5d 20 3d 20 70 53 74 72 75 63 74 2d 3e 61  ut] = pStruct->a
243c0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67  Level[iLvl].aSeg
243d0 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20  [iSeg];.        
243e0 20 20 69 53 65 67 4f 75 74 2b 2b 3b 0a 20 20 20    iSegOut++;.   
243f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
24400 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67 6d       pNew->nSegm
24410 65 6e 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67  ent = pLvl->nSeg
24420 20 3d 20 6e 53 65 67 3b 0a 20 20 20 20 7d 65 6c   = nSeg;.    }el
24430 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
24440 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
24450 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
24460 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
24470 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 69 6e 74 20 73  n pNew;.}..int s
24480 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f  qlite3Fts5IndexO
24490 70 74 69 6d 69 7a 65 28 46 74 73 35 49 6e 64 65  ptimize(Fts5Inde
244a0 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72  x *p){.  Fts5Str
244b0 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b  ucture *pStruct;
244c0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
244d0 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 0a 20 20 61   *pNew = 0;..  a
244e0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
244f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73  LITE_OK );.  fts
24500 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a  5IndexFlush(p);.
24510 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35    pStruct = fts5
24520 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29  StructureRead(p)
24530 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
24540 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a  eInvalidate(p);.
24550 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29  .  if( pStruct )
24560 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 66 74 73  {.    pNew = fts
24570 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65 53 74  5IndexOptimizeSt
24580 72 75 63 74 28 70 2c 20 70 53 74 72 75 63 74 29  ruct(p, pStruct)
24590 3b 0a 20 20 7d 0a 20 20 66 74 73 35 53 74 72 75  ;.  }.  fts5Stru
245a0 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
245b0 72 75 63 74 29 3b 0a 0a 20 20 61 73 73 65 72 74  ruct);..  assert
245c0 28 20 70 4e 65 77 3d 3d 30 20 7c 7c 20 70 4e 65  ( pNew==0 || pNe
245d0 77 2d 3e 6e 53 65 67 6d 65 6e 74 3e 30 20 29 3b  w->nSegment>0 );
245e0 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
245f0 20 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 20     int iLvl;.   
24600 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 70 4e 65   for(iLvl=0; pNe
24610 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  w->aLevel[iLvl].
24620 6e 53 65 67 3d 3d 30 3b 20 69 4c 76 6c 2b 2b 29  nSeg==0; iLvl++)
24630 7b 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d  {}.    while( p-
24640 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
24650 26 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69  & pNew->aLevel[i
24660 4c 76 6c 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a 20  Lvl].nSeg>0 ){. 
24670 20 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20       int nRem = 
24680 46 54 53 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e  FTS5_OPT_WORK_UN
24690 49 54 3b 0a 20 20 20 20 20 20 66 74 73 35 49 6e  IT;.      fts5In
246a0 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c  dexMergeLevel(p,
246b0 20 26 70 4e 65 77 2c 20 69 4c 76 6c 2c 20 26 6e   &pNew, iLvl, &n
246c0 52 65 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Rem);.    }..   
246d0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72   fts5StructureWr
246e0 69 74 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20  ite(p, pNew);.  
246f0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
24700 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20  elease(pNew);.  
24710 7d 0a 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  }..  return fts5
24720 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 20  IndexReturn(p); 
24730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
24740 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6d 70 6c  s called to impl
24750 65 6d 65 6e 74 20 74 68 65 20 73 70 65 63 69 61  ement the specia
24760 6c 20 22 56 41 4c 55 45 53 28 27 6d 65 72 67 65  l "VALUES('merge
24770 27 2c 20 24 6e 4d 65 72 67 65 29 22 0a 2a 2a 20  ', $nMerge)".** 
24780 49 4e 53 45 52 54 20 63 6f 6d 6d 61 6e 64 2e 0a  INSERT command..
24790 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
247a0 73 35 49 6e 64 65 78 4d 65 72 67 65 28 46 74 73  s5IndexMerge(Fts
247b0 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e  5Index *p, int n
247c0 4d 65 72 67 65 29 7b 0a 20 20 46 74 73 35 53 74  Merge){.  Fts5St
247d0 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
247e0 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
247f0 52 65 61 64 28 70 29 3b 0a 20 20 69 66 28 20 70  Read(p);.  if( p
24800 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e  Struct ){.    in
24810 74 20 6e 4d 69 6e 20 3d 20 70 2d 3e 70 43 6f 6e  t nMin = p->pCon
24820 66 69 67 2d 3e 6e 55 73 65 72 6d 65 72 67 65 3b  fig->nUsermerge;
24830 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
24840 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b  reInvalidate(p);
24850 0a 20 20 20 20 69 66 28 20 6e 4d 65 72 67 65 3c  .    if( nMerge<
24860 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  0 ){.      Fts5S
24870 74 72 75 63 74 75 72 65 20 2a 70 4e 65 77 20 3d  tructure *pNew =
24880 20 66 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69   fts5IndexOptimi
24890 7a 65 53 74 72 75 63 74 28 70 2c 20 70 53 74 72  zeStruct(p, pStr
248a0 75 63 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35  uct);.      fts5
248b0 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
248c0 28 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20  (pStruct);.     
248d0 20 70 53 74 72 75 63 74 20 3d 20 70 4e 65 77 3b   pStruct = pNew;
248e0 0a 20 20 20 20 20 20 6e 4d 69 6e 20 3d 20 32 3b  .      nMin = 2;
248f0 0a 20 20 20 20 20 20 6e 4d 65 72 67 65 20 3d 20  .      nMerge = 
24900 6e 4d 65 72 67 65 2a 2d 31 3b 0a 20 20 20 20 7d  nMerge*-1;.    }
24910 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74  .    if( pStruct
24920 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65   && pStruct->nLe
24930 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  vel ){.      if(
24940 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28   fts5IndexMerge(
24950 70 2c 20 26 70 53 74 72 75 63 74 2c 20 6e 4d 65  p, &pStruct, nMe
24960 72 67 65 2c 20 6e 4d 69 6e 29 20 29 7b 0a 20 20  rge, nMin) ){.  
24970 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
24980 75 72 65 57 72 69 74 65 28 70 2c 20 70 53 74 72  ureWrite(p, pStr
24990 75 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  uct);.      }.  
249a0 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75    }.    fts5Stru
249b0 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
249c0 72 75 63 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ruct);.  }.  ret
249d0 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
249e0 75 72 6e 28 70 29 3b 0a 7d 0a 0a 73 74 61 74 69  urn(p);.}..stati
249f0 63 20 76 6f 69 64 20 66 74 73 35 41 70 70 65 6e  c void fts5Appen
24a00 64 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e  dRowid(.  Fts5In
24a10 64 65 78 20 2a 70 2c 0a 20 20 69 36 34 20 69 44  dex *p,.  i64 iD
24a20 65 6c 74 61 2c 0a 20 20 46 74 73 35 49 74 65 72  elta,.  Fts5Iter
24a30 20 2a 70 55 6e 75 73 65 64 2c 0a 20 20 46 74 73   *pUnused,.  Fts
24a40 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b  5Buffer *pBuf.){
24a50 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  .  UNUSED_PARAM(
24a60 70 55 6e 75 73 65 64 29 3b 0a 20 20 66 74 73 35  pUnused);.  fts5
24a70 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
24a80 6e 74 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c  nt(&p->rc, pBuf,
24a90 20 69 44 65 6c 74 61 29 3b 0a 7d 0a 0a 73 74 61   iDelta);.}..sta
24aa0 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 70 70  tic void fts5App
24ab0 65 6e 64 50 6f 73 6c 69 73 74 28 0a 20 20 46 74  endPoslist(.  Ft
24ac0 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 36  s5Index *p,.  i6
24ad0 34 20 69 44 65 6c 74 61 2c 0a 20 20 46 74 73 35  4 iDelta,.  Fts5
24ae0 49 74 65 72 20 2a 70 4d 75 6c 74 69 2c 0a 20 20  Iter *pMulti,.  
24af0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
24b00 0a 29 7b 0a 20 20 69 6e 74 20 6e 44 61 74 61 20  .){.  int nData 
24b10 3d 20 70 4d 75 6c 74 69 2d 3e 62 61 73 65 2e 6e  = pMulti->base.n
24b20 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20  Data;.  assert( 
24b30 6e 44 61 74 61 3e 30 20 29 3b 0a 20 20 69 66 28  nData>0 );.  if(
24b40 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
24b50 4b 20 26 26 20 30 3d 3d 66 74 73 35 42 75 66 66  K && 0==fts5Buff
24b60 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70  erGrow(&p->rc, p
24b70 42 75 66 2c 20 6e 44 61 74 61 2b 39 2b 39 29 20  Buf, nData+9+9) 
24b80 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  ){.    fts5Buffe
24b90 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
24ba0 74 28 70 42 75 66 2c 20 69 44 65 6c 74 61 29 3b  t(pBuf, iDelta);
24bb0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53  .    fts5BufferS
24bc0 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28  afeAppendVarint(
24bd0 70 42 75 66 2c 20 6e 44 61 74 61 2a 32 29 3b 0a  pBuf, nData*2);.
24be0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
24bf0 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75  feAppendBlob(pBu
24c00 66 2c 20 70 4d 75 6c 74 69 2d 3e 62 61 73 65 2e  f, pMulti->base.
24c10 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20  pData, nData);. 
24c20 20 7d 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f   }.}...static vo
24c30 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74  id fts5DoclistIt
24c40 65 72 4e 65 78 74 28 46 74 73 35 44 6f 63 6c 69  erNext(Fts5Docli
24c50 73 74 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  stIter *pIter){.
24c60 20 20 75 38 20 2a 70 20 3d 20 70 49 74 65 72 2d    u8 *p = pIter-
24c70 3e 61 50 6f 73 6c 69 73 74 20 2b 20 70 49 74 65  >aPoslist + pIte
24c80 72 2d 3e 6e 53 69 7a 65 20 2b 20 70 49 74 65 72  r->nSize + pIter
24c90 2d 3e 6e 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 61  ->nPoslist;..  a
24ca0 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 61 50  ssert( pIter->aP
24cb0 6f 73 6c 69 73 74 20 29 3b 0a 20 20 69 66 28 20  oslist );.  if( 
24cc0 70 3e 3d 70 49 74 65 72 2d 3e 61 45 6f 66 20 29  p>=pIter->aEof )
24cd0 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50 6f  {.    pIter->aPo
24ce0 73 6c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  slist = 0;.  }el
24cf0 73 65 7b 0a 20 20 20 20 69 36 34 20 69 44 65 6c  se{.    i64 iDel
24d00 74 61 3b 0a 0a 20 20 20 20 70 20 2b 3d 20 66 74  ta;..    p += ft
24d10 73 35 47 65 74 56 61 72 69 6e 74 28 70 2c 20 28  s5GetVarint(p, (
24d20 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20  u64*)&iDelta);. 
24d30 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64     pIter->iRowid
24d40 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20   += iDelta;..   
24d50 20 2f 2a 20 52 65 61 64 20 70 6f 73 69 74 69 6f   /* Read positio
24d60 6e 20 6c 69 73 74 20 73 69 7a 65 20 2a 2f 0a 20  n list size */. 
24d70 20 20 20 69 66 28 20 70 5b 30 5d 20 26 20 30 78     if( p[0] & 0x
24d80 38 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  80 ){.      int 
24d90 6e 50 6f 73 3b 0a 20 20 20 20 20 20 70 49 74 65  nPos;.      pIte
24da0 72 2d 3e 6e 53 69 7a 65 20 3d 20 66 74 73 35 47  r->nSize = fts5G
24db0 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20 6e 50  etVarint32(p, nP
24dc0 6f 73 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  os);.      pIter
24dd0 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d 20 28 6e 50  ->nPoslist = (nP
24de0 6f 73 3e 3e 31 29 3b 0a 20 20 20 20 7d 65 6c 73  os>>1);.    }els
24df0 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  e{.      pIter->
24e00 6e 50 6f 73 6c 69 73 74 20 3d 20 28 28 69 6e 74  nPoslist = ((int
24e10 29 28 70 5b 30 5d 29 29 20 3e 3e 20 31 3b 0a 20  )(p[0])) >> 1;. 
24e20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 53 69 7a       pIter->nSiz
24e30 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 1;.    }..  
24e40 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73    pIter->aPoslis
24e50 74 20 3d 20 70 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  t = p;.  }.}..st
24e60 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f  atic void fts5Do
24e70 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 0a 20  clistIterInit(. 
24e80 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
24e90 66 2c 20 0a 20 20 46 74 73 35 44 6f 63 6c 69 73  f, .  Fts5Doclis
24ea0 74 49 74 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a  tIter *pIter.){.
24eb0 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
24ec0 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72  0, sizeof(*pIter
24ed0 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61 50 6f  ));.  pIter->aPo
24ee0 73 6c 69 73 74 20 3d 20 70 42 75 66 2d 3e 70 3b  slist = pBuf->p;
24ef0 0a 20 20 70 49 74 65 72 2d 3e 61 45 6f 66 20 3d  .  pIter->aEof =
24f00 20 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e   &pBuf->p[pBuf->
24f10 6e 5d 3b 0a 20 20 66 74 73 35 44 6f 63 6c 69 73  n];.  fts5Doclis
24f20 74 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 29  tIterNext(pIter)
24f30 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a  ;.}..#if 0./*.**
24f40 20 41 70 70 65 6e 64 20 61 20 64 6f 63 6c 69 73   Append a doclis
24f50 74 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66  t to buffer pBuf
24f60 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
24f70 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
24f80 61 74 20 73 70 61 63 65 20 77 69 74 68 69 6e 20  at space within 
24f90 74 68 65 20 62 75 66 66 65 72 20 68 61 73 20 61  the buffer has a
24fa0 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 61  lready been.** a
24fb0 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61  llocated..*/.sta
24fc0 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72  tic void fts5Mer
24fd0 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 0a 20  geAppendDocid(. 
24fe0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
24ff0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
25000 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 77 72   /* Buffer to wr
25010 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20  ite to */.  i64 
25020 2a 70 69 4c 61 73 74 52 6f 77 69 64 2c 20 20 20  *piLastRowid,   
25030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
25040 4e 2f 4f 55 54 3a 20 50 72 65 76 69 6f 75 73 20  N/OUT: Previous 
25050 72 6f 77 69 64 20 77 72 69 74 74 65 6e 20 28 69  rowid written (i
25060 66 20 61 6e 79 29 20 2a 2f 0a 20 20 69 36 34 20  f any) */.  i64 
25070 69 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20  iRowid          
25080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
25090 6f 77 69 64 20 74 6f 20 61 70 70 65 6e 64 20 2a  owid to append *
250a0 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
250b0 42 75 66 2d 3e 6e 21 3d 30 20 7c 7c 20 28 2a 70  Buf->n!=0 || (*p
250c0 69 4c 61 73 74 52 6f 77 69 64 29 3d 3d 30 20 29  iLastRowid)==0 )
250d0 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 61  ;.  fts5BufferSa
250e0 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70  feAppendVarint(p
250f0 42 75 66 2c 20 69 52 6f 77 69 64 20 2d 20 2a 70  Buf, iRowid - *p
25100 69 4c 61 73 74 52 6f 77 69 64 29 3b 0a 20 20 2a  iLastRowid);.  *
25110 70 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 69 52  piLastRowid = iR
25120 6f 77 69 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  owid;.}.#endif..
25130 23 64 65 66 69 6e 65 20 66 74 73 35 4d 65 72 67  #define fts5Merg
25140 65 41 70 70 65 6e 64 44 6f 63 69 64 28 70 42 75  eAppendDocid(pBu
25150 66 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69  f, iLastRowid, i
25160 52 6f 77 69 64 29 20 7b 20 20 20 20 20 20 20 5c  Rowid) {       \
25170 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 75 66  .  assert( (pBuf
25180 29 2d 3e 6e 21 3d 30 20 7c 7c 20 28 69 4c 61 73  )->n!=0 || (iLas
25190 74 52 6f 77 69 64 29 3d 3d 30 20 29 3b 20 20 20  tRowid)==0 );   
251a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251b0 5c 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 61  \.  fts5BufferSa
251c0 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 28  feAppendVarint((
251d0 70 42 75 66 29 2c 20 28 69 52 6f 77 69 64 29 20  pBuf), (iRowid) 
251e0 2d 20 28 69 4c 61 73 74 52 6f 77 69 64 29 29 3b  - (iLastRowid));
251f0 20 5c 0a 20 20 28 69 4c 61 73 74 52 6f 77 69 64   \.  (iLastRowid
25200 29 20 3d 20 28 69 52 6f 77 69 64 29 3b 20 20 20  ) = (iRowid);   
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25230 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61    \.}../*.** Swa
25240 70 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  p the contents o
25250 66 20 62 75 66 66 65 72 20 2a 70 31 20 77 69 74  f buffer *p1 wit
25260 68 20 74 68 61 74 20 6f 66 20 2a 70 32 2e 0a 2a  h that of *p2..*
25270 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
25280 73 35 42 75 66 66 65 72 53 77 61 70 28 46 74 73  s5BufferSwap(Fts
25290 35 42 75 66 66 65 72 20 2a 70 31 2c 20 46 74 73  5Buffer *p1, Fts
252a0 35 42 75 66 66 65 72 20 2a 70 32 29 7b 0a 20 20  5Buffer *p2){.  
252b0 46 74 73 35 42 75 66 66 65 72 20 74 6d 70 20 3d  Fts5Buffer tmp =
252c0 20 2a 70 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70   *p1;.  *p1 = *p
252d0 32 3b 0a 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a  2;.  *p2 = tmp;.
252e0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
252f0 74 73 35 4e 65 78 74 52 6f 77 69 64 28 46 74 73  ts5NextRowid(Fts
25300 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69  5Buffer *pBuf, i
25310 6e 74 20 2a 70 69 4f 66 66 2c 20 69 36 34 20 2a  nt *piOff, i64 *
25320 70 69 52 6f 77 69 64 29 7b 0a 20 20 69 6e 74 20  piRowid){.  int 
25330 69 20 3d 20 2a 70 69 4f 66 66 3b 0a 20 20 69 66  i = *piOff;.  if
25340 28 20 69 3e 3d 70 42 75 66 2d 3e 6e 20 29 7b 0a  ( i>=pBuf->n ){.
25350 20 20 20 20 2a 70 69 4f 66 66 20 3d 20 2d 31 3b      *piOff = -1;
25360 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 36  .  }else{.    u6
25370 34 20 69 56 61 6c 3b 0a 20 20 20 20 2a 70 69 4f  4 iVal;.    *piO
25380 66 66 20 3d 20 69 20 2b 20 73 71 6c 69 74 65 33  ff = i + sqlite3
25390 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  Fts5GetVarint(&p
253a0 42 75 66 2d 3e 70 5b 69 5d 2c 20 26 69 56 61 6c  Buf->p[i], &iVal
253b0 29 3b 0a 20 20 20 20 2a 70 69 52 6f 77 69 64 20  );.    *piRowid 
253c0 2b 3d 20 69 56 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  += iVal;.  }.}..
253d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
253e0 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20  e equivalent of 
253f0 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c  fts5MergePrefixL
25400 69 73 74 73 28 29 20 66 6f 72 20 64 65 74 61 69  ists() for detai
25410 6c 3d 6e 6f 6e 65 20 6d 6f 64 65 2e 0a 2a 2a 20  l=none mode..** 
25420 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
25430 20 62 75 66 66 65 72 73 20 63 6f 6e 73 69 73 74   buffers consist
25440 20 6f 66 20 61 20 64 65 6c 74 61 2d 65 6e 63 6f   of a delta-enco
25450 64 65 64 20 6c 69 73 74 20 6f 66 20 72 6f 77 69  ded list of rowi
25460 64 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ds only..*/.stat
25470 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67  ic void fts5Merg
25480 65 52 6f 77 69 64 4c 69 73 74 73 28 0a 20 20 46  eRowidLists(.  F
25490 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
254a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
254b0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
254c0 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 42  bject */.  Fts5B
254d0 75 66 66 65 72 20 2a 70 31 2c 20 20 20 20 20 20  uffer *p1,      
254e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
254f0 72 73 74 20 6c 69 73 74 20 74 6f 20 6d 65 72 67  rst list to merg
25500 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  e */.  Fts5Buffe
25510 72 20 2a 70 32 20 20 20 20 20 20 20 20 20 20 20  r *p2           
25520 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64         /* Second
25530 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a   list to merge *
25540 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20  /.){.  int i1 = 
25550 30 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 30 3b  0;.  int i2 = 0;
25560 0a 20 20 69 36 34 20 69 52 6f 77 69 64 31 20 3d  .  i64 iRowid1 =
25570 20 30 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64   0;.  i64 iRowid
25580 32 20 3d 20 30 3b 0a 20 20 69 36 34 20 69 4f 75  2 = 0;.  i64 iOu
25590 74 20 3d 20 30 3b 0a 0a 20 20 46 74 73 35 42 75  t = 0;..  Fts5Bu
255a0 66 66 65 72 20 6f 75 74 3b 0a 20 20 6d 65 6d 73  ffer out;.  mems
255b0 65 74 28 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65  et(&out, 0, size
255c0 6f 66 28 6f 75 74 29 29 3b 0a 20 20 73 71 6c 69  of(out));.  sqli
255d0 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a  te3Fts5BufferSiz
255e0 65 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20  e(&p->rc, &out, 
255f0 70 31 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 29 3b 0a  p1->n + p2->n);.
25600 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
25610 74 75 72 6e 3b 0a 0a 20 20 66 74 73 35 4e 65 78  turn;..  fts5Nex
25620 74 52 6f 77 69 64 28 70 31 2c 20 26 69 31 2c 20  tRowid(p1, &i1, 
25630 26 69 52 6f 77 69 64 31 29 3b 0a 20 20 66 74 73  &iRowid1);.  fts
25640 35 4e 65 78 74 52 6f 77 69 64 28 70 32 2c 20 26  5NextRowid(p2, &
25650 69 32 2c 20 26 69 52 6f 77 69 64 32 29 3b 0a 20  i2, &iRowid2);. 
25660 20 77 68 69 6c 65 28 20 69 31 3e 3d 30 20 7c 7c   while( i1>=0 ||
25670 20 69 32 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66   i2>=0 ){.    if
25680 28 20 69 31 3e 3d 30 20 26 26 20 28 69 32 3c 30  ( i1>=0 && (i2<0
25690 20 7c 7c 20 69 52 6f 77 69 64 31 3c 69 52 6f 77   || iRowid1<iRow
256a0 69 64 32 29 20 29 7b 0a 20 20 20 20 20 20 61 73  id2) ){.      as
256b0 73 65 72 74 28 20 69 4f 75 74 3d 3d 30 20 7c 7c  sert( iOut==0 ||
256c0 20 69 52 6f 77 69 64 31 3e 69 4f 75 74 20 29 3b   iRowid1>iOut );
256d0 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
256e0 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
256f0 74 28 26 6f 75 74 2c 20 69 52 6f 77 69 64 31 20  t(&out, iRowid1 
25700 2d 20 69 4f 75 74 29 3b 0a 20 20 20 20 20 20 69  - iOut);.      i
25710 4f 75 74 20 3d 20 69 52 6f 77 69 64 31 3b 0a 20  Out = iRowid1;. 
25720 20 20 20 20 20 66 74 73 35 4e 65 78 74 52 6f 77       fts5NextRow
25730 69 64 28 70 31 2c 20 26 69 31 2c 20 26 69 52 6f  id(p1, &i1, &iRo
25740 77 69 64 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  wid1);.    }else
25750 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
25760 69 4f 75 74 3d 3d 30 20 7c 7c 20 69 52 6f 77 69  iOut==0 || iRowi
25770 64 32 3e 69 4f 75 74 20 29 3b 0a 20 20 20 20 20  d2>iOut );.     
25780 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
25790 70 70 65 6e 64 56 61 72 69 6e 74 28 26 6f 75 74  ppendVarint(&out
257a0 2c 20 69 52 6f 77 69 64 32 20 2d 20 69 4f 75 74  , iRowid2 - iOut
257b0 29 3b 0a 20 20 20 20 20 20 69 4f 75 74 20 3d 20  );.      iOut = 
257c0 69 52 6f 77 69 64 32 3b 0a 20 20 20 20 20 20 69  iRowid2;.      i
257d0 66 28 20 69 31 3e 3d 30 20 26 26 20 69 52 6f 77  f( i1>=0 && iRow
257e0 69 64 31 3d 3d 69 52 6f 77 69 64 32 20 29 7b 0a  id1==iRowid2 ){.
257f0 20 20 20 20 20 20 20 20 66 74 73 35 4e 65 78 74          fts5Next
25800 52 6f 77 69 64 28 70 31 2c 20 26 69 31 2c 20 26  Rowid(p1, &i1, &
25810 69 52 6f 77 69 64 31 29 3b 0a 20 20 20 20 20 20  iRowid1);.      
25820 7d 0a 20 20 20 20 20 20 66 74 73 35 4e 65 78 74  }.      fts5Next
25830 52 6f 77 69 64 28 70 32 2c 20 26 69 32 2c 20 26  Rowid(p2, &i2, &
25840 69 52 6f 77 69 64 32 29 3b 0a 20 20 20 20 7d 0a  iRowid2);.    }.
25850 20 20 7d 0a 0a 20 20 66 74 73 35 42 75 66 66 65    }..  fts5Buffe
25860 72 53 77 61 70 28 26 6f 75 74 2c 20 70 31 29 3b  rSwap(&out, p1);
25870 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
25880 65 28 26 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(&out);.}../*.*
25890 2a 20 42 75 66 66 65 72 73 20 70 31 20 61 6e 64  * Buffers p1 and
258a0 20 70 32 20 63 6f 6e 74 61 69 6e 20 64 6f 63 6c   p2 contain docl
258b0 69 73 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74  ists. This funct
258c0 69 6f 6e 20 6d 65 72 67 65 73 20 74 68 65 20 63  ion merges the c
258d0 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65  ontent.** of the
258e0 20 74 77 6f 20 64 6f 63 6c 69 73 74 73 20 74 6f   two doclists to
258f0 67 65 74 68 65 72 20 61 6e 64 20 73 65 74 73 20  gether and sets 
25900 62 75 66 66 65 72 20 70 31 20 74 6f 20 74 68 65  buffer p1 to the
25910 20 72 65 73 75 6c 74 20 62 65 66 6f 72 65 0a 2a   result before.*
25920 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  * returning..**.
25930 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
25940 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
25950 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20  code is left in 
25960 70 2d 3e 72 63 2e 20 49 66 20 61 6e 20 65 72 72  p->rc. If an err
25970 6f 72 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64  or has.** alread
25980 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
25990 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
259a0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
259b0 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 50 72  void fts5MergePr
259c0 65 66 69 78 4c 69 73 74 73 28 0a 20 20 46 74 73  efixLists(.  Fts
259d0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
259e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
259f0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
25a00 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ect */.  Fts5Buf
25a10 66 65 72 20 2a 70 31 2c 20 20 20 20 20 20 20 20  fer *p1,        
25a20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
25a30 74 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20  t list to merge 
25a40 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
25a50 2a 70 32 20 20 20 20 20 20 20 20 20 20 20 20 20  *p2             
25a60 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c       /* Second l
25a70 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a  ist to merge */.
25a80 29 7b 0a 20 20 69 66 28 20 70 32 2d 3e 6e 20 29  ){.  if( p2->n )
25a90 7b 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 52  {.    i64 iLastR
25aa0 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74  owid = 0;.    Ft
25ab0 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69 31  s5DoclistIter i1
25ac0 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73  ;.    Fts5Doclis
25ad0 74 49 74 65 72 20 69 32 3b 0a 20 20 20 20 46 74  tIter i2;.    Ft
25ae0 73 35 42 75 66 66 65 72 20 6f 75 74 20 3d 20 7b  s5Buffer out = {
25af0 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 20 20 46 74  0, 0, 0};.    Ft
25b00 73 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20 7b  s5Buffer tmp = {
25b10 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 20 20 2f  0, 0, 0};..    /
25b20 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  * The maximum si
25b30 7a 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  ze of the output
25b40 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65   is equal to the
25b50 20 73 75 6d 20 6f 66 20 74 68 65 20 74 77 6f 20   sum of the two 
25b60 0a 20 20 20 20 2a 2a 20 69 6e 70 75 74 20 73 69  .    ** input si
25b70 7a 65 73 20 2b 20 31 20 76 61 72 69 6e 74 20 28  zes + 1 varint (
25b80 39 20 62 79 74 65 73 29 2e 20 54 68 65 20 65 78  9 bytes). The ex
25b90 74 72 61 20 76 61 72 69 6e 74 20 69 73 20 62 65  tra varint is be
25ba0 63 61 75 73 65 20 69 66 20 74 68 65 0a 20 20 20  cause if the.   
25bb0 20 2a 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20   ** first rowid 
25bc0 69 6e 20 6f 6e 65 20 69 6e 70 75 74 20 69 73 20  in one input is 
25bd0 61 20 6c 61 72 67 65 20 6e 65 67 61 74 69 76 65  a large negative
25be0 20 6e 75 6d 62 65 72 2c 20 61 6e 64 20 74 68 65   number, and the
25bf0 20 66 69 72 73 74 20 69 6e 0a 20 20 20 20 2a 2a   first in.    **
25c00 20 74 68 65 20 6f 74 68 65 72 20 61 20 6e 6f 6e   the other a non
25c10 2d 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72  -negative number
25c20 2c 20 74 68 65 20 64 65 6c 74 61 20 66 6f 72 20  , the delta for 
25c30 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  the non-negative
25c40 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 77  .    ** number w
25c50 69 6c 6c 20 62 65 20 6c 61 72 67 65 72 20 6f 6e  ill be larger on
25c60 20 64 69 73 6b 20 74 68 61 6e 20 74 68 65 20 6c   disk than the l
25c70 69 74 65 72 61 6c 20 69 6e 74 65 67 65 72 20 76  iteral integer v
25c80 61 6c 75 65 0a 20 20 20 20 2a 2a 20 77 61 73 2e  alue.    ** was.
25c90 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
25ca0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69  ite3Fts5BufferSi
25cb0 7a 65 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c  ze(&p->rc, &out,
25cc0 20 70 31 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 20 2b   p1->n + p2->n +
25cd0 20 39 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   9) ) return;.  
25ce0 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
25cf0 72 49 6e 69 74 28 70 31 2c 20 26 69 31 29 3b 0a  rInit(p1, &i1);.
25d00 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
25d10 74 65 72 49 6e 69 74 28 70 32 2c 20 26 69 32 29  terInit(p2, &i2)
25d20 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20  ;..    while( 1 
25d30 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 31 2e  ){.      if( i1.
25d40 69 52 6f 77 69 64 3c 69 32 2e 69 52 6f 77 69 64  iRowid<i2.iRowid
25d50 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
25d60 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20 69  opy entry from i
25d70 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73  1 */.        fts
25d80 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
25d90 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77  d(&out, iLastRow
25da0 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a  id, i1.iRowid);.
25db0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
25dc0 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
25dd0 28 26 6f 75 74 2c 20 69 31 2e 61 50 6f 73 6c 69  (&out, i1.aPosli
25de0 73 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2b  st, i1.nPoslist+
25df0 69 31 2e 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  i1.nSize);.     
25e00 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
25e10 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20  erNext(&i1);.   
25e20 20 20 20 20 20 69 66 28 20 69 31 2e 61 50 6f 73       if( i1.aPos
25e30 6c 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b  list==0 ) break;
25e40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
25e50 6c 73 65 20 69 66 28 20 69 32 2e 69 52 6f 77 69  lse if( i2.iRowi
25e60 64 21 3d 69 31 2e 69 52 6f 77 69 64 20 29 7b 0a  d!=i1.iRowid ){.
25e70 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
25e80 65 6e 74 72 79 20 66 72 6f 6d 20 69 32 20 2a 2f  entry from i2 */
25e90 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72  .        fts5Mer
25ea0 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f  geAppendDocid(&o
25eb0 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20  ut, iLastRowid, 
25ec0 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  i2.iRowid);.    
25ed0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
25ee0 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75  feAppendBlob(&ou
25ef0 74 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20  t, i2.aPoslist, 
25f00 69 32 2e 6e 50 6f 73 6c 69 73 74 2b 69 32 2e 6e  i2.nPoslist+i2.n
25f10 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 66  Size);.        f
25f20 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
25f30 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 20  xt(&i2);.       
25f40 20 69 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74   if( i2.aPoslist
25f50 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
25f60 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 7b     }.      else{
25f70 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67  .        /* Merg
25f80 65 20 74 68 65 20 74 77 6f 20 70 6f 73 69 74 69  e the two positi
25f90 6f 6e 20 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20  on lists. */ .  
25fa0 20 20 20 20 20 20 69 36 34 20 69 50 6f 73 31 20        i64 iPos1 
25fb0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34  = 0;.        i64
25fc0 20 69 50 6f 73 32 20 3d 20 30 3b 0a 20 20 20 20   iPos2 = 0;.    
25fd0 20 20 20 20 69 6e 74 20 69 4f 66 66 31 20 3d 20      int iOff1 = 
25fe0 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  0;.        int i
25ff0 4f 66 66 32 20 3d 20 30 3b 0a 20 20 20 20 20 20  Off2 = 0;.      
26000 20 20 75 38 20 2a 61 31 20 3d 20 26 69 31 2e 61    u8 *a1 = &i1.a
26010 50 6f 73 6c 69 73 74 5b 69 31 2e 6e 53 69 7a 65  Poslist[i1.nSize
26020 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61  ];.        u8 *a
26030 32 20 3d 20 26 69 32 2e 61 50 6f 73 6c 69 73 74  2 = &i2.aPoslist
26040 5b 69 32 2e 6e 53 69 7a 65 5d 3b 0a 0a 20 20 20  [i2.nSize];..   
26050 20 20 20 20 20 69 36 34 20 69 50 72 65 76 20 3d       i64 iPrev =
26060 20 30 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35   0;.        Fts5
26070 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77 72  PoslistWriter wr
26080 69 74 65 72 3b 0a 20 20 20 20 20 20 20 20 6d 65  iter;.        me
26090 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c  mset(&writer, 0,
260a0 20 73 69 7a 65 6f 66 28 77 72 69 74 65 72 29 29   sizeof(writer))
260b0 3b 0a 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  ;..        fts5M
260c0 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28  ergeAppendDocid(
260d0 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64  &out, iLastRowid
260e0 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20  , i2.iRowid);.  
260f0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
26100 5a 65 72 6f 28 26 74 6d 70 29 3b 0a 20 20 20 20  Zero(&tmp);.    
26110 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
26120 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63  ufferSize(&p->rc
26130 2c 20 26 74 6d 70 2c 20 69 31 2e 6e 50 6f 73 6c  , &tmp, i1.nPosl
26140 69 73 74 20 2b 20 69 32 2e 6e 50 6f 73 6c 69 73  ist + i2.nPoslis
26150 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
26160 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a  p->rc ) break;..
26170 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
26180 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
26190 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74  (a1, i1.nPoslist
261a0 2c 20 26 69 4f 66 66 31 2c 20 26 69 50 6f 73 31  , &iOff1, &iPos1
261b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
261c0 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78  e3Fts5PoslistNex
261d0 74 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c  t64(a2, i2.nPosl
261e0 69 73 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50  ist, &iOff2, &iP
261f0 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73  os2);.        as
26200 73 65 72 74 28 20 69 50 6f 73 31 3e 3d 30 20 26  sert( iPos1>=0 &
26210 26 20 69 50 6f 73 32 3e 3d 30 20 29 3b 0a 0a 20  & iPos2>=0 );.. 
26220 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31         if( iPos1
26230 3c 69 50 6f 73 32 20 29 7b 0a 20 20 20 20 20 20  <iPos2 ){.      
26240 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
26250 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64  oslistSafeAppend
26260 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69  (&tmp, &iPrev, i
26270 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20  Pos1);.         
26280 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
26290 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31  istNext64(a1, i1
262a0 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66  .nPoslist, &iOff
262b0 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20  1, &iPos1);.    
262c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
262d0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
262e0 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e  PoslistSafeAppen
262f0 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20  d(&tmp, &iPrev, 
26300 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20  iPos2);.        
26310 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
26320 6c 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69  listNext64(a2, i
26330 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66  2.nPoslist, &iOf
26340 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20 20  f2, &iPos2);.   
26350 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
26360 69 66 28 20 69 50 6f 73 31 3e 3d 30 20 26 26 20  if( iPos1>=0 && 
26370 69 50 6f 73 32 3e 3d 30 20 29 7b 0a 20 20 20 20  iPos2>=0 ){.    
26380 20 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29        while( 1 )
26390 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
263a0 28 20 69 50 6f 73 31 3c 69 50 6f 73 32 20 29 7b  ( iPos1<iPos2 ){
263b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
263c0 66 28 20 69 50 6f 73 31 21 3d 69 50 72 65 76 20  f( iPos1!=iPrev 
263d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
263e0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
263f0 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28  slistSafeAppend(
26400 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50  &tmp, &iPrev, iP
26410 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  os1);.          
26420 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26430 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
26440 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61 31 2c  oslistNext64(a1,
26450 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69   i1.nPoslist, &i
26460 4f 66 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20  Off1, &iPos1);. 
26470 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
26480 20 69 50 6f 73 31 3c 30 20 29 20 62 72 65 61 6b   iPos1<0 ) break
26490 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
264a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
264b0 20 20 20 61 73 73 65 72 74 28 20 69 50 6f 73 32     assert( iPos2
264c0 21 3d 69 50 72 65 76 20 29 3b 0a 20 20 20 20 20  !=iPrev );.     
264d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
264e0 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41  Fts5PoslistSafeA
264f0 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72  ppend(&tmp, &iPr
26500 65 76 2c 20 69 50 6f 73 32 29 3b 0a 20 20 20 20  ev, iPos2);.    
26510 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26520 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74  3Fts5PoslistNext
26530 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69  64(a2, i2.nPosli
26540 73 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f  st, &iOff2, &iPo
26550 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  s2);.           
26560 20 20 20 69 66 28 20 69 50 6f 73 32 3c 30 20 29     if( iPos2<0 )
26570 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
26580 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26590 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  }.        }..   
265a0 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 3e 3d       if( iPos1>=
265b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
265c0 66 28 20 69 50 6f 73 31 21 3d 69 50 72 65 76 20  f( iPos1!=iPrev 
265d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
265e0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
265f0 74 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70  tSafeAppend(&tmp
26600 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73 31 29  , &iPrev, iPos1)
26610 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26620 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
26630 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
26640 28 26 74 6d 70 2c 20 26 61 31 5b 69 4f 66 66 31  (&tmp, &a1[iOff1
26650 5d 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2d 69  ], i1.nPoslist-i
26660 4f 66 66 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  Off1);.        }
26670 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26680 61 73 73 65 72 74 28 20 69 50 6f 73 32 3e 3d 30  assert( iPos2>=0
26690 20 26 26 20 69 50 6f 73 32 21 3d 69 50 72 65 76   && iPos2!=iPrev
266a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   );.          sq
266b0 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
266c0 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c  SafeAppend(&tmp,
266d0 20 26 69 50 72 65 76 2c 20 69 50 6f 73 32 29 3b   &iPrev, iPos2);
266e0 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42  .          fts5B
266f0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
26700 6c 6f 62 28 26 74 6d 70 2c 20 26 61 32 5b 69 4f  lob(&tmp, &a2[iO
26710 66 66 32 5d 2c 20 69 32 2e 6e 50 6f 73 6c 69 73  ff2], i2.nPoslis
26720 74 2d 69 4f 66 66 32 29 3b 0a 20 20 20 20 20 20  t-iOff2);.      
26730 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
26740 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45  WRITEPOSLISTSIZE
26750 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35   */.        fts5
26760 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
26770 56 61 72 69 6e 74 28 26 6f 75 74 2c 20 74 6d 70  Varint(&out, tmp
26780 2e 6e 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 20  .n * 2);.       
26790 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
267a0 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20  ppendBlob(&out, 
267b0 74 6d 70 2e 70 2c 20 74 6d 70 2e 6e 29 3b 0a 20  tmp.p, tmp.n);. 
267c0 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69         fts5Docli
267d0 73 74 49 74 65 72 4e 65 78 74 28 26 69 31 29 3b  stIterNext(&i1);
267e0 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63  .        fts5Doc
267f0 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 32  listIterNext(&i2
26800 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
26810 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c  1.aPoslist==0 ||
26820 20 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20   i2.aPoslist==0 
26830 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
26840 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
26850 69 31 2e 61 50 6f 73 6c 69 73 74 20 29 7b 0a 20  i1.aPoslist ){. 
26860 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70       fts5MergeAp
26870 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20  pendDocid(&out, 
26880 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 31 2e 69  iLastRowid, i1.i
26890 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 66 74  Rowid);.      ft
268a0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
268b0 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 31 2e  ndBlob(&out, i1.
268c0 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e 61 45 6f  aPoslist, i1.aEo
268d0 66 20 2d 20 69 31 2e 61 50 6f 73 6c 69 73 74 29  f - i1.aPoslist)
268e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
268f0 20 69 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74   if( i2.aPoslist
26900 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 65   ){.      fts5Me
26910 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26  rgeAppendDocid(&
26920 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c  out, iLastRowid,
26930 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20   i2.iRowid);.   
26940 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
26950 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74  eAppendBlob(&out
26960 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20 69  , i2.aPoslist, i
26970 32 2e 61 45 6f 66 20 2d 20 69 32 2e 61 50 6f 73  2.aEof - i2.aPos
26980 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  list);.    }.   
26990 20 61 73 73 65 72 74 28 20 6f 75 74 2e 6e 3c 3d   assert( out.n<=
269a0 28 70 31 2d 3e 6e 2b 70 32 2d 3e 6e 2b 39 29 20  (p1->n+p2->n+9) 
269b0 29 3b 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66  );..    fts5Buff
269c0 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 70 31  erSet(&p->rc, p1
269d0 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70 29 3b  , out.n, out.p);
269e0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
269f0 72 65 65 28 26 74 6d 70 29 3b 0a 20 20 20 20 66  ree(&tmp);.    f
26a00 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 6f  ts5BufferFree(&o
26a10 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ut);.  }.}..stat
26a20 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 74 75  ic void fts5Setu
26a30 70 50 72 65 66 69 78 49 74 65 72 28 0a 20 20 46  pPrefixIter(.  F
26a40 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
26a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26a60 2a 20 49 6e 64 65 78 20 74 6f 20 72 65 61 64 20  * Index to read 
26a70 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 44  from */.  int bD
26a80 65 73 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  esc,            
26a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
26aa0 65 20 66 6f 72 20 22 4f 52 44 45 52 20 42 59 20  e for "ORDER BY 
26ab0 72 6f 77 69 64 20 44 45 53 43 22 20 2a 2f 0a 20  rowid DESC" */. 
26ac0 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 6f 6b 65   const u8 *pToke
26ad0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
26ae0 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
26af0 69 6e 69 6e 67 20 70 72 65 66 69 78 20 74 6f 20  ining prefix to 
26b00 6d 61 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20 6e  match */.  int n
26b10 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20  Token,          
26b20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
26b30 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 54 6f  ze of buffer pTo
26b40 6b 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ken in bytes */.
26b50 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
26b60 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  olset,          
26b70 20 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61    /* Restrict ma
26b80 74 63 68 65 73 20 74 6f 20 74 68 65 73 65 20 63  tches to these c
26b90 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 46 74 73 35  olumns */.  Fts5
26ba0 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20  Iter **ppIter   
26bb0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
26bc0 65 77 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 29  ew iterator */.)
26bd0 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
26be0 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74  e *pStruct;.  Ft
26bf0 73 35 42 75 66 66 65 72 20 2a 61 42 75 66 3b 0a  s5Buffer *aBuf;.
26c00 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66    const int nBuf
26c10 20 3d 20 33 32 3b 0a 0a 20 20 76 6f 69 64 20 28   = 32;..  void (
26c20 2a 78 4d 65 72 67 65 29 28 46 74 73 35 49 6e 64  *xMerge)(Fts5Ind
26c30 65 78 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a  ex*, Fts5Buffer*
26c40 2c 20 46 74 73 35 42 75 66 66 65 72 2a 29 3b 0a  , Fts5Buffer*);.
26c50 20 20 76 6f 69 64 20 28 2a 78 41 70 70 65 6e 64    void (*xAppend
26c60 29 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 69 36  )(Fts5Index*, i6
26c70 34 2c 20 46 74 73 35 49 74 65 72 2a 2c 20 46 74  4, Fts5Iter*, Ft
26c80 73 35 42 75 66 66 65 72 2a 29 3b 0a 20 20 69 66  s5Buffer*);.  if
26c90 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44  ( p->pConfig->eD
26ca0 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
26cb0 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 78  IL_NONE ){.    x
26cc0 4d 65 72 67 65 20 3d 20 66 74 73 35 4d 65 72 67  Merge = fts5Merg
26cd0 65 52 6f 77 69 64 4c 69 73 74 73 3b 0a 20 20 20  eRowidLists;.   
26ce0 20 78 41 70 70 65 6e 64 20 3d 20 66 74 73 35 41   xAppend = fts5A
26cf0 70 70 65 6e 64 52 6f 77 69 64 3b 0a 20 20 7d 65  ppendRowid;.  }e
26d00 6c 73 65 7b 0a 20 20 20 20 78 4d 65 72 67 65 20  lse{.    xMerge 
26d10 3d 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69  = fts5MergePrefi
26d20 78 4c 69 73 74 73 3b 0a 20 20 20 20 78 41 70 70  xLists;.    xApp
26d30 65 6e 64 20 3d 20 66 74 73 35 41 70 70 65 6e 64  end = fts5Append
26d40 50 6f 73 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20  Poslist;.  }..  
26d50 61 42 75 66 20 3d 20 28 46 74 73 35 42 75 66 66  aBuf = (Fts5Buff
26d60 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f  er*)fts5IdxMallo
26d70 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  c(p, sizeof(Fts5
26d80 42 75 66 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20  Buffer)*nBuf);. 
26d90 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53   pStruct = fts5S
26da0 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
26db0 0a 0a 20 20 69 66 28 20 61 42 75 66 20 26 26 20  ..  if( aBuf && 
26dc0 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 63  pStruct ){.    c
26dd0 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
26de0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
26df0 5f 53 43 41 4e 20 0a 20 20 20 20 20 20 20 20 20  _SCAN .         
26e00 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 54 53             | FTS
26e10 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b 49  5INDEX_QUERY_SKI
26e20 50 45 4d 50 54 59 20 0a 20 20 20 20 20 20 20 20  PEMPTY .        
26e30 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 54              | FT
26e40 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f  S5INDEX_QUERY_NO
26e50 4f 55 54 50 55 54 3b 0a 20 20 20 20 69 6e 74 20  OUTPUT;.    int 
26e60 69 3b 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74  i;.    i64 iLast
26e70 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46  Rowid = 0;.    F
26e80 74 73 35 49 74 65 72 20 2a 70 31 20 3d 20 30 3b  ts5Iter *p1 = 0;
26e90 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
26ea0 20 75 73 65 64 20 74 6f 20 67 61 74 68 65 72 20   used to gather 
26eb0 64 61 74 61 20 66 72 6f 6d 20 69 6e 64 65 78 20  data from index 
26ec0 2a 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61 20  */.    Fts5Data 
26ed0 2a 70 44 61 74 61 3b 0a 20 20 20 20 46 74 73 35  *pData;.    Fts5
26ee0 42 75 66 66 65 72 20 64 6f 63 6c 69 73 74 3b 0a  Buffer doclist;.
26ef0 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d      int bNewTerm
26f00 20 3d 20 31 3b 0a 0a 20 20 20 20 6d 65 6d 73 65   = 1;..    memse
26f10 74 28 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20 73  t(&doclist, 0, s
26f20 69 7a 65 6f 66 28 64 6f 63 6c 69 73 74 29 29 3b  izeof(doclist));
26f30 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74  .    fts5MultiIt
26f40 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74  erNew(p, pStruct
26f50 2c 20 66 6c 61 67 73 2c 20 70 43 6f 6c 73 65 74  , flags, pColset
26f60 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , pToken, nToken
26f70 2c 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a 20  , -1, 0, &p1);. 
26f80 20 20 20 66 74 73 35 49 74 65 72 53 65 74 4f 75     fts5IterSetOu
26f90 74 70 75 74 43 62 28 26 70 2d 3e 72 63 2c 20 70  tputCb(&p->rc, p
26fa0 31 29 3b 0a 20 20 20 20 66 6f 72 28 20 2f 2a 20  1);.    for( /* 
26fb0 6e 6f 2d 6f 70 20 2a 2f 20 3b 0a 20 20 20 20 20  no-op */ ;.     
26fc0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
26fd0 45 6f 66 28 70 2c 20 70 31 29 3d 3d 30 3b 0a 20  Eof(p, p1)==0;. 
26fe0 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
26ff0 49 74 65 72 4e 65 78 74 32 28 70 2c 20 70 31 2c  IterNext2(p, p1,
27000 20 26 62 4e 65 77 54 65 72 6d 29 0a 20 20 20 20   &bNewTerm).    
27010 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ){.      Fts5Seg
27020 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 31  Iter *pSeg = &p1
27030 2d 3e 61 53 65 67 5b 20 70 31 2d 3e 61 46 69 72  ->aSeg[ p1->aFir
27040 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
27050 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20        int nTerm 
27060 3d 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 3b 0a  = pSeg->term.n;.
27070 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a        const u8 *
27080 70 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e 74 65  pTerm = pSeg->te
27090 72 6d 2e 70 3b 0a 20 20 20 20 20 20 70 31 2d 3e  rm.p;.      p1->
270a0 78 53 65 74 4f 75 74 70 75 74 73 28 70 31 2c 20  xSetOutputs(p1, 
270b0 70 53 65 67 29 3b 0a 0a 20 20 20 20 20 20 61 73  pSeg);..      as
270c0 73 65 72 74 5f 6e 63 28 20 6d 65 6d 63 6d 70 28  sert_nc( memcmp(
270d0 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 4d  pToken, pTerm, M
270e0 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d  IN(nToken, nTerm
270f0 29 29 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ))<=0 );.      i
27100 66 28 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20  f( bNewTerm ){. 
27110 20 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d         if( nTerm
27120 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63 6d  <nToken || memcm
27130 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c  p(pToken, pTerm,
27140 20 6e 54 6f 6b 65 6e 29 20 29 20 62 72 65 61 6b   nToken) ) break
27150 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
27160 20 69 66 28 20 70 31 2d 3e 62 61 73 65 2e 6e 44   if( p1->base.nD
27170 61 74 61 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ata==0 ) continu
27180 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 31  e;..      if( p1
27190 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 3c 3d 69  ->base.iRowid<=i
271a0 4c 61 73 74 52 6f 77 69 64 20 26 26 20 64 6f 63  LastRowid && doc
271b0 6c 69 73 74 2e 6e 3e 30 20 29 7b 0a 20 20 20 20  list.n>0 ){.    
271c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e      for(i=0; p->
271d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
271e0 20 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b 29   doclist.n; i++)
271f0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
27200 72 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a 20 20  rt( i<nBuf );.  
27210 20 20 20 20 20 20 20 20 69 66 28 20 61 42 75 66          if( aBuf
27220 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  [i].n==0 ){.    
27230 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
27240 65 72 53 77 61 70 28 26 64 6f 63 6c 69 73 74 2c  erSwap(&doclist,
27250 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20   &aBuf[i]);.    
27260 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
27270 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73 74 29  erZero(&doclist)
27280 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
27290 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 78  e{.            x
272a0 4d 65 72 67 65 28 70 2c 20 26 64 6f 63 6c 69 73  Merge(p, &doclis
272b0 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20  t, &aBuf[i]);.  
272c0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
272d0 66 66 65 72 5a 65 72 6f 28 26 61 42 75 66 5b 69  fferZero(&aBuf[i
272e0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ]);.          }.
272f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27300 20 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30    iLastRowid = 0
27310 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
27320 20 78 41 70 70 65 6e 64 28 70 2c 20 70 31 2d 3e   xAppend(p, p1->
27330 62 61 73 65 2e 69 52 6f 77 69 64 2d 69 4c 61 73  base.iRowid-iLas
27340 74 52 6f 77 69 64 2c 20 70 31 2c 20 26 64 6f 63  tRowid, p1, &doc
27350 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 4c 61  list);.      iLa
27360 73 74 52 6f 77 69 64 20 3d 20 70 31 2d 3e 62 61  stRowid = p1->ba
27370 73 65 2e 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d  se.iRowid;.    }
27380 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
27390 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nBuf; i++){.   
273a0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
273b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
273c0 20 20 20 78 4d 65 72 67 65 28 70 2c 20 26 64 6f     xMerge(p, &do
273d0 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29  clist, &aBuf[i])
273e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
273f0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
27400 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  aBuf[i]);.    }.
27410 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
27420 72 46 72 65 65 28 70 31 29 3b 0a 0a 20 20 20 20  rFree(p1);..    
27430 70 44 61 74 61 20 3d 20 66 74 73 35 49 64 78 4d  pData = fts5IdxM
27440 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
27450 46 74 73 35 44 61 74 61 29 20 2b 20 64 6f 63 6c  Fts5Data) + docl
27460 69 73 74 2e 6e 29 3b 0a 20 20 20 20 69 66 28 20  ist.n);.    if( 
27470 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70  pData ){.      p
27480 44 61 74 61 2d 3e 70 20 3d 20 28 75 38 2a 29 26  Data->p = (u8*)&
27490 70 44 61 74 61 5b 31 5d 3b 0a 20 20 20 20 20 20  pData[1];.      
274a0 70 44 61 74 61 2d 3e 6e 6e 20 3d 20 70 44 61 74  pData->nn = pDat
274b0 61 2d 3e 73 7a 4c 65 61 66 20 3d 20 64 6f 63 6c  a->szLeaf = docl
274c0 69 73 74 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28  ist.n;.      if(
274d0 20 64 6f 63 6c 69 73 74 2e 6e 20 29 20 6d 65 6d   doclist.n ) mem
274e0 63 70 79 28 70 44 61 74 61 2d 3e 70 2c 20 64 6f  cpy(pData->p, do
274f0 63 6c 69 73 74 2e 70 2c 20 64 6f 63 6c 69 73 74  clist.p, doclist
27500 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d  .n);.      fts5M
27510 75 6c 74 69 49 74 65 72 4e 65 77 32 28 70 2c 20  ultiIterNew2(p, 
27520 70 44 61 74 61 2c 20 62 44 65 73 63 2c 20 70 70  pData, bDesc, pp
27530 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Iter);.    }.   
27540 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
27550 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 0a  &doclist);.  }..
27560 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
27570 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
27580 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
27590 61 42 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  aBuf);.}.../*.**
275a0 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 61   Indicate that a
275b0 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  ll subsequent ca
275c0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74  lls to sqlite3Ft
275d0 73 35 49 6e 64 65 78 57 72 69 74 65 28 29 20 70  s5IndexWrite() p
275e0 65 72 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65  ertain.** to the
275f0 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72   document with r
27600 6f 77 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a  owid iRowid..*/.
27610 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
27620 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65 28 46  ndexBeginWrite(F
27630 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
27640 20 62 44 65 6c 65 74 65 2c 20 69 36 34 20 69 52   bDelete, i64 iR
27650 6f 77 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28  owid){.  assert(
27660 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
27670 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  K );..  /* Alloc
27680 61 74 65 20 74 68 65 20 68 61 73 68 20 74 61 62  ate the hash tab
27690 6c 65 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  le if it has not
276a0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
276b0 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 66 28  located */.  if(
276c0 20 70 2d 3e 70 48 61 73 68 3d 3d 30 20 29 7b 0a   p->pHash==0 ){.
276d0 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
276e0 74 65 33 46 74 73 35 48 61 73 68 4e 65 77 28 70  te3Fts5HashNew(p
276f0 2d 3e 70 43 6f 6e 66 69 67 2c 20 26 70 2d 3e 70  ->pConfig, &p->p
27700 48 61 73 68 2c 20 26 70 2d 3e 6e 50 65 6e 64 69  Hash, &p->nPendi
27710 6e 67 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20  ngData);.  }..  
27720 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 68 61 73  /* Flush the has
27730 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b 20  h table to disk 
27740 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
27750 20 69 66 28 20 69 52 6f 77 69 64 3c 70 2d 3e 69   if( iRowid<p->i
27760 57 72 69 74 65 52 6f 77 69 64 20 0a 20 20 20 7c  WriteRowid .   |
27770 7c 20 28 69 52 6f 77 69 64 3d 3d 70 2d 3e 69 57  | (iRowid==p->iW
27780 72 69 74 65 52 6f 77 69 64 20 26 26 20 70 2d 3e  riteRowid && p->
27790 62 44 65 6c 65 74 65 3d 3d 30 29 0a 20 20 20 7c  bDelete==0).   |
277a0 7c 20 28 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61  | (p->nPendingDa
277b0 74 61 20 3e 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  ta > p->pConfig-
277c0 3e 6e 48 61 73 68 53 69 7a 65 29 20 0a 20 20 29  >nHashSize) .  )
277d0 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 46  {.    fts5IndexF
277e0 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a 0a 20 20  lush(p);.  }..  
277f0 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 3d  p->iWriteRowid =
27800 20 69 52 6f 77 69 64 3b 0a 20 20 70 2d 3e 62 44   iRowid;.  p->bD
27810 65 6c 65 74 65 20 3d 20 62 44 65 6c 65 74 65 3b  elete = bDelete;
27820 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
27830 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
27840 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61  ./*.** Commit da
27850 74 61 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69  ta to disk..*/.i
27860 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
27870 64 65 78 53 79 6e 63 28 46 74 73 35 49 6e 64 65  dexSync(Fts5Inde
27880 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  x *p){.  assert(
27890 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
278a0 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78  K );.  fts5Index
278b0 46 6c 75 73 68 28 70 29 3b 0a 20 20 66 74 73 35  Flush(p);.  fts5
278c0 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a  CloseReader(p);.
278d0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
278e0 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
278f0 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6e  /*.** Discard an
27900 79 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  y data stored in
27910 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68   the in-memory h
27920 61 73 68 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e  ash tables. Do n
27930 6f 74 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 74  ot write it.** t
27940 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
27950 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73  Additionally, as
27960 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 63 6f  sume that the co
27970 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f  ntents of the %_
27980 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61  data.** table ma
27990 79 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 6f  y have changed o
279a0 6e 20 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69  n disk. So any i
279b0 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 73 20  n-memory caches 
279c0 6f 66 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65  of %_data .** re
279d0 63 6f 72 64 73 20 6d 75 73 74 20 62 65 20 69 6e  cords must be in
279e0 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e  validated..*/.in
279f0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
27a00 65 78 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49  exRollback(Fts5I
27a10 6e 64 65 78 20 2a 70 29 7b 0a 20 20 66 74 73 35  ndex *p){.  fts5
27a20 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a  CloseReader(p);.
27a30 20 20 66 74 73 35 49 6e 64 65 78 44 69 73 63 61    fts5IndexDisca
27a40 72 64 44 61 74 61 28 70 29 3b 0a 20 20 66 74 73  rdData(p);.  fts
27a50 35 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69  5StructureInvali
27a60 64 61 74 65 28 70 29 3b 0a 20 20 2f 2a 20 61 73  date(p);.  /* as
27a70 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
27a80 49 54 45 5f 4f 4b 20 29 3b 20 2a 2f 0a 20 20 72  ITE_OK ); */.  r
27a90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27aa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f  .}../*.** The %_
27ab0 64 61 74 61 20 74 61 62 6c 65 20 69 73 20 63 6f  data table is co
27ac0 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 77  mpletely empty w
27ad0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
27ae0 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 69  n is called. Thi
27af0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 6f  s.** function po
27b00 70 75 6c 61 74 65 73 20 69 74 20 77 69 74 68 20  pulates it with 
27b10 74 68 65 20 69 6e 69 74 69 61 6c 20 73 74 72 75  the initial stru
27b20 63 74 75 72 65 20 6f 62 6a 65 63 74 73 20 66 6f  cture objects fo
27b30 72 20 65 61 63 68 20 69 6e 64 65 78 2c 0a 2a 2a  r each index,.**
27b40 20 61 6e 64 20 74 68 65 20 69 6e 69 74 69 61 6c   and the initial
27b50 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
27b60 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72  "averages" recor
27b70 64 20 28 61 20 7a 65 72 6f 2d 62 79 74 65 20 62  d (a zero-byte b
27b80 6c 6f 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lob)..*/.int sql
27b90 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 69  ite3Fts5IndexRei
27ba0 6e 69 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70  nit(Fts5Index *p
27bb0 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ){.  Fts5Structu
27bc0 72 65 20 73 3b 0a 20 20 66 74 73 35 53 74 72 75  re s;.  fts5Stru
27bd0 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28  ctureInvalidate(
27be0 70 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c  p);.  memset(&s,
27bf0 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
27c00 74 72 75 63 74 75 72 65 29 29 3b 0a 20 20 66 74  tructure));.  ft
27c10 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 46  s5DataWrite(p, F
27c20 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
27c30 49 44 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22  ID, (const u8*)"
27c40 22 2c 20 30 29 3b 0a 20 20 66 74 73 35 53 74 72  ", 0);.  fts5Str
27c50 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 26  uctureWrite(p, &
27c60 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  s);.  return fts
27c70 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
27c80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
27c90 20 6e 65 77 20 46 74 73 35 49 6e 64 65 78 20 68   new Fts5Index h
27ca0 61 6e 64 6c 65 2e 20 49 66 20 74 68 65 20 62 43  andle. If the bC
27cb0 72 65 61 74 65 20 61 72 67 75 6d 65 6e 74 20 69  reate argument i
27cc0 73 20 74 72 75 65 2c 20 63 72 65 61 74 65 0a 2a  s true, create.*
27cd0 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
27ce0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
27cf0 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a  %_data table..**
27d00 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
27d10 6c 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f  l, set *pp to po
27d20 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f  int to the new o
27d30 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
27d40 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f   SQLITE_OK..** O
27d50 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 2a 70  therwise, set *p
27d60 70 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72 65  p to NULL and re
27d70 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
27d80 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e  rror code..*/.in
27d90 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
27da0 65 78 4f 70 65 6e 28 0a 20 20 46 74 73 35 43 6f  exOpen(.  Fts5Co
27db0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a  nfig *pConfig, .
27dc0 20 20 69 6e 74 20 62 43 72 65 61 74 65 2c 20 0a    int bCreate, .
27dd0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 2a 70 70    Fts5Index **pp
27de0 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  ,.  char **pzErr
27df0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
27e00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35  QLITE_OK;.  Fts5
27e10 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20  Index *p;       
27e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
27e30 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20  ew object */..  
27e40 2a 70 70 20 3d 20 70 20 3d 20 28 46 74 73 35 49  *pp = p = (Fts5I
27e50 6e 64 65 78 2a 29 73 71 6c 69 74 65 33 46 74 73  ndex*)sqlite3Fts
27e60 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c  5MallocZero(&rc,
27e70 20 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65   sizeof(Fts5Inde
27e80 78 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  x));.  if( rc==S
27e90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27ea0 70 2d 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f  p->pConfig = pCo
27eb0 6e 66 69 67 3b 0a 20 20 20 20 70 2d 3e 6e 57 6f  nfig;.    p->nWo
27ec0 72 6b 55 6e 69 74 20 3d 20 46 54 53 35 5f 57 4f  rkUnit = FTS5_WO
27ed0 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 70 2d 3e  RK_UNIT;.    p->
27ee0 7a 44 61 74 61 54 62 6c 20 3d 20 73 71 6c 69 74  zDataTbl = sqlit
27ef0 65 33 46 74 73 35 4d 70 72 69 6e 74 66 28 26 72  e3Fts5Mprintf(&r
27f00 63 2c 20 22 25 73 5f 64 61 74 61 22 2c 20 70 43  c, "%s_data", pC
27f10 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  onfig->zName);. 
27f20 20 20 20 69 66 28 20 70 2d 3e 7a 44 61 74 61 54     if( p->zDataT
27f30 62 6c 20 26 26 20 62 43 72 65 61 74 65 20 29 7b  bl && bCreate ){
27f40 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
27f50 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61 62  te3Fts5CreateTab
27f60 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 43  le(.          pC
27f70 6f 6e 66 69 67 2c 20 22 64 61 74 61 22 2c 20 22  onfig, "data", "
27f80 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  id INTEGER PRIMA
27f90 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c  RY KEY, block BL
27fa0 4f 42 22 2c 20 30 2c 20 70 7a 45 72 72 0a 20 20  OB", 0, pzErr.  
27fb0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
27fc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27fd0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
27fe0 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74 65  qlite3Fts5Create
27ff0 54 61 62 6c 65 28 70 43 6f 6e 66 69 67 2c 20 22  Table(pConfig, "
28000 69 64 78 22 2c 20 0a 20 20 20 20 20 20 20 20 20  idx", .         
28010 20 20 20 22 73 65 67 69 64 2c 20 74 65 72 6d 2c     "segid, term,
28020 20 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b   pgno, PRIMARY K
28030 45 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 22  EY(segid, term)"
28040 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 31  , .            1
28050 2c 20 70 7a 45 72 72 0a 20 20 20 20 20 20 20 20  , pzErr.        
28060 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
28070 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28080 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
28090 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e   = sqlite3Fts5In
280a0 64 65 78 52 65 69 6e 69 74 28 70 29 3b 0a 20 20  dexReinit(p);.  
280b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
280c0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
280d0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
280e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
280f0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
28100 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
28110 43 6c 6f 73 65 28 70 29 3b 0a 20 20 20 20 2a 70  Close(p);.    *p
28120 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  p = 0;.  }.  ret
28130 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
28140 20 43 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20   Close a handle 
28150 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72  opened by an ear
28160 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  lier call to sql
28170 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65  ite3Fts5IndexOpe
28180 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  n()..*/.int sqli
28190 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73  te3Fts5IndexClos
281a0 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  e(Fts5Index *p){
281b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
281c0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 29  TE_OK;.  if( p )
281d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
281e0 3e 70 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20  >pReader==0 );. 
281f0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
28200 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20  Invalidate(p);. 
28210 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
28220 69 7a 65 28 70 2d 3e 70 57 72 69 74 65 72 29 3b  ize(p->pWriter);
28230 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
28240 61 6c 69 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65  alize(p->pDelete
28250 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
28260 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78  finalize(p->pIdx
28270 57 72 69 74 65 72 29 3b 0a 20 20 20 20 73 71 6c  Writer);.    sql
28280 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d  ite3_finalize(p-
28290 3e 70 49 64 78 44 65 6c 65 74 65 72 29 3b 0a 20  >pIdxDeleter);. 
282a0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
282b0 69 7a 65 28 70 2d 3e 70 49 64 78 53 65 6c 65 63  ize(p->pIdxSelec
282c0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
282d0 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 61 74  finalize(p->pDat
282e0 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20 20 20 73  aVersion);.    s
282f0 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 46 72  qlite3Fts5HashFr
28300 65 65 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20  ee(p->pHash);.  
28310 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
28320 2d 3e 7a 44 61 74 61 54 62 6c 29 3b 0a 20 20 20  ->zDataTbl);.   
28330 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
28340 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
28350 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  c;.}../*.** Argu
28360 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f  ment p points to
28370 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
28380 6e 69 6e 67 20 75 74 66 2d 38 20 74 65 78 74 20  ning utf-8 text 
28390 74 68 61 74 20 69 73 20 6e 20 62 79 74 65 73 20  that is n bytes 
283a0 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e 20 52 65 74  in .** size. Ret
283b0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
283c0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6e  f bytes in the n
283d0 43 68 61 72 20 63 68 61 72 61 63 74 65 72 20 70  Char character p
283e0 72 65 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20  refix of the.** 
283f0 62 75 66 66 65 72 2c 20 6f 72 20 30 20 69 66 20  buffer, or 0 if 
28400 74 68 65 72 65 20 61 72 65 20 6c 65 73 73 20 74  there are less t
28410 68 61 6e 20 6e 43 68 61 72 20 63 68 61 72 61 63  han nChar charac
28420 74 65 72 73 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a  ters in total..*
28430 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
28440 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42  5IndexCharlenToB
28450 79 74 65 6c 65 6e 28 0a 20 20 63 6f 6e 73 74 20  ytelen(.  const 
28460 63 68 61 72 20 2a 70 2c 20 0a 20 20 69 6e 74 20  char *p, .  int 
28470 6e 42 79 74 65 2c 20 0a 20 20 69 6e 74 20 6e 43  nByte, .  int nC
28480 68 61 72 0a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  har.){.  int n =
28490 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
284a0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b  or(i=0; i<nChar;
284b0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e   i++){.    if( n
284c0 3e 3d 6e 42 79 74 65 20 29 20 72 65 74 75 72 6e  >=nByte ) return
284d0 20 30 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70 75   0;      /* Inpu
284e0 74 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72  t contains fewer
284f0 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68 61 72   than nChar char
28500 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 75 6e  s */.    if( (un
28510 73 69 67 6e 65 64 20 63 68 61 72 29 70 5b 6e 2b  signed char)p[n+
28520 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20  +]>=0xc0 ){.    
28530 20 20 77 68 69 6c 65 28 20 28 70 5b 6e 5d 20 26    while( (p[n] &
28540 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 7b 0a   0xc0)==0x80 ){.
28550 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20          n++;.   
28560 20 20 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79 74       if( n>=nByt
28570 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  e ) break;.     
28580 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
28590 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
285a0 2a 20 70 49 6e 20 69 73 20 61 20 55 54 46 2d 38  * pIn is a UTF-8
285b0 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2c   encoded string,
285c0 20 6e 49 6e 20 62 79 74 65 73 20 69 6e 20 73 69   nIn bytes in si
285d0 7a 65 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ze. Return the n
285e0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 75 6e 69 63  umber of.** unic
285f0 6f 64 65 20 63 68 61 72 61 63 74 65 72 73 20 69  ode characters i
28600 6e 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f  n the string..*/
28610 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
28620 49 6e 64 65 78 43 68 61 72 6c 65 6e 28 63 6f 6e  IndexCharlen(con
28630 73 74 20 63 68 61 72 20 2a 70 49 6e 2c 20 69 6e  st char *pIn, in
28640 74 20 6e 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 43  t nIn){.  int nC
28650 68 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  har = 0;        
28660 20 20 20 20 0a 20 20 69 6e 74 20 69 20 3d 20 30      .  int i = 0
28670 3b 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e  ;.  while( i<nIn
28680 20 29 7b 0a 20 20 20 20 69 66 28 20 28 75 6e 73   ){.    if( (uns
28690 69 67 6e 65 64 20 63 68 61 72 29 70 49 6e 5b 69  igned char)pIn[i
286a0 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20  ++]>=0xc0 ){.   
286b0 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20     while( i<nIn 
286c0 26 26 20 28 70 49 6e 5b 69 5d 20 26 20 30 78 63  && (pIn[i] & 0xc
286d0 30 29 3d 3d 30 78 38 30 20 29 20 69 2b 2b 3b 0a  0)==0x80 ) i++;.
286e0 20 20 20 20 7d 0a 20 20 20 20 6e 43 68 61 72 2b      }.    nChar+
286f0 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
28700 6e 43 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nChar;.}../*.** 
28710 49 6e 73 65 72 74 20 6f 72 20 72 65 6d 6f 76 65  Insert or remove
28720 20 64 61 74 61 20 74 6f 20 6f 72 20 66 72 6f 6d   data to or from
28730 20 74 68 65 20 69 6e 64 65 78 2e 20 45 61 63 68   the index. Each
28740 20 74 69 6d 65 20 61 20 64 6f 63 75 6d 65 6e 74   time a document
28750 20 69 73 20 0a 2a 2a 20 61 64 64 65 64 20 74 6f   is .** added to
28760 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   or removed from
28770 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68 69 73   the index, this
28780 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
28790 6c 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a  led one or more.
287a0 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20  ** times..**.** 
287b0 46 6f 72 20 61 6e 20 69 6e 73 65 72 74 2c 20 69  For an insert, i
287c0 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  t must be called
287d0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
287e0 6f 6b 65 6e 20 69 6e 20 74 68 65 20 6e 65 77 20  oken in the new 
287f0 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20  document..** If 
28800 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  the operation is
28810 20 61 20 64 65 6c 65 74 65 2c 20 69 74 20 6d 75   a delete, it mu
28820 73 74 20 62 65 20 63 61 6c 6c 65 64 20 28 61 74  st be called (at
28830 20 6c 65 61 73 74 29 20 6f 6e 63 65 20 66 6f 72   least) once for
28840 20 65 61 63 68 0a 2a 2a 20 75 6e 69 71 75 65 20   each.** unique 
28850 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 64 6f 63  token in the doc
28860 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 69 43  ument with an iC
28870 6f 6c 20 76 61 6c 75 65 20 6c 65 73 73 20 74 68  ol value less th
28880 61 6e 20 7a 65 72 6f 2e 20 54 68 65 20 69 50 6f  an zero. The iPo
28890 73 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73  s.** argument is
288a0 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 61 20 64   ignored for a d
288b0 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  elete..*/.int sq
288c0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 57 72  lite3Fts5IndexWr
288d0 69 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ite(.  Fts5Index
288e0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
288f0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
28900 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20  to write to */. 
28910 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
28920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28930 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e   /* Column token
28940 20 61 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65   appears in (-ve
28950 20 2d 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20   -> delete) */. 
28960 20 69 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20   int iPos,      
28970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28980 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20   /* Position of 
28990 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c  token within col
289a0 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  umn */.  const c
289b0 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74  har *pToken, int
289c0 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65   nToken  /* Toke
289d0 6e 20 74 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f  n to add or remo
289e0 76 65 20 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e  ve to or from in
289f0 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  dex */.){.  int 
28a00 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
28a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
28a20 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
28a30 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a  hrough indexes *
28a40 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
28a50 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
28a60 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
28a70 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66  de */.  Fts5Conf
28a80 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
28a90 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20 20 61 73 73  >pConfig;..  ass
28aa0 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
28ab0 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72  TE_OK );.  asser
28ac0 74 28 20 28 69 43 6f 6c 3c 30 29 3d 3d 70 2d 3e  t( (iCol<0)==p->
28ad0 62 44 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f 2a  bDelete );..  /*
28ae0 20 41 64 64 20 74 68 65 20 65 6e 74 72 79 20 74   Add the entry t
28af0 6f 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 73  o the main terms
28b00 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 72 63 20   index. */.  rc 
28b10 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  = sqlite3Fts5Has
28b20 68 57 72 69 74 65 28 0a 20 20 20 20 20 20 70 2d  hWrite(.      p-
28b30 3e 70 48 61 73 68 2c 20 70 2d 3e 69 57 72 69 74  >pHash, p->iWrit
28b40 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50  eRowid, iCol, iP
28b50 6f 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52  os, FTS5_MAIN_PR
28b60 45 46 49 58 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54  EFIX, pToken, nT
28b70 6f 6b 65 6e 0a 20 20 29 3b 0a 0a 20 20 66 6f 72  oken.  );..  for
28b80 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d  (i=0; i<pConfig-
28b90 3e 6e 50 72 65 66 69 78 20 26 26 20 72 63 3d 3d  >nPrefix && rc==
28ba0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
28bb0 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  .    const int n
28bc0 43 68 61 72 20 3d 20 70 43 6f 6e 66 69 67 2d 3e  Char = pConfig->
28bd0 61 50 72 65 66 69 78 5b 69 5d 3b 0a 20 20 20 20  aPrefix[i];.    
28be0 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69  int nByte = sqli
28bf0 74 65 33 46 74 73 35 49 6e 64 65 78 43 68 61 72  te3Fts5IndexChar
28c00 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54 6f  lenToBytelen(pTo
28c10 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 6e 43 68  ken, nToken, nCh
28c20 61 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79  ar);.    if( nBy
28c30 74 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  te ){.      rc =
28c40 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
28c50 57 72 69 74 65 28 70 2d 3e 70 48 61 73 68 2c 20  Write(p->pHash, 
28c60 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 57  .          p->iW
28c70 72 69 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c  riteRowid, iCol,
28c80 20 69 50 6f 73 2c 20 28 63 68 61 72 29 28 46 54   iPos, (char)(FT
28c90 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2b 69  S5_MAIN_PREFIX+i
28ca0 2b 31 29 2c 20 70 54 6f 6b 65 6e 2c 0a 20 20 20  +1), pToken,.   
28cb0 20 20 20 20 20 20 20 6e 42 79 74 65 0a 20 20 20         nByte.   
28cc0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a     );.    }.  }.
28cd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28ce0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  ./*.** Open a ne
28cf0 77 20 69 74 65 72 61 74 6f 72 20 74 6f 20 69 74  w iterator to it
28d00 65 72 61 74 65 20 74 68 6f 75 67 68 20 61 6c 6c  erate though all
28d10 20 72 6f 77 69 64 20 74 68 61 74 20 6d 61 74 63   rowid that matc
28d20 68 20 74 68 65 20 0a 2a 2a 20 73 70 65 63 69 66  h the .** specif
28d30 69 65 64 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b  ied token or tok
28d40 65 6e 20 70 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e  en prefix..*/.in
28d50 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
28d60 65 78 51 75 65 72 79 28 0a 20 20 46 74 73 35 49  exQuery(.  Fts5I
28d70 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
28d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
28d90 53 20 69 6e 64 65 78 20 74 6f 20 71 75 65 72 79  S index to query
28da0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
28db0 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54   *pToken, int nT
28dc0 6f 6b 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28  oken, /* Token (
28dd0 6f 72 20 70 72 65 66 69 78 29 20 74 6f 20 71 75  or prefix) to qu
28de0 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ery for */.  int
28df0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
28e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28e10 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45  Mask of FTS5INDE
28e20 58 5f 51 55 45 52 59 5f 58 20 66 6c 61 67 73 20  X_QUERY_X flags 
28e30 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  */.  Fts5Colset 
28e40 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20  *pColset,       
28e50 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 68       /* Match th
28e60 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6f 6e 6c 79  ese columns only
28e70 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49   */.  Fts5IndexI
28e80 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20  ter **ppIter    
28e90 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
28ea0 77 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63  w iterator objec
28eb0 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f  t */.){.  Fts5Co
28ec0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
28ed0 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74  p->pConfig;.  Ft
28ee0 73 35 49 74 65 72 20 2a 70 52 65 74 20 3d 20 30  s5Iter *pRet = 0
28ef0 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  ;.  Fts5Buffer b
28f00 75 66 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a  uf = {0, 0, 0};.
28f10 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 51 55 45  .  /* If the QUE
28f20 52 59 5f 53 43 41 4e 20 66 6c 61 67 20 69 73 20  RY_SCAN flag is 
28f30 73 65 74 2c 20 61 6c 6c 20 6f 74 68 65 72 20 66  set, all other f
28f40 6c 61 67 73 20 6d 75 73 74 20 62 65 20 63 6c 65  lags must be cle
28f50 61 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ar. */.  assert(
28f60 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e   (flags & FTS5IN
28f70 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3d  DEX_QUERY_SCAN)=
28f80 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 46 54 53  =0 || flags==FTS
28f90 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41  5INDEX_QUERY_SCA
28fa0 4e 20 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  N );..  if( sqli
28fb0 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a  te3Fts5BufferSiz
28fc0 65 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  e(&p->rc, &buf, 
28fd0 6e 54 6f 6b 65 6e 2b 31 29 3d 3d 30 20 29 7b 0a  nToken+1)==0 ){.
28fe0 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30      int iIdx = 0
28ff0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29000 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 73 65    /* Index to se
29010 61 72 63 68 20 2a 2f 0a 20 20 20 20 69 66 28 20  arch */.    if( 
29020 6e 54 6f 6b 65 6e 20 29 20 6d 65 6d 63 70 79 28  nToken ) memcpy(
29030 26 62 75 66 2e 70 5b 31 5d 2c 20 70 54 6f 6b 65  &buf.p[1], pToke
29040 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 0a 20 20 20  n, nToken);..   
29050 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
29060 68 69 63 68 20 69 6e 64 65 78 20 74 6f 20 73 65  hich index to se
29070 61 72 63 68 20 61 6e 64 20 73 65 74 20 69 49 64  arch and set iId
29080 78 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49  x accordingly. I
29090 66 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73  f this.    ** is
290a0 20 61 20 70 72 65 66 69 78 20 71 75 65 72 79 20   a prefix query 
290b0 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65 20  for which there 
290c0 69 73 20 6e 6f 20 70 72 65 66 69 78 20 69 6e 64  is no prefix ind
290d0 65 78 2c 20 73 65 74 20 69 49 64 78 20 74 6f 0a  ex, set iIdx to.
290e0 20 20 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74      ** greater t
290f0 68 61 6e 20 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  han pConfig->nPr
29100 65 66 69 78 20 74 6f 20 69 6e 64 69 63 61 74 65  efix to indicate
29110 20 74 68 61 74 20 74 68 65 20 71 75 65 72 79 20   that the query 
29120 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 73  will be.    ** s
29130 61 74 69 73 66 69 65 64 20 62 79 20 73 63 61 6e  atisfied by scan
29140 6e 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 74 65  ning multiple te
29150 72 6d 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  rms in the main 
29160 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  index..    **.  
29170 20 20 2a 2a 20 49 66 20 74 68 65 20 51 55 45 52    ** If the QUER
29180 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20 66 6c 61  Y_TEST_NOIDX fla
29190 67 20 77 61 73 20 73 70 65 63 69 66 69 65 64 2c  g was specified,
291a0 20 74 68 65 6e 20 74 68 69 73 20 6d 75 73 74 20   then this must 
291b0 62 65 20 61 0a 20 20 20 20 2a 2a 20 70 72 65 66  be a.    ** pref
291c0 69 78 2d 71 75 65 72 79 2e 20 49 6e 73 74 65 61  ix-query. Instea
291d0 64 20 6f 66 20 75 73 69 6e 67 20 61 20 70 72 65  d of using a pre
291e0 66 69 78 2d 69 6e 64 65 78 20 28 69 66 20 6f 6e  fix-index (if on
291f0 65 20 65 78 69 73 74 73 29 2c 20 0a 20 20 20 20  e exists), .    
29200 2a 2a 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  ** evaluate the 
29210 70 72 65 66 69 78 20 71 75 65 72 79 20 75 73 69  prefix query usi
29220 6e 67 20 74 68 65 20 6d 61 69 6e 20 46 54 53 20  ng the main FTS 
29230 69 6e 64 65 78 2e 20 54 68 69 73 20 69 73 20 75  index. This is u
29240 73 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 69  sed.    ** for i
29250 6e 74 65 72 6e 61 6c 20 73 61 6e 69 74 79 20 63  nternal sanity c
29260 68 65 63 6b 69 6e 67 20 62 79 20 74 68 65 20 69  hecking by the i
29270 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 69  ntegrity-check i
29280 6e 20 64 65 62 75 67 20 0a 20 20 20 20 2a 2a 20  n debug .    ** 
29290 6d 6f 64 65 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 23  mode only.  */.#
292a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
292b0 55 47 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66  UG.    if( pConf
292c0 69 67 2d 3e 62 50 72 65 66 69 78 49 6e 64 65 78  ig->bPrefixIndex
292d0 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
292e0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
292f0 54 45 53 54 5f 4e 4f 49 44 58 29 20 29 7b 0a 20  TEST_NOIDX) ){. 
29300 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61       assert( fla
29310 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
29320 55 45 52 59 5f 50 52 45 46 49 58 20 29 3b 0a 20  UERY_PREFIX );. 
29330 20 20 20 20 20 69 49 64 78 20 3d 20 31 2b 70 43       iIdx = 1+pC
29340 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 0a  onfig->nPrefix;.
29350 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
29360 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
29370 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
29380 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20  _PREFIX ){.     
29390 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 66 74 73   int nChar = fts
293a0 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28 70 54  5IndexCharlen(pT
293b0 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20  oken, nToken);. 
293c0 20 20 20 20 20 66 6f 72 28 69 49 64 78 3d 31 3b       for(iIdx=1;
293d0 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e   iIdx<=pConfig->
293e0 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29  nPrefix; iIdx++)
293f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  {.        if( pC
29400 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69  onfig->aPrefix[i
29410 49 64 78 2d 31 5d 3d 3d 6e 43 68 61 72 20 29 20  Idx-1]==nChar ) 
29420 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
29430 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 49     }..    if( iI
29440 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  dx<=pConfig->nPr
29450 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a  efix ){.      /*
29460 20 53 74 72 61 69 67 68 74 20 69 6e 64 65 78 20   Straight index 
29470 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 20 20  lookup */.      
29480 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
29490 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
294a0 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20  uctureRead(p);. 
294b0 20 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20       buf.p[0] = 
294c0 28 75 38 29 28 46 54 53 35 5f 4d 41 49 4e 5f 50  (u8)(FTS5_MAIN_P
294d0 52 45 46 49 58 20 2b 20 69 49 64 78 29 3b 0a 20  REFIX + iIdx);. 
294e0 20 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74       if( pStruct
294f0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
29500 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20  MultiIterNew(p, 
29510 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73 20 7c  pStruct, flags |
29520 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
29530 5f 53 4b 49 50 45 4d 50 54 59 2c 20 0a 20 20 20  _SKIPEMPTY, .   
29540 20 20 20 20 20 20 20 20 20 70 43 6f 6c 73 65 74           pColset
29550 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b  , buf.p, nToken+
29560 31 2c 20 2d 31 2c 20 30 2c 20 26 70 52 65 74 0a  1, -1, 0, &pRet.
29570 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
29580 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
29590 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
295a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
295b0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53 63  lse{.      /* Sc
295c0 61 6e 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d  an multiple term
295d0 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 69 6e  s in the main in
295e0 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  dex */.      int
295f0 20 62 44 65 73 63 20 3d 20 28 66 6c 61 67 73 20   bDesc = (flags 
29600 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
29610 59 5f 44 45 53 43 29 21 3d 30 3b 0a 20 20 20 20  Y_DESC)!=0;.    
29620 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53    buf.p[0] = FTS
29630 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 3b 0a 20  5_MAIN_PREFIX;. 
29640 20 20 20 20 20 66 74 73 35 53 65 74 75 70 50 72       fts5SetupPr
29650 65 66 69 78 49 74 65 72 28 70 2c 20 62 44 65 73  efixIter(p, bDes
29660 63 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e  c, buf.p, nToken
29670 2b 31 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70 52  +1, pColset, &pR
29680 65 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  et);.      asser
29690 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  t( p->rc!=SQLITE
296a0 5f 4f 4b 20 7c 7c 20 70 52 65 74 2d 3e 70 43 6f  _OK || pRet->pCo
296b0 6c 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lset==0 );.     
296c0 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
296d0 75 74 43 62 28 26 70 2d 3e 72 63 2c 20 70 52 65  utCb(&p->rc, pRe
296e0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  t);.      if( p-
296f0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
29700 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 53 65  {.        Fts5Se
29710 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
29720 52 65 74 2d 3e 61 53 65 67 5b 70 52 65 74 2d 3e  Ret->aSeg[pRet->
29730 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
29740 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
29750 53 65 67 2d 3e 70 4c 65 61 66 20 29 20 70 52 65  Seg->pLeaf ) pRe
29760 74 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 28 70  t->xSetOutputs(p
29770 52 65 74 2c 20 70 53 65 67 29 3b 0a 20 20 20 20  Ret, pSeg);.    
29780 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
29790 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20  f( p->rc ){.    
297a0 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65    sqlite3Fts5Ite
297b0 72 43 6c 6f 73 65 28 28 46 74 73 35 49 6e 64 65  rClose((Fts5Inde
297c0 78 49 74 65 72 2a 29 70 52 65 74 29 3b 0a 20 20  xIter*)pRet);.  
297d0 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
297e0 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61      fts5CloseRea
297f0 64 65 72 28 70 29 3b 0a 20 20 20 20 7d 0a 0a 20  der(p);.    }.. 
29800 20 20 20 2a 70 70 49 74 65 72 20 3d 20 28 46 74     *ppIter = (Ft
29810 73 35 49 6e 64 65 78 49 74 65 72 2a 29 70 52 65  s5IndexIter*)pRe
29820 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  t;.    sqlite3Ft
29830 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75  s5BufferFree(&bu
29840 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
29850 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
29860 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (p);.}../*.** Re
29870 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
29880 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
29890 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
298a0 75 6d 65 6e 74 20 69 73 20 61 74 20 45 4f 46 2e  ument is at EOF.
298b0 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .*/./*.** Move t
298c0 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68  o the next match
298d0 69 6e 67 20 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69  ing rowid. .*/.i
298e0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
298f0 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78  erNext(Fts5Index
29900 49 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72  Iter *pIndexIter
29910 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  ){.  Fts5Iter *p
29920 49 74 65 72 20 3d 20 28 46 74 73 35 49 74 65 72  Iter = (Fts5Iter
29930 2a 29 70 49 6e 64 65 78 49 74 65 72 3b 0a 20 20  *)pIndexIter;.  
29940 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
29950 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54  Index->rc==SQLIT
29960 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 4d 75  E_OK );.  fts5Mu
29970 6c 74 69 49 74 65 72 4e 65 78 74 28 70 49 74 65  ltiIterNext(pIte
29980 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72  r->pIndex, pIter
29990 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  , 0, 0);.  retur
299a0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
299b0 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29  n(pIter->pIndex)
299c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
299d0 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63  to the next matc
299e0 68 69 6e 67 20 74 65 72 6d 2f 72 6f 77 69 64 2e  hing term/rowid.
299f0 20 55 73 65 64 20 62 79 20 74 68 65 20 66 74 73   Used by the fts
29a00 35 76 6f 63 61 62 20 6d 6f 64 75 6c 65 2e 0a 2a  5vocab module..*
29a10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
29a20 35 49 74 65 72 4e 65 78 74 53 63 61 6e 28 46 74  5IterNextScan(Ft
29a30 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e  s5IndexIter *pIn
29a40 64 65 78 49 74 65 72 29 7b 0a 20 20 46 74 73 35  dexIter){.  Fts5
29a50 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 28 46  Iter *pIter = (F
29a60 74 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49  ts5Iter*)pIndexI
29a70 74 65 72 3b 0a 20 20 46 74 73 35 49 6e 64 65 78  ter;.  Fts5Index
29a80 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e   *p = pIter->pIn
29a90 64 65 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  dex;..  assert( 
29aa0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72  pIter->pIndex->r
29ab0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
29ac0 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  .  fts5MultiIter
29ad0 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30  Next(p, pIter, 0
29ae0 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  , 0);.  if( p->r
29af0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29b00 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
29b10 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
29b20 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
29b30 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
29b40 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70  .    if( pSeg->p
29b50 4c 65 61 66 20 26 26 20 70 53 65 67 2d 3e 74 65  Leaf && pSeg->te
29b60 72 6d 2e 70 5b 30 5d 21 3d 46 54 53 35 5f 4d 41  rm.p[0]!=FTS5_MA
29b70 49 4e 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20  IN_PREFIX ){.   
29b80 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
29b90 73 65 28 70 53 65 67 2d 3e 70 4c 65 61 66 29 3b  se(pSeg->pLeaf);
29ba0 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 4c 65  .      pSeg->pLe
29bb0 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 49  af = 0;.      pI
29bc0 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20 3d  ter->base.bEof =
29bd0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
29be0 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
29bf0 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70  xReturn(pIter->p
29c00 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Index);.}../*.**
29c10 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78   Move to the nex
29c20 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64  t matching rowid
29c30 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
29c40 6f 72 20 61 66 74 65 72 20 69 4d 61 74 63 68 2e  or after iMatch.
29c50 20 54 68 65 0a 2a 2a 20 64 65 66 69 6e 69 74 69   The.** definiti
29c60 6f 6e 20 6f 66 20 22 61 74 20 6f 72 20 61 66 74  on of "at or aft
29c70 65 72 22 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  er" depends on w
29c80 68 65 74 68 65 72 20 74 68 69 73 20 69 74 65 72  hether this iter
29c90 61 74 6f 72 20 69 74 65 72 61 74 65 73 0a 2a 2a  ator iterates.**
29ca0 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
29cb0 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69   descending rowi
29cc0 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20  d order..*/.int 
29cd0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
29ce0 65 78 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65  extFrom(Fts5Inde
29cf0 78 49 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65  xIter *pIndexIte
29d00 72 2c 20 69 36 34 20 69 4d 61 74 63 68 29 7b 0a  r, i64 iMatch){.
29d10 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65    Fts5Iter *pIte
29d20 72 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29 70  r = (Fts5Iter*)p
29d30 49 6e 64 65 78 49 74 65 72 3b 0a 20 20 66 74 73  IndexIter;.  fts
29d40 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72  5MultiIterNextFr
29d50 6f 6d 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  om(pIter->pIndex
29d60 2c 20 70 49 74 65 72 2c 20 69 4d 61 74 63 68 29  , pIter, iMatch)
29d70 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
29d80 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65 72  ndexReturn(pIter
29d90 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a  ->pIndex);.}../*
29da0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
29db0 75 72 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a  urrent term..*/.
29dc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
29dd0 74 65 33 46 74 73 35 49 74 65 72 54 65 72 6d 28  te3Fts5IterTerm(
29de0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
29df0 49 6e 64 65 78 49 74 65 72 2c 20 69 6e 74 20 2a  IndexIter, int *
29e00 70 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  pn){.  int n;.  
29e10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
29e20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 66 74 73  (const char*)fts
29e30 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 28  5MultiIterTerm((
29e40 46 74 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78  Fts5Iter*)pIndex
29e50 49 74 65 72 2c 20 26 6e 29 3b 0a 20 20 2a 70 6e  Iter, &n);.  *pn
29e60 20 3d 20 6e 2d 31 3b 0a 20 20 72 65 74 75 72 6e   = n-1;.  return
29e70 20 26 7a 5b 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   &z[1];.}../*.**
29e80 20 43 6c 6f 73 65 20 61 6e 20 69 74 65 72 61 74   Close an iterat
29e90 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20  or opened by an 
29ea0 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
29eb0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
29ec0 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Query()..*/.void
29ed0 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
29ee0 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 49  Close(Fts5IndexI
29ef0 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72 29  ter *pIndexIter)
29f00 7b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 49 74  {.  if( pIndexIt
29f10 65 72 20 29 7b 0a 20 20 20 20 46 74 73 35 49 74  er ){.    Fts5It
29f20 65 72 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73  er *pIter = (Fts
29f30 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65  5Iter*)pIndexIte
29f40 72 3b 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78  r;.    Fts5Index
29f50 20 2a 70 49 6e 64 65 78 20 3d 20 70 49 74 65 72   *pIndex = pIter
29f60 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 66 74  ->pIndex;.    ft
29f70 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
29f80 70 49 74 65 72 29 3b 0a 20 20 20 20 66 74 73 35  pIter);.    fts5
29f90 43 6c 6f 73 65 52 65 61 64 65 72 28 70 49 6e 64  CloseReader(pInd
29fa0 65 78 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ex);.  }.}../*.*
29fb0 2a 20 52 65 61 64 20 61 6e 64 20 64 65 63 6f 64  * Read and decod
29fc0 65 20 74 68 65 20 22 61 76 65 72 61 67 65 73 22  e the "averages"
29fd0 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
29fe0 20 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a   database. .**.*
29ff0 2a 20 50 61 72 61 6d 65 74 65 72 20 61 6e 53 69  * Parameter anSi
2a000 7a 65 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ze must point to
2a010 20 61 6e 20 61 72 72 61 79 20 6f 66 20 73 69 7a   an array of siz
2a020 65 20 6e 43 6f 6c 2c 20 77 68 65 72 65 20 6e 43  e nCol, where nC
2a030 6f 6c 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6d  ol is.** the num
2a040 62 65 72 20 6f 66 20 75 73 65 72 20 64 65 66 69  ber of user defi
2a050 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  ned columns in t
2a060 68 65 20 46 54 53 20 74 61 62 6c 65 2e 0a 2a 2f  he FTS table..*/
2a070 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
2a080 49 6e 64 65 78 47 65 74 41 76 65 72 61 67 65 73  IndexGetAverages
2a090 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
2a0a0 36 34 20 2a 70 6e 52 6f 77 2c 20 69 36 34 20 2a  64 *pnRow, i64 *
2a0b0 61 6e 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 6e  anSize){.  int n
2a0c0 43 6f 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  Col = p->pConfig
2a0d0 2d 3e 6e 43 6f 6c 3b 0a 20 20 46 74 73 35 44 61  ->nCol;.  Fts5Da
2a0e0 74 61 20 2a 70 44 61 74 61 3b 0a 0a 20 20 2a 70  ta *pData;..  *p
2a0f0 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 6d 65 6d 73  nRow = 0;.  mems
2a100 65 74 28 61 6e 53 69 7a 65 2c 20 30 2c 20 73 69  et(anSize, 0, si
2a110 7a 65 6f 66 28 69 36 34 29 20 2a 20 6e 43 6f 6c  zeof(i64) * nCol
2a120 29 3b 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73  );.  pData = fts
2a130 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53  5DataRead(p, FTS
2a140 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
2a150 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
2a160 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61  SQLITE_OK && pDa
2a170 74 61 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 69 6e  ta->nn ){.    in
2a180 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  t i = 0;.    int
2a190 20 69 43 6f 6c 3b 0a 20 20 20 20 69 20 2b 3d 20   iCol;.    i += 
2a1a0 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  fts5GetVarint(&p
2a1b0 44 61 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34  Data->p[i], (u64
2a1c0 2a 29 70 6e 52 6f 77 29 3b 0a 20 20 20 20 66 6f  *)pnRow);.    fo
2a1d0 72 28 69 43 6f 6c 3d 30 3b 20 69 3c 70 44 61 74  r(iCol=0; i<pDat
2a1e0 61 2d 3e 6e 6e 20 26 26 20 69 43 6f 6c 3c 6e 43  a->nn && iCol<nC
2a1f0 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
2a200 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
2a210 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b  arint(&pData->p[
2a220 69 5d 2c 20 28 75 36 34 2a 29 26 61 6e 53 69 7a  i], (u64*)&anSiz
2a230 65 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 7d 0a  e[iCol]);.    }.
2a240 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52    }..  fts5DataR
2a250 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20  elease(pData);. 
2a260 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
2a270 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
2a280 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65  *.** Replace the
2a290 20 63 75 72 72 65 6e 74 20 22 61 76 65 72 61 67   current "averag
2a2a0 65 73 22 20 72 65 63 6f 72 64 20 77 69 74 68 20  es" record with 
2a2b0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2a2c0 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 73  the buffer .** s
2a2d0 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 20 73  upplied as the s
2a2e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
2a2f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
2a300 73 35 49 6e 64 65 78 53 65 74 41 76 65 72 61 67  s5IndexSetAverag
2a310 65 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  es(Fts5Index *p,
2a320 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61   const u8 *pData
2a330 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20  , int nData){.  
2a340 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
2a350 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74  QLITE_OK );.  ft
2a360 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 46  s5DataWrite(p, F
2a370 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
2a380 49 44 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61  ID, pData, nData
2a390 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
2a3a0 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
2a3b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2a3c0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
2a3d0 20 6f 66 20 62 6c 6f 63 6b 73 20 74 68 69 73 20   of blocks this 
2a3e0 6d 6f 64 75 6c 65 20 68 61 73 20 72 65 61 64 20  module has read 
2a3f0 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 0a  from the %_data.
2a400 2a 2a 20 74 61 62 6c 65 20 73 69 6e 63 65 20 69  ** table since i
2a410 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a  t was created..*
2a420 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
2a430 35 49 6e 64 65 78 52 65 61 64 73 28 46 74 73 35  5IndexReads(Fts5
2a440 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 72 65 74  Index *p){.  ret
2a450 75 72 6e 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a  urn p->nRead;.}.
2a460 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 33  ./*.** Set the 3
2a470 32 2d 62 69 74 20 63 6f 6f 6b 69 65 20 76 61 6c  2-bit cookie val
2a480 75 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  ue stored at the
2a490 20 73 74 61 72 74 20 6f 66 20 61 6c 6c 20 73 74   start of all st
2a4a0 72 75 63 74 75 72 65 20 0a 2a 2a 20 72 65 63 6f  ructure .** reco
2a4b0 72 64 73 20 74 6f 20 74 68 65 20 76 61 6c 75 65  rds to the value
2a4c0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
2a4d0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
2a4e0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
2a4f0 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
2a500 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
2a510 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  te error code if
2a520 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63   an error.** occ
2a530 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  urs..*/.int sqli
2a540 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 43  te3Fts5IndexSetC
2a550 6f 6f 6b 69 65 28 46 74 73 35 49 6e 64 65 78 20  ookie(Fts5Index 
2a560 2a 70 2c 20 69 6e 74 20 69 4e 65 77 29 7b 0a 20  *p, int iNew){. 
2a570 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a590 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2a5a0 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f  code */.  Fts5Co
2a5b0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
2a5c0 70 2d 3e 70 43 6f 6e 66 69 67 3b 20 20 20 20 2f  p->pConfig;    /
2a5d0 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
2a5e0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 38 20 61  object */.  u8 a
2a5f0 43 6f 6f 6b 69 65 5b 34 5d 3b 20 20 20 20 20 20  Cookie[4];      
2a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a610 20 2f 2a 20 42 69 6e 61 72 79 20 72 65 70 72 65   /* Binary repre
2a620 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 69 4e 65  sentation of iNe
2a630 77 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62  w */.  sqlite3_b
2a640 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a  lob *pBlob = 0;.
2a650 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
2a660 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
2a670 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 33   sqlite3Fts5Put3
2a680 32 28 61 43 6f 6f 6b 69 65 2c 20 69 4e 65 77 29  2(aCookie, iNew)
2a690 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
2a6a0 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e  3_blob_open(pCon
2a6b0 66 69 67 2d 3e 64 62 2c 20 70 43 6f 6e 66 69 67  fig->db, pConfig
2a6c0 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54  ->zDb, p->zDataT
2a6d0 62 6c 2c 20 0a 20 20 20 20 20 20 22 62 6c 6f 63  bl, .      "bloc
2a6e0 6b 22 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55  k", FTS5_STRUCTU
2a6f0 52 45 5f 52 4f 57 49 44 2c 20 31 2c 20 26 70 42  RE_ROWID, 1, &pB
2a700 6c 6f 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  lob.  );.  if( r
2a710 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2a720 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
2a730 5f 77 72 69 74 65 28 70 42 6c 6f 62 2c 20 61 43  _write(pBlob, aC
2a740 6f 6f 6b 69 65 2c 20 34 2c 20 30 29 3b 0a 20 20  ookie, 4, 0);.  
2a750 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
2a760 6c 6f 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29  lob_close(pBlob)
2a770 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2a780 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  rc;.}..int sqlit
2a790 65 33 46 74 73 35 49 6e 64 65 78 4c 6f 61 64 43  e3Fts5IndexLoadC
2a7a0 6f 6e 66 69 67 28 46 74 73 35 49 6e 64 65 78 20  onfig(Fts5Index 
2a7b0 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  *p){.  Fts5Struc
2a7c0 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20  ture *pStruct;. 
2a7d0 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53   pStruct = fts5S
2a7e0 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
2a7f0 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
2a800 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
2a810 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
2a820 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
2a830 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
2a840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2a880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a8a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a8b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a8c0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f  ********.** Belo
2a8d0 77 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20  w this point is 
2a8e0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
2a8f0 6f 6e 20 6f 66 20 74 68 65 20 69 6e 74 65 67 72  on of the integr
2a900 69 74 79 2d 63 68 65 63 6b 20 0a 2a 2a 20 66 75  ity-check .** fu
2a910 6e 63 74 69 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a  nctionality..*/.
2a920 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
2a930 73 69 6d 70 6c 65 20 63 68 65 63 6b 73 75 6d 20  simple checksum 
2a940 76 61 6c 75 65 20 62 61 73 65 64 20 6f 6e 20 74  value based on t
2a950 68 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  he arguments..*/
2a960 0a 75 36 34 20 73 71 6c 69 74 65 33 46 74 73 35  .u64 sqlite3Fts5
2a970 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28  IndexEntryCksum(
2a980 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a  .  i64 iRowid, .
2a990 20 20 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69    int iCol, .  i
2a9a0 6e 74 20 69 50 6f 73 2c 20 0a 20 20 69 6e 74 20  nt iPos, .  int 
2a9b0 69 49 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68  iIdx,.  const ch
2a9c0 61 72 20 2a 70 54 65 72 6d 2c 0a 20 20 69 6e 74  ar *pTerm,.  int
2a9d0 20 6e 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20   nTerm.){.  int 
2a9e0 69 3b 0a 20 20 75 36 34 20 72 65 74 20 3d 20 69  i;.  u64 ret = i
2a9f0 52 6f 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20  Rowid;.  ret += 
2aa00 28 72 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b  (ret<<3) + iCol;
2aa10 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c  .  ret += (ret<<
2aa20 33 29 20 2b 20 69 50 6f 73 3b 0a 20 20 69 66 28  3) + iPos;.  if(
2aa30 20 69 49 64 78 3e 3d 30 20 29 20 72 65 74 20 2b   iIdx>=0 ) ret +
2aa40 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 28 46 54  = (ret<<3) + (FT
2aa50 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b  S5_MAIN_PREFIX +
2aa60 20 69 49 64 78 29 3b 0a 20 20 66 6f 72 28 69 3d   iIdx);.  for(i=
2aa70 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29  0; i<nTerm; i++)
2aa80 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29   ret += (ret<<3)
2aa90 20 2b 20 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 72   + pTerm[i];.  r
2aaa0 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69  eturn ret;.}..#i
2aab0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2aac0 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  G./*.** This fun
2aad0 63 74 69 6f 6e 20 69 73 20 70 75 72 65 6c 79 20  ction is purely 
2aae0 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74  an internal test
2aaf0 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f  . It does not co
2ab00 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20  ntribute to .** 
2ab10 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  FTS functionalit
2ab20 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69  y, or even the i
2ab30 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20  ntegrity-check, 
2ab40 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a  in any way..**.*
2ab50 2a 20 49 6e 73 74 65 61 64 2c 20 69 74 20 74 65  * Instead, it te
2ab60 73 74 73 20 74 68 61 74 20 74 68 65 20 73 61 6d  sts that the sam
2ab70 65 20 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f  e set of pgno/ro
2ab80 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  wid combinations
2ab90 20 61 72 65 20 0a 2a 2a 20 76 69 73 69 74 65 64   are .** visited
2aba0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
2abb0 68 65 74 68 65 72 20 74 68 65 20 64 6f 63 6c 69  hether the docli
2abc0 73 74 2d 69 6e 64 65 78 20 69 64 65 6e 74 69 66  st-index identif
2abd0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
2abe0 73 0a 2a 2a 20 69 53 65 67 69 64 2f 69 4c 65 61  s.** iSegid/iLea
2abf0 66 20 69 73 20 69 74 65 72 61 74 65 64 20 69 6e  f is iterated in
2ac00 20 66 6f 72 77 61 72 64 73 20 6f 72 20 72 65 76   forwards or rev
2ac10 65 72 73 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  erse order..*/.s
2ac20 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 54  tatic void fts5T
2ac30 65 73 74 44 6c 69 64 78 52 65 76 65 72 73 65 28  estDlidxReverse(
2ac40 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
2ac50 20 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20   .  int iSegid, 
2ac60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac70 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69      /* Segment i
2ac80 64 20 74 6f 20 6c 6f 61 64 20 66 72 6f 6d 20 2a  d to load from *
2ac90 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 20 20 20  /.  int iLeaf   
2aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acb0 20 20 20 20 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c      /* Load docl
2acc0 69 73 74 2d 69 6e 64 65 78 20 66 6f 72 20 74 68  ist-index for th
2acd0 69 73 20 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20 20  is leaf */.){.  
2ace0 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
2acf0 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 75 36 34  Dlidx = 0;.  u64
2ad00 20 63 6b 73 75 6d 31 20 3d 20 31 33 3b 0a 20 20   cksum1 = 13;.  
2ad10 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 31 33 3b  u64 cksum2 = 13;
2ad20 0a 0a 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66  ..  for(pDlidx=f
2ad30 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
2ad40 28 70 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69  (p, 0, iSegid, i
2ad50 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 66 74 73  Leaf);.      fts
2ad60 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
2ad70 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20   pDlidx)==0;.   
2ad80 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
2ad90 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a  Next(p, pDlidx).
2ada0 20 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f    ){.    i64 iRo
2adb0 77 69 64 20 3d 20 66 74 73 35 44 6c 69 64 78 49  wid = fts5DlidxI
2adc0 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29  terRowid(pDlidx)
2add0 3b 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d  ;.    int pgno =
2ade0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
2adf0 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  no(pDlidx);.    
2ae00 61 73 73 65 72 74 28 20 70 67 6e 6f 3e 69 4c 65  assert( pgno>iLe
2ae10 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31  af );.    cksum1
2ae20 20 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69   += iRowid + ((i
2ae30 36 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20  64)pgno<<32);.  
2ae40 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65  }.  fts5DlidxIte
2ae50 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20  rFree(pDlidx);. 
2ae60 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20   pDlidx = 0;..  
2ae70 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44  for(pDlidx=fts5D
2ae80 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20  lidxIterInit(p, 
2ae90 31 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66  1, iSegid, iLeaf
2aea0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  );.      fts5Dli
2aeb0 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
2aec0 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66  idx)==0;.      f
2aed0 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76  ts5DlidxIterPrev
2aee0 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 29 7b  (p, pDlidx).  ){
2aef0 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20  .    i64 iRowid 
2af00 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 52  = fts5DlidxIterR
2af10 6f 77 69 64 28 70 44 6c 69 64 78 29 3b 0a 20 20  owid(pDlidx);.  
2af20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73    int pgno = fts
2af30 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
2af40 44 6c 69 64 78 29 3b 0a 20 20 20 20 61 73 73 65  Dlidx);.    asse
2af50 72 74 28 20 66 74 73 35 44 6c 69 64 78 49 74 65  rt( fts5DlidxIte
2af60 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3e 69 4c  rPgno(pDlidx)>iL
2af70 65 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d  eaf );.    cksum
2af80 32 20 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28  2 += iRowid + ((
2af90 69 36 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20  i64)pgno<<32);. 
2afa0 20 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74   }.  fts5DlidxIt
2afb0 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a  erFree(pDlidx);.
2afc0 20 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20    pDlidx = 0;.. 
2afd0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
2afe0 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21  TE_OK && cksum1!
2aff0 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20  =cksum2 ) p->rc 
2b000 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2b010 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
2b020 73 35 51 75 65 72 79 43 6b 73 75 6d 28 0a 20 20  s5QueryCksum(.  
2b030 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
2b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b050 2f 2a 20 46 74 73 35 20 69 6e 64 65 78 20 6f 62  /* Fts5 index ob
2b060 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49  ject */.  int iI
2b070 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  dx,.  const char
2b080 20 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20   *z,            
2b090 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6b        /* Index k
2b0a0 65 79 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  ey to query for 
2b0b0 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  int n,     
2b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0d0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2b0e0 69 6e 64 65 78 20 6b 65 79 20 69 6e 20 62 79 74  index key in byt
2b0f0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  es */.  int flag
2b100 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2b110 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
2b120 20 66 6f 72 20 46 74 73 35 49 6e 64 65 78 51 75   for Fts5IndexQu
2b130 65 72 79 20 2a 2f 0a 20 20 75 36 34 20 2a 70 43  ery */.  u64 *pC
2b140 6b 73 75 6d 20 20 20 20 20 20 20 20 20 20 20 20  ksum            
2b150 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
2b160 55 54 3a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c  UT: Checksum val
2b170 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65  ue */.){.  int e
2b180 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e  Detail = p->pCon
2b190 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20  fig->eDetail;.  
2b1a0 75 36 34 20 63 6b 73 75 6d 20 3d 20 2a 70 43 6b  u64 cksum = *pCk
2b1b0 73 75 6d 3b 0a 20 20 46 74 73 35 49 6e 64 65 78  sum;.  Fts5Index
2b1c0 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b  Iter *pIter = 0;
2b1d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
2b1e0 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72  te3Fts5IndexQuer
2b1f0 79 28 70 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67 73  y(p, z, n, flags
2b200 2c 20 30 2c 20 26 70 49 74 65 72 29 3b 0a 0a 20  , 0, &pIter);.. 
2b210 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
2b220 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69  TE_OK && 0==sqli
2b230 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70  te3Fts5IterEof(p
2b240 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69 36 34  Iter) ){.    i64
2b250 20 72 6f 77 69 64 20 3d 20 70 49 74 65 72 2d 3e   rowid = pIter->
2b260 69 52 6f 77 69 64 3b 0a 0a 20 20 20 20 69 66 28  iRowid;..    if(
2b270 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44   eDetail==FTS5_D
2b280 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
2b290 20 20 20 20 63 6b 73 75 6d 20 5e 3d 20 73 71 6c      cksum ^= sql
2b2a0 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74  ite3Fts5IndexEnt
2b2b0 72 79 43 6b 73 75 6d 28 72 6f 77 69 64 2c 20 30  ryCksum(rowid, 0
2b2c0 2c 20 30 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29  , 0, iIdx, z, n)
2b2d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2b2e0 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65     Fts5PoslistRe
2b2f0 61 64 65 72 20 73 52 65 61 64 65 72 3b 0a 20 20  ader sReader;.  
2b300 20 20 20 20 66 6f 72 28 73 71 6c 69 74 65 33 46      for(sqlite3F
2b310 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
2b320 49 6e 69 74 28 70 49 74 65 72 2d 3e 70 44 61 74  Init(pIter->pDat
2b330 61 2c 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 2c  a, pIter->nData,
2b340 20 26 73 52 65 61 64 65 72 29 3b 0a 20 20 20 20   &sReader);.    
2b350 20 20 20 20 20 20 73 52 65 61 64 65 72 2e 62 45        sReader.bE
2b360 6f 66 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20  of==0;.         
2b370 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
2b380 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 73  istReaderNext(&s
2b390 52 65 61 64 65 72 29 0a 20 20 20 20 20 20 29 7b  Reader).      ){
2b3a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
2b3b0 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c  l = FTS5_POS2COL
2b3c0 55 4d 4e 28 73 52 65 61 64 65 72 2e 69 50 6f 73  UMN(sReader.iPos
2b3d0 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  );.        int i
2b3e0 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f  Off = FTS5_POS2O
2b3f0 46 46 53 45 54 28 73 52 65 61 64 65 72 2e 69 50  FFSET(sReader.iP
2b400 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73  os);.        cks
2b410 75 6d 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73  um ^= sqlite3Fts
2b420 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d  5IndexEntryCksum
2b430 28 72 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 4f  (rowid, iCol, iO
2b440 66 66 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b  ff, iIdx, z, n);
2b450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2b460 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b470 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
2b480 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74   = sqlite3Fts5It
2b490 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a 20  erNext(pIter);. 
2b4a0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
2b4b0 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28  e3Fts5IterClose(
2b4c0 70 49 74 65 72 29 3b 0a 0a 20 20 2a 70 43 6b 73  pIter);..  *pCks
2b4d0 75 6d 20 3d 20 63 6b 73 75 6d 3b 0a 20 20 72 65  um = cksum;.  re
2b4e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
2b4f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2b500 20 69 73 20 61 6c 73 6f 20 70 75 72 65 6c 79 20   is also purely 
2b510 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74  an internal test
2b520 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f  . It does not co
2b530 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20  ntribute to .** 
2b540 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  FTS functionalit
2b550 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69  y, or even the i
2b560 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20  ntegrity-check, 
2b570 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 73  in any way..*/.s
2b580 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 54  tatic void fts5T
2b590 65 73 74 54 65 72 6d 28 0a 20 20 46 74 73 35 49  estTerm(.  Fts5I
2b5a0 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
2b5b0 42 75 66 66 65 72 20 2a 70 50 72 65 76 2c 20 20  Buffer *pPrev,  
2b5c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2b5d0 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a  revious term */.
2b5e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c    const char *z,
2b5f0 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
2b600 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6e 65    /* Possibly ne
2b610 77 20 74 65 72 6d 20 74 6f 20 74 65 73 74 20 2a  w term to test *
2b620 2f 0a 20 20 75 36 34 20 65 78 70 65 63 74 65 64  /.  u64 expected
2b630 2c 0a 20 20 75 36 34 20 2a 70 43 6b 73 75 6d 0a  ,.  u64 *pCksum.
2b640 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d  ){.  int rc = p-
2b650 3e 72 63 3b 0a 20 20 69 66 28 20 70 50 72 65 76  >rc;.  if( pPrev
2b660 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74  ->n==0 ){.    ft
2b670 73 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c  s5BufferSet(&rc,
2b680 20 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73   pPrev, n, (cons
2b690 74 20 75 38 2a 29 7a 29 3b 0a 20 20 7d 65 6c 73  t u8*)z);.  }els
2b6a0 65 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  e.  if( rc==SQLI
2b6b0 54 45 5f 4f 4b 20 26 26 20 28 70 50 72 65 76 2d  TE_OK && (pPrev-
2b6c0 3e 6e 21 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28  >n!=n || memcmp(
2b6d0 70 50 72 65 76 2d 3e 70 2c 20 7a 2c 20 6e 29 29  pPrev->p, z, n))
2b6e0 20 29 7b 0a 20 20 20 20 75 36 34 20 63 6b 73 75   ){.    u64 cksu
2b6f0 6d 33 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20  m3 = *pCksum;.  
2b700 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
2b710 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  erm = (const cha
2b720 72 2a 29 26 70 50 72 65 76 2d 3e 70 5b 31 5d 3b  r*)&pPrev->p[1];
2b730 20 20 2f 2a 20 74 65 72 6d 20 73 61 6e 73 20 70    /* term sans p
2b740 72 65 66 69 78 2d 62 79 74 65 20 2a 2f 0a 20 20  refix-byte */.  
2b750 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70 50    int nTerm = pP
2b760 72 65 76 2d 3e 6e 2d 31 3b 20 20 20 20 20 20 20  rev->n-1;       
2b770 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2b780 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a  zTerm in bytes *
2b790 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d  /.    int iIdx =
2b7a0 20 28 70 50 72 65 76 2d 3e 70 5b 30 5d 20 2d 20   (pPrev->p[0] - 
2b7b0 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58  FTS5_MAIN_PREFIX
2b7c0 29 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  );.    int flags
2b7d0 20 3d 20 28 69 49 64 78 3d 3d 30 20 3f 20 30 20   = (iIdx==0 ? 0 
2b7e0 3a 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  : FTS5INDEX_QUER
2b7f0 59 5f 50 52 45 46 49 58 29 3b 0a 20 20 20 20 75  Y_PREFIX);.    u
2b800 36 34 20 63 6b 31 20 3d 20 30 3b 0a 20 20 20 20  64 ck1 = 0;.    
2b810 75 36 34 20 63 6b 32 20 3d 20 30 3b 0a 0a 20 20  u64 ck2 = 0;..  
2b820 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
2b830 74 68 65 20 72 65 73 75 6c 74 73 20 72 65 74 75  the results retu
2b840 72 6e 65 64 20 66 6f 72 20 41 53 43 20 61 6e 64  rned for ASC and
2b850 20 44 45 53 43 20 71 75 65 72 69 65 73 20 61 72   DESC queries ar
2b860 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d  e.    ** the sam
2b870 65 2e 20 49 66 20 6e 6f 74 2c 20 63 61 6c 6c 20  e. If not, call 
2b880 74 68 69 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e  this corruption.
2b890 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74    */.    rc = ft
2b8a0 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20  s5QueryCksum(p, 
2b8b0 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  iIdx, zTerm, nTe
2b8c0 72 6d 2c 20 66 6c 61 67 73 2c 20 26 63 6b 31 29  rm, flags, &ck1)
2b8d0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2b8e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b8f0 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46   int f = flags|F
2b900 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
2b910 45 53 43 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ESC;.      rc = 
2b920 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70  fts5QueryCksum(p
2b930 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e  , iIdx, zTerm, n
2b940 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a  Term, f, &ck2);.
2b950 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2b960 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
2b970 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46  k1!=ck2 ) rc = F
2b980 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20  TS5_CORRUPT;..  
2b990 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
2b9a0 61 20 70 72 65 66 69 78 20 71 75 65 72 79 2c 20  a prefix query, 
2b9b0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 72  check that the r
2b9c0 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64 20  esults returned 
2b9d0 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68  if the.    ** th
2b9e0 65 20 69 6e 64 65 78 20 69 73 20 64 69 73 61 62  e index is disab
2b9f0 6c 65 64 20 61 72 65 20 74 68 65 20 73 61 6d 65  led are the same
2ba00 2e 20 49 6e 20 62 6f 74 68 20 41 53 43 20 61 6e  . In both ASC an
2ba10 64 20 44 45 53 43 20 6f 72 64 65 72 2e 20 0a 20  d DESC order. . 
2ba20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
2ba30 73 20 63 68 65 63 6b 20 6d 61 79 20 6f 6e 6c 79  s check may only
2ba40 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66   be performed if
2ba50 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
2ba60 69 73 20 65 6d 70 74 79 2e 20 54 68 69 73 0a 20  is empty. This. 
2ba70 20 20 20 2a 2a 20 69 73 20 62 65 63 61 75 73 65     ** is because
2ba80 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
2ba90 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 20 61 20  only supports a 
2baa0 73 69 6e 67 6c 65 20 73 63 61 6e 20 71 75 65 72  single scan quer
2bab0 79 20 61 74 0a 20 20 20 20 2a 2a 20 61 20 74 69  y at.    ** a ti
2bac0 6d 65 2c 20 61 6e 64 20 74 68 65 20 6d 75 6c 74  me, and the mult
2bad0 69 2d 69 74 65 72 20 6c 6f 6f 70 20 66 72 6f 6d  i-iter loop from
2bae0 20 77 68 69 63 68 20 74 68 69 73 20 66 75 6e 63   which this func
2baf0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 0a 20  tion is called. 
2bb00 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79     ** is already
2bb10 20 70 65 72 66 6f 72 6d 69 6e 67 20 73 75 63 68   performing such
2bb20 20 61 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20   a scan. */.    
2bb30 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44  if( p->nPendingD
2bb40 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ata==0 ){.      
2bb50 69 66 28 20 69 49 64 78 3e 30 20 26 26 20 72 63  if( iIdx>0 && rc
2bb60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2bb70 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66         int f = f
2bb80 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51  lags|FTS5INDEX_Q
2bb90 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 3b  UERY_TEST_NOIDX;
2bba0 0a 20 20 20 20 20 20 20 20 63 6b 32 20 3d 20 30  .        ck2 = 0
2bbb0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  ;.        rc = f
2bbc0 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c  ts5QueryCksum(p,
2bbd0 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54   iIdx, zTerm, nT
2bbe0 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20  erm, f, &ck2);. 
2bbf0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2bc00 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21  QLITE_OK && ck1!
2bc10 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35  =ck2 ) rc = FTS5
2bc20 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2bc30 7d 0a 20 20 20 20 20 20 69 66 28 20 69 49 64 78  }.      if( iIdx
2bc40 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  >0 && rc==SQLITE
2bc50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
2bc60 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53  nt f = flags|FTS
2bc70 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53  5INDEX_QUERY_TES
2bc80 54 5f 4e 4f 49 44 58 7c 46 54 53 35 49 4e 44 45  T_NOIDX|FTS5INDE
2bc90 58 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a 20 20  X_QUERY_DESC;.  
2bca0 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20        ck2 = 0;. 
2bcb0 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
2bcc0 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49  QueryCksum(p, iI
2bcd0 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  dx, zTerm, nTerm
2bce0 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20  , f, &ck2);.    
2bcf0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2bd00 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b  TE_OK && ck1!=ck
2bd10 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f  2 ) rc = FTS5_CO
2bd20 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  RRUPT;.      }. 
2bd30 20 20 20 7d 0a 0a 20 20 20 20 63 6b 73 75 6d 33     }..    cksum3
2bd40 20 5e 3d 20 63 6b 31 3b 0a 20 20 20 20 66 74 73   ^= ck1;.    fts
2bd50 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20  5BufferSet(&rc, 
2bd60 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74  pPrev, n, (const
2bd70 20 75 38 2a 29 7a 29 3b 0a 0a 20 20 20 20 69 66   u8*)z);..    if
2bd80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2bd90 26 26 20 63 6b 73 75 6d 33 21 3d 65 78 70 65 63  && cksum3!=expec
2bda0 74 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ted ){.      rc 
2bdb0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2bdc0 20 20 20 20 7d 0a 20 20 20 20 2a 70 43 6b 73 75      }.    *pCksu
2bdd0 6d 20 3d 20 63 6b 73 75 6d 33 3b 0a 20 20 7d 0a  m = cksum3;.  }.
2bde0 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a    p->rc = rc;.}.
2bdf0 20 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65   .#else.# define
2be00 20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52 65   fts5TestDlidxRe
2be10 76 65 72 73 65 28 78 2c 79 2c 7a 29 0a 23 20 64  verse(x,y,z).# d
2be20 65 66 69 6e 65 20 66 74 73 35 54 65 73 74 54 65  efine fts5TestTe
2be30 72 6d 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a  rm(u,v,w,x,y,z).
2be40 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68  #endif../*.** Ch
2be50 65 63 6b 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20  eck that:.**.** 
2be60 20 20 31 29 20 41 6c 6c 20 6c 65 61 76 65 73 20    1) All leaves 
2be70 6f 66 20 70 53 65 67 20 62 65 74 77 65 65 6e 20  of pSeg between 
2be80 69 46 69 72 73 74 20 61 6e 64 20 69 4c 61 73 74  iFirst and iLast
2be90 20 28 69 6e 63 6c 75 73 69 76 65 29 20 65 78 69   (inclusive) exi
2bea0 73 74 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63  st and.**      c
2beb0 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 74 65 72 6d  ontain zero term
2bec0 73 2e 0a 2a 2a 20 20 20 32 29 20 41 6c 6c 20 6c  s..**   2) All l
2bed0 65 61 76 65 73 20 6f 66 20 70 53 65 67 20 62 65  eaves of pSeg be
2bee0 74 77 65 65 6e 20 69 4e 6f 52 6f 77 69 64 20 61  tween iNoRowid a
2bef0 6e 64 20 69 4c 61 73 74 20 28 69 6e 63 6c 75 73  nd iLast (inclus
2bf00 69 76 65 29 20 65 78 69 73 74 20 61 6e 64 0a 2a  ive) exist and.*
2bf10 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a  *      contain z
2bf20 65 72 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73  ero rowids..*/.s
2bf30 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
2bf40 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
2bf50 63 6b 45 6d 70 74 79 28 0a 20 20 46 74 73 35 49  ckEmpty(.  Fts5I
2bf60 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53  ndex *p,.  Fts5S
2bf70 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
2bf80 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 53 65  *pSeg,     /* Se
2bf90 67 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69  gment to check i
2bfa0 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65  nternal consiste
2bfb0 6e 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  ncy */.  int iFi
2bfc0 72 73 74 2c 0a 20 20 69 6e 74 20 69 4e 6f 52 6f  rst,.  int iNoRo
2bfd0 77 69 64 2c 0a 20 20 69 6e 74 20 69 4c 61 73 74  wid,.  int iLast
2bfe0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  .){.  int i;..  
2bff0 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  /* Now check tha
2c000 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d 70 74  t the iter.nEmpt
2c010 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69  y leaves followi
2c020 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  ng the current l
2c030 65 61 66 0a 20 20 2a 2a 20 28 61 29 20 65 78 69  eaf.  ** (a) exi
2c040 73 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61  st and (b) conta
2c050 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a  in no terms. */.
2c060 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20    for(i=iFirst; 
2c070 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
2c080 20 26 26 20 69 3c 3d 69 4c 61 73 74 3b 20 69 2b   && i<=iLast; i+
2c090 2b 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61  +){.    Fts5Data
2c0a0 20 2a 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61   *pLeaf = fts5Da
2c0b0 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53  taRead(p, FTS5_S
2c0c0 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65  EGMENT_ROWID(pSe
2c0d0 67 2d 3e 69 53 65 67 69 64 2c 20 69 29 29 3b 0a  g->iSegid, i));.
2c0e0 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b      if( pLeaf ){
2c0f0 0a 20 20 20 20 20 20 69 66 28 20 21 66 74 73 35  .      if( !fts5
2c100 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70  LeafIsTermless(p
2c110 4c 65 61 66 29 20 29 20 70 2d 3e 72 63 20 3d 20  Leaf) ) p->rc = 
2c120 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2c130 20 20 20 20 69 66 28 20 69 3e 3d 69 4e 6f 52 6f      if( i>=iNoRo
2c140 77 69 64 20 26 26 20 30 21 3d 66 74 73 35 4c 65  wid && 0!=fts5Le
2c150 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28  afFirstRowidOff(
2c160 70 4c 65 61 66 29 20 29 20 70 2d 3e 72 63 20 3d  pLeaf) ) p->rc =
2c170 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2c180 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74     }.    fts5Dat
2c190 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
2c1a0 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
2c1b0 6f 69 64 20 66 74 73 35 49 6e 74 65 67 72 69 74  oid fts5Integrit
2c1c0 79 43 68 65 63 6b 50 67 69 64 78 28 46 74 73 35  yCheckPgidx(Fts5
2c1d0 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 61  Index *p, Fts5Da
2c1e0 74 61 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69 6e  ta *pLeaf){.  in
2c1f0 74 20 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a  t iTermOff = 0;.
2c200 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 46 74 73    int ii;..  Fts
2c210 35 42 75 66 66 65 72 20 62 75 66 31 20 3d 20 7b  5Buffer buf1 = {
2c220 30 2c 30 2c 30 7d 3b 0a 20 20 46 74 73 35 42 75  0,0,0};.  Fts5Bu
2c230 66 66 65 72 20 62 75 66 32 20 3d 20 7b 30 2c 30  ffer buf2 = {0,0
2c240 2c 30 7d 3b 0a 0a 20 20 69 69 20 3d 20 70 4c 65  ,0};..  ii = pLe
2c250 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 77 68  af->szLeaf;.  wh
2c260 69 6c 65 28 20 69 69 3c 70 4c 65 61 66 2d 3e 6e  ile( ii<pLeaf->n
2c270 6e 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  n && p->rc==SQLI
2c280 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
2c290 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 69 4f   res;.    int iO
2c2a0 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 63  ff;.    int nInc
2c2b0 72 3b 0a 0a 20 20 20 20 69 69 20 2b 3d 20 66 74  r;..    ii += ft
2c2c0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
2c2d0 4c 65 61 66 2d 3e 70 5b 69 69 5d 2c 20 6e 49 6e  Leaf->p[ii], nIn
2c2e0 63 72 29 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66  cr);.    iTermOf
2c2f0 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20 20 20  f += nIncr;.    
2c300 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
2c310 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d  ..    if( iOff>=
2c320 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
2c330 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46  .      p->rc = F
2c340 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2c350 20 7d 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d   }else if( iTerm
2c360 4f 66 66 3d 3d 6e 49 6e 63 72 20 29 7b 0a 20 20  Off==nIncr ){.  
2c370 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20      int nByte;. 
2c380 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
2c390 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
2c3a0 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42  eaf->p[iOff], nB
2c3b0 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  yte);.      if( 
2c3c0 28 69 4f 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65  (iOff+nByte)>pLe
2c3d0 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
2c3e0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
2c3f0 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2c400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c410 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
2c420 70 2d 3e 72 63 2c 20 26 62 75 66 31 2c 20 6e 42  p->rc, &buf1, nB
2c430 79 74 65 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69  yte, &pLeaf->p[i
2c440 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Off]);.      }. 
2c450 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c460 69 6e 74 20 6e 4b 65 65 70 2c 20 6e 42 79 74 65  int nKeep, nByte
2c470 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
2c480 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
2c490 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
2c4a0 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 69   nKeep);.      i
2c4b0 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
2c4c0 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70  rint32(&pLeaf->p
2c4d0 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a  [iOff], nByte);.
2c4e0 20 20 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3e        if( nKeep>
2c4f0 62 75 66 31 2e 6e 20 7c 7c 20 28 69 4f 66 66 2b  buf1.n || (iOff+
2c500 6e 42 79 74 65 29 3e 70 4c 65 61 66 2d 3e 73 7a  nByte)>pLeaf->sz
2c510 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
2c520 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2c530 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RUPT;.      }els
2c540 65 7b 0a 20 20 20 20 20 20 20 20 62 75 66 31 2e  e{.        buf1.
2c550 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20  n = nKeep;.     
2c560 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
2c570 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
2c580 26 62 75 66 31 2c 20 6e 42 79 74 65 2c 20 26 70  &buf1, nByte, &p
2c590 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a  Leaf->p[iOff]);.
2c5a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
2c5b0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
2c5c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2c5d0 65 73 20 3d 20 66 74 73 35 42 75 66 66 65 72 43  es = fts5BufferC
2c5e0 6f 6d 70 61 72 65 28 26 62 75 66 31 2c 20 26 62  ompare(&buf1, &b
2c5f0 75 66 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66  uf2);.        if
2c600 28 20 72 65 73 3c 3d 30 20 29 20 70 2d 3e 72 63  ( res<=0 ) p->rc
2c610 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2c620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c630 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
2c640 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 32 2c 20  (&p->rc, &buf2, 
2c650 62 75 66 31 2e 6e 2c 20 62 75 66 31 2e 70 29 3b  buf1.n, buf1.p);
2c660 0a 20 20 7d 0a 0a 20 20 66 74 73 35 42 75 66 66  .  }..  fts5Buff
2c670 65 72 46 72 65 65 28 26 62 75 66 31 29 3b 0a 20  erFree(&buf1);. 
2c680 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
2c690 26 62 75 66 32 29 3b 0a 7d 0a 0a 73 74 61 74 69  &buf2);.}..stati
2c6a0 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
2c6b0 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53 65  IntegrityCheckSe
2c6c0 67 6d 65 6e 74 28 0a 20 20 46 74 73 35 49 6e 64  gment(.  Fts5Ind
2c6d0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
2c6e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
2c6f0 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
2c700 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
2c710 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
2c720 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
2c730 74 6f 20 63 68 65 63 6b 20 69 6e 74 65 72 6e 61  to check interna
2c740 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f  l consistency */
2c750 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  .){.  Fts5Config
2c760 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
2c770 43 6f 6e 66 69 67 3b 0a 20 20 73 71 6c 69 74 65  Config;.  sqlite
2c780 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
2c790 30 3b 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  0;.  int rc2;.  
2c7a0 69 6e 74 20 69 49 64 78 50 72 65 76 4c 65 61 66  int iIdxPrevLeaf
2c7b0 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72   = pSeg->pgnoFir
2c7c0 73 74 2d 31 3b 0a 20 20 69 6e 74 20 69 44 6c 69  st-1;.  int iDli
2c7d0 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65  dxPrevLeaf = pSe
2c7e0 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 0a 20 20  g->pgnoLast;..  
2c7f0 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69  if( pSeg->pgnoFi
2c800 72 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  rst==0 ) return;
2c810 0a 0a 20 20 66 74 73 35 49 6e 64 65 78 50 72 65  ..  fts5IndexPre
2c820 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 53 74  pareStmt(p, &pSt
2c830 6d 74 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  mt, sqlite3_mpri
2c840 6e 74 66 28 0a 20 20 20 20 20 20 22 53 45 4c 45  ntf(.      "SELE
2c850 43 54 20 73 65 67 69 64 2c 20 74 65 72 6d 2c 20  CT segid, term, 
2c860 28 70 67 6e 6f 3e 3e 31 29 2c 20 28 70 67 6e 6f  (pgno>>1), (pgno
2c870 26 31 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f  &1) FROM %Q.'%q_
2c880 69 64 78 27 20 57 48 45 52 45 20 73 65 67 69 64  idx' WHERE segid
2c890 3d 25 64 22 2c 0a 20 20 20 20 20 20 70 43 6f 6e  =%d",.      pCon
2c8a0 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
2c8b0 67 2d 3e 7a 4e 61 6d 65 2c 20 70 53 65 67 2d 3e  g->zName, pSeg->
2c8c0 69 53 65 67 69 64 0a 20 20 29 29 3b 0a 0a 20 20  iSegid.  ));..  
2c8d0 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  /* Iterate throu
2c8e0 67 68 20 74 68 65 20 62 2d 74 72 65 65 20 68 69  gh the b-tree hi
2c8f0 65 72 61 72 63 68 79 2e 20 20 2a 2f 0a 20 20 77  erarchy.  */.  w
2c900 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
2c910 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
2c920 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
2c930 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
2c940 20 69 36 34 20 69 52 6f 77 3b 20 20 20 20 20 20   i64 iRow;      
2c950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c960 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73  * Rowid for this
2c970 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 46 74 73   leaf */.    Fts
2c980 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20  5Data *pLeaf;   
2c990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
2c9a0 74 61 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66  ta for this leaf
2c9b0 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 6e 49 64   */..    int nId
2c9c0 78 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 5f  xTerm = sqlite3_
2c9d0 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
2c9e0 6d 74 2c 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73  mt, 1);.    cons
2c9f0 74 20 63 68 61 72 20 2a 7a 49 64 78 54 65 72 6d  t char *zIdxTerm
2ca00 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
2ca10 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2ca20 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20  ext(pStmt, 1);. 
2ca30 20 20 20 69 6e 74 20 69 49 64 78 4c 65 61 66 20     int iIdxLeaf 
2ca40 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2ca50 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a  _int(pStmt, 2);.
2ca60 20 20 20 20 69 6e 74 20 62 49 64 78 44 6c 69 64      int bIdxDlid
2ca70 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  x = sqlite3_colu
2ca80 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33 29  mn_int(pStmt, 3)
2ca90 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2caa0 20 6c 65 61 66 20 69 6e 20 71 75 65 73 74 69 6f   leaf in questio
2cab0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
2cac0 65 6e 20 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20  en trimmed from 
2cad0 74 68 65 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20  the segment, .  
2cae0 20 20 2a 2a 20 69 67 6e 6f 72 65 20 74 68 69 73    ** ignore this
2caf0 20 62 2d 74 72 65 65 20 65 6e 74 72 79 2e 20 4f   b-tree entry. O
2cb00 74 68 65 72 77 69 73 65 2c 20 6c 6f 61 64 20 69  therwise, load i
2cb10 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a  t into memory. *
2cb20 2f 0a 20 20 20 20 69 66 28 20 69 49 64 78 4c 65  /.    if( iIdxLe
2cb30 61 66 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  af<pSeg->pgnoFir
2cb40 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  st ) continue;. 
2cb50 20 20 20 69 52 6f 77 20 3d 20 46 54 53 35 5f 53     iRow = FTS5_S
2cb60 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65  EGMENT_ROWID(pSe
2cb70 67 2d 3e 69 53 65 67 69 64 2c 20 69 49 64 78 4c  g->iSegid, iIdxL
2cb80 65 61 66 29 3b 0a 20 20 20 20 70 4c 65 61 66 20  eaf);.    pLeaf 
2cb90 3d 20 66 74 73 35 4c 65 61 66 52 65 61 64 28 70  = fts5LeafRead(p
2cba0 2c 20 69 52 6f 77 29 3b 0a 20 20 20 20 69 66 28  , iRow);.    if(
2cbb0 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61   pLeaf==0 ) brea
2cbc0 6b 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  k;..    /* Check
2cbd0 20 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 63   that the leaf c
2cbe0 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74  ontains at least
2cbf0 20 6f 6e 65 20 74 65 72 6d 2c 20 61 6e 64 20 74   one term, and t
2cc00 68 61 74 20 69 74 20 69 73 20 65 71 75 61 6c 0a  hat it is equal.
2cc10 20 20 20 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72      ** to or lar
2cc20 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 70 6c  ger than the spl
2cc30 69 74 2d 6b 65 79 20 69 6e 20 7a 49 64 78 54 65  it-key in zIdxTe
2cc40 72 6d 2e 20 20 41 6c 73 6f 20 63 68 65 63 6b 20  rm.  Also check 
2cc50 74 68 61 74 20 69 66 20 74 68 65 72 65 0a 20 20  that if there.  
2cc60 20 20 2a 2a 20 69 73 20 61 6c 73 6f 20 61 20 72    ** is also a r
2cc70 6f 77 69 64 20 70 6f 69 6e 74 65 72 20 77 69 74  owid pointer wit
2cc80 68 69 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67  hin the leaf pag
2cc90 65 20 68 65 61 64 65 72 2c 20 69 74 20 70 6f 69  e header, it poi
2cca0 6e 74 73 20 74 6f 20 61 0a 20 20 20 20 2a 2a 20  nts to a.    ** 
2ccb0 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20  location before 
2ccc0 74 68 65 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20  the term.  */.  
2ccd0 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3c    if( pLeaf->nn<
2cce0 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  =pLeaf->szLeaf )
2ccf0 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
2cd00 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2cd10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
2cd20 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20  nt iOff;        
2cd30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
2cd40 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 65  fset of first te
2cd50 72 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20  rm on leaf */.  
2cd60 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66      int iRowidOf
2cd70 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
2cd80 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72  /* Offset of fir
2cd90 73 74 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66  st rowid on leaf
2cda0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 54   */.      int nT
2cdb0 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
2cdc0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2cdd0 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e   term on leaf in
2cde0 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20   bytes */.      
2cdf0 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20  int res;        
2ce00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2ce10 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 65 72  omparison of ter
2ce20 6d 20 61 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20  m and split-key 
2ce30 2a 2f 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d  */..      iOff =
2ce40 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65   fts5LeafFirstTe
2ce50 72 6d 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20  rmOff(pLeaf);.  
2ce60 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20      iRowidOff = 
2ce70 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77  fts5LeafFirstRow
2ce80 69 64 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20  idOff(pLeaf);.  
2ce90 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66      if( iRowidOf
2cea0 66 3e 3d 69 4f 66 66 20 7c 7c 20 69 4f 66 66 3e  f>=iOff || iOff>
2ceb0 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  =pLeaf->szLeaf )
2cec0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
2ced0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2cee0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2cef0 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
2cf00 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
2cf10 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54  eaf->p[iOff], nT
2cf20 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 72 65  erm);.        re
2cf30 73 20 3d 20 6d 65 6d 63 6d 70 28 26 70 4c 65 61  s = memcmp(&pLea
2cf40 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 7a 49 64 78  f->p[iOff], zIdx
2cf50 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c  Term, MIN(nTerm,
2cf60 20 6e 49 64 78 54 65 72 6d 29 29 3b 0a 20 20 20   nIdxTerm));.   
2cf70 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
2cf80 29 20 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20  ) res = nTerm - 
2cf90 6e 49 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20  nIdxTerm;.      
2cfa0 20 20 69 66 28 20 72 65 73 3c 30 20 29 20 70 2d    if( res<0 ) p-
2cfb0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2cfc0 50 54 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  PT;.      }..   
2cfd0 20 20 20 66 74 73 35 49 6e 74 65 67 72 69 74 79     fts5Integrity
2cfe0 43 68 65 63 6b 50 67 69 64 78 28 70 2c 20 70 4c  CheckPgidx(p, pL
2cff0 65 61 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eaf);.    }.    
2d000 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
2d010 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20  pLeaf);.    if( 
2d020 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a  p->rc ) break;..
2d030 20 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b      /* Now check
2d040 20 74 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e   that the iter.n
2d050 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c  Empty leaves fol
2d060 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72 65  lowing the curre
2d070 6e 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28  nt leaf.    ** (
2d080 61 29 20 65 78 69 73 74 20 61 6e 64 20 28 62 29  a) exist and (b)
2d090 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d   contain no term
2d0a0 73 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 49 6e  s. */.    fts5In
2d0b0 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63  dexIntegrityChec
2d0c0 6b 45 6d 70 74 79 28 0a 20 20 20 20 20 20 20 20  kEmpty(.        
2d0d0 70 2c 20 70 53 65 67 2c 20 69 49 64 78 50 72 65  p, pSeg, iIdxPre
2d0e0 76 4c 65 61 66 2b 31 2c 20 69 44 6c 69 64 78 50  vLeaf+1, iDlidxP
2d0f0 72 65 76 4c 65 61 66 2b 31 2c 20 69 49 64 78 4c  revLeaf+1, iIdxL
2d100 65 61 66 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20  eaf-1.    );.   
2d110 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65   if( p->rc ) bre
2d120 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ak;..    /* If t
2d130 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73  here is a doclis
2d140 74 2d 69 6e 64 65 78 2c 20 63 68 65 63 6b 20 74  t-index, check t
2d150 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 72 69 67  hat it looks rig
2d160 68 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62  ht. */.    if( b
2d170 49 64 78 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  IdxDlidx ){.    
2d180 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
2d190 2a 70 44 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a  *pDlidx = 0;  /*
2d1a0 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74   For iterating t
2d1b0 68 72 6f 75 67 68 20 64 6f 63 6c 69 73 74 20 69  hrough doclist i
2d1c0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ndex */.      in
2d1d0 74 20 69 50 72 65 76 4c 65 61 66 20 3d 20 69 49  t iPrevLeaf = iI
2d1e0 64 78 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e  dxLeaf;.      in
2d1f0 74 20 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d  t iSegid = pSeg-
2d200 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69  >iSegid;.      i
2d210 6e 74 20 69 50 67 20 3d 20 30 3b 0a 20 20 20 20  nt iPg = 0;.    
2d220 20 20 69 36 34 20 69 4b 65 79 3b 0a 0a 20 20 20    i64 iKey;..   
2d230 20 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74     for(pDlidx=ft
2d240 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28  s5DlidxIterInit(
2d250 70 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69 49  p, 0, iSegid, iI
2d260 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  dxLeaf);.       
2d270 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
2d280 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d  Eof(p, pDlidx)==
2d290 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  0;.          fts
2d2a0 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70  5DlidxIterNext(p
2d2b0 2c 20 70 44 6c 69 64 78 29 0a 20 20 20 20 20 20  , pDlidx).      
2d2c0 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  ){..        /* C
2d2d0 68 65 63 6b 20 61 6e 79 20 72 6f 77 69 64 2d 6c  heck any rowid-l
2d2e0 65 73 73 20 70 61 67 65 73 20 74 68 61 74 20 6f  ess pages that o
2d2f0 63 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20  ccur before the 
2d300 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f  current leaf. */
2d310 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 50 67  .        for(iPg
2d320 3d 69 50 72 65 76 4c 65 61 66 2b 31 3b 20 69 50  =iPrevLeaf+1; iP
2d330 67 3c 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  g<fts5DlidxIterP
2d340 67 6e 6f 28 70 44 6c 69 64 78 29 3b 20 69 50 67  gno(pDlidx); iPg
2d350 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
2d360 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  Key = FTS5_SEGME
2d370 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c  NT_ROWID(iSegid,
2d380 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20   iPg);.         
2d390 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
2d3a0 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a  aRead(p, iKey);.
2d3b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c            if( pL
2d3c0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
2d3d0 20 20 20 69 66 28 20 66 74 73 35 4c 65 61 66 46     if( fts5LeafF
2d3e0 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65  irstRowidOff(pLe
2d3f0 61 66 29 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d  af)!=0 ) p->rc =
2d400 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2d410 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44             fts5D
2d420 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
2d430 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2d440 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d450 20 69 50 72 65 76 4c 65 61 66 20 3d 20 66 74 73   iPrevLeaf = fts
2d460 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
2d470 44 6c 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20  Dlidx);..       
2d480 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
2d490 68 65 20 6c 65 61 66 20 70 61 67 65 20 69 6e 64  he leaf page ind
2d4a0 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74  icated by the it
2d4b0 65 72 61 74 6f 72 20 72 65 61 6c 6c 79 20 64 6f  erator really do
2d4c0 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  es.        ** co
2d4d0 6e 74 61 69 6e 20 74 68 65 20 72 6f 77 69 64 20  ntain the rowid 
2d4e0 73 75 67 67 65 73 74 65 64 20 62 79 20 74 68 65  suggested by the
2d4f0 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20   same. */.      
2d500 20 20 69 4b 65 79 20 3d 20 46 54 53 35 5f 53 45    iKey = FTS5_SE
2d510 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67  GMENT_ROWID(iSeg
2d520 69 64 2c 20 69 50 72 65 76 4c 65 61 66 29 3b 0a  id, iPrevLeaf);.
2d530 20 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20          pLeaf = 
2d540 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
2d550 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69  iKey);.        i
2d560 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  f( pLeaf ){.    
2d570 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
2d580 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
2d590 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35  iRowidOff = fts5
2d5a0 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
2d5b0 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  f(pLeaf);.      
2d5c0 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41      ASSERT_SZLEA
2d5d0 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20  F_OK(pLeaf);.   
2d5e0 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69         if( iRowi
2d5f0 64 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c  dOff>=pLeaf->szL
2d600 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
2d610 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
2d620 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
2d630 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d640 20 20 20 20 20 20 66 74 73 35 47 65 74 56 61 72        fts5GetVar
2d650 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52  int(&pLeaf->p[iR
2d660 6f 77 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29  owidOff], (u64*)
2d670 26 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  &iRowid);.      
2d680 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64        if( iRowid
2d690 21 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 52  !=fts5DlidxIterR
2d6a0 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29 20 70  owid(pDlidx) ) p
2d6b0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2d6c0 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  UPT;.          }
2d6d0 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44  .          fts5D
2d6e0 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
2d6f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2d700 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 44 6c 69     }..      iDli
2d710 64 78 50 72 65 76 4c 65 61 66 20 3d 20 69 50 67  dxPrevLeaf = iPg
2d720 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  ;.      fts5Dlid
2d730 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78  xIterFree(pDlidx
2d740 29 3b 0a 20 20 20 20 20 20 66 74 73 35 54 65 73  );.      fts5Tes
2d750 74 44 6c 69 64 78 52 65 76 65 72 73 65 28 70 2c  tDlidxReverse(p,
2d760 20 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61   iSegid, iIdxLea
2d770 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f);.    }else{. 
2d780 20 20 20 20 20 69 44 6c 69 64 78 50 72 65 76 4c       iDlidxPrevL
2d790 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  eaf = pSeg->pgno
2d7a0 4c 61 73 74 3b 0a 20 20 20 20 20 20 2f 2a 20 54  Last;.      /* T
2d7b0 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 72 65  ODO: Check there
2d7c0 20 69 73 20 6e 6f 20 64 6f 63 6c 69 73 74 20 69   is no doclist i
2d7d0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20  ndex */.    }.. 
2d7e0 20 20 20 69 49 64 78 50 72 65 76 4c 65 61 66 20     iIdxPrevLeaf 
2d7f0 3d 20 69 49 64 78 4c 65 61 66 3b 0a 20 20 7d 0a  = iIdxLeaf;.  }.
2d800 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  .  rc2 = sqlite3
2d810 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
2d820 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
2d830 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63  QLITE_OK ) p->rc
2d840 20 3d 20 72 63 32 3b 0a 0a 20 20 2f 2a 20 50 61   = rc2;..  /* Pa
2d850 67 65 20 69 74 65 72 2e 69 4c 65 61 66 20 6d 75  ge iter.iLeaf mu
2d860 73 74 20 6e 6f 77 20 62 65 20 74 68 65 20 72 69  st now be the ri
2d870 67 68 74 6d 6f 73 74 20 6c 65 61 66 2d 70 61 67  ghtmost leaf-pag
2d880 65 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74  e in the segment
2d890 20 2a 2f 0a 23 69 66 20 30 0a 20 20 69 66 28 20   */.#if 0.  if( 
2d8a0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
2d8b0 20 26 26 20 69 74 65 72 2e 69 4c 65 61 66 21 3d   && iter.iLeaf!=
2d8c0 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29  pSeg->pgnoLast )
2d8d0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54  {.    p->rc = FT
2d8e0 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a  S5_CORRUPT;.  }.
2d8f0 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
2d900 20 52 75 6e 20 69 6e 74 65 72 6e 61 6c 20 63 68   Run internal ch
2d910 65 63 6b 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ecks to ensure t
2d920 68 61 74 20 74 68 65 20 46 54 53 20 69 6e 64 65  hat the FTS inde
2d930 78 20 28 61 29 20 69 73 20 69 6e 74 65 72 6e 61  x (a) is interna
2d940 6c 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65  lly .** consiste
2d950 6e 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61  nt and (b) conta
2d960 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ins entries for 
2d970 77 68 69 63 68 20 74 68 65 20 58 4f 52 20 6f 66  which the XOR of
2d980 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a   the checksums.*
2d990 2a 20 61 73 20 63 61 6c 63 75 6c 61 74 65 64 20  * as calculated 
2d9a0 62 79 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  by sqlite3Fts5In
2d9b0 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 29 20  dexEntryCksum() 
2d9c0 69 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20  is cksum..**.** 
2d9d0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
2d9e0 52 52 55 50 54 20 69 66 20 61 6e 79 20 6f 66 20  RRUPT if any of 
2d9f0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 68 65  the internal che
2da00 63 6b 73 20 66 61 69 6c 2c 20 6f 72 20 69 66 20  cks fail, or if 
2da10 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20  the.** checksum 
2da20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20  does not match. 
2da30 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2da40 20 69 66 20 61 6c 6c 20 63 68 65 63 6b 73 20 70   if all checks p
2da50 61 73 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 65  ass without.** e
2da60 72 72 6f 72 2c 20 6f 72 20 73 6f 6d 65 20 6f 74  rror, or some ot
2da70 68 65 72 20 53 51 4c 69 74 65 20 65 72 72 6f 72  her SQLite error
2da80 20 63 6f 64 65 20 69 66 20 61 6e 6f 74 68 65 72   code if another
2da90 20 65 72 72 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d   error (e.g. OOM
2daa0 29 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  ).** occurs..*/.
2dab0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
2dac0 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
2dad0 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ck(Fts5Index *p,
2dae0 20 75 36 34 20 63 6b 73 75 6d 29 7b 0a 20 20 69   u64 cksum){.  i
2daf0 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e  nt eDetail = p->
2db00 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
2db10 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d  ;.  u64 cksum2 =
2db20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2db30 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
2db40 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74  based on content
2db50 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a  s of indexes */.
2db60 20 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73    Fts5Buffer pos
2db70 6c 69 73 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20  list = {0,0,0}; 
2db80 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64    /* Buffer used
2db90 20 74 6f 20 68 6f 6c 64 20 61 20 70 6f 73 6c 69   to hold a posli
2dba0 73 74 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72  st */.  Fts5Iter
2dbb0 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20   *pIter;        
2dbc0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2dbd0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
2dbe0 67 68 20 65 6e 74 69 72 65 20 69 6e 64 65 78 20  gh entire index 
2dbf0 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
2dc00 72 65 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20  re *pStruct;    
2dc10 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74       /* Index st
2dc20 72 75 63 74 75 72 65 20 2a 2f 0a 0a 23 69 66 64  ructure */..#ifd
2dc30 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2dc40 20 20 2f 2a 20 55 73 65 64 20 62 79 20 65 78 74    /* Used by ext
2dc50 72 61 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74  ra internal test
2dc60 73 20 6f 6e 6c 79 20 72 75 6e 20 69 66 20 4e 44  s only run if ND
2dc70 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
2dc80 6e 65 64 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73  ned */.  u64 cks
2dc90 75 6d 33 20 3d 20 30 3b 20 20 20 20 20 20 20 20  um3 = 0;        
2dca0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
2dcb0 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f  ksum based on co
2dcc0 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65  ntents of indexe
2dcd0 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  s */.  Fts5Buffe
2dce0 72 20 74 65 72 6d 20 3d 20 7b 30 2c 30 2c 30 7d  r term = {0,0,0}
2dcf0 3b 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  ;      /* Buffer
2dd00 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 6d 6f   used to hold mo
2dd10 73 74 20 72 65 63 65 6e 74 20 74 65 72 6d 20 2a  st recent term *
2dd20 2f 0a 23 65 6e 64 69 66 0a 20 20 63 6f 6e 73 74  /.#endif.  const
2dd30 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53   int flags = FTS
2dd40 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f  5INDEX_QUERY_NOO
2dd50 55 54 50 55 54 3b 0a 20 20 0a 20 20 2f 2a 20 4c  UTPUT;.  .  /* L
2dd60 6f 61 64 20 74 68 65 20 46 54 53 20 69 6e 64 65  oad the FTS inde
2dd70 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  x structure */. 
2dd80 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53   pStruct = fts5S
2dd90 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
2dda0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
2ddb0 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  t the internal n
2ddc0 6f 64 65 73 20 6f 66 20 65 61 63 68 20 73 65 67  odes of each seg
2ddd0 6d 65 6e 74 20 6d 61 74 63 68 20 74 68 65 20 6c  ment match the l
2dde0 65 61 76 65 73 20 2a 2f 0a 20 20 69 66 28 20 70  eaves */.  if( p
2ddf0 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e  Struct ){.    in
2de00 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20  t iLvl, iSeg;.  
2de10 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
2de20 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
2de30 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
2de40 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
2de50 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65  Seg<pStruct->aLe
2de60 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20  vel[iLvl].nSeg; 
2de70 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
2de80 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
2de90 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70  gment *pSeg = &p
2dea0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
2deb0 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b  Lvl].aSeg[iSeg];
2dec0 0a 20 20 20 20 20 20 20 20 66 74 73 35 49 6e 64  .        fts5Ind
2ded0 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  exIntegrityCheck
2dee0 53 65 67 6d 65 6e 74 28 70 2c 20 70 53 65 67 29  Segment(p, pSeg)
2def0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2df00 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6b    }..  /* The ck
2df10 73 75 6d 20 61 72 67 75 6d 65 6e 74 20 70 61 73  sum argument pas
2df20 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
2df30 74 69 6f 6e 20 69 73 20 61 20 63 68 65 63 6b 73  tion is a checks
2df40 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 0a 20 20  um calculated.  
2df50 2a 2a 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20  ** based on all 
2df60 65 78 70 65 63 74 65 64 20 65 6e 74 72 69 65 73  expected entries
2df70 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65   in the FTS inde
2df80 78 20 28 69 6e 63 6c 75 64 69 6e 67 20 70 72 65  x (including pre
2df90 66 69 78 20 69 6e 64 65 78 0a 20 20 2a 2a 20 65  fix index.  ** e
2dfa0 6e 74 72 69 65 73 29 2e 20 54 68 69 73 20 62 6c  ntries). This bl
2dfb0 6f 63 6b 20 63 68 65 63 6b 73 20 74 68 61 74 20  ock checks that 
2dfc0 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75  a checksum calcu
2dfd0 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74  lated based on t
2dfe0 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 63  he.  ** actual c
2dff0 6f 6e 74 65 6e 74 73 20 6f 66 20 46 54 53 20 69  ontents of FTS i
2e000 6e 64 65 78 20 69 73 20 69 64 65 6e 74 69 63 61  ndex is identica
2e010 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 77 6f  l..  **.  ** Two
2e020 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
2e030 20 73 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 61   same checksum a
2e040 72 65 20 63 61 6c 63 75 6c 61 74 65 64 2e 20 54  re calculated. T
2e050 68 65 20 66 69 72 73 74 20 28 73 74 61 63 6b 0a  he first (stack.
2e060 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 63 6b    ** variable ck
2e070 73 75 6d 32 29 20 62 61 73 65 64 20 6f 6e 20 65  sum2) based on e
2e080 6e 74 72 69 65 73 20 65 78 74 72 61 63 74 65 64  ntries extracted
2e090 20 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d 74   from the full-t
2e0a0 65 78 74 20 69 6e 64 65 78 0a 20 20 2a 2a 20 77  ext index.  ** w
2e0b0 68 69 6c 65 20 64 6f 69 6e 67 20 61 20 6c 69 6e  hile doing a lin
2e0c0 65 61 72 20 73 63 61 6e 20 6f 66 20 65 61 63 68  ear scan of each
2e0d0 20 69 6e 64 69 76 69 64 75 61 6c 20 69 6e 64 65   individual inde
2e0e0 78 20 69 6e 20 74 75 72 6e 2e 20 0a 20 20 2a 2a  x in turn. .  **
2e0f0 0a 20 20 2a 2a 20 41 73 20 65 61 63 68 20 74 65  .  ** As each te
2e100 72 6d 20 76 69 73 69 74 65 64 20 62 79 20 74 68  rm visited by th
2e110 65 20 6c 69 6e 65 61 72 20 73 63 61 6e 73 2c 20  e linear scans, 
2e120 61 20 73 65 70 61 72 61 74 65 20 71 75 65 72 79  a separate query
2e130 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 61   for the.  ** sa
2e140 6d 65 20 74 65 72 6d 20 69 73 20 70 65 72 66 6f  me term is perfo
2e150 72 6d 65 64 2e 20 63 6b 73 75 6d 33 20 69 73 20  rmed. cksum3 is 
2e160 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64  calculated based
2e170 20 6f 6e 20 74 68 65 20 65 6e 74 72 69 65 73 0a   on the entries.
2e180 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 62    ** extracted b
2e190 79 20 74 68 65 73 65 20 71 75 65 72 69 65 73 2e  y these queries.
2e1a0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74 73 35  .  */.  for(fts5
2e1b0 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20  MultiIterNew(p, 
2e1c0 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73 2c 20  pStruct, flags, 
2e1d0 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20  0, 0, 0, -1, 0, 
2e1e0 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66  &pIter);.      f
2e1f0 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
2e200 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20  p, pIter)==0;.  
2e210 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
2e220 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20  rNext(p, pIter, 
2e230 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 69  0, 0).  ){.    i
2e240 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
2e250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2e260 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79  ze of term in by
2e270 74 65 73 20 2a 2f 0a 20 20 20 20 69 36 34 20 69  tes */.    i64 i
2e280 50 6f 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Pos = 0;        
2e290 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69         /* Positi
2e2a0 6f 6e 20 72 65 61 64 20 66 72 6f 6d 20 70 6f 73  on read from pos
2e2b0 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  list */.    int 
2e2c0 69 4f 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20  iOff = 0;       
2e2d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
2e2e0 74 20 77 69 74 68 69 6e 20 70 6f 73 6c 69 73 74  t within poslist
2e2f0 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77   */.    i64 iRow
2e300 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  id = fts5MultiIt
2e310 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a  erRowid(pIter);.
2e320 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63      char *z = (c
2e330 68 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74  har*)fts5MultiIt
2e340 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e  erTerm(pIter, &n
2e350 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2e360 69 73 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d  is is a new term
2e370 2c 20 71 75 65 72 79 20 66 6f 72 20 69 74 2e 20  , query for it. 
2e380 55 70 64 61 74 65 20 63 6b 73 75 6d 33 20 77 69  Update cksum3 wi
2e390 74 68 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  th the results. 
2e3a0 2a 2f 0a 20 20 20 20 66 74 73 35 54 65 73 74 54  */.    fts5TestT
2e3b0 65 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20 7a 2c  erm(p, &term, z,
2e3c0 20 6e 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73   n, cksum2, &cks
2e3d0 75 6d 33 29 3b 0a 0a 20 20 20 20 69 66 28 20 65  um3);..    if( e
2e3e0 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
2e3f0 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AIL_NONE ){.    
2e400 20 20 69 66 28 20 30 3d 3d 66 74 73 35 4d 75 6c    if( 0==fts5Mul
2e410 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c  tiIterIsEmpty(p,
2e420 20 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20 20   pIter) ){.     
2e430 20 20 20 63 6b 73 75 6d 32 20 5e 3d 20 73 71 6c     cksum2 ^= sql
2e440 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74  ite3Fts5IndexEnt
2e450 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20  ryCksum(iRowid, 
2e460 30 2c 20 30 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b  0, 0, -1, z, n);
2e470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2e480 73 65 7b 0a 20 20 20 20 20 20 70 6f 73 6c 69 73  se{.      poslis
2e490 74 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  t.n = 0;.      f
2e4a0 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
2e4b0 74 28 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65  t(p, &pIter->aSe
2e4c0 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  g[pIter->aFirst[
2e4d0 31 5d 2e 69 46 69 72 73 74 5d 2c 20 30 2c 20 26  1].iFirst], 0, &
2e4e0 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  poslist);.      
2e4f0 77 68 69 6c 65 28 20 30 3d 3d 73 71 6c 69 74 65  while( 0==sqlite
2e500 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74  3Fts5PoslistNext
2e510 36 34 28 70 6f 73 6c 69 73 74 2e 70 2c 20 70 6f  64(poslist.p, po
2e520 73 6c 69 73 74 2e 6e 2c 20 26 69 4f 66 66 2c 20  slist.n, &iOff, 
2e530 26 69 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20  &iPos) ){.      
2e540 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53    int iCol = FTS
2e550 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f  5_POS2COLUMN(iPo
2e560 73 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  s);.        int 
2e570 69 54 6f 6b 4f 66 66 20 3d 20 46 54 53 35 5f 50  iTokOff = FTS5_P
2e580 4f 53 32 4f 46 46 53 45 54 28 69 50 6f 73 29 3b  OS2OFFSET(iPos);
2e590 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20  .        cksum2 
2e5a0 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  ^= sqlite3Fts5In
2e5b0 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52  dexEntryCksum(iR
2e5c0 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 54 6f 6b  owid, iCol, iTok
2e5d0 4f 66 66 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a  Off, -1, z, n);.
2e5e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2e5f0 7d 0a 20 20 66 74 73 35 54 65 73 74 54 65 72 6d  }.  fts5TestTerm
2e600 28 70 2c 20 26 74 65 72 6d 2c 20 30 2c 20 30 2c  (p, &term, 0, 0,
2e610 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33   cksum2, &cksum3
2e620 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49  );..  fts5MultiI
2e630 74 65 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a  terFree(pIter);.
2e640 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
2e650 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21  ITE_OK && cksum!
2e660 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20  =cksum2 ) p->rc 
2e670 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2e680 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
2e690 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
2e6a0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2e6b0 44 45 42 55 47 0a 20 20 66 74 73 35 42 75 66 66  DEBUG.  fts5Buff
2e6c0 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 23  erFree(&term);.#
2e6d0 65 6e 64 69 66 0a 20 20 66 74 73 35 42 75 66 66  endif.  fts5Buff
2e6e0 65 72 46 72 65 65 28 26 70 6f 73 6c 69 73 74 29  erFree(&poslist)
2e6f0 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
2e700 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
2e710 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
2e720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
2e760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e7a0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77  *******.** Below
2e7b0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74   this point is t
2e7c0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
2e7d0 6e 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65  n of the fts5_de
2e7e0 63 6f 64 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a  code() scalar.**
2e7f0 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a   function only..
2e800 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  */../*.** Decode
2e810 20 61 20 73 65 67 6d 65 6e 74 2d 64 61 74 61 20   a segment-data 
2e820 72 6f 77 69 64 20 66 72 6f 6d 20 74 68 65 20 25  rowid from the %
2e830 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54 68 69  _data table. Thi
2e840 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
2e850 20 74 68 65 20 6f 70 70 6f 73 69 74 65 20 6f 66   the opposite of
2e860 20 6d 61 63 72 6f 20 46 54 53 35 5f 53 45 47 4d   macro FTS5_SEGM
2e870 45 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a  ENT_ROWID()..*/.
2e880 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2e890 44 65 63 6f 64 65 52 6f 77 69 64 28 0a 20 20 69  DecodeRowid(.  i
2e8a0 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20  64 iRowid,      
2e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e8c0 2a 20 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64  * Rowid from %_d
2e8d0 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ata table */.  i
2e8e0 6e 74 20 2a 70 69 53 65 67 69 64 2c 20 20 20 20  nt *piSegid,    
2e8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e900 2a 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74 20 69  * OUT: Segment i
2e910 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6c  d */.  int *pbDl
2e920 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  idx,            
2e930 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44         /* OUT: D
2e940 6c 69 64 78 20 66 6c 61 67 20 2a 2f 0a 20 20 69  lidx flag */.  i
2e950 6e 74 20 2a 70 69 48 65 69 67 68 74 2c 20 20 20  nt *piHeight,   
2e960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e970 2a 20 4f 55 54 3a 20 48 65 69 67 68 74 20 2a 2f  * OUT: Height */
2e980 0a 20 20 69 6e 74 20 2a 70 69 50 67 6e 6f 20 20  .  int *piPgno  
2e990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9a0 20 20 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20     /* OUT: Page 
2e9b0 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a  number */.){.  *
2e9c0 70 69 50 67 6e 6f 20 3d 20 28 69 6e 74 29 28 69  piPgno = (int)(i
2e9d0 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31  Rowid & (((i64)1
2e9e0 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 50 41   << FTS5_DATA_PA
2e9f0 47 45 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69  GE_B) - 1));.  i
2ea00 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44  Rowid >>= FTS5_D
2ea10 41 54 41 5f 50 41 47 45 5f 42 3b 0a 0a 20 20 2a  ATA_PAGE_B;..  *
2ea20 70 69 48 65 69 67 68 74 20 3d 20 28 69 6e 74 29  piHeight = (int)
2ea30 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34  (iRowid & (((i64
2ea40 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f  )1 << FTS5_DATA_
2ea50 48 45 49 47 48 54 5f 42 29 20 2d 20 31 29 29 3b  HEIGHT_B) - 1));
2ea60 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54  .  iRowid >>= FT
2ea70 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42  S5_DATA_HEIGHT_B
2ea80 3b 0a 0a 20 20 2a 70 62 44 6c 69 64 78 20 3d 20  ;..  *pbDlidx = 
2ea90 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 30  (int)(iRowid & 0
2eaa0 78 30 30 30 31 29 3b 0a 20 20 69 52 6f 77 69 64  x0001);.  iRowid
2eab0 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 44   >>= FTS5_DATA_D
2eac0 4c 49 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67 69  LI_B;..  *piSegi
2ead0 64 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64  d = (int)(iRowid
2eae0 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46   & (((i64)1 << F
2eaf0 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d  TS5_DATA_ID_B) -
2eb00 20 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   1));.}..static 
2eb10 76 6f 69 64 20 66 74 73 35 44 65 62 75 67 52 6f  void fts5DebugRo
2eb20 77 69 64 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  wid(int *pRc, Ft
2eb30 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
2eb40 69 36 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74  i64 iKey){.  int
2eb50 20 69 53 65 67 69 64 2c 20 69 48 65 69 67 68 74   iSegid, iHeight
2eb60 2c 20 69 50 67 6e 6f 2c 20 62 44 6c 69 64 78 3b  , iPgno, bDlidx;
2eb70 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
2eb80 63 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a 20 20  compenents */.  
2eb90 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28  fts5DecodeRowid(
2eba0 69 4b 65 79 2c 20 26 69 53 65 67 69 64 2c 20 26  iKey, &iSegid, &
2ebb0 62 44 6c 69 64 78 2c 20 26 69 48 65 69 67 68 74  bDlidx, &iHeight
2ebc0 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69 66  , &iPgno);..  if
2ebd0 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20  ( iSegid==0 ){. 
2ebe0 20 20 20 69 66 28 20 69 4b 65 79 3d 3d 46 54 53     if( iKey==FTS
2ebf0 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
2ec00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2ec10 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2ec20 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2ec30 66 2c 20 22 7b 61 76 65 72 61 67 65 73 7d 20 22  f, "{averages} "
2ec40 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2ec50 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2ec60 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2ec70 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 73  f(pRc, pBuf, "{s
2ec80 74 72 75 63 74 75 72 65 7d 22 29 3b 0a 20 20 20  tructure}");.   
2ec90 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 7b 0a 20   }.  }.  else{. 
2eca0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2ecb0 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2ecc0 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 25 73  (pRc, pBuf, "{%s
2ecd0 73 65 67 69 64 3d 25 64 20 68 3d 25 64 20 70 67  segid=%d h=%d pg
2ece0 6e 6f 3d 25 64 7d 22 2c 0a 20 20 20 20 20 20 20  no=%d}",.       
2ecf0 20 62 44 6c 69 64 78 20 3f 20 22 64 6c 69 64 78   bDlidx ? "dlidx
2ed00 20 22 20 3a 20 22 22 2c 20 69 53 65 67 69 64 2c   " : "", iSegid,
2ed10 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a   iHeight, iPgno.
2ed20 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74      );.  }.}..st
2ed30 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
2ed40 62 75 67 53 74 72 75 63 74 75 72 65 28 0a 20 20  bugStructure(.  
2ed50 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20  int *pRc,       
2ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed70 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72  /* IN/OUT: error
2ed80 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42   code */.  Fts5B
2ed90 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 46  uffer *pBuf,.  F
2eda0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 0a  ts5Structure *p.
2edb0 29 7b 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69  ){.  int iLvl, i
2edc0 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seg;            
2edd0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20       /* Iterate 
2ede0 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 2c 20  through levels, 
2edf0 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 66  segments */..  f
2ee00 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
2ee10 70 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  p->nLevel; iLvl+
2ee20 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75  +){.    Fts5Stru
2ee30 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
2ee40 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c   = &p->aLevel[iL
2ee50 76 6c 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  vl];.    sqlite3
2ee60 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2ee70 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2ee80 2c 20 0a 20 20 20 20 20 20 20 20 22 20 7b 6c 76  , .        " {lv
2ee90 6c 3d 25 64 20 6e 4d 65 72 67 65 3d 25 64 20 6e  l=%d nMerge=%d n
2eea0 53 65 67 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70  Seg=%d", iLvl, p
2eeb0 4c 76 6c 2d 3e 6e 4d 65 72 67 65 2c 20 70 4c 76  Lvl->nMerge, pLv
2eec0 6c 2d 3e 6e 53 65 67 0a 20 20 20 20 29 3b 0a 20  l->nSeg.    );. 
2eed0 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
2eee0 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20  Seg<pLvl->nSeg; 
2eef0 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46  iSeg++){.      F
2ef00 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
2ef10 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76  ent *pSeg = &pLv
2ef20 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20  l->aSeg[iSeg];. 
2ef30 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
2ef40 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2ef50 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20  tf(pRc, pBuf, " 
2ef60 7b 69 64 3d 25 64 20 6c 65 61 76 65 73 3d 25 64  {id=%d leaves=%d
2ef70 2e 2e 25 64 7d 22 2c 20 0a 20 20 20 20 20 20 20  ..%d}", .       
2ef80 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c     pSeg->iSegid,
2ef90 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
2efa0 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  , pSeg->pgnoLast
2efb0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
2efc0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2efd0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2efe0 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7d 22  f(pRc, pBuf, "}"
2eff0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2f000 54 68 69 73 20 69 73 20 70 61 72 74 20 6f 66 20  This is part of 
2f010 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28  the fts5_decode(
2f020 29 20 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e  ) debugging aid.
2f030 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73  .**.** Arguments
2f040 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e   pBlob/nBlob con
2f050 74 61 69 6e 20 61 20 73 65 72 69 61 6c 69 7a 65  tain a serialize
2f060 64 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  d Fts5Structure 
2f070 6f 62 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20  object. This.** 
2f080 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
2f090 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
2f0a0 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
2f0b0 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6f 62 6a   of the same obj
2f0c0 65 63 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75  ect.** to the bu
2f0d0 66 66 65 72 20 70 61 73 73 65 64 20 61 73 20 74  ffer passed as t
2f0e0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2f0f0 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nt. .*/.static v
2f100 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 53 74  oid fts5DecodeSt
2f110 72 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a  ructure(.  int *
2f120 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  pRc,            
2f130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
2f140 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65  /OUT: error code
2f150 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
2f160 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20   *pBuf,.  const 
2f170 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e  u8 *pBlob, int n
2f180 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Blob.){.  int rc
2f190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f1a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2f1b0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  urn code */.  Ft
2f1c0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 20 3d  s5Structure *p =
2f1d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2f1e0 20 44 65 63 6f 64 65 64 20 73 74 72 75 63 74 75   Decoded structu
2f1f0 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20  re object */..  
2f200 72 63 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  rc = fts5Structu
2f210 72 65 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20  reDecode(pBlob, 
2f220 6e 42 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20  nBlob, 0, &p);. 
2f230 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f240 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d  OK ){.    *pRc =
2f250 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
2f260 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 65 62 75  .  }..  fts5Debu
2f270 67 53 74 72 75 63 74 75 72 65 28 70 52 63 2c 20  gStructure(pRc, 
2f280 70 42 75 66 2c 20 70 29 3b 0a 20 20 66 74 73 35  pBuf, p);.  fts5
2f290 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
2f2a0 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  (p);.}../*.** Th
2f2b0 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  is is part of th
2f2c0 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20  e fts5_decode() 
2f2d0 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a  debugging aid..*
2f2e0 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70  *.** Arguments p
2f2f0 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61  Blob/nBlob conta
2f300 69 6e 20 61 6e 20 22 61 76 65 72 61 67 65 73 22  in an "averages"
2f310 20 72 65 63 6f 72 64 2e 20 54 68 69 73 20 66 75   record. This fu
2f320 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 70 70 65 6e  nction .** appen
2f330 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61  ds a human-reada
2f340 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
2f350 6f 6e 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20  on of record to 
2f360 74 68 65 20 62 75 66 66 65 72 20 70 61 73 73 65  the buffer passe
2f370 64 20 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63  d .** as the sec
2f380 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a  ond argument. .*
2f390 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
2f3a0 73 35 44 65 63 6f 64 65 41 76 65 72 61 67 65 73  s5DecodeAverages
2f3b0 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20  (.  int *pRc,   
2f3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f3d0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65      /* IN/OUT: e
2f3e0 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46  rror code */.  F
2f3f0 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
2f400 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c  .  const u8 *pBl
2f410 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b  ob, int nBlob.){
2f420 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
2f430 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 61  const char *zSpa
2f440 63 65 20 3d 20 22 22 3b 0a 0a 20 20 77 68 69 6c  ce = "";..  whil
2f450 65 28 20 69 3c 6e 42 6c 6f 62 20 29 7b 0a 20 20  e( i<nBlob ){.  
2f460 20 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20 20    u64 iVal;.    
2f470 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  i += sqlite3Fts5
2f480 47 65 74 56 61 72 69 6e 74 28 26 70 42 6c 6f 62  GetVarint(&pBlob
2f490 5b 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20  [i], &iVal);.   
2f4a0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2f4b0 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2f4c0 52 63 2c 20 70 42 75 66 2c 20 22 25 73 25 64 22  Rc, pBuf, "%s%d"
2f4d0 2c 20 7a 53 70 61 63 65 2c 20 28 69 6e 74 29 69  , zSpace, (int)i
2f4e0 56 61 6c 29 3b 0a 20 20 20 20 7a 53 70 61 63 65  Val);.    zSpace
2f4f0 20 3d 20 22 20 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = " ";.  }.}../
2f500 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28 61 2f 6e  *.** Buffer (a/n
2f510 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  ) is assumed to 
2f520 63 6f 6e 74 61 69 6e 20 61 20 6c 69 73 74 20 6f  contain a list o
2f530 66 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 72  f serialized var
2f540 69 6e 74 73 2e 20 52 65 61 64 0a 2a 2a 20 65 61  ints. Read.** ea
2f550 63 68 20 76 61 72 69 6e 74 20 61 6e 64 20 61 70  ch varint and ap
2f560 70 65 6e 64 20 69 74 73 20 73 74 72 69 6e 67 20  pend its string 
2f570 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 74  representation t
2f580 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 20 52  o buffer pBuf. R
2f590 65 74 75 72 6e 0a 2a 2a 20 61 66 74 65 72 20 65  eturn.** after e
2f5a0 69 74 68 65 72 20 74 68 65 20 69 6e 70 75 74 20  ither the input 
2f5b0 62 75 66 66 65 72 20 69 73 20 65 78 68 61 75 73  buffer is exhaus
2f5c0 74 65 64 20 6f 72 20 61 20 30 20 76 61 6c 75 65  ted or a 0 value
2f5d0 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   is read..**.** 
2f5e0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
2f5f0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2f600 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f  f bytes read fro
2f610 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66  m the input buff
2f620 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2f630 74 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c  t fts5DecodePosl
2f640 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  ist(int *pRc, Ft
2f650 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
2f660 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74  const u8 *a, int
2f670 20 6e 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20   n){.  int iOff 
2f680 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f  = 0;.  while( iO
2f690 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ff<n ){.    int 
2f6a0 69 56 61 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b  iVal;.    iOff +
2f6b0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
2f6c0 32 28 26 61 5b 69 4f 66 66 5d 2c 20 69 56 61 6c  2(&a[iOff], iVal
2f6d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
2f6e0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2f6f0 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2f700 22 20 25 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20  " %d", iVal);.  
2f710 7d 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b  }.  return iOff;
2f720 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74  .}../*.** The st
2f730 61 72 74 20 6f 66 20 62 75 66 66 65 72 20 28 61  art of buffer (a
2f740 2f 6e 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  /n) contains the
2f750 20 73 74 61 72 74 20 6f 66 20 61 20 64 6f 63 6c   start of a docl
2f760 69 73 74 2e 20 54 68 65 20 64 6f 63 6c 69 73 74  ist. The doclist
2f770 0a 2a 2a 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  .** may or may n
2f780 6f 74 20 66 69 6e 69 73 68 20 77 69 74 68 69 6e  ot finish within
2f790 20 74 68 65 20 62 75 66 66 65 72 2e 20 54 68 69   the buffer. Thi
2f7a0 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e  s function appen
2f7b0 64 73 20 61 20 74 65 78 74 0a 2a 2a 20 72 65 70  ds a text.** rep
2f7c0 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
2f7d0 68 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  he part of the d
2f7e0 6f 63 6c 69 73 74 20 74 68 61 74 20 69 73 20 70  oclist that is p
2f7f0 72 65 73 65 6e 74 20 74 6f 20 62 75 66 66 65 72  resent to buffer
2f800 0a 2a 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a  .** pBuf. .**.**
2f810 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
2f820 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
2f830 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72  of bytes read fr
2f840 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66  om the input buf
2f850 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  fer..*/.static i
2f860 6e 74 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63  nt fts5DecodeDoc
2f870 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46  list(int *pRc, F
2f880 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
2f890 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e   const u8 *a, in
2f8a0 74 20 6e 29 7b 0a 20 20 69 36 34 20 69 44 6f 63  t n){.  i64 iDoc
2f8b0 69 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  id = 0;.  int iO
2f8c0 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e  ff = 0;..  if( n
2f8d0 3e 30 20 29 7b 0a 20 20 20 20 69 4f 66 66 20 3d  >0 ){.    iOff =
2f8e0 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
2f8f0 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26  arint(a, (u64*)&
2f900 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 73 71 6c  iDocid);.    sql
2f910 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2f920 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
2f930 70 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22  pBuf, " id=%lld"
2f940 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20  , iDocid);.  }. 
2f950 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29   while( iOff<n )
2f960 7b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a  {.    int nPos;.
2f970 20 20 20 20 69 6e 74 20 62 44 65 6c 3b 0a 20 20      int bDel;.  
2f980 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
2f990 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b  tPoslistSize(&a[
2f9a0 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62  iOff], &nPos, &b
2f9b0 44 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Del);.    sqlite
2f9c0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2f9d0 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2f9e0 66 2c 20 22 20 6e 50 6f 73 3d 25 64 25 73 22 2c  f, " nPos=%d%s",
2f9f0 20 6e 50 6f 73 2c 20 62 44 65 6c 3f 22 2a 22 3a   nPos, bDel?"*":
2fa00 22 22 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  "");.    iOff +=
2fa10 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69   fts5DecodePosli
2fa20 73 74 28 70 52 63 2c 20 70 42 75 66 2c 20 26 61  st(pRc, pBuf, &a
2fa30 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f  [iOff], MIN(n-iO
2fa40 66 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20  ff, nPos));.    
2fa50 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20  if( iOff<n ){.  
2fa60 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a      i64 iDelta;.
2fa70 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71        iOff += sq
2fa80 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
2fa90 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
2faa0 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
2fab0 20 20 20 69 44 6f 63 69 64 20 2b 3d 20 69 44 65     iDocid += iDe
2fac0 6c 74 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lta;.      sqlit
2fad0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2fae0 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2faf0 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20  uf, " id=%lld", 
2fb00 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d 0a 20  iDocid);.    }. 
2fb10 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 4f 66   }..  return iOf
2fb20 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  f;.}../*.** This
2fb30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72   function is par
2fb40 74 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65  t of the fts5_de
2fb50 63 6f 64 65 28 29 20 64 65 62 75 67 67 69 6e 67  code() debugging
2fb60 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73   function. It is
2fb70 20 0a 2a 2a 20 6f 6e 6c 79 20 65 76 65 72 20 75   .** only ever u
2fb80 73 65 64 20 77 69 74 68 20 64 65 74 61 69 6c 3d  sed with detail=
2fb90 6e 6f 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  none tables..**.
2fba0 2a 2a 20 42 75 66 66 65 72 20 28 70 44 61 74 61  ** Buffer (pData
2fbb0 2f 6e 44 61 74 61 29 20 63 6f 6e 74 61 69 6e 73  /nData) contains
2fbc0 20 61 20 64 6f 63 6c 69 73 74 20 69 6e 20 74 68   a doclist in th
2fbd0 65 20 66 6f 72 6d 61 74 20 75 73 65 64 20 62 79  e format used by
2fbe0 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 0a 2a 2a 20   detail=none.** 
2fbf0 74 61 62 6c 65 73 2e 20 54 68 69 73 20 66 75 6e  tables. This fun
2fc00 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20  ction appends a 
2fc10 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 76  human-readable v
2fc20 65 72 73 69 6f 6e 20 6f 66 20 74 68 61 74 20 6c  ersion of that l
2fc30 69 73 74 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72  ist to.** buffer
2fc40 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   pBuf..**.** If 
2fc50 2a 70 52 63 20 69 73 20 6f 74 68 65 72 20 74 68  *pRc is other th
2fc60 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65  an SQLITE_OK whe
2fc70 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
2fc80 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
2fc90 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 49 66 20   a.** no-op. If 
2fca0 61 6e 20 4f 4f 4d 20 6f 72 20 6f 74 68 65 72 20  an OOM or other 
2fcb0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
2fcc0 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
2fcd0 6e 2c 20 2a 70 52 63 20 69 73 0a 2a 2a 20 73 65  n, *pRc is.** se
2fce0 74 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 65  t to an SQLite e
2fcf0 72 72 6f 72 20 63 6f 64 65 20 62 65 66 6f 72 65  rror code before
2fd00 20 72 65 74 75 72 6e 69 6e 67 2e 20 54 68 65 20   returning. The 
2fd10 66 69 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 62  final state of b
2fd20 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 20 69 73  uffer.** pBuf is
2fd30 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
2fd40 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  is case..*/.stat
2fd50 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f  ic void fts5Deco
2fd60 64 65 52 6f 77 69 64 4c 69 73 74 28 0a 20 20 69  deRowidList(.  i
2fd70 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20  nt *pRc,        
2fd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fd90 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20  * IN/OUT: Error 
2fda0 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  code */.  Fts5Bu
2fdb0 66 66 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20  ffer *pBuf,     
2fdc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
2fdd0 66 65 72 20 74 6f 20 61 70 70 65 6e 64 20 74 65  fer to append te
2fde0 78 74 20 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74  xt to */.  const
2fdf0 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20   u8 *pData, int 
2fe00 6e 44 61 74 61 20 20 20 20 20 20 2f 2a 20 44 61  nData      /* Da
2fe10 74 61 20 74 6f 20 64 65 63 6f 64 65 20 6c 69 73  ta to decode lis
2fe20 74 2d 6f 66 2d 72 6f 77 69 64 73 20 66 72 6f 6d  t-of-rowids from
2fe30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 20 3d   */.){.  int i =
2fe40 20 30 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64   0;.  i64 iRowid
2fe50 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
2fe60 69 3c 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 63  i<nData ){.    c
2fe70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 70 70 20  onst char *zApp 
2fe80 3d 20 22 22 3b 0a 20 20 20 20 75 36 34 20 69 56  = "";.    u64 iV
2fe90 61 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c  al;.    i += sql
2fea0 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
2feb0 74 28 26 70 44 61 74 61 5b 69 5d 2c 20 26 69 56  t(&pData[i], &iV
2fec0 61 6c 29 3b 0a 20 20 20 20 69 52 6f 77 69 64 20  al);.    iRowid 
2fed0 2b 3d 20 69 56 61 6c 3b 0a 0a 20 20 20 20 69 66  += iVal;..    if
2fee0 28 20 69 3c 6e 44 61 74 61 20 26 26 20 70 44 61  ( i<nData && pDa
2fef0 74 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b 0a 20  ta[i]==0x00 ){. 
2ff00 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
2ff10 69 66 28 20 69 3c 6e 44 61 74 61 20 26 26 20 70  if( i<nData && p
2ff20 44 61 74 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b  Data[i]==0x00 ){
2ff30 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
2ff40 20 20 20 20 20 20 7a 41 70 70 20 3d 20 22 2b 22        zApp = "+"
2ff50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2ff60 20 20 20 20 20 20 20 7a 41 70 70 20 3d 20 22 2a         zApp = "*
2ff70 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ";.      }.    }
2ff80 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ..    sqlite3Fts
2ff90 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2ffa0 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
2ffb0 20 25 6c 6c 64 25 73 22 2c 20 69 52 6f 77 69 64   %lld%s", iRowid
2ffc0 2c 20 7a 41 70 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  , zApp);.  }.}..
2ffd0 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  /*.** The implem
2ffe0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72  entation of user
2fff0 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20  -defined scalar 
30000 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 64 65  function fts5_de
30010 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  code()..*/.stati
30020 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64  c void fts5Decod
30030 65 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  eFunction(.  sql
30040 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
30050 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tx,          /* 
30060 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f  Function call co
30070 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ntext */.  int n
30080 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
30090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
300a0 6d 62 65 72 20 6f 66 20 61 72 67 73 20 28 61 6c  mber of args (al
300b0 77 61 79 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c  ways 2) */.  sql
300c0 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
300d0 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  al           /* 
300e0 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  Function argumen
300f0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 69  ts */.){.  i64 i
30100 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  Rowid;          
30110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
30120 77 69 64 20 66 6f 72 20 72 65 63 6f 72 64 20 62  wid for record b
30130 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a  eing decoded */.
30140 20 20 69 6e 74 20 69 53 65 67 69 64 2c 69 48 65    int iSegid,iHe
30150 69 67 68 74 2c 69 50 67 6e 6f 2c 62 44 6c 69 64  ight,iPgno,bDlid
30160 78 3b 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 6f  x;/* Rowid compo
30170 6e 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  nents */.  const
30180 20 75 38 20 2a 61 42 6c 6f 62 3b 20 69 6e 74 20   u8 *aBlob; int 
30190 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  n;         /* Re
301a0 63 6f 72 64 20 74 6f 20 64 65 63 6f 64 65 20 2a  cord to decode *
301b0 2f 0a 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20  /.  u8 *a = 0;. 
301c0 20 46 74 73 35 42 75 66 66 65 72 20 73 3b 20 20   Fts5Buffer s;  
301d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
301e0 20 2f 2a 20 42 75 69 6c 64 20 75 70 20 74 65 78   /* Build up tex
301f0 74 20 74 6f 20 72 65 74 75 72 6e 20 68 65 72 65  t to return here
30200 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
30210 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
30220 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
30230 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  code */.  int nS
30240 70 61 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pace = 0;.  int 
30250 65 44 65 74 61 69 6c 4e 6f 6e 65 20 3d 20 28 73  eDetailNone = (s
30260 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
30270 28 70 43 74 78 29 21 3d 30 29 3b 0a 0a 20 20 61  (pCtx)!=0);..  a
30280 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29  ssert( nArg==2 )
30290 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
302a0 28 6e 41 72 67 29 3b 0a 20 20 6d 65 6d 73 65 74  (nArg);.  memset
302b0 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  (&s, 0, sizeof(F
302c0 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69  ts5Buffer));.  i
302d0 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  Rowid = sqlite3_
302e0 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61  value_int64(apVa
302f0 6c 5b 30 5d 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  l[0]);..  /* Mak
30300 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
30310 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
30320 28 61 20 62 6c 6f 62 29 20 69 6e 20 61 42 6c 6f  (a blob) in aBlo
30330 62 5b 5d 2e 20 54 68 65 20 61 42 6c 6f 62 5b 5d  b[]. The aBlob[]
30340 0a 20 20 2a 2a 20 63 6f 70 79 20 69 73 20 66 6f  .  ** copy is fo
30350 6c 6c 6f 77 65 64 20 62 79 20 46 54 53 35 5f 44  llowed by FTS5_D
30360 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47  ATA_ZERO_PADDING
30370 20 30 78 30 30 20 62 79 74 65 73 2c 20 77 68 69   0x00 bytes, whi
30380 63 68 20 70 72 65 76 65 6e 74 73 0a 20 20 2a 2a  ch prevents.  **
30390 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64   buffer overread
303a0 73 20 65 76 65 6e 20 69 66 20 74 68 65 20 72 65  s even if the re
303b0 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 2e  cord is corrupt.
303c0 20 20 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c 69 74    */.  n = sqlit
303d0 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
303e0 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 61 42 6c 6f  pVal[1]);.  aBlo
303f0 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  b = sqlite3_valu
30400 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 31 5d 29  e_blob(apVal[1])
30410 3b 0a 20 20 6e 53 70 61 63 65 20 3d 20 6e 20 2b  ;.  nSpace = n +
30420 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f   FTS5_DATA_ZERO_
30430 50 41 44 44 49 4e 47 3b 0a 20 20 61 20 3d 20 28  PADDING;.  a = (
30440 75 38 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  u8*)sqlite3Fts5M
30450 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e  allocZero(&rc, n
30460 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20 61 3d  Space);.  if( a=
30470 3d 30 20 29 20 67 6f 74 6f 20 64 65 63 6f 64 65  =0 ) goto decode
30480 5f 6f 75 74 3b 0a 20 20 69 66 28 20 6e 3e 30 20  _out;.  if( n>0 
30490 29 20 6d 65 6d 63 70 79 28 61 2c 20 61 42 6c 6f  ) memcpy(a, aBlo
304a0 62 2c 20 6e 29 3b 0a 0a 20 20 66 74 73 35 44 65  b, n);..  fts5De
304b0 63 6f 64 65 52 6f 77 69 64 28 69 52 6f 77 69 64  codeRowid(iRowid
304c0 2c 20 26 69 53 65 67 69 64 2c 20 26 62 44 6c 69  , &iSegid, &bDli
304d0 64 78 2c 20 26 69 48 65 69 67 68 74 2c 20 26 69  dx, &iHeight, &i
304e0 50 67 6e 6f 29 3b 0a 0a 20 20 66 74 73 35 44 65  Pgno);..  fts5De
304f0 62 75 67 52 6f 77 69 64 28 26 72 63 2c 20 26 73  bugRowid(&rc, &s
30500 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 69 66 28  , iRowid);.  if(
30510 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 46   bDlidx ){.    F
30520 74 73 35 44 61 74 61 20 64 6c 69 64 78 3b 0a 20  ts5Data dlidx;. 
30530 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20     Fts5DlidxLvl 
30540 6c 76 6c 3b 0a 0a 20 20 20 20 64 6c 69 64 78 2e  lvl;..    dlidx.
30550 70 20 3d 20 61 3b 0a 20 20 20 20 64 6c 69 64 78  p = a;.    dlidx
30560 2e 6e 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 6d 65  .nn = n;..    me
30570 6d 73 65 74 28 26 6c 76 6c 2c 20 30 2c 20 73 69  mset(&lvl, 0, si
30580 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76  zeof(Fts5DlidxLv
30590 6c 29 29 3b 0a 20 20 20 20 6c 76 6c 2e 70 44 61  l));.    lvl.pDa
305a0 74 61 20 3d 20 26 64 6c 69 64 78 3b 0a 20 20 20  ta = &dlidx;.   
305b0 20 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 20 3d   lvl.iLeafPgno =
305c0 20 69 50 67 6e 6f 3b 0a 0a 20 20 20 20 66 6f 72   iPgno;..    for
305d0 28 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78  (fts5DlidxLvlNex
305e0 74 28 26 6c 76 6c 29 3b 20 6c 76 6c 2e 62 45 6f  t(&lvl); lvl.bEo
305f0 66 3d 3d 30 3b 20 66 74 73 35 44 6c 69 64 78 4c  f==0; fts5DlidxL
30600 76 6c 4e 65 78 74 28 26 6c 76 6c 29 29 7b 0a 20  vlNext(&lvl)){. 
30610 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
30620 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
30630 74 66 28 26 72 63 2c 20 26 73 2c 20 0a 20 20 20  tf(&rc, &s, .   
30640 20 20 20 20 20 20 20 22 20 25 64 28 25 6c 6c 64         " %d(%lld
30650 29 22 2c 20 6c 76 6c 2e 69 4c 65 61 66 50 67 6e  )", lvl.iLeafPgn
30660 6f 2c 20 6c 76 6c 2e 69 52 6f 77 69 64 0a 20 20  o, lvl.iRowid.  
30670 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
30680 65 6c 73 65 20 69 66 28 20 69 53 65 67 69 64 3d  else if( iSegid=
30690 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 52  =0 ){.    if( iR
306a0 6f 77 69 64 3d 3d 46 54 53 35 5f 41 56 45 52 41  owid==FTS5_AVERA
306b0 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  GES_ROWID ){.   
306c0 20 20 20 66 74 73 35 44 65 63 6f 64 65 41 76 65     fts5DecodeAve
306d0 72 61 67 65 73 28 26 72 63 2c 20 26 73 2c 20 61  rages(&rc, &s, a
306e0 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
306f0 0a 20 20 20 20 20 20 66 74 73 35 44 65 63 6f 64  .      fts5Decod
30700 65 53 74 72 75 63 74 75 72 65 28 26 72 63 2c 20  eStructure(&rc, 
30710 26 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d  &s, a, n);.    }
30720 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65  .  }else if( eDe
30730 74 61 69 6c 4e 6f 6e 65 20 29 7b 0a 20 20 20 20  tailNone ){.    
30740 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b  Fts5Buffer term;
30750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30760 20 43 75 72 72 65 6e 74 20 74 65 72 6d 20 72 65   Current term re
30770 61 64 20 66 72 6f 6d 20 70 61 67 65 20 2a 2f 0a  ad from page */.
30780 20 20 20 20 69 6e 74 20 73 7a 4c 65 61 66 3b 0a      int szLeaf;.
30790 20 20 20 20 69 6e 74 20 69 50 67 69 64 78 4f 66      int iPgidxOf
307a0 66 20 3d 20 73 7a 4c 65 61 66 20 3d 20 66 74 73  f = szLeaf = fts
307b0 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a  5GetU16(&a[2]);.
307c0 20 20 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66      int iTermOff
307d0 3b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 20  ;.    int nKeep 
307e0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66  = 0;.    int iOf
307f0 66 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  f;..    memset(&
30800 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  term, 0, sizeof(
30810 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20  Fts5Buffer));.. 
30820 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 61 6e 79     /* Decode any
30830 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63   entries that oc
30840 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20 66  cur before the f
30850 69 72 73 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  irst term. */.  
30860 20 20 69 66 28 20 73 7a 4c 65 61 66 3c 6e 20 29    if( szLeaf<n )
30870 7b 0a 20 20 20 20 20 20 69 50 67 69 64 78 4f 66  {.      iPgidxOf
30880 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
30890 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66  nt32(&a[iPgidxOf
308a0 66 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20  f], iTermOff);. 
308b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
308c0 69 54 65 72 6d 4f 66 66 20 3d 20 73 7a 4c 65 61  iTermOff = szLea
308d0 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  f;.    }.    fts
308e0 35 44 65 63 6f 64 65 52 6f 77 69 64 4c 69 73 74  5DecodeRowidList
308f0 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 34 5d 2c  (&rc, &s, &a[4],
30900 20 69 54 65 72 6d 4f 66 66 2d 34 29 3b 0a 0a 20   iTermOff-4);.. 
30910 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f     iOff = iTermO
30920 66 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  ff;.    while( i
30930 4f 66 66 3c 73 7a 4c 65 61 66 20 29 7b 0a 20 20  Off<szLeaf ){.  
30940 20 20 20 20 69 6e 74 20 6e 41 70 70 65 6e 64 3b      int nAppend;
30950 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20  ..      /* Read 
30960 74 68 65 20 74 65 72 6d 20 64 61 74 61 20 66 6f  the term data fo
30970 72 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 2a  r the next term*
30980 2f 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  /.      iOff += 
30990 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
309a0 26 61 5b 69 4f 66 66 5d 2c 20 6e 41 70 70 65 6e  &a[iOff], nAppen
309b0 64 29 3b 0a 20 20 20 20 20 20 74 65 72 6d 2e 6e  d);.      term.n
309c0 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20   = nKeep;.      
309d0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
309e0 42 6c 6f 62 28 26 72 63 2c 20 26 74 65 72 6d 2c  Blob(&rc, &term,
309f0 20 6e 41 70 70 65 6e 64 2c 20 26 61 5b 69 4f 66   nAppend, &a[iOf
30a00 66 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  f]);.      sqlit
30a10 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
30a20 6e 64 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ndPrintf(.      
30a30 20 20 20 20 26 72 63 2c 20 26 73 2c 20 22 20 74      &rc, &s, " t
30a40 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e  erm=%.*s", term.
30a50 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  n, (const char*)
30a60 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 29 3b 0a  term.p.      );.
30a70 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 41        iOff += nA
30a80 70 70 65 6e 64 3b 0a 0a 20 20 20 20 20 20 2f 2a  ppend;..      /*
30a90 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 72   Figure out wher
30aa0 65 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f  e the doclist fo
30ab0 72 20 74 68 69 73 20 74 65 72 6d 20 65 6e 64 73  r this term ends
30ac0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 50   */.      if( iP
30ad0 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  gidxOff<n ){.   
30ae0 20 20 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b 0a       int nIncr;.
30af0 20 20 20 20 20 20 20 20 69 50 67 69 64 78 4f 66          iPgidxOf
30b00 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
30b10 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66  nt32(&a[iPgidxOf
30b20 66 5d 2c 20 6e 49 6e 63 72 29 3b 0a 20 20 20 20  f], nIncr);.    
30b30 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20      iTermOff += 
30b40 6e 49 6e 63 72 3b 0a 20 20 20 20 20 20 7d 65 6c  nIncr;.      }el
30b50 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 65 72  se{.        iTer
30b60 6d 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20  mOff = szLeaf;. 
30b70 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74       }..      ft
30b80 73 35 44 65 63 6f 64 65 52 6f 77 69 64 4c 69 73  s5DecodeRowidLis
30b90 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f  t(&rc, &s, &a[iO
30ba0 66 66 5d 2c 20 69 54 65 72 6d 4f 66 66 2d 69 4f  ff], iTermOff-iO
30bb0 66 66 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  ff);.      iOff 
30bc0 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20  = iTermOff;.    
30bd0 20 20 69 66 28 20 69 4f 66 66 3c 73 7a 4c 65 61    if( iOff<szLea
30be0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66  f ){.        iOf
30bf0 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
30c00 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
30c10 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Keep);.      }. 
30c20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75     }..    fts5Bu
30c30 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b  fferFree(&term);
30c40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74  .  }else{.    Ft
30c50 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20  s5Buffer term;  
30c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
30c70 75 72 72 65 6e 74 20 74 65 72 6d 20 72 65 61 64  urrent term read
30c80 20 66 72 6f 6d 20 70 61 67 65 20 2a 2f 0a 20 20   from page */.  
30c90 20 20 69 6e 74 20 73 7a 4c 65 61 66 3b 20 20 20    int szLeaf;   
30ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30cb0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 70 67 69  /* Offset of pgi
30cc0 64 78 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 20  dx in a[] */.   
30cd0 20 69 6e 74 20 69 50 67 69 64 78 4f 66 66 3b 0a   int iPgidxOff;.
30ce0 20 20 20 20 69 6e 74 20 69 50 67 69 64 78 50 72      int iPgidxPr
30cf0 65 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ev = 0;         
30d00 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61    /* Previous va
30d10 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 70 67  lue read from pg
30d20 69 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  idx */.    int i
30d30 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 20  TermOff = 0;.   
30d40 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 20 3d   int iRowidOff =
30d50 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66   0;.    int iOff
30d60 3b 0a 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69  ;.    int nDocli
30d70 73 74 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28  st;..    memset(
30d80 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &term, 0, sizeof
30d90 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a  (Fts5Buffer));..
30da0 20 20 20 20 69 66 28 20 6e 3c 34 20 29 7b 0a 20      if( n<4 ){. 
30db0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
30dc0 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 26  BufferSet(&rc, &
30dd0 73 2c 20 37 2c 20 28 63 6f 6e 73 74 20 75 38 2a  s, 7, (const u8*
30de0 29 22 63 6f 72 72 75 70 74 22 29 3b 0a 20 20 20  )"corrupt");.   
30df0 20 20 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f     goto decode_o
30e00 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ut;.    }else{. 
30e10 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d       iRowidOff =
30e20 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 30   fts5GetU16(&a[0
30e30 5d 29 3b 0a 20 20 20 20 20 20 69 50 67 69 64 78  ]);.      iPgidx
30e40 4f 66 66 20 3d 20 73 7a 4c 65 61 66 20 3d 20 66  Off = szLeaf = f
30e50 74 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29  ts5GetU16(&a[2])
30e60 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 67 69  ;.      if( iPgi
30e70 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20  dxOff<n ){.     
30e80 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74     fts5GetVarint
30e90 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d  32(&a[iPgidxOff]
30ea0 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20 20  , iTermOff);.   
30eb0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
30ec0 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 6f  /* Decode the po
30ed0 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 61 69 6c  sition list tail
30ee0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
30ef0 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
30f00 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 21 3d   if( iRowidOff!=
30f10 30 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20  0 ){.      iOff 
30f20 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20  = iRowidOff;.   
30f30 20 7d 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d   }else if( iTerm
30f40 4f 66 66 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Off!=0 ){.      
30f50 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
30f60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30f70 20 20 69 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b    iOff = szLeaf;
30f80 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44  .    }.    fts5D
30f90 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 26 72 63  ecodePoslist(&rc
30fa0 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69 4f 66  , &s, &a[4], iOf
30fb0 66 2d 34 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65  f-4);..    /* De
30fc0 63 6f 64 65 20 61 6e 79 20 6d 6f 72 65 20 64 6f  code any more do
30fd0 63 6c 69 73 74 20 64 61 74 61 20 74 68 61 74 20  clist data that 
30fe0 61 70 70 65 61 72 73 20 6f 6e 20 74 68 65 20 70  appears on the p
30ff0 61 67 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20  age before the. 
31000 20 20 20 2a 2a 20 66 69 72 73 74 20 74 65 72 6d     ** first term
31010 2e 20 2a 2f 0a 20 20 20 20 6e 44 6f 63 6c 69 73  . */.    nDoclis
31020 74 20 3d 20 28 69 54 65 72 6d 4f 66 66 20 3f 20  t = (iTermOff ? 
31030 69 54 65 72 6d 4f 66 66 20 3a 20 73 7a 4c 65 61  iTermOff : szLea
31040 66 29 20 2d 20 69 4f 66 66 3b 0a 20 20 20 20 66  f) - iOff;.    f
31050 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74  ts5DecodeDoclist
31060 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66  (&rc, &s, &a[iOf
31070 66 5d 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 0a  f], nDoclist);..
31080 20 20 20 20 77 68 69 6c 65 28 20 69 50 67 69 64      while( iPgid
31090 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20  xOff<n ){.      
310a0 69 6e 74 20 62 46 69 72 73 74 20 3d 20 28 69 50  int bFirst = (iP
310b0 67 69 64 78 4f 66 66 3d 3d 73 7a 4c 65 61 66 29  gidxOff==szLeaf)
310c0 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f  ;     /* True fo
310d0 72 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  r first term on 
310e0 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  page */.      in
310f0 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
31100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31110 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
31120 64 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 69 6e  data */.      in
31130 74 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 0a 20  t iEnd;.      . 
31140 20 20 20 20 20 69 50 67 69 64 78 4f 66 66 20 2b       iPgidxOff +
31150 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
31160 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c  2(&a[iPgidxOff],
31170 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69   nByte);.      i
31180 50 67 69 64 78 50 72 65 76 20 2b 3d 20 6e 42 79  PgidxPrev += nBy
31190 74 65 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d  te;.      iOff =
311a0 20 69 50 67 69 64 78 50 72 65 76 3b 0a 0a 20 20   iPgidxPrev;..  
311b0 20 20 20 20 69 66 28 20 69 50 67 69 64 78 4f 66      if( iPgidxOf
311c0 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 66  f<n ){.        f
311d0 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
311e0 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 42  a[iPgidxOff], nB
311f0 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 45  yte);.        iE
31200 6e 64 20 3d 20 69 50 67 69 64 78 50 72 65 76 20  nd = iPgidxPrev 
31210 2b 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 7d  + nByte;.      }
31220 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 45  else{.        iE
31230 6e 64 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20  nd = szLeaf;.   
31240 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
31250 62 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20  bFirst==0 ){.   
31260 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
31270 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
31280 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  iOff], nByte);. 
31290 20 20 20 20 20 20 20 74 65 72 6d 2e 6e 20 3d 20         term.n = 
312a0 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20  nByte;.      }. 
312b0 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
312c0 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
312d0 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  iOff], nByte);. 
312e0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
312f0 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20 26  ppendBlob(&rc, &
31300 74 65 72 6d 2c 20 6e 42 79 74 65 2c 20 26 61 5b  term, nByte, &a[
31310 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 69 4f  iOff]);.      iO
31320 66 66 20 2b 3d 20 6e 42 79 74 65 3b 0a 0a 20 20  ff += nByte;..  
31330 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
31340 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
31350 66 28 0a 20 20 20 20 20 20 20 20 20 20 26 72 63  f(.          &rc
31360 2c 20 26 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a  , &s, " term=%.*
31370 73 22 2c 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e  s", term.n, (con
31380 73 74 20 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a  st char*)term.p.
31390 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
313a0 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64  Off += fts5Decod
313b0 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73  eDoclist(&rc, &s
313c0 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 69 45 6e 64  , &a[iOff], iEnd
313d0 2d 69 4f 66 66 29 3b 0a 20 20 20 20 7d 0a 0a 20  -iOff);.    }.. 
313e0 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
313f0 65 28 26 74 65 72 6d 29 3b 0a 20 20 7d 0a 20 20  e(&term);.  }.  
31400 0a 20 64 65 63 6f 64 65 5f 6f 75 74 3a 0a 20 20  . decode_out:.  
31410 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b  sqlite3_free(a);
31420 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
31430 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
31440 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
31450 70 43 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61  pCtx, (const cha
31460 72 2a 29 73 2e 70 2c 20 73 2e 6e 2c 20 53 51 4c  r*)s.p, s.n, SQL
31470 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
31480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
31490 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
314a0 72 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63 29  r_code(pCtx, rc)
314b0 3b 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66  ;.  }.  fts5Buff
314c0 65 72 46 72 65 65 28 26 73 29 3b 0a 7d 0a 0a 2f  erFree(&s);.}../
314d0 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
314e0 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d  ntation of user-
314f0 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66  defined scalar f
31500 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 72 6f 77  unction fts5_row
31510 69 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  id()..*/.static 
31520 76 6f 69 64 20 66 74 73 35 52 6f 77 69 64 46 75  void fts5RowidFu
31530 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
31540 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
31550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
31560 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65  ction call conte
31570 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  xt */.  int nArg
31580 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31590 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
315a0 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61 79  r of args (alway
315b0 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s 2) */.  sqlite
315c0 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20  3_value **apVal 
315d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
315e0 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
315f0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
31600 61 72 20 2a 7a 41 72 67 3b 0a 20 20 69 66 28 20  ar *zArg;.  if( 
31610 6e 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73  nArg==0 ){.    s
31620 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
31630 72 6f 72 28 70 43 74 78 2c 20 22 73 68 6f 75 6c  ror(pCtx, "shoul
31640 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64  d be: fts5_rowid
31650 28 73 75 62 6a 65 63 74 2c 20 2e 2e 2e 2e 29 22  (subject, ....)"
31660 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , -1);.  }else{.
31670 20 20 20 20 7a 41 72 67 20 3d 20 28 63 6f 6e 73      zArg = (cons
31680 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
31690 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
316a0 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  [0]);.    if( 0=
316b0 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70  =sqlite3_stricmp
316c0 28 7a 41 72 67 2c 20 22 73 65 67 6d 65 6e 74 22  (zArg, "segment"
316d0 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69  ) ){.      i64 i
316e0 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 6e 74  Rowid;.      int
316f0 20 73 65 67 69 64 2c 20 70 67 6e 6f 3b 0a 20 20   segid, pgno;.  
31700 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 33 20      if( nArg!=3 
31710 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
31720 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
31730 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20 20 20  pCtx, .         
31740 20 20 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66     "should be: f
31750 74 73 35 5f 72 6f 77 69 64 28 27 73 65 67 6d 65  ts5_rowid('segme
31760 6e 74 27 2c 20 73 65 67 69 64 2c 20 70 67 6e 6f  nt', segid, pgno
31770 29 29 22 2c 20 2d 31 0a 20 20 20 20 20 20 20 20  ))", -1.        
31780 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
31790 20 20 20 20 20 20 20 20 73 65 67 69 64 20 3d 20          segid = 
317a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
317b0 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20  t(apVal[1]);.   
317c0 20 20 20 20 20 70 67 6e 6f 20 3d 20 73 71 6c 69       pgno = sqli
317d0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70  te3_value_int(ap
317e0 56 61 6c 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20  Val[2]);.       
317f0 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53   iRowid = FTS5_S
31800 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 73 65 67  EGMENT_ROWID(seg
31810 69 64 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  id, pgno);.     
31820 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
31830 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 69 52  t_int64(pCtx, iR
31840 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  owid);.      }. 
31850 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31860 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
31870 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20  rror(pCtx, .    
31880 20 20 20 20 22 66 69 72 73 74 20 61 72 67 20 74      "first arg t
31890 6f 20 66 74 73 35 5f 72 6f 77 69 64 28 29 20 6d  o fts5_rowid() m
318a0 75 73 74 20 62 65 20 27 73 65 67 6d 65 6e 74 27  ust be 'segment'
318b0 22 20 2c 20 2d 31 0a 20 20 20 20 20 20 29 3b 0a  " , -1.      );.
318c0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
318d0 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  ** This is calle
318e0 64 20 61 73 20 70 61 72 74 20 6f 66 20 72 65 67  d as part of reg
318f0 69 73 74 65 72 69 6e 67 20 74 68 65 20 46 54 53  istering the FTS
31900 35 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 64 61  5 module with da
31910 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
31920 74 69 6f 6e 20 64 62 2e 20 49 74 20 72 65 67 69  tion db. It regi
31930 73 74 65 72 73 20 73 65 76 65 72 61 6c 20 75 73  sters several us
31940 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61  er-defined scala
31950 72 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 66  r functions usef
31960 75 6c 0a 2a 2a 20 77 69 74 68 20 46 54 53 35 2e  ul.** with FTS5.
31970 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
31980 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
31990 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
319a0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
319b0 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 53   some other.** S
319c0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
319d0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73   is returned ins
319e0 74 65 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tead..*/.int sql
319f0 69 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 69  ite3Fts5IndexIni
31a00 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
31a10 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
31a20 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
31a30 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22 66  on(.      db, "f
31a40 74 73 35 5f 64 65 63 6f 64 65 22 2c 20 32 2c 20  ts5_decode", 2, 
31a50 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
31a60 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69  fts5DecodeFuncti
31a70 6f 6e 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 0a 20  on, 0, 0.  );.. 
31a80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31a90 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
31aa0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
31ab0 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20  nction(.        
31ac0 64 62 2c 20 22 66 74 73 35 5f 64 65 63 6f 64 65  db, "fts5_decode
31ad0 5f 6e 6f 6e 65 22 2c 20 32 2c 20 0a 20 20 20 20  _none", 2, .    
31ae0 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c      SQLITE_UTF8,
31af0 20 28 76 6f 69 64 2a 29 64 62 2c 20 66 74 73 35   (void*)db, fts5
31b00 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20  DecodeFunction, 
31b10 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  0, 0.    );.  }.
31b20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
31b30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
31b40 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
31b50 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20  function(.      
31b60 20 20 64 62 2c 20 22 66 74 73 35 5f 72 6f 77 69    db, "fts5_rowi
31b70 64 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  d", -1, SQLITE_U
31b80 54 46 38 2c 20 30 2c 20 66 74 73 35 52 6f 77 69  TF8, 0, fts5Rowi
31b90 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a  dFunction, 0, 0.
31ba0 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74      );.  }.  ret
31bb0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 69 6e 74 20  urn rc;.}...int 
31bc0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
31bd0 52 65 73 65 74 28 46 74 73 35 49 6e 64 65 78 20  Reset(Fts5Index 
31be0 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
31bf0 2d 3e 70 53 74 72 75 63 74 3d 3d 30 20 7c 7c 20  ->pStruct==0 || 
31c00 70 2d 3e 69 53 74 72 75 63 74 56 65 72 73 69 6f  p->iStructVersio
31c10 6e 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 66 74  n!=0 );.  if( ft
31c20 73 35 49 6e 64 65 78 44 61 74 61 56 65 72 73 69  s5IndexDataVersi
31c30 6f 6e 28 70 29 21 3d 70 2d 3e 69 53 74 72 75 63  on(p)!=p->iStruc
31c40 74 56 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20  tVersion ){.    
31c50 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e 76  fts5StructureInv
31c60 61 6c 69 64 61 74 65 28 70 29 3b 0a 20 20 7d 0a  alidate(p);.  }.
31c70 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
31c80 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a     exReturn(p);.}.