/ Hex Artifact Content
Login

Artifact 19df86d29d24cc56bfb01a6a07dcaac227d2fcdf:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 6f 77 20  *****.**.** Low 
0180: 6c 65 76 65 6c 20 61 63 63 65 73 73 20 74 6f 20  level access to 
0190: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
01a0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
01b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 0a  base file. The .
01c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
01d0: 68 69 73 20 66 69 6c 65 20 66 69 6c 65 20 69 6d  his file file im
01e0: 70 6c 65 6d 65 6e 74 20 61 6c 6c 20 72 65 61 64  plement all read
01f0: 20 61 6e 64 20 77 72 69 74 65 20 61 63 63 65 73   and write acces
0200: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 25 5f 64 61  s to the.** %_da
0210: 74 61 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 20  ta table. Other 
0220: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 79 73  parts of the sys
0230: 74 65 6d 20 61 63 63 65 73 73 20 74 68 69 73 20  tem access this 
0240: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 76 69  functionality vi
0250: 61 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 66 61  a.** the interfa
0260: 63 65 20 64 65 66 69 6e 65 64 20 69 6e 20 66 74  ce defined in ft
0270: 73 35 49 6e 74 2e 68 2e 0a 2a 2f 0a 0a 0a 23 69  s5Int.h..*/...#i
0280: 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e  nclude "fts5Int.
0290: 68 22 0a 0a 2f 2a 0a 2a 2a 20 4f 76 65 72 76 69  h"../*.** Overvi
02a0: 65 77 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f  ew:.**.** The %_
02b0: 64 61 74 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  data table conta
02c0: 69 6e 73 20 61 6c 6c 20 74 68 65 20 46 54 53 20  ins all the FTS 
02d0: 69 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 20 46  indexes for an F
02e0: 54 53 35 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS5 virtual tabl
02f0: 65 2e 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73  e..** As well as
0300: 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 20 69   the main term i
0310: 6e 64 65 78 2c 20 74 68 65 72 65 20 6d 61 79 20  ndex, there may 
0320: 62 65 20 75 70 20 74 6f 20 33 31 20 70 72 65 66  be up to 31 pref
0330: 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 54  ix indexes..** T
0340: 68 65 20 66 6f 72 6d 61 74 20 69 73 20 73 69 6d  he format is sim
0350: 69 6c 61 72 20 74 6f 20 46 54 53 33 2f 34 2c 20  ilar to FTS3/4, 
0360: 65 78 63 65 70 74 20 74 68 61 74 3a 0a 2a 2a 0a  except that:.**.
0370: 2a 2a 20 20 20 2a 20 61 6c 6c 20 73 65 67 6d 65  **   * all segme
0380: 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 64  nt b-tree leaf d
0390: 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ata is stored in
03a0: 20 66 69 78 65 64 20 73 69 7a 65 20 70 61 67 65   fixed size page
03b0: 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 20 20 20   records .**    
03c0: 20 28 65 2e 67 2e 20 31 30 30 30 20 62 79 74 65   (e.g. 1000 byte
03d0: 73 29 2e 20 41 20 73 69 6e 67 6c 65 20 64 6f 63  s). A single doc
03e0: 6c 69 73 74 20 6d 61 79 20 73 70 61 6e 20 6d 75  list may span mu
03f0: 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 20 43 61  ltiple pages. Ca
0400: 72 65 20 69 73 20 0a 2a 2a 20 20 20 20 20 74 61  re is .**     ta
0410: 6b 65 6e 20 74 6f 20 65 6e 73 75 72 65 20 69 74  ken to ensure it
0420: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
0430: 69 74 65 72 61 74 65 20 69 6e 20 65 69 74 68 65  iterate in eithe
0440: 72 20 64 69 72 65 63 74 69 6f 6e 20 74 68 72 6f  r direction thro
0450: 75 67 68 20 0a 2a 2a 20 20 20 20 20 74 68 65 20  ugh .**     the 
0460: 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64 6f 63  entries in a doc
0470: 6c 69 73 74 2c 20 6f 72 20 74 6f 20 73 65 65 6b  list, or to seek
0480: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 65   to a specific e
0490: 6e 74 72 79 20 77 69 74 68 69 6e 20 61 20 0a 2a  ntry within a .*
04a0: 2a 20 20 20 20 20 64 6f 63 6c 69 73 74 2c 20 77  *     doclist, w
04b0: 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 69  ithout loading i
04c0: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  t into memory..*
04d0: 2a 0a 2a 2a 20 20 20 2a 20 6c 61 72 67 65 20 64  *.**   * large d
04e0: 6f 63 6c 69 73 74 73 20 74 68 61 74 20 73 70 61  oclists that spa
04f0: 6e 20 6d 61 6e 79 20 70 61 67 65 73 20 68 61 76  n many pages hav
0500: 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 64 6f  e associated "do
0510: 63 6c 69 73 74 20 69 6e 64 65 78 22 0a 2a 2a 20  clist index".** 
0520: 20 20 20 20 72 65 63 6f 72 64 73 20 74 68 61 74      records that
0530: 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 70 79 20   contain a copy 
0540: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
0550: 69 64 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  id on each page 
0560: 73 70 61 6e 6e 65 64 20 62 79 0a 2a 2a 20 20 20  spanned by.**   
0570: 20 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 54    the doclist. T
0580: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
0590: 70 65 65 64 20 75 70 20 73 65 65 6b 20 6f 70 65  peed up seek ope
05a0: 72 61 74 69 6f 6e 73 2c 20 61 6e 64 20 6d 65 72  rations, and mer
05b0: 67 65 73 20 6f 66 0a 2a 2a 20 20 20 20 20 6c 61  ges of.**     la
05c0: 72 67 65 20 64 6f 63 6c 69 73 74 73 20 77 69 74  rge doclists wit
05d0: 68 20 76 65 72 79 20 73 6d 61 6c 6c 20 64 6f 63  h very small doc
05e0: 6c 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  lists..**.**   *
05f0: 20 65 78 74 72 61 20 66 69 65 6c 64 73 20 69 6e   extra fields in
0600: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 20   the "structure 
0610: 72 65 63 6f 72 64 22 20 72 65 63 6f 72 64 20 74  record" record t
0620: 68 65 20 73 74 61 74 65 20 6f 66 20 6f 6e 67 6f  he state of ongo
0630: 69 6e 67 0a 2a 2a 20 20 20 20 20 69 6e 63 72 65  ing.**     incre
0640: 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65  mental merge ope
0650: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2f 0a 0a  rations..**.*/..
0660: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4f 50  .#define FTS5_OP
0670: 54 5f 57 4f 52 4b 5f 55 4e 49 54 20 20 31 30 30  T_WORK_UNIT  100
0680: 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  0  /* Number of 
0690: 6c 65 61 66 20 70 61 67 65 73 20 70 65 72 20 6f  leaf pages per o
06a0: 70 74 69 6d 69 7a 65 20 73 74 65 70 20 2a 2f 0a  ptimize step */.
06b0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 57 4f 52  #define FTS5_WOR
06c0: 4b 5f 55 4e 49 54 20 20 20 20 20 20 36 34 20 20  K_UNIT      64  
06d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
06e0: 65 61 66 20 70 61 67 65 73 20 69 6e 20 75 6e 69  eaf pages in uni
06f0: 74 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 23 64  t of work */..#d
0700: 65 66 69 6e 65 20 46 54 53 35 5f 4d 49 4e 5f 44  efine FTS5_MIN_D
0710: 4c 49 44 58 5f 53 49 5a 45 20 34 20 20 20 20 20  LIDX_SIZE 4     
0720: 2f 2a 20 41 64 64 20 64 6c 69 64 78 20 69 66 20  /* Add dlidx if 
0730: 74 68 69 73 20 6d 61 6e 79 20 65 6d 70 74 79 20  this many empty 
0740: 70 61 67 65 73 20 2a 2f 0a 0a 23 64 65 66 69 6e  pages */..#defin
0750: 65 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  e FTS5_MAIN_PREF
0760: 49 58 20 27 30 27 0a 0a 23 69 66 20 46 54 53 35  IX '0'..#if FTS5
0770: 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45  _MAX_PREFIX_INDE
0780: 58 45 53 20 3e 20 33 31 0a 23 20 65 72 72 6f 72  XES > 31.# error
0790: 20 22 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49   "FTS5_MAX_PREFI
07a0: 58 5f 49 4e 44 45 58 45 53 20 69 73 20 74 6f 6f  X_INDEXES is too
07b0: 20 6c 61 72 67 65 22 0a 23 65 6e 64 69 66 0a 0a   large".#endif..
07c0: 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 3a 0a 2a  /*.** Details:.*
07d0: 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
07e0: 74 61 62 6c 65 20 6d 61 6e 61 67 65 64 20 62 79  table managed by
07f0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2c 0a 2a 2a   this module,.**
0800: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
0810: 41 42 4c 45 20 25 5f 64 61 74 61 28 69 64 20 49  ABLE %_data(id I
0820: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0830: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b  EY, block BLOB);
0840: 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e 74 61 69 6e  .**.** , contain
0850: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
0860: 35 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72  5 types of recor
0870: 64 73 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ds. See the comm
0880: 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ents surrounding
0890: 0a 2a 2a 20 74 68 65 20 46 54 53 35 5f 2a 5f 52  .** the FTS5_*_R
08a0: 4f 57 49 44 20 6d 61 63 72 6f 73 20 62 65 6c 6f  OWID macros belo
08b0: 77 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  w for a descript
08c0: 69 6f 6e 20 6f 66 20 68 6f 77 20 25 5f 64 61 74  ion of how %_dat
08d0: 61 20 72 6f 77 69 64 73 20 61 72 65 20 0a 2a 2a  a rowids are .**
08e0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63   assigned to eac
08f0: 68 20 66 6f 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  h fo them..**.**
0900: 20 31 2e 20 53 74 72 75 63 74 75 72 65 20 52 65   1. Structure Re
0910: 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  cords:.**.**   T
0920: 68 65 20 73 65 74 20 6f 66 20 73 65 67 6d 65 6e  he set of segmen
0930: 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
0940: 61 6e 20 69 6e 64 65 78 20 2d 20 74 68 65 20 69  an index - the i
0950: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2d  ndex structure -
0960: 20 61 72 65 0a 2a 2a 20 20 20 72 65 63 6f 72 64   are.**   record
0970: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 72  ed in a single r
0980: 65 63 6f 72 64 20 77 69 74 68 69 6e 20 74 68 65  ecord within the
0990: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
09a0: 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73  he record consis
09b0: 74 73 0a 2a 2a 20 20 20 6f 66 20 61 20 73 69 6e  ts.**   of a sin
09c0: 67 6c 65 20 33 32 2d 62 69 74 20 63 6f 6e 66 69  gle 32-bit confi
09d0: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
09e0: 76 61 6c 75 65 20 66 6f 6c 6c 6f 77 65 64 20 62  value followed b
09f0: 79 20 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20  y a list of .** 
0a00: 20 20 53 51 4c 69 74 65 20 76 61 72 69 6e 74 73    SQLite varints
0a10: 2e 20 49 66 20 74 68 65 20 46 54 53 20 74 61 62  . If the FTS tab
0a20: 6c 65 20 66 65 61 74 75 72 65 73 20 6d 6f 72 65  le features more
0a30: 20 74 68 61 6e 20 6f 6e 65 20 69 6e 64 65 78 20   than one index 
0a40: 28 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 74 68  (because.**   th
0a50: 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
0a60: 6f 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78  ore prefix index
0a70: 65 73 29 2c 20 69 74 20 69 73 20 67 75 61 72 61  es), it is guara
0a80: 6e 74 65 65 64 20 74 68 61 74 20 61 6c 6c 20 73  nteed that all s
0a90: 68 61 72 65 0a 2a 2a 20 20 20 74 68 65 20 73 61  hare.**   the sa
0aa0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 2e  me cookie value.
0ab0: 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d 65 64 69 61  .**.**   Immedia
0ac0: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
0ad0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
0ae0: 20 63 6f 6f 6b 69 65 2c 20 74 68 65 20 72 65 63   cookie, the rec
0af0: 6f 72 64 20 62 65 67 69 6e 73 20 77 69 74 68 0a  ord begins with.
0b00: 2a 2a 20 20 20 74 68 72 65 65 20 76 61 72 69 6e  **   three varin
0b10: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20  ts:.**.**     + 
0b20: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
0b30: 2c 0a 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c  ,.**     + total
0b40: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0b50: 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c 65 76 65 6c  nts on all level
0b60: 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 76 61 6c 75  s,.**     + valu
0b70: 65 20 6f 66 20 77 72 69 74 65 20 63 6f 75 6e 74  e of write count
0b80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 6e  er..**.**   Then
0b90: 2c 20 66 6f 72 20 65 61 63 68 20 6c 65 76 65 6c  , for each level
0ba0: 20 66 72 6f 6d 20 30 20 74 6f 20 6e 4d 61 78 3a   from 0 to nMax:
0bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 6e 75 6d  .**.**     + num
0bc0: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
0bd0: 6d 65 6e 74 73 20 69 6e 20 6f 6e 67 6f 69 6e 67  ments in ongoing
0be0: 20 6d 65 72 67 65 2e 0a 2a 2a 20 20 20 20 20 2b   merge..**     +
0bf0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
0c00: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76   segments in lev
0c10: 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b 20 66 6f 72  el..**     + for
0c20: 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 66 72   each segment fr
0c30: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
0c40: 65 73 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  est:.**         
0c50: 2b 20 73 65 67 6d 65 6e 74 20 69 64 20 28 61 6c  + segment id (al
0c60: 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20  ways > 0).**    
0c70: 20 20 20 20 20 2b 20 66 69 72 73 74 20 6c 65 61       + first lea
0c80: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  f page number (o
0c90: 66 74 65 6e 20 31 2c 20 61 6c 77 61 79 73 20 67  ften 1, always g
0ca0: 72 65 61 74 65 72 20 74 68 61 6e 20 30 29 0a 2a  reater than 0).*
0cb0: 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e 61  *         + fina
0cc0: 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  l leaf page numb
0cd0: 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65 20  er.**.** 2. The 
0ce0: 41 76 65 72 61 67 65 73 20 52 65 63 6f 72 64 3a  Averages Record:
0cf0: 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67 6c  .**.**   A singl
0d00: 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20  e record within 
0d10: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
0d20: 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 61 20  . The data is a 
0d30: 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e  list of varints.
0d40: 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74 20  .**   The first 
0d50: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
0d60: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
0d70: 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c 20  he index. Then, 
0d80: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
0d90: 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74  **   from left t
0da0: 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f 74  o right, the tot
0db0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  al number of tok
0dc0: 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ens in the colum
0dd0: 6e 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 20 20 72  n for all.**   r
0de0: 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ows of the table
0df0: 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67 6d 65  ..**.** 3. Segme
0e00: 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a 2a 2a  nt leaves:.**.**
0e10: 20 20 20 54 45 52 4d 2f 44 4f 43 4c 49 53 54 20     TERM/DOCLIST 
0e20: 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 20 20  FORMAT:.**.**   
0e30: 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68 20 73    Most of each s
0e40: 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73 20 74  egment leaf is t
0e50: 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72 6d 2f  aken up by term/
0e60: 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20 54 68  doclist data. Th
0e70: 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65 72 61  e .**     genera
0e80: 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 65 72 6d  l format of term
0e90: 2f 64 6f 63 6c 69 73 74 2c 20 73 74 61 72 74 69  /doclist, starti
0ea0: 6e 67 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ng with the firs
0eb0: 74 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 6f 6e  t term.**     on
0ec0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2c 20   the leaf page, 
0ed0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
0ee0: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
0ef0: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
0f00: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20           blob:  
0f10: 20 20 66 69 72 73 74 20 74 65 72 6d 20 64 61 74    first term dat
0f20: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 6f 63  a.**         doc
0f30: 6c 69 73 74 3a 20 66 69 72 73 74 20 64 6f 63 6c  list: first docl
0f40: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  ist.**         z
0f50: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
0f60: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
0f70: 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  t:  number of by
0f80: 74 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69  tes in common wi
0f90: 74 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  th previous term
0fa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
0fb0: 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66  rint:  number of
0fc0: 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65   bytes of new te
0fd0: 72 6d 20 64 61 74 61 20 28 6e 4e 65 77 29 0a 2a  rm data (nNew).*
0fe0: 2a 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  *           blob
0ff0: 3a 20 20 20 20 6e 4e 65 77 20 62 79 74 65 73 20  :    nNew bytes 
1000: 6f 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61  of new term data
1010: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 64 6f  .**           do
1020: 63 6c 69 73 74 3a 20 6e 65 78 74 20 64 6f 63 6c  clist: next docl
1030: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ist.**         }
1040: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 6f 63 6c 69  .**.**     docli
1050: 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a  st format:.**.**
1060: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
1070: 20 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a    first rowid.**
1080: 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73 74           poslist
1090: 3a 20 66 69 72 73 74 20 70 6f 73 6c 69 73 74 0a  : first poslist.
10a0: 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d  **         zero-
10b0: 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20  or-more {.**    
10c0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20         varint:  
10d0: 72 6f 77 69 64 20 64 65 6c 74 61 20 28 61 6c 77  rowid delta (alw
10e0: 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20 20  ays > 0).**     
10f0: 20 20 20 20 20 20 70 6f 73 6c 69 73 74 3a 20 6e        poslist: n
1100: 65 78 74 20 70 6f 73 6c 69 73 74 0a 2a 2a 20 20  ext poslist.**  
1110: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1120: 20 20 20 70 6f 73 6c 69 73 74 20 66 6f 72 6d 61     poslist forma
1130: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
1140: 20 76 61 72 69 6e 74 3a 20 73 69 7a 65 20 6f 66   varint: size of
1150: 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65   poslist in byte
1160: 73 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20  s multiplied by 
1170: 32 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  2, not including
1180: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1190: 20 20 20 20 74 68 69 73 20 66 69 65 6c 64 2e 20      this field. 
11a0: 50 6c 75 73 20 31 20 69 66 20 74 68 69 73 20 65  Plus 1 if this e
11b0: 6e 74 72 79 20 63 61 72 72 69 65 73 20 74 68 65  ntry carries the
11c0: 20 22 64 65 6c 65 74 65 22 20 66 6c 61 67 2e 0a   "delete" flag..
11d0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 6c 69  **         colli
11e0: 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20  st: collist for 
11f0: 63 6f 6c 75 6d 6e 20 30 0a 2a 2a 20 20 20 20 20  column 0.**     
1200: 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65      zero-or-more
1210: 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   {.**           
1220: 30 78 30 31 20 62 79 74 65 0a 2a 2a 20 20 20 20  0x01 byte.**    
1230: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 63         varint: c
1240: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 28 49 29  olumn number (I)
1250: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f  .**           co
1260: 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66  llist: collist f
1270: 6f 72 20 63 6f 6c 75 6d 6e 20 49 0a 2a 2a 20 20  or column I.**  
1280: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1290: 20 20 20 63 6f 6c 6c 69 73 74 20 66 6f 72 6d 61     collist forma
12a0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
12b0: 20 76 61 72 69 6e 74 3a 20 66 69 72 73 74 20 6f   varint: first o
12c0: 66 66 73 65 74 20 2b 20 32 0a 2a 2a 20 20 20 20  ffset + 2.**    
12d0: 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72       zero-or-mor
12e0: 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  e {.**          
12f0: 20 76 61 72 69 6e 74 3a 20 6f 66 66 73 65 74 20   varint: offset 
1300: 64 65 6c 74 61 20 2b 20 32 0a 2a 2a 20 20 20 20  delta + 2.**    
1310: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 50       }.**.**   P
1320: 41 47 45 20 46 4f 52 4d 41 54 0a 2a 2a 0a 2a 2a  AGE FORMAT.**.**
1330: 20 20 20 20 20 45 61 63 68 20 6c 65 61 66 20 70       Each leaf p
1340: 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  age begins with 
1350: 61 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  a 4-byte header 
1360: 63 6f 6e 74 61 69 6e 69 6e 67 20 32 20 31 36 2d  containing 2 16-
1370: 62 69 74 20 0a 2a 2a 20 20 20 20 20 75 6e 73 69  bit .**     unsi
1380: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 69 65  gned integer fie
1390: 6c 64 73 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  lds in big-endia
13a0: 6e 20 66 6f 72 6d 61 74 2e 20 54 68 65 79 20 61  n format. They a
13b0: 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
13c0: 2a 20 54 68 65 20 62 79 74 65 20 6f 66 66 73 65  * The byte offse
13d0: 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  t of the first r
13e0: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
13f0: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 2a  , if it exists.*
1400: 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 6f 63  *         and oc
1410: 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 65 20  curs before the 
1420: 66 69 72 73 74 20 74 65 72 6d 20 28 6f 74 68 65  first term (othe
1430: 72 77 69 73 65 20 30 29 2e 0a 2a 2a 0a 2a 2a 20  rwise 0)..**.** 
1440: 20 20 20 20 20 20 2a 20 54 68 65 20 62 79 74 65        * The byte
1450: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
1460: 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  tart of the page
1470: 20 66 6f 6f 74 65 72 2e 20 49 66 20 74 68 65 20   footer. If the 
1480: 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  page.**         
1490: 66 6f 6f 74 65 72 20 69 73 20 30 20 62 79 74 65  footer is 0 byte
14a0: 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
14b0: 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 74 68  this field is th
14c0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
14d0: 20 20 20 20 20 20 20 20 20 73 69 7a 65 20 6f 66           size of
14e0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69   the leaf page i
14f0: 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  n bytes..**.**  
1500: 20 20 20 54 68 65 20 70 61 67 65 20 66 6f 6f 74     The page foot
1510: 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  er consists of a
1520: 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 66   single varint f
1530: 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6c 6f 63  or each term loc
1540: 61 74 65 64 0a 2a 2a 20 20 20 20 20 6f 6e 20 74  ated.**     on t
1550: 68 65 20 70 61 67 65 2e 20 45 61 63 68 20 76 61  he page. Each va
1560: 72 69 6e 74 20 69 73 20 74 68 65 20 62 79 74 65  rint is the byte
1570: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 63   offset of the c
1580: 75 72 72 65 6e 74 20 74 65 72 6d 0a 2a 2a 20 20  urrent term.**  
1590: 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 61     within the pa
15a0: 67 65 2c 20 64 65 6c 74 61 2d 63 6f 6d 70 72 65  ge, delta-compre
15b0: 73 73 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ssed against the
15c0: 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e   previous value.
15d0: 20 49 6e 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72   In.**     other
15e0: 20 77 6f 72 64 73 2c 20 74 68 65 20 66 69 72 73   words, the firs
15f0: 74 20 76 61 72 69 6e 74 20 69 6e 20 74 68 65 20  t varint in the 
1600: 66 6f 6f 74 65 72 20 69 73 20 74 68 65 20 62 79  footer is the by
1610: 74 65 20 6f 66 66 73 65 74 20 6f 66 0a 2a 2a 20  te offset of.** 
1620: 20 20 20 20 74 68 65 20 66 69 72 73 74 20 74 65      the first te
1630: 72 6d 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  rm, the second i
1640: 73 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  s the byte offse
1650: 74 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  t of the second 
1660: 6c 65 73 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  less that.**    
1670: 20 6f 66 20 74 68 65 20 66 69 72 73 74 2c 20 61   of the first, a
1680: 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nd so on..**.** 
1690: 20 20 20 20 54 68 65 20 74 65 72 6d 2f 64 6f 63      The term/doc
16a0: 6c 69 73 74 20 66 6f 72 6d 61 74 20 64 65 73 63  list format desc
16b0: 72 69 62 65 64 20 61 62 6f 76 65 20 69 73 20 61  ribed above is a
16c0: 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20 65  ccurate if the e
16d0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 74 65 72  ntire.**     ter
16e0: 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 20 66  m/doclist data f
16f0: 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  its on a single 
1700: 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74 68  leaf page. If th
1710: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
1720: 73 65 2c 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  se,.**     the f
1730: 6f 72 6d 61 74 20 69 73 20 63 68 61 6e 67 65 64  ormat is changed
1740: 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a   in two ways:.**
1750: 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20 74  .**       + if t
1760: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
1770: 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73 20  n a page occurs 
1780: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
1790: 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20 20   term, it.**    
17a0: 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20 61       is stored a
17b0: 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
17c0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
17d0: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66 69       varint:  fi
17e0: 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  rst rowid.**.** 
17f0: 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72 73        + the firs
1800: 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20 70  t term on each p
1810: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1820: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
1830: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
1840: 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d 20  very first term 
1850: 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a 0a  of the segment:.
1860: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1870: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
1880: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
18a0: 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d  b:    first term
18b0: 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 35 2e 20 53   data.**.** 5. S
18c0: 65 67 6d 65 6e 74 20 64 6f 63 6c 69 73 74 20 69  egment doclist i
18d0: 6e 64 65 78 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ndexes:.**.**   
18e0: 44 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 20  Doclist indexes 
18f0: 61 72 65 20 74 68 65 6d 73 65 6c 76 65 73 20 62  are themselves b
1900: 2d 74 72 65 65 73 2c 20 68 6f 77 65 76 65 72 20  -trees, however 
1910: 74 68 65 79 20 75 73 75 61 6c 6c 79 20 63 6f 6e  they usually con
1920: 73 69 73 74 20 6f 66 0a 2a 2a 20 20 20 61 20 73  sist of.**   a s
1930: 69 6e 67 6c 65 20 6c 65 61 66 20 72 65 63 6f 72  ingle leaf recor
1940: 64 20 6f 6e 6c 79 2e 20 54 68 65 20 66 6f 72 6d  d only. The form
1950: 61 74 20 6f 66 20 65 61 63 68 20 64 6f 63 6c 69  at of each docli
1960: 73 74 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  st index leaf pa
1970: 67 65 20 0a 2a 2a 20 20 20 69 73 3a 0a 2a 2a 0a  ge .**   is:.**.
1980: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1990: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
19a0: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
19b0: 43 6c 65 61 72 20 69 66 20 6c 65 61 66 20 69 73  Clear if leaf is
19c0: 20 61 6c 73 6f 20 74 68 65 20 72 6f 6f 74 20 70   also the root p
19d0: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
19e0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
19f0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1a00: 74 73 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  ts index leaf pa
1a10: 67 65 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e  ge. As a varint.
1a20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 69 72  .**.**     * Fir
1a30: 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65  st rowid on page
1a40: 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 70 72   indicated by pr
1a50: 65 76 69 6f 75 73 20 66 69 65 6c 64 2e 20 41 73  evious field. As
1a60: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
1a70: 20 20 20 20 20 2a 20 41 20 6c 69 73 74 20 6f 66       * A list of
1a80: 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65 20 66 6f   varints, one fo
1a90: 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  r each subsequen
1aa0: 74 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65 2e  t termless page.
1ab0: 20 41 20 0a 2a 2a 20 20 20 20 20 20 20 70 6f 73   A .**       pos
1ac0: 69 74 69 76 65 20 64 65 6c 74 61 20 69 66 20 74  itive delta if t
1ad0: 68 65 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65  he termless page
1ae0: 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
1af0: 73 74 20 6f 6e 65 20 72 6f 77 69 64 2c 20 0a 2a  st one rowid, .*
1b00: 2a 20 20 20 20 20 20 20 6f 72 20 61 6e 20 30 78  *       or an 0x
1b10: 30 30 20 62 79 74 65 20 6f 74 68 65 72 77 69 73  00 byte otherwis
1b20: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 74 65 72  e..**.**   Inter
1b30: 6e 61 6c 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  nal doclist inde
1b40: 78 20 6e 6f 64 65 73 20 61 72 65 3a 0a 2a 2a 0a  x nodes are:.**.
1b50: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1b60: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
1b70: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
1b80: 43 6c 65 61 72 20 66 6f 72 20 72 6f 6f 74 20 70  Clear for root p
1b90: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
1ba0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
1bb0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1bc0: 69 72 73 74 20 63 68 69 6c 64 20 70 61 67 65 2e  irst child page.
1bd0: 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   As a varint..**
1be0: 0a 2a 2a 20 20 20 20 20 2a 20 43 6f 70 79 20 6f  .**     * Copy o
1bf0: 66 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  f first rowid on
1c00: 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20   page indicated 
1c10: 62 79 20 70 72 65 76 69 6f 75 73 20 66 69 65 6c  by previous fiel
1c20: 64 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a  d. As a varint..
1c30: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 41 20 6c 69  **.**     * A li
1c40: 73 74 20 6f 66 20 64 65 6c 74 61 2d 65 6e 63 6f  st of delta-enco
1c50: 64 65 64 20 76 61 72 69 6e 74 73 20 2d 20 74 68  ded varints - th
1c60: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
1c70: 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
1c80: 0a 2a 2a 20 20 20 20 20 20 20 63 68 69 6c 64 20  .**       child 
1c90: 70 61 67 65 2e 20 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a  page. .**.*/../*
1ca0: 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72 20 74  .** Rowids for t
1cb0: 68 65 20 61 76 65 72 61 67 65 73 20 61 6e 64 20  he averages and 
1cc0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
1cd0: 73 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20  s in the %_data 
1ce0: 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  table..*/.#defin
1cf0: 65 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  e FTS5_AVERAGES_
1d00: 52 4f 57 49 44 20 20 20 20 20 31 20 20 20 20 2f  ROWID     1    /
1d10: 2a 20 52 6f 77 69 64 20 75 73 65 64 20 66 6f 72  * Rowid used for
1d20: 20 74 68 65 20 61 76 65 72 61 67 65 73 20 72 65   the averages re
1d30: 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  cord */.#define 
1d40: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
1d50: 4f 57 49 44 20 20 20 31 30 20 20 20 20 2f 2a 20  OWID   10    /* 
1d60: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  The structure re
1d70: 63 6f 72 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  cord */../*.** M
1d80: 61 63 72 6f 73 20 64 65 74 65 72 6d 69 6e 69 6e  acros determinin
1d90: 67 20 74 68 65 20 72 6f 77 69 64 73 20 75 73 65  g the rowids use
1da0: 64 20 62 79 20 73 65 67 6d 65 6e 74 20 6c 65 61  d by segment lea
1db0: 76 65 73 20 61 6e 64 20 64 6c 69 64 78 20 6c 65  ves and dlidx le
1dc0: 61 76 65 73 0a 2a 2a 20 61 6e 64 20 6e 6f 64 65  aves.** and node
1dd0: 73 2e 20 41 6c 6c 20 6e 6f 64 65 73 20 61 6e 64  s. All nodes and
1de0: 20 6c 65 61 76 65 73 20 61 72 65 20 73 74 6f 72   leaves are stor
1df0: 65 64 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61  ed in the %_data
1e00: 20 74 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67   table with larg
1e10: 65 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 72 6f  e.** positive ro
1e20: 77 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  wids..**.** Each
1e30: 20 73 65 67 6d 65 6e 74 20 68 61 73 20 61 20 75   segment has a u
1e40: 6e 69 71 75 65 20 6e 6f 6e 2d 7a 65 72 6f 20 31  nique non-zero 1
1e50: 36 2d 62 69 74 20 69 64 2e 0a 2a 2a 0a 2a 2a 20  6-bit id..**.** 
1e60: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 65 61  The rowid for ea
1e70: 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61 66 20  ch segment leaf 
1e80: 69 73 20 66 6f 75 6e 64 20 62 79 20 70 61 73 73  is found by pass
1e90: 69 6e 67 20 74 68 65 20 73 65 67 6d 65 6e 74 20  ing the segment 
1ea0: 69 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6c  id and .** the l
1eb0: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
1ec0: 74 6f 20 74 68 65 20 46 54 53 35 5f 53 45 47 4d  to the FTS5_SEGM
1ed0: 45 4e 54 5f 52 4f 57 49 44 20 6d 61 63 72 6f 2e  ENT_ROWID macro.
1ee0: 20 4c 65 61 76 65 73 20 61 72 65 20 6e 75 6d 62   Leaves are numb
1ef0: 65 72 65 64 0a 2a 2a 20 73 65 71 75 65 6e 74 69  ered.** sequenti
1f00: 61 6c 6c 79 20 73 74 61 72 74 69 6e 67 20 66 72  ally starting fr
1f10: 6f 6d 20 31 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  om 1..*/.#define
1f20: 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20   FTS5_DATA_ID_B 
1f30: 20 20 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61      16     /* Ma
1f40: 78 20 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20  x seg id number 
1f50: 36 35 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65  65535 */.#define
1f60: 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42   FTS5_DATA_DLI_B
1f70: 20 20 20 20 20 31 20 20 20 20 20 2f 2a 20 44 6f       1     /* Do
1f80: 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6c 61 67  clist-index flag
1f90: 20 28 31 20 62 69 74 29 20 2a 2f 0a 23 64 65 66   (1 bit) */.#def
1fa0: 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 48 45  ine FTS5_DATA_HE
1fb0: 49 47 48 54 5f 42 20 20 35 20 20 20 20 20 2f 2a  IGHT_B  5     /*
1fc0: 20 4d 61 78 20 64 6c 69 64 78 20 74 72 65 65 20   Max dlidx tree 
1fd0: 68 65 69 67 68 74 20 6f 66 20 33 32 20 2a 2f 0a  height of 32 */.
1fe0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
1ff0: 41 5f 50 41 47 45 5f 42 20 20 20 33 31 20 20 20  A_PAGE_B   31   
2000: 20 20 2f 2a 20 4d 61 78 20 70 61 67 65 20 6e 75    /* Max page nu
2010: 6d 62 65 72 20 6f 66 20 32 31 34 37 34 38 33 36  mber of 21474836
2020: 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 66  48 */..#define f
2030: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 64  ts5_dri(segid, d
2040: 6c 69 64 78 2c 20 68 65 69 67 68 74 2c 20 70 67  lidx, height, pg
2050: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34 29 28        \. ((i64)(
2080: 73 65 67 69 64 29 20 20 3c 3c 20 28 46 54 53 35  segid)  << (FTS5
2090: 5f 44 41 54 41 5f 50 41 47 45 5f 42 2b 46 54 53  _DATA_PAGE_B+FTS
20a0: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 2b  5_DATA_HEIGHT_B+
20b0: 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 29  FTS5_DATA_DLI_B)
20c0: 29 20 2b 20 20 20 20 5c 0a 20 28 28 69 36 34 29  ) +    \. ((i64)
20d0: 28 64 6c 69 64 78 29 20 20 3c 3c 20 28 46 54 53  (dlidx)  << (FTS
20e0: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 2b 20  5_DATA_PAGE_B + 
20f0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2100: 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  _B)) +          
2110: 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34          \. ((i64
2120: 29 28 68 65 69 67 68 74 29 20 3c 3c 20 28 46 54  )(height) << (FT
2130: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 29  S5_DATA_PAGE_B))
2140: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
2170: 34 29 28 70 67 6e 6f 29 29 20 20 20 20 20 20 20  4)(pgno))       
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 23            \.)..#
21c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
21d0: 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
21e0: 20 70 67 6e 6f 29 20 20 20 20 20 20 20 66 74 73   pgno)       fts
21f0: 35 5f 64 72 69 28 73 65 67 69 64 2c 20 30 2c 20  5_dri(segid, 0, 
2200: 30 2c 20 70 67 6e 6f 29 0a 23 64 65 66 69 6e 65  0, pgno).#define
2210: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
2220: 44 28 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c  D(segid, height,
2230: 20 70 67 6e 6f 29 20 66 74 73 35 5f 64 72 69 28   pgno) fts5_dri(
2240: 73 65 67 69 64 2c 20 31 2c 20 68 65 69 67 68 74  segid, 1, height
2250: 2c 20 70 67 6e 6f 29 0a 0a 2f 2a 0a 2a 2a 20 4d  , pgno)../*.** M
2260: 61 78 69 6d 75 6d 20 73 65 67 6d 65 6e 74 73 20  aximum segments 
2270: 70 65 72 6d 69 74 74 65 64 20 69 6e 20 61 20 73  permitted in a s
2280: 69 6e 67 6c 65 20 69 6e 64 65 78 20 0a 2a 2f 0a  ingle index .*/.
2290: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d 41 58  #define FTS5_MAX
22a0: 5f 53 45 47 4d 45 4e 54 20 32 30 30 30 0a 0a 23  _SEGMENT 2000..#
22b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22c0: 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  UG.int sqlite3Ft
22d0: 73 35 43 6f 72 72 75 70 74 28 29 20 7b 20 72 65  s5Corrupt() { re
22e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22f0: 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23 65 6e 64  UPT_VTAB; }.#end
2300: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  if.../*.** Each 
2310: 74 69 6d 65 20 61 20 62 6c 6f 62 20 69 73 20 72  time a blob is r
2320: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
2330: 61 74 61 20 74 61 62 6c 65 2c 20 69 74 20 69 73  ata table, it is
2340: 20 70 61 64 64 65 64 20 77 69 74 68 20 74 68 69   padded with thi
2350: 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65 72 6f 20 62  s.** many zero b
2360: 79 74 65 73 2e 20 54 68 69 73 20 6d 61 6b 65 73  ytes. This makes
2370: 20 69 74 20 65 61 73 69 65 72 20 74 6f 20 64 65   it easier to de
2380: 63 6f 64 65 20 74 68 65 20 76 61 72 69 6f 75 73  code the various
2390: 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 73 0a   record formats.
23a0: 2a 2a 20 77 69 74 68 6f 75 74 20 6f 76 65 72 72  ** without overr
23b0: 65 61 64 69 6e 67 20 69 66 20 74 68 65 20 72 65  eading if the re
23c0: 63 6f 72 64 73 20 61 72 65 20 63 6f 72 72 75 70  cords are corrup
23d0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  t..*/.#define FT
23e0: 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
23f0: 44 49 4e 47 20 38 0a 23 64 65 66 69 6e 65 20 46  DING 8.#define F
2400: 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
2410: 20 32 30 0a 0a 74 79 70 65 64 65 66 20 73 74 72   20..typedef str
2420: 75 63 74 20 46 74 73 35 44 61 74 61 20 46 74 73  uct Fts5Data Fts
2430: 35 44 61 74 61 3b 0a 74 79 70 65 64 65 66 20 73  5Data;.typedef s
2440: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
2450: 74 65 72 20 46 74 73 35 44 6c 69 64 78 49 74 65  ter Fts5DlidxIte
2460: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2470: 74 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 46  t Fts5DlidxLvl F
2480: 74 73 35 44 6c 69 64 78 4c 76 6c 3b 0a 74 79 70  ts5DlidxLvl;.typ
2490: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24a0: 44 6c 69 64 78 57 72 69 74 65 72 20 46 74 73 35  DlidxWriter Fts5
24b0: 44 6c 69 64 78 57 72 69 74 65 72 3b 0a 74 79 70  DlidxWriter;.typ
24c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24d0: 49 74 65 72 20 46 74 73 35 49 74 65 72 3b 0a 74  Iter Fts5Iter;.t
24e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
24f0: 73 35 50 61 67 65 57 72 69 74 65 72 20 46 74 73  s5PageWriter Fts
2500: 35 50 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70  5PageWriter;.typ
2510: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2520: 53 65 67 49 74 65 72 20 46 74 73 35 53 65 67 49  SegIter Fts5SegI
2530: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2540: 75 63 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49  uct Fts5DoclistI
2550: 74 65 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49  ter Fts5DoclistI
2560: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2570: 75 63 74 20 46 74 73 35 53 65 67 57 72 69 74 65  uct Fts5SegWrite
2580: 72 20 46 74 73 35 53 65 67 57 72 69 74 65 72 3b  r Fts5SegWriter;
2590: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
25a0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 46 74  Fts5Structure Ft
25b0: 73 35 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70  s5Structure;.typ
25c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
25d0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46  StructureLevel F
25e0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
25f0: 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  l;.typedef struc
2600: 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53  t Fts5StructureS
2610: 65 67 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63  egment Fts5Struc
2620: 74 75 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74  tureSegment;..st
2630: 72 75 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a  ruct Fts5Data {.
2640: 20 20 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20    u8 *p;        
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2670: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
2680: 67 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  g record */.  in
2690: 74 20 6e 6e 3b 20 20 20 20 20 20 20 20 20 20 20  t nn;           
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26b0: 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20   Size of record 
26c0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
26d0: 74 20 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20  t szLeaf;       
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26f0: 20 53 69 7a 65 20 6f 66 20 6c 65 61 66 20 77 69   Size of leaf wi
2700: 74 68 6f 75 74 20 70 61 67 65 2d 69 6e 64 65 78  thout page-index
2710: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e   */.};../*.** On
2720: 65 20 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64  e object per %_d
2730: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ata table..*/.st
2740: 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b  ruct Fts5Index {
2750: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
2760: 43 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20  Config;         
2770: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
2780: 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ble configuratio
2790: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61  n */.  char *zDa
27a0: 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20  taTbl;          
27b0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
27c0: 66 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  f %_data table *
27d0: 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69  /.  int nWorkUni
27e0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
27f0: 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65      /* Leaf page
2800: 73 20 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66  s in a "unit" of
2810: 20 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20   work */..  /*. 
2820: 20 2a 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65   ** Variables re
2830: 6c 61 74 65 64 20 74 6f 20 74 68 65 20 61 63 63  lated to the acc
2840: 75 6d 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b  umulation of tok
2850: 65 6e 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73  ens and doclists
2860: 20 77 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a   within the.  **
2870: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
2880: 74 61 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68  tables before th
2890: 65 79 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  ey are flushed t
28a0: 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46  o disk..  */.  F
28b0: 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20  ts5Hash *pHash; 
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28d0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
28e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20   in-memory data 
28f0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e  */.  int nPendin
2900: 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  gData;          
2910: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2920: 62 79 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67  bytes of pending
2930: 20 64 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69   data */.  i64 i
2940: 57 72 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20  WriteRowid;     
2950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2960: 77 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20  wid for current 
2970: 64 6f 63 20 62 65 69 6e 67 20 77 72 69 74 74 65  doc being writte
2980: 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 65  n */.  int bDele
2990: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
29a0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
29b0: 74 20 77 72 69 74 65 20 69 73 20 61 20 64 65 6c  t write is a del
29c0: 65 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72  ete */..  /* Err
29d0: 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
29e0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a00: 2a 20 43 75 72 72 65 6e 74 20 65 72 72 6f 72 20  * Current error 
2a10: 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74  code */..  /* St
2a20: 61 74 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ate used by the 
2a30: 66 74 73 35 44 61 74 61 58 58 58 28 29 20 66 75  fts5DataXXX() fu
2a40: 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71  nctions. */.  sq
2a50: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61  lite3_blob *pRea
2a60: 64 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  der;          /*
2a70: 20 52 4f 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70   RO incr-blob op
2a80: 65 6e 20 6f 6e 20 25 5f 64 61 74 61 20 74 61 62  en on %_data tab
2a90: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
2aa0: 73 74 6d 74 20 2a 70 57 72 69 74 65 72 3b 20 20  stmt *pWriter;  
2ab0: 20 20 20 20 20 20 20 20 2f 2a 20 22 49 4e 53 45          /* "INSE
2ac0: 52 54 20 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41  RT ... %_data VA
2ad0: 4c 55 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20  LUES(?,?)" */.  
2ae0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44  sqlite3_stmt *pD
2af0: 65 6c 65 74 65 72 3b 20 20 20 20 20 20 20 20 20  eleter;         
2b00: 2f 2a 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  /* "DELETE FROM 
2b10: 25 5f 64 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f  %_data ... id>=?
2b20: 20 41 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20   AND id<=?" */. 
2b30: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2b40: 49 64 78 57 72 69 74 65 72 3b 20 20 20 20 20 20  IdxWriter;      
2b50: 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20   /* "INSERT ... 
2b60: 25 5f 69 64 78 20 56 41 4c 55 45 53 28 3f 2c 3f  %_idx VALUES(?,?
2b70: 2c 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69  ,?,?)" */.  sqli
2b80: 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 44 65  te3_stmt *pIdxDe
2b90: 6c 65 74 65 72 3b 20 20 20 20 20 20 2f 2a 20 22  leter;      /* "
2ba0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 69 64  DELETE FROM %_id
2bb0: 78 20 57 48 45 52 45 20 73 65 67 69 64 3d 3f 20  x WHERE segid=? 
2bc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
2bd0: 74 20 2a 70 49 64 78 53 65 6c 65 63 74 3b 0a 20  t *pIdxSelect;. 
2be0: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2c10: 20 6f 66 20 62 6c 6f 63 6b 73 20 72 65 61 64 20   of blocks read 
2c20: 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  */..  sqlite3_st
2c30: 6d 74 20 2a 70 44 61 74 61 56 65 72 73 69 6f 6e  mt *pDataVersion
2c40: 3b 0a 20 20 69 36 34 20 69 53 74 72 75 63 74 56  ;.  i64 iStructV
2c50: 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ersion;         
2c60: 20 20 20 20 2f 2a 20 64 61 74 61 5f 76 65 72 73      /* data_vers
2c70: 69 6f 6e 20 77 68 65 6e 20 70 53 74 72 75 63 74  ion when pStruct
2c80: 20 72 65 61 64 20 2a 2f 0a 20 20 46 74 73 35 53   read */.  Fts5S
2c90: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
2ca0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  t;         /* Cu
2cb0: 72 72 65 6e 74 20 64 62 20 73 74 72 75 63 74 75  rrent db structu
2cc0: 72 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  re (or NULL) */.
2cd0: 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44  };..struct Fts5D
2ce0: 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20 75  oclistIter {.  u
2cf0: 38 20 2a 61 45 6f 66 3b 20 20 20 20 20 20 20 20  8 *aEof;        
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d10: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62  * Pointer to 1 b
2d20: 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20  yte past end of 
2d30: 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f 2a  doclist */..  /*
2d40: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
2d50: 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20 61  s. aPoslist==0 a
2d60: 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69  t EOF */.  i64 i
2d70: 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50 6f  Rowid;.  u8 *aPo
2d80: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50 6f  slist;.  int nPo
2d90: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 53 69  slist;.  int nSi
2da0: 7a 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  ze;.};../*.** Th
2db0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2dc0: 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65  e "structure" re
2dd0: 63 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e  cord for each in
2de0: 64 65 78 20 61 72 65 20 72 65 70 72 65 73 65 6e  dex are represen
2df0: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20  ted.** using an 
2e00: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 72 65  Fts5Structure re
2e10: 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  cord in memory. 
2e20: 57 68 69 63 68 20 75 73 65 73 20 69 6e 73 74 61  Which uses insta
2e30: 6e 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  nces of the .** 
2e40: 6f 74 68 65 72 20 46 74 73 35 53 74 72 75 63 74  other Fts5Struct
2e50: 75 72 65 58 58 58 20 74 79 70 65 73 20 61 73 20  ureXXX types as 
2e60: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73  components..*/.s
2e70: 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74  truct Fts5Struct
2e80: 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69  ureSegment {.  i
2e90: 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20  nt iSegid;      
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2eb0: 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a  * Segment id */.
2ec0: 20 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b    int pgnoFirst;
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20    /* First leaf 
2ef0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73  page number in s
2f00: 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
2f10: 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20 20  pgnoLast;       
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2f30: 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ast leaf page nu
2f40: 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20  mber in segment 
2f50: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
2f60: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
2f70: 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20  {.  int nMerge; 
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2fa0: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63   segments in inc
2fb0: 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74  r-merge */.  int
2fc0: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fe0: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2ff0: 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65  segments on leve
3000: 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  l */.  Fts5Struc
3010: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53 65  tureSegment *aSe
3020: 67 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  g;     /* Array 
3030: 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53 65  of segments. aSe
3040: 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20  g[0] is oldest. 
3050: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
3060: 35 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20 69  5Structure {.  i
3070: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3090: 2a 20 4f 62 6a 65 63 74 20 72 65 66 65 72 65 6e  * Object referen
30a0: 63 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75 36  ce count */.  u6
30b0: 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b  4 nWriteCounter;
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30d0: 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77 72   Total leaves wr
30e0: 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30  itten to level 0
30f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65   */.  int nSegme
3100: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
3110: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
3120: 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20  egments in this 
3130: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
3140: 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20  nt nLevel;      
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3160: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  * Number of leve
3170: 6c 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78  ls in this index
3180: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
3190: 75 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c 5b  ureLevel aLevel[
31a0: 31 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  1];   /* Array o
31b0: 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20 6f  f nLevel level o
31c0: 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  bjects */.};../*
31d0: 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66  .** An object of
31e0: 20 74 79 70 65 20 46 74 73 35 53 65 67 57 72 69   type Fts5SegWri
31f0: 74 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 77  ter is used to w
3200: 72 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74 73  rite to segments
3210: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
3220: 50 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20 69  PageWriter {.  i
3230: 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  nt pgno;        
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3250: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
3260: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
3270: 20 69 6e 74 20 69 50 72 65 76 50 67 69 64 78 3b   int iPrevPgidx;
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c   /* Previous val
32a0: 75 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ue written into 
32b0: 70 67 69 64 78 20 2a 2f 0a 20 20 46 74 73 35 42  pgidx */.  Fts5B
32c0: 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20  uffer buf;      
32d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
32e0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
32f0: 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 46  leaf data */.  F
3300: 74 73 35 42 75 66 66 65 72 20 70 67 69 64 78 3b  ts5Buffer pgidx;
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3320: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
3330: 69 6e 67 20 70 61 67 65 2d 69 6e 64 65 78 20 2a  ing page-index *
3340: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
3350: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
3360: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
3370: 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75  ntaining previou
3380: 73 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a  s term on page *
3390: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
33a0: 44 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20 20  DlidxWriter {.  
33b0: 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  int pgno;       
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
33e0: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
33f0: 20 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69 64    int bPrevValid
3400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3410: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50 72    /* True if iPr
3420: 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  ev is valid */. 
3430: 20 69 36 34 20 69 50 72 65 76 3b 20 20 20 20 20   i64 iPrev;     
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77   /* Previous row
3460: 69 64 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e  id value written
3470: 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46 74   to page */.  Ft
3480: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34a0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
34b0: 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ng page data */.
34c0: 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 65  };.struct Fts5Se
34d0: 67 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20  gWriter {.  int 
34e0: 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20 20  iSegid;         
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
3500: 65 67 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f  egid to write to
3510: 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72   */.  Fts5PageWr
3520: 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20  iter writer;    
3530: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 57 72 69        /* PageWri
3540: 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
3550: 69 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b 20  i64 iPrevRowid; 
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69  /* Previous rowi
3580: 64 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75 72  d written to cur
3590: 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75  rent leaf */.  u
35a0: 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  8 bFirstRowidInD
35b0: 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 2f  oclist;        /
35c0: 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72  * True if next r
35d0: 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e  owid is first in
35e0: 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38   doclist */.  u8
35f0: 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61   bFirstRowidInPa
3600: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
3610: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f   True if next ro
3620: 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20  wid is first in 
3630: 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20 54 4f 44  page */.  /* TOD
3640: 4f 31 3a 20 43 61 6e 20 75 73 65 20 28 77 72 69  O1: Can use (wri
3650: 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 29 20  ter.pgidx.n==0) 
3660: 69 6e 73 74 65 61 64 20 6f 66 20 62 46 69 72 73  instead of bFirs
3670: 74 54 65 72 6d 49 6e 50 61 67 65 20 2a 2f 0a 20  tTermInPage */. 
3680: 20 75 38 20 62 46 69 72 73 74 54 65 72 6d 49 6e   u8 bFirstTermIn
3690: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
36a0: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74   /* True if next
36b0: 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 66 69   term will be fi
36c0: 72 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f 0a 20  rst in leaf */. 
36d0: 20 69 6e 74 20 6e 4c 65 61 66 57 72 69 74 74 65   int nLeafWritte
36e0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
36f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
3700: 61 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  af pages written
3710: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79   */.  int nEmpty
3720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3730: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3740: 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 74 65  of contiguous te
3750: 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a 2f  rm-less nodes */
3760: 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78 3b 20  ..  int nDlidx; 
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3780: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
3790: 20 73 69 7a 65 20 6f 66 20 61 44 6c 69 64 78 5b   size of aDlidx[
37a0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73  ] array */.  Fts
37b0: 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44  5DlidxWriter *aD
37c0: 6c 69 64 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  lidx;        /* 
37d0: 41 72 72 61 79 20 6f 66 20 46 74 73 35 44 6c 69  Array of Fts5Dli
37e0: 64 78 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73  dxWriter objects
37f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c 75 65 73   */..  /* Values
3800: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
3810: 74 68 65 20 25 5f 69 64 78 20 74 61 62 6c 65 20  the %_idx table 
3820: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
3830: 62 74 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  btterm;         
3840: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 65 72       /* Next ter
3850: 6d 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  m to insert into
3860: 20 25 5f 69 64 78 20 74 61 62 6c 65 20 2a 2f 0a   %_idx table */.
3870: 20 20 69 6e 74 20 69 42 74 50 61 67 65 3b 20 20    int iBtPage;  
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
38a0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
38b0: 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d 3b 0a 0a  o btterm */.};..
38c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
38d0: 74 73 35 43 52 65 73 75 6c 74 20 46 74 73 35 43  ts5CResult Fts5C
38e0: 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20 46  Result;.struct F
38f0: 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20 75  ts5CResult {.  u
3900: 31 36 20 69 46 69 72 73 74 3b 20 20 20 20 20 20  16 iFirst;      
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3920: 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20 6f  * aSeg[] index o
3930: 66 20 66 69 72 73 74 65 73 74 20 69 74 65 72 61  f firstest itera
3940: 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65 72  tor */.  u8 bTer
3950: 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  mEq;            
3960: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3970: 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 61 72   if the terms ar
3980: 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  e equal */.};../
3990: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20  *.** Object for 
39a0: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
39b0: 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65  h a single segme
39c0: 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63  nt, visiting eac
39d0: 68 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a 20  h term/rowid.** 
39e0: 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d  pair in the segm
39f0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a  ent..**.** pSeg:
3a00: 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e  .**   The segmen
3a10: 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  t to iterate thr
3a20: 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ough..**.** iLea
3a30: 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72  fPgno:.**   Curr
3a40: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ent leaf page nu
3a50: 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d  mber within segm
3a60: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66  ent..**.** iLeaf
3a70: 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74  Offset:.**   Byt
3a80: 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  e offset within 
3a90: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
3aa0: 20 74 68 61 74 20 69 73 20 74 68 65 20 66 69 72   that is the fir
3ab0: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a  st byte of the .
3ac0: 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69  **   position li
3ad0: 73 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79 74  st data (one byt
3ae0: 65 20 70 61 73 73 65 64 20 74 68 65 20 70 6f 73  e passed the pos
3af0: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
3b00: 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f 77  field)..**   row
3b10: 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  id field of the 
3b20: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55  current entry. U
3b30: 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74  sually this is t
3b40: 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  he size field of
3b50: 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69   the.**   positi
3b60: 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68  on list data. Th
3b70: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69  e exception is i
3b80: 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20  f the rowid for 
3b90: 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
3ba0: 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c  y .**   is the l
3bb0: 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65  ast thing on the
3bc0: 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a   leaf page..**.*
3bd0: 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75  * pLeaf:.**   Bu
3be0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
3bf0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
3c00: 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e  e data. Set to N
3c10: 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a  ULL at EOF..**.*
3c20: 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c  * iTermLeafPgno,
3c30: 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74   iTermLeafOffset
3c40: 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65  :.**   Leaf page
3c50: 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69   number containi
3c60: 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d  ng the last term
3c70: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
3c80: 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20  egment. And.**  
3c90: 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65   the offset imme
3ca0: 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
3cb0: 67 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e  g the term data.
3cc0: 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a  .**.** flags:.**
3cd0: 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f     Mask of FTS5_
3ce0: 53 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75  SEGITER_XXX valu
3cf0: 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20  es. Interpreted 
3d00: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
3d10: 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52  *   FTS5_SEGITER
3d20: 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20  _ONETERM:.**    
3d30: 20 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65   If set, set the
3d40: 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69   iterator to poi
3d50: 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20  nt to EOF after 
3d60: 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
3d70: 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20  ist .**     has 
3d80: 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20  been exhausted. 
3d90: 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74  Do not proceed t
3da0: 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20  o the next term 
3db0: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a  in the segment..
3dc0: 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47  **.**   FTS5_SEG
3dd0: 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a  ITER_REVERSE:.**
3de0: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69       This flag i
3df0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20  s only ever set 
3e00: 69 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  if FTS5_SEGITER_
3e10: 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20  ONETERM is also 
3e20: 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69  set. If.**     i
3e30: 74 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74  t is set, iterat
3e40: 65 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64 20  e through rowid 
3e50: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72  in descending or
3e60: 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74  der instead of t
3e70: 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c  he.**     defaul
3e80: 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  t ascending orde
3e90: 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f  r..**.** iRowidO
3ea0: 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73  ffset/nRowidOffs
3eb0: 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a  et/aRowidOffset:
3ec0: 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72  .**     These ar
3ed0: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54  e used if the FT
3ee0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
3ef0: 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
3f00: 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65 61  **.**     For ea
3f10: 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  ch rowid on the 
3f20: 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  page correspondi
3f30: 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
3f40: 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20 20  t term, the.**  
3f50: 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67     corresponding
3f60: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
3f70: 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f 20  entry is set to 
3f80: 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20  the byte offset 
3f90: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73 74  of the.**     st
3fa0: 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73 69  art of the "posi
3fb0: 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22 20  tion-list-size" 
3fc0: 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65  field within the
3fd0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 69 54 65   page..**.** iTe
3fe0: 72 6d 49 64 78 3a 0a 2a 2a 20 20 20 20 20 49 6e  rmIdx:.**     In
3ff0: 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 74  dex of current t
4000: 65 72 6d 20 6f 6e 20 69 54 65 72 6d 4c 65 61 66  erm on iTermLeaf
4010: 50 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  Pgno..*/.struct 
4020: 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20 20  Fts5SegIter {.  
4030: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
4040: 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20  ment *pSeg;     
4050: 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69 74  /* Segment to it
4060: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f  erate through */
4070: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20  .  int flags;   
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f     /* Mask of co
40a0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61 67  nfiguration flag
40b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  s */.  int iLeaf
40c0: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
40d0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
40e0: 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
40f0: 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  er */.  Fts5Data
4100: 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20   *pLeaf;        
4110: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4120: 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  nt leaf data */.
4130: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 78    Fts5Data *pNex
4140: 74 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  tLeaf;          
4150: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 28    /* Leaf page (
4160: 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f 0a  iLeafPgno+1) */.
4170: 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73 65    int iLeafOffse
4180: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4190: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
41a0: 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20   within current 
41b0: 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 4e 65  leaf */..  /* Ne
41c0: 78 74 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 76  xt method */.  v
41d0: 6f 69 64 20 28 2a 78 4e 65 78 74 29 28 46 74 73  oid (*xNext)(Fts
41e0: 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67  5Index*, Fts5Seg
41f0: 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 20  Iter*, int*);.. 
4200: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 61 6e 64   /* The page and
4210: 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 77 68 69   offset from whi
4220: 63 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ch the current t
4230: 65 72 6d 20 77 61 73 20 72 65 61 64 2e 20 54 68  erm was read. Th
4240: 65 20 6f 66 66 73 65 74 20 0a 20 20 2a 2a 20 69  e offset .  ** i
4250: 73 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  s the offset of 
4260: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
4270: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  in the current d
4280: 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 69 6e  oclist.  */.  in
4290: 74 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b  t iTermLeafPgno;
42a0: 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c 65 61 66  .  int iTermLeaf
42b0: 4f 66 66 73 65 74 3b 0a 0a 20 20 69 6e 74 20 69  Offset;..  int i
42c0: 50 67 69 64 78 4f 66 66 3b 20 20 20 20 20 20 20  PgidxOff;       
42d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
42e0: 78 74 20 6f 66 66 73 65 74 20 69 6e 20 70 67 69  xt offset in pgi
42f0: 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  dx */.  int iEnd
4300: 6f 66 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f 2a  ofDoclist;..  /*
4310: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
4320: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20  re only used if 
4330: 74 68 65 20 46 54 53 35 5f 53 45 47 49 54 45 52  the FTS5_SEGITER
4340: 5f 52 45 56 45 52 53 45 20 66 6c 61 67 20 69 73  _REVERSE flag is
4350: 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   set. */.  int i
4360: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4380: 72 72 65 6e 74 20 65 6e 74 72 79 20 69 6e 20 61  rrent entry in a
4390: 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 2a 2f  RowidOffset[] */
43a0: 0a 20 20 69 6e 74 20 6e 52 6f 77 69 64 4f 66 66  .  int nRowidOff
43b0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
43c0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
43d0: 73 69 7a 65 20 6f 66 20 61 52 6f 77 69 64 4f 66  size of aRowidOf
43e0: 66 73 65 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  fset[] array */.
43f0: 20 20 69 6e 74 20 2a 61 52 6f 77 69 64 4f 66 66    int *aRowidOff
4400: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
4410: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 66    /* Array of of
4420: 66 73 65 74 20 74 6f 20 72 6f 77 69 64 20 66 69  fset to rowid fi
4430: 65 6c 64 73 20 2a 2f 0a 0a 20 20 46 74 73 35 44  elds */..  Fts5D
4440: 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
4450: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;          /* If
4460: 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c   there is a docl
4470: 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20 20  ist-index */..  
4480: 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 70 6f 70  /* Variables pop
4490: 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20  ulated based on 
44a0: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 2a  current entry. *
44b0: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
44c0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
44d0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74      /* Current t
44e0: 65 72 6d 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  erm */.  i64 iRo
44f0: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
4500: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4510: 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69  ent rowid */.  i
4520: 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20 20  nt nPos;        
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4540: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
4550: 73 20 69 6e 20 63 75 72 72 65 6e 74 20 70 6f 73  s in current pos
4560: 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20  ition list */.  
4570: 75 38 20 62 44 65 6c 3b 20 20 20 20 20 20 20 20  u8 bDel;        
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4590: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 64  /* True if the d
45a0: 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73 65  elete flag is se
45b0: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
45c0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
45d0: 6e 74 65 72 20 74 6f 20 61 6e 20 46 74 73 35 44  nter to an Fts5D
45e0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 74 68  ata structure th
45f0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 0a 2a  at contains a .*
4600: 2a 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2f 0a  * leaf page..*/.
4610: 23 64 65 66 69 6e 65 20 41 53 53 45 52 54 5f 53  #define ASSERT_S
4620: 5a 4c 45 41 46 5f 4f 4b 28 78 29 20 61 73 73 65  ZLEAF_OK(x) asse
4630: 72 74 28 20 5c 0a 20 20 20 20 28 78 29 2d 3e 73  rt( \.    (x)->s
4640: 7a 4c 65 61 66 3d 3d 28 78 29 2d 3e 6e 6e 20 7c  zLeaf==(x)->nn |
4650: 7c 20 28 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d 66  | (x)->szLeaf==f
4660: 74 73 35 47 65 74 55 31 36 28 26 28 78 29 2d 3e  ts5GetU16(&(x)->
4670: 70 5b 32 5d 29 20 5c 0a 29 0a 0a 23 64 65 66 69  p[2]) \.)..#defi
4680: 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  ne FTS5_SEGITER_
4690: 4f 4e 45 54 45 52 4d 20 30 78 30 31 0a 23 64 65  ONETERM 0x01.#de
46a0: 66 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45  fine FTS5_SEGITE
46b0: 52 5f 52 45 56 45 52 53 45 20 30 78 30 32 0a 0a  R_REVERSE 0x02..
46c0: 2f 2a 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  /* .** Argument 
46d0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
46e0: 61 6e 20 46 74 73 35 44 61 74 61 20 73 74 72 75  an Fts5Data stru
46f0: 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
4700: 69 6e 73 20 61 20 6c 65 61 66 0a 2a 2a 20 70 61  ins a leaf.** pa
4710: 67 65 2e 20 54 68 69 73 20 6d 61 63 72 6f 20 65  ge. This macro e
4720: 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75 65  valuates to true
4730: 20 69 66 20 74 68 65 20 6c 65 61 66 20 63 6f 6e   if the leaf con
4740: 74 61 69 6e 73 20 6e 6f 20 74 65 72 6d 73 2c 20  tains no terms, 
4750: 6f 72 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  or.** false if i
4760: 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  t contains at le
4770: 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 0a 2a 2f  ast one term..*/
4780: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c 65 61  .#define fts5Lea
4790: 66 49 73 54 65 72 6d 6c 65 73 73 28 78 29 20 28  fIsTermless(x) (
47a0: 28 78 29 2d 3e 73 7a 4c 65 61 66 20 3e 3d 20 28  (x)->szLeaf >= (
47b0: 78 29 2d 3e 6e 6e 29 0a 0a 23 64 65 66 69 6e 65  x)->nn)..#define
47c0: 20 66 74 73 35 4c 65 61 66 54 65 72 6d 4f 66 66   fts5LeafTermOff
47d0: 28 78 2c 20 69 29 20 28 66 74 73 35 47 65 74 55  (x, i) (fts5GetU
47e0: 31 36 28 26 28 78 29 2d 3e 70 5b 28 78 29 2d 3e  16(&(x)->p[(x)->
47f0: 73 7a 4c 65 61 66 20 2b 20 28 69 29 2a 32 5d 29  szLeaf + (i)*2])
4800: 29 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c  )..#define fts5L
4810: 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
4820: 28 78 29 20 28 66 74 73 35 47 65 74 55 31 36 28  (x) (fts5GetU16(
4830: 28 78 29 2d 3e 70 29 29 0a 0a 2f 2a 0a 2a 2a 20  (x)->p))../*.** 
4840: 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72 61  Object for itera
4850: 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65  ting through the
4860: 20 6d 65 72 67 65 64 20 72 65 73 75 6c 74 73 20   merged results 
4870: 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  of one or more s
4880: 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20 76 69 73 69  egments,.** visi
4890: 74 69 6e 67 20 65 61 63 68 20 74 65 72 6d 2f 72  ting each term/r
48a0: 6f 77 69 64 20 70 61 69 72 20 69 6e 20 74 68 65  owid pair in the
48b0: 20 6d 65 72 67 65 64 20 64 61 74 61 2e 0a 2a 2a   merged data..**
48c0: 0a 2a 2a 20 6e 53 65 67 20 69 73 20 61 6c 77 61  .** nSeg is alwa
48d0: 79 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  ys a power of tw
48e0: 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  o greater than o
48f0: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e  r equal to the n
4900: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 65 67 6d  umber of.** segm
4910: 65 6e 74 73 20 74 68 61 74 20 74 68 69 73 20 6f  ents that this o
4920: 62 6a 65 63 74 20 69 73 20 6d 65 72 67 69 6e 67  bject is merging
4930: 20 64 61 74 61 20 66 72 6f 6d 2e 20 42 6f 74 68   data from. Both
4940: 20 74 68 65 20 61 53 65 67 5b 5d 20 61 6e 64 0a   the aSeg[] and.
4950: 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  ** aFirst[] arra
4960: 79 73 20 61 72 65 20 73 69 7a 65 64 20 61 74 20  ys are sized at 
4970: 6e 53 65 67 20 65 6e 74 72 69 65 73 2e 20 54 68  nSeg entries. Th
4980: 65 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20 69  e aSeg[] array i
4990: 73 20 70 61 64 64 65 64 0a 2a 2a 20 77 69 74 68  s padded.** with
49a0: 20 7a 65 72 6f 65 64 20 6f 62 6a 65 63 74 73 20   zeroed objects 
49b0: 2d 20 74 68 65 73 65 20 61 72 65 20 68 61 6e 64  - these are hand
49c0: 6c 65 64 20 61 73 20 69 66 20 74 68 65 79 20 77  led as if they w
49d0: 65 72 65 20 69 74 65 72 61 74 6f 72 73 20 6f 70  ere iterators op
49e0: 65 6e 65 64 0a 2a 2a 20 6f 6e 20 65 6d 70 74 79  ened.** on empty
49f0: 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a   segments..**.**
4a00: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
4a10: 63 6f 6d 70 61 72 69 6e 67 20 73 65 67 6d 65 6e  comparing segmen
4a20: 74 73 20 61 53 65 67 5b 4e 5d 20 61 6e 64 20 61  ts aSeg[N] and a
4a30: 53 65 67 5b 4e 2b 31 5d 2c 20 77 68 65 72 65 20  Seg[N+1], where 
4a40: 4e 20 69 73 20 61 6e 0a 2a 2a 20 65 76 65 6e 20  N is an.** even 
4a50: 6e 75 6d 62 65 72 2c 20 69 73 20 73 74 6f 72 65  number, is store
4a60: 64 20 69 6e 20 61 46 69 72 73 74 5b 28 6e 53 65  d in aFirst[(nSe
4a70: 67 2b 4e 29 2f 32 5d 2e 20 54 68 65 20 22 72 65  g+N)/2]. The "re
4a80: 73 75 6c 74 22 20 6f 66 20 74 68 65 20 0a 2a 2a  sult" of the .**
4a90: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 74   comparison in t
4aa0: 68 69 73 20 63 6f 6e 74 65 78 74 20 69 73 20 74  his context is t
4ab0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
4ac0: 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 63 75  iterator that cu
4ad0: 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
4ae0: 73 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 72  s to the smaller
4af0: 20 74 65 72 6d 2f 72 6f 77 69 64 20 63 6f 6d 62   term/rowid comb
4b00: 69 6e 61 74 69 6f 6e 2e 20 49 74 65 72 61 74 6f  ination. Iterato
4b10: 72 73 20 61 74 20 45 4f 46 20 61 72 65 0a 2a 2a  rs at EOF are.**
4b20: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
4b30: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  e greater than a
4b40: 6c 6c 20 6f 74 68 65 72 20 69 74 65 72 61 74 6f  ll other iterato
4b50: 72 73 2e 0a 2a 2a 0a 2a 2a 20 61 46 69 72 73 74  rs..**.** aFirst
4b60: 5b 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  [1] contains the
4b70: 20 69 6e 64 65 78 20 69 6e 20 61 53 65 67 5b 5d   index in aSeg[]
4b80: 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   of the iterator
4b90: 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 0a   that points to.
4ba0: 2a 2a 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  ** the smallest 
4bb0: 6b 65 79 20 6f 76 65 72 61 6c 6c 2e 20 61 46 69  key overall. aFi
4bc0: 72 73 74 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  rst[0] is unused
4bd0: 2e 20 0a 2a 2a 0a 2a 2a 20 70 6f 73 6c 69 73 74  . .**.** poslist
4be0: 3a 0a 2a 2a 20 20 20 55 73 65 64 20 62 79 20 73  :.**   Used by s
4bf0: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f  qlite3Fts5IterPo
4c00: 73 6c 69 73 74 28 29 20 77 68 65 6e 20 74 68 65  slist() when the
4c10: 20 70 6f 73 6c 69 73 74 20 6e 65 65 64 73 20 74   poslist needs t
4c20: 6f 20 62 65 20 62 75 66 66 65 72 65 64 2e 0a 2a  o be buffered..*
4c30: 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  *   There is no 
4c40: 77 61 79 20 74 6f 20 74 65 6c 6c 20 69 66 20 74  way to tell if t
4c50: 68 69 73 20 69 73 20 70 6f 70 75 6c 61 74 65 64  his is populated
4c60: 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 72 75   or not..*/.stru
4c70: 63 74 20 46 74 73 35 49 74 65 72 20 7b 0a 20 20  ct Fts5Iter {.  
4c80: 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 62 61  Fts5IndexIter ba
4c90: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
4ca0: 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20 63 6f  /* Base class co
4cb0: 6e 74 61 69 6e 69 6e 67 20 6f 75 74 70 75 74 20  ntaining output 
4cc0: 76 61 72 73 20 2a 2f 0a 0a 20 20 46 74 73 35 49  vars */..  Fts5I
4cd0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
4ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
4cf0: 64 65 78 20 74 68 61 74 20 6f 77 6e 73 20 74 68  dex that owns th
4d00: 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  is iterator */. 
4d10: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
4d20: 70 53 74 72 75 63 74 3b 20 20 20 20 20 20 20 20  pStruct;        
4d30: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 74 72   /* Database str
4d40: 75 63 74 75 72 65 20 66 6f 72 20 74 68 69 73 20  ucture for this 
4d50: 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 46 74  iterator */.  Ft
4d60: 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69 73 74  s5Buffer poslist
4d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4d80: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
4d90: 6e 67 20 63 75 72 72 65 6e 74 20 70 6f 73 6c 69  ng current posli
4da0: 73 74 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73  st */.  Fts5Cols
4db0: 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20  et *pColset;    
4dc0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
4dd0: 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74  ict matches to t
4de0: 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  hese columns */.
4df0: 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 64 20 74 6f  .  /* Invoked to
4e00: 20 73 65 74 20 6f 75 74 70 75 74 20 76 61 72 69   set output vari
4e10: 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 76 6f 69 64  ables. */.  void
4e20: 20 28 2a 78 53 65 74 4f 75 74 70 75 74 73 29 28   (*xSetOutputs)(
4e30: 46 74 73 35 49 74 65 72 2a 2c 20 46 74 73 35 53  Fts5Iter*, Fts5S
4e40: 65 67 49 74 65 72 2a 29 3b 0a 0a 20 20 69 6e 74  egIter*);..  int
4e50: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e70: 53 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d 20 61  Size of aSeg[] a
4e80: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  rray */.  int bR
4e90: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
4ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4eb0: 65 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e 20  e to iterate in 
4ec0: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
4ed0: 0a 20 20 75 38 20 62 53 6b 69 70 45 6d 70 74 79  .  u8 bSkipEmpty
4ee0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4ef0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 6b     /* True to sk
4f00: 69 70 20 64 65 6c 65 74 65 64 20 65 6e 74 72 69  ip deleted entri
4f10: 65 73 20 2a 2f 0a 0a 20 20 69 36 34 20 69 53 77  es */..  i64 iSw
4f20: 69 74 63 68 52 6f 77 69 64 3b 20 20 20 20 20 20  itchRowid;      
4f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
4f40: 74 65 73 74 20 72 6f 77 69 64 20 6f 66 20 6f 74  test rowid of ot
4f50: 68 65 72 20 74 68 61 6e 20 61 46 69 72 73 74 5b  her than aFirst[
4f60: 31 5d 20 2a 2f 0a 20 20 46 74 73 35 43 52 65 73  1] */.  Fts5CRes
4f70: 75 6c 74 20 2a 61 46 69 72 73 74 3b 20 20 20 20  ult *aFirst;    
4f80: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4f90: 6e 74 20 6d 65 72 67 65 20 73 74 61 74 65 20 28  nt merge state (
4fa0: 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a 20 20  see above) */.  
4fb0: 46 74 73 35 53 65 67 49 74 65 72 20 61 53 65 67  Fts5SegIter aSeg
4fc0: 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [1];            
4fd0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65 67 6d  /* Array of segm
4fe0: 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 2a 2f  ent iterators */
4ff0: 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  .};.../*.** An i
5000: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
5010: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69 73  ollowing type is
5020: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
5030: 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e   through the con
5040: 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20 64 6f  tents.** of a do
5050: 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f  clist-index reco
5060: 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74 61 3a  rd..**.** pData:
5070: 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20 63 6f 6e  .**   Record con
5080: 74 61 69 6e 69 6e 67 20 74 68 65 20 64 6f 63 6c  taining the docl
5090: 69 73 74 2d 69 6e 64 65 78 20 64 61 74 61 2e 0a  ist-index data..
50a0: 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a 20 20  **.** bEof:.**  
50b0: 20 53 65 74 20 74 6f 20 74 72 75 65 20 6f 6e 63   Set to true onc
50c0: 65 20 69 74 65 72 61 74 6f 72 20 68 61 73 20 72  e iterator has r
50d0: 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a 0a 2a  eached EOF..**.*
50e0: 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53 65 74  * iOff:.**   Set
50f0: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
5100: 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 72 65  offset within re
5110: 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f 0a 73  cord pData..*/.s
5120: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 4c  truct Fts5DlidxL
5130: 76 6c 20 7b 0a 20 20 46 74 73 35 44 61 74 61 20  vl {.  Fts5Data 
5140: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
5150: 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
5160: 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 6f 66   current page of
5170: 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f 0a 20   this level */. 
5180: 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20   int iOff;      
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51a0: 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74  * Current offset
51b0: 20 69 6e 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20   into pData */. 
51c0: 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20   int bEof;      
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51e0: 2a 20 41 74 20 45 4f 46 20 61 6c 72 65 61 64 79  * At EOF already
51f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
5200: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
5210: 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 72      /* Used by r
5220: 65 76 65 72 73 65 20 69 74 65 72 61 74 6f 72 73  everse iterators
5230: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74   */..  /* Output
5240: 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20   variables */.  
5250: 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 3b 20 20  int iLeafPgno;  
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5270: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
5280: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
5290: 65 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69  e */.  i64 iRowi
52a0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
52b0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 6f       /* First ro
52c0: 77 69 64 20 6f 6e 20 6c 65 61 66 20 69 4c 65 61  wid on leaf iLea
52d0: 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73 74 72 75  fPgno */.};.stru
52e0: 63 74 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  ct Fts5DlidxIter
52f0: 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c 3b 0a 20   {.  int nLvl;. 
5300: 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 46   int iSegid;.  F
5310: 74 73 35 44 6c 69 64 78 4c 76 6c 20 61 4c 76 6c  ts5DlidxLvl aLvl
5320: 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  [1];.};..static 
5330: 76 6f 69 64 20 66 74 73 35 50 75 74 55 31 36 28  void fts5PutU16(
5340: 75 38 20 2a 61 4f 75 74 2c 20 75 31 36 20 69 56  u8 *aOut, u16 iV
5350: 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30 5d 20 3d  al){.  aOut[0] =
5360: 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20 20 61 4f   (iVal>>8);.  aO
5370: 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c 26 30 78  ut[1] = (iVal&0x
5380: 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75  FF);.}..static u
5390: 31 36 20 66 74 73 35 47 65 74 55 31 36 28 63 6f  16 fts5GetU16(co
53a0: 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b 0a 20 20  nst u8 *aIn){.  
53b0: 72 65 74 75 72 6e 20 28 28 75 31 36 29 61 49 6e  return ((u16)aIn
53c0: 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61 49 6e 5b  [0] << 8) + aIn[
53d0: 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a 2a 2a 20 41 6c  1];.} ../*.** Al
53e0: 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
53f0: 6e 20 61 20 62 75 66 66 65 72 20 61 74 20 6c 65  n a buffer at le
5400: 61 73 74 20 6e 42 79 74 65 20 62 79 74 65 73 20  ast nByte bytes 
5410: 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
5420: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69  f an OOM error i
5430: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 72  s encountered, r
5440: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 73  eturn NULL and s
5450: 65 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  et the error cod
5460: 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 74 73 35  e in.** the Fts5
5470: 49 6e 64 65 78 20 68 61 6e 64 6c 65 20 70 61 73  Index handle pas
5480: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
5490: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
54a0: 61 74 69 63 20 76 6f 69 64 20 2a 66 74 73 35 49  atic void *fts5I
54b0: 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35 49 6e 64  dxMalloc(Fts5Ind
54c0: 65 78 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65  ex *p, int nByte
54d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
54e0: 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
54f0: 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29  o(&p->rc, nByte)
5500: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
5510: 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
5520: 6f 66 20 74 68 65 20 70 4c 65 66 74 20 62 75 66  of the pLeft buf
5530: 66 65 72 20 77 69 74 68 20 74 68 65 20 70 52 69  fer with the pRi
5540: 67 68 74 2f 6e 52 69 67 68 74 20 62 6c 6f 62 2e  ght/nRight blob.
5550: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76  .**.** Return -v
5560: 65 20 69 66 20 70 4c 65 66 74 20 69 73 20 73 6d  e if pLeft is sm
5570: 61 6c 6c 65 72 20 74 68 61 6e 20 70 52 69 67 68  aller than pRigh
5580: 74 2c 20 30 20 69 66 20 74 68 65 79 20 61 72 65  t, 0 if they are
5590: 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65   equal or.** +ve
55a0: 20 69 66 20 70 52 69 67 68 74 20 69 73 20 73 6d   if pRight is sm
55b0: 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65 66 74  aller than pLeft
55c0: 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
55d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65 73 20  :.**.**     res 
55e0: 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52 69 67  = *pLeft - *pRig
55f0: 68 74 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ht.*/.#ifdef SQL
5600: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
5610: 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72 43   int fts5BufferC
5620: 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20 46 74  ompareBlob(.  Ft
5630: 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66 74 2c  s5Buffer *pLeft,
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5650: 20 4c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20   Left hand side 
5660: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f  of comparison */
5670: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 52 69  .  const u8 *pRi
5680: 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68 74 20  ght, int nRight 
5690: 20 20 20 2f 2a 20 52 69 67 68 74 20 68 61 6e 64     /* Right hand
56a0: 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69   side of compari
56b0: 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  son */.){.  int 
56c0: 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74  nCmp = MIN(pLeft
56d0: 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20  ->n, nRight);.  
56e0: 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70  int res = memcmp
56f0: 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67 68  (pLeft->p, pRigh
5700: 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75  t, nCmp);.  retu
5710: 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c  rn (res==0 ? (pL
5720: 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67 68 74 29  eft->n - nRight)
5730: 20 3a 20 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69   : res);.}.#endi
5740: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  f../*.** Compare
5750: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
5760: 20 74 68 65 20 74 77 6f 20 62 75 66 66 65 72 73   the two buffers
5770: 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e   using memcmp().
5780: 20 49 66 20 6f 6e 65 20 62 75 66 66 65 72 0a 2a   If one buffer.*
5790: 2a 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  * is a prefix of
57a0: 20 74 68 65 20 6f 74 68 65 72 2c 20 69 74 20 69   the other, it i
57b0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 68 65  s considered the
57c0: 20 6c 65 73 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52   lesser..**.** R
57d0: 65 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65  eturn -ve if pLe
57e0: 66 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ft is smaller th
57f0: 61 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66 20  an pRight, 0 if 
5800: 74 68 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f  they are equal o
5810: 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67  r.** +ve if pRig
5820: 68 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ht is smaller th
5830: 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68  an pLeft. In oth
5840: 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20  er words:.**.** 
5850: 20 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74      res = *pLeft
5860: 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74   - *pRight.*/.st
5870: 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66  atic int fts5Buf
5880: 66 65 72 43 6f 6d 70 61 72 65 28 46 74 73 35 42  ferCompare(Fts5B
5890: 75 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 46 74  uffer *pLeft, Ft
58a0: 73 35 42 75 66 66 65 72 20 2a 70 52 69 67 68 74  s5Buffer *pRight
58b0: 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20  ){.  int nCmp = 
58c0: 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20 70 52  MIN(pLeft->n, pR
58d0: 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20  ight->n);.  int 
58e0: 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65  res = memcmp(pLe
58f0: 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2d 3e 70  ft->p, pRight->p
5900: 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72  , nCmp);.  retur
5910: 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65  n (res==0 ? (pLe
5920: 66 74 2d 3e 6e 20 2d 20 70 52 69 67 68 74 2d 3e  ft->n - pRight->
5930: 6e 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 73 74  n) : res);.}..st
5940: 61 74 69 63 20 69 6e 74 20 66 74 73 35 4c 65 61  atic int fts5Lea
5950: 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 46 74  fFirstTermOff(Ft
5960: 73 35 44 61 74 61 20 2a 70 4c 65 61 66 29 7b 0a  s5Data *pLeaf){.
5970: 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 66 74 73    int ret;.  fts
5980: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
5990: 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a  eaf->p[pLeaf->sz
59a0: 4c 65 61 66 5d 2c 20 72 65 74 29 3b 0a 20 20 72  Leaf], ret);.  r
59b0: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
59c0: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 72 65  .** Close the re
59d0: 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e  ad-only blob han
59e0: 64 6c 65 2c 20 69 66 20 69 74 20 69 73 20 6f 70  dle, if it is op
59f0: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  en..*/.static vo
5a00: 69 64 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64  id fts5CloseRead
5a10: 65 72 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  er(Fts5Index *p)
5a20: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64  {.  if( p->pRead
5a30: 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
5a40: 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 20  3_blob *pReader 
5a50: 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20  = p->pReader;.  
5a60: 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30    p->pReader = 0
5a70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c  ;.    sqlite3_bl
5a80: 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72  ob_close(pReader
5a90: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
5aa0: 20 52 65 74 72 69 65 76 65 20 61 20 72 65 63 6f   Retrieve a reco
5ab0: 72 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  rd from the %_da
5ac0: 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ta table..**.** 
5ad0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
5ae0: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
5af0: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
5b00: 72 20 6c 65 66 74 20 69 6e 20 74 68 65 20 0a 2a  r left in the .*
5b10: 2a 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65  * Fts5Index obje
5b20: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74  ct..*/.static Ft
5b30: 73 35 44 61 74 61 20 2a 66 74 73 35 44 61 74 61  s5Data *fts5Data
5b40: 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a  Read(Fts5Index *
5b50: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  p, i64 iRowid){.
5b60: 20 20 46 74 73 35 44 61 74 61 20 2a 70 52 65 74    Fts5Data *pRet
5b70: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72   = 0;.  if( p->r
5b80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5b90: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
5ba0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20 69 66 28  ITE_OK;..    if(
5bb0: 20 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20   p->pReader ){. 
5bc0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c       /* This cal
5bd0: 6c 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  l may return SQL
5be0: 49 54 45 5f 41 42 4f 52 54 20 69 66 20 74 68 65  ITE_ABORT if the
5bf0: 72 65 20 68 61 73 20 62 65 65 6e 20 61 20 73 61  re has been a sa
5c00: 76 65 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a  vepoint.      **
5c10: 20 72 6f 6c 6c 62 61 63 6b 20 73 69 6e 63 65 20   rollback since 
5c20: 69 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  it was last used
5c30: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
5c40: 20 6e 65 77 20 62 6c 6f 62 20 68 61 6e 64 6c 65   new blob handle
5c50: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71  .      ** is req
5c60: 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20  uired.  */.     
5c70: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
5c80: 42 6c 6f 62 20 3d 20 70 2d 3e 70 52 65 61 64 65  Blob = p->pReade
5c90: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 61  r;.      p->pRea
5ca0: 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  der = 0;.      r
5cb0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
5cc0: 5f 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69  _reopen(pBlob, i
5cd0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 61 73  Rowid);.      as
5ce0: 73 65 72 74 28 20 70 2d 3e 70 52 65 61 64 65 72  sert( p->pReader
5cf0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==0 );.      p->
5d00: 70 52 65 61 64 65 72 20 3d 20 70 42 6c 6f 62 3b  pReader = pBlob;
5d10: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
5d20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5d30: 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61      fts5CloseRea
5d40: 64 65 72 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  der(p);.      }.
5d50: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
5d60: 4c 49 54 45 5f 41 42 4f 52 54 20 29 20 72 63 20  LITE_ABORT ) rc 
5d70: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
5d80: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
5d90: 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73  e blob handle is
5da0: 20 6e 6f 74 20 6f 70 65 6e 20 61 74 20 74 68 69   not open at thi
5db0: 73 20 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 69 74  s point, open it
5dc0: 20 61 6e 64 20 73 65 65 6b 20 0a 20 20 20 20 2a   and seek .    *
5dd0: 2a 20 74 6f 20 74 68 65 20 72 65 71 75 65 73 74  * to the request
5de0: 65 64 20 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20  ed entry.  */.  
5df0: 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72    if( p->pReader
5e00: 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ==0 && rc==SQLIT
5e10: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46 74  E_OK ){.      Ft
5e20: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
5e30: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
5e40: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
5e50: 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f  e3_blob_open(pCo
5e60: 6e 66 69 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20  nfig->db, .     
5e70: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
5e80: 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  b, p->zDataTbl, 
5e90: 22 62 6c 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c  "block", iRowid,
5ea0: 20 30 2c 20 26 70 2d 3e 70 52 65 61 64 65 72 0a   0, &p->pReader.
5eb0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
5ec0: 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72      /* If either
5ed0: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
5ee0: 62 6c 6f 62 5f 6f 70 65 6e 28 29 20 6f 72 20 73  blob_open() or s
5ef0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70  qlite3_blob_reop
5f00: 65 6e 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a  en() calls.    *
5f10: 2a 20 61 62 6f 76 65 20 72 65 74 75 72 6e 65 64  * above returned
5f20: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 72   SQLITE_ERROR, r
5f30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
5f40: 52 55 50 54 5f 56 54 41 42 20 69 6e 73 74 65 61  RUPT_VTAB instea
5f50: 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 6c 20 74 68  d..    ** All th
5f60: 65 20 72 65 61 73 6f 6e 73 20 74 68 6f 73 65 20  e reasons those 
5f70: 66 75 6e 63 74 69 6f 6e 73 20 6d 69 67 68 74 20  functions might 
5f80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
5f90: 52 4f 52 20 2d 20 6d 69 73 73 69 6e 67 0a 20 20  ROR - missing.  
5fa0: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 6d 69 73 73    ** table, miss
5fb0: 69 6e 67 20 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f  ing row, non-blo
5fc0: 62 2f 74 65 78 74 20 69 6e 20 62 6c 6f 63 6b 20  b/text in block 
5fd0: 63 6f 6c 75 6d 6e 20 2d 20 69 6e 64 69 63 61 74  column - indicat
5fe0: 65 20 0a 20 20 20 20 2a 2a 20 62 61 63 6b 69 6e  e .    ** backin
5ff0: 67 20 73 74 6f 72 65 20 63 6f 72 72 75 70 74 69  g store corrupti
6000: 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  on.  */.    if( 
6010: 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52  rc==SQLITE_ERROR
6020: 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52   ) rc = FTS5_COR
6030: 52 55 50 54 3b 0a 0a 20 20 20 20 69 66 28 20 72  RUPT;..    if( r
6040: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6050: 20 20 20 20 20 20 75 38 20 2a 61 4f 75 74 20 3d        u8 *aOut =
6060: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
6070: 20 20 2f 2a 20 52 65 61 64 20 62 6c 6f 62 20 64    /* Read blob d
6080: 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 62 75  ata into this bu
6090: 66 66 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ffer */.      in
60a0: 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65  t nByte = sqlite
60b0: 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e  3_blob_bytes(p->
60c0: 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20  pReader);.      
60d0: 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 73 69 7a  int nAlloc = siz
60e0: 65 6f 66 28 46 74 73 35 44 61 74 61 29 20 2b 20  eof(Fts5Data) + 
60f0: 6e 42 79 74 65 20 2b 20 46 54 53 35 5f 44 41 54  nByte + FTS5_DAT
6100: 41 5f 50 41 44 44 49 4e 47 3b 0a 20 20 20 20 20  A_PADDING;.     
6110: 20 70 52 65 74 20 3d 20 28 46 74 73 35 44 61 74   pRet = (Fts5Dat
6120: 61 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  a*)sqlite3_mallo
6130: 63 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  c(nAlloc);.     
6140: 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
6150: 20 20 20 20 20 70 52 65 74 2d 3e 6e 6e 20 3d 20       pRet->nn = 
6160: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 61  nByte;.        a
6170: 4f 75 74 20 3d 20 70 52 65 74 2d 3e 70 20 3d 20  Out = pRet->p = 
6180: 28 75 38 2a 29 26 70 52 65 74 5b 31 5d 3b 0a 20  (u8*)&pRet[1];. 
6190: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
61a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
61b0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 0a  NOMEM;.      }..
61c0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
61d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
61e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
61f0: 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 52 65  blob_read(p->pRe
6200: 61 64 65 72 2c 20 61 4f 75 74 2c 20 6e 42 79 74  ader, aOut, nByt
6210: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
6220: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
6230: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6240: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6250: 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 70 52  Ret);.        pR
6260: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  et = 0;.      }e
6270: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
6280: 54 4f 44 4f 31 3a 20 46 69 78 20 74 68 69 73 20  TODO1: Fix this 
6290: 2a 2f 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  */.        pRet-
62a0: 3e 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65  >szLeaf = fts5Ge
62b0: 74 55 31 36 28 26 70 52 65 74 2d 3e 70 5b 32 5d  tU16(&pRet->p[2]
62c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
62d0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b  .    p->rc = rc;
62e0: 0a 20 20 20 20 70 2d 3e 6e 52 65 61 64 2b 2b 3b  .    p->nRead++;
62f0: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
6300: 28 70 52 65 74 3d 3d 30 29 3d 3d 28 70 2d 3e 72  (pRet==0)==(p->r
6310: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b  c!=SQLITE_OK) );
6320: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
6330: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  }.../*.** Releas
6340: 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
6350: 20 64 61 74 61 20 72 65 63 6f 72 64 20 72 65 74   data record ret
6360: 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  urned by an earl
6370: 69 65 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 66  ier call to.** f
6380: 74 73 35 44 61 74 61 52 65 61 64 28 29 2e 0a 2a  ts5DataRead()..*
6390: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
63a0: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 46 74  s5DataRelease(Ft
63b0: 73 35 44 61 74 61 20 2a 70 44 61 74 61 29 7b 0a  s5Data *pData){.
63c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
63d0: 44 61 74 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  Data);.}..static
63e0: 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 50 72   int fts5IndexPr
63f0: 65 70 61 72 65 53 74 6d 74 28 0a 20 20 46 74 73  epareStmt(.  Fts
6400: 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 73 71 6c  5Index *p,.  sql
6410: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74  ite3_stmt **ppSt
6420: 6d 74 2c 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  mt,.  char *zSql
6430: 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  .){.  if( p->rc=
6440: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6450: 20 20 69 66 28 20 7a 53 71 6c 20 29 7b 0a 20 20    if( zSql ){.  
6460: 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
6470: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
6480: 2d 3e 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a  ->pConfig->db, z
6490: 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c  Sql, -1, ppStmt,
64a0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
64b0: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
64c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
64d0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
64e0: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 72 65  free(zSql);.  re
64f0: 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 0a  turn p->rc;.}...
6500: 2f 2a 0a 2a 2a 20 49 4e 53 45 52 54 20 4f 52 20  /*.** INSERT OR 
6510: 52 45 50 4c 41 43 45 20 61 20 72 65 63 6f 72 64  REPLACE a record
6520: 20 69 6e 74 6f 20 74 68 65 20 25 5f 64 61 74 61   into the %_data
6530: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
6540: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 57  c void fts5DataW
6550: 72 69 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a  rite(Fts5Index *
6560: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 2c 20 63  p, i64 iRowid, c
6570: 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20  onst u8 *pData, 
6580: 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 69 66  int nData){.  if
6590: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
65a0: 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  OK ) return;..  
65b0: 69 66 28 20 70 2d 3e 70 57 72 69 74 65 72 3d 3d  if( p->pWriter==
65c0: 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e  0 ){.    Fts5Con
65d0: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
65e0: 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66  ->pConfig;.    f
65f0: 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53  ts5IndexPrepareS
6600: 74 6d 74 28 70 2c 20 26 70 2d 3e 70 57 72 69 74  tmt(p, &p->pWrit
6610: 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  er, sqlite3_mpri
6620: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
6630: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27 25 71  REPLACE INTO '%q
6640: 27 2e 27 25 71 5f 64 61 74 61 27 28 69 64 2c 20  '.'%q_data'(id, 
6650: 62 6c 6f 63 6b 29 20 56 41 4c 55 45 53 28 3f 2c  block) VALUES(?,
6660: 3f 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ?)", .          
6670: 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43  pConfig->zDb, pC
6680: 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20  onfig->zName.   
6690: 20 29 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   ));.    if( p->
66a0: 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d  rc ) return;.  }
66b0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ..  sqlite3_bind
66c0: 5f 69 6e 74 36 34 28 70 2d 3e 70 57 72 69 74 65  _int64(p->pWrite
66d0: 72 2c 20 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20  r, 1, iRowid);. 
66e0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
66f0: 6f 62 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 32  ob(p->pWriter, 2
6700: 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20  , pData, nData, 
6710: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
6720: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
6730: 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 70 2d  ->pWriter);.  p-
6740: 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
6750: 73 65 74 28 70 2d 3e 70 57 72 69 74 65 72 29 3b  set(p->pWriter);
6760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
6770: 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
6780: 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44  SQL:.**.**     D
6790: 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64 61 74  ELETE FROM %_dat
67a0: 61 20 57 48 45 52 45 20 69 64 20 42 45 54 57 45  a WHERE id BETWE
67b0: 45 4e 20 24 69 46 69 72 73 74 20 41 4e 44 20 24  EN $iFirst AND $
67c0: 69 4c 61 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20  iLast.*/.static 
67d0: 76 6f 69 64 20 66 74 73 35 44 61 74 61 44 65 6c  void fts5DataDel
67e0: 65 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ete(Fts5Index *p
67f0: 2c 20 69 36 34 20 69 46 69 72 73 74 2c 20 69 36  , i64 iFirst, i6
6800: 34 20 69 4c 61 73 74 29 7b 0a 20 20 69 66 28 20  4 iLast){.  if( 
6810: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
6820: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
6830: 28 20 70 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30  ( p->pDeleter==0
6840: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
6850: 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a      Fts5Config *
6860: 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
6870: 6e 66 69 67 3b 0a 20 20 20 20 63 68 61 72 20 2a  nfig;.    char *
6880: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
6890: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
68a0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71  "DELETE FROM '%q
68b0: 27 2e 27 25 71 5f 64 61 74 61 27 20 57 48 45 52  '.'%q_data' WHER
68c0: 45 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64 3c 3d  E id>=? AND id<=
68d0: 3f 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  ?", .          p
68e0: 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f  Config->zDb, pCo
68f0: 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  nfig->zName.    
6900: 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  );.    if( zSql=
6910: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
6920: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
6930: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6940: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
6950: 70 61 72 65 5f 76 32 28 70 43 6f 6e 66 69 67 2d  pare_v2(pConfig-
6960: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
6970: 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 30 29 3b  p->pDeleter, 0);
6980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
6990: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ree(zSql);.    }
69a0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
69b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
69c0: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
69d0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
69e0: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62    }..  sqlite3_b
69f0: 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65  ind_int64(p->pDe
6a00: 6c 65 74 65 72 2c 20 31 2c 20 69 46 69 72 73 74  leter, 1, iFirst
6a10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
6a20: 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65 6c 65  d_int64(p->pDele
6a30: 74 65 72 2c 20 32 2c 20 69 4c 61 73 74 29 3b 0a  ter, 2, iLast);.
6a40: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
6a50: 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20 20 70  ->pDeleter);.  p
6a60: 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  ->rc = sqlite3_r
6a70: 65 73 65 74 28 70 2d 3e 70 44 65 6c 65 74 65 72  eset(p->pDeleter
6a80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  );.}../*.** Remo
6a90: 76 65 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 61  ve all records a
6aa0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73  ssociated with s
6ab0: 65 67 6d 65 6e 74 20 69 53 65 67 69 64 2e 0a 2a  egment iSegid..*
6ac0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
6ad0: 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65 67 6d  s5DataRemoveSegm
6ae0: 65 6e 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ent(Fts5Index *p
6af0: 2c 20 69 6e 74 20 69 53 65 67 69 64 29 7b 0a 20  , int iSegid){. 
6b00: 20 69 36 34 20 69 46 69 72 73 74 20 3d 20 46 54   i64 iFirst = FT
6b10: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
6b20: 28 69 53 65 67 69 64 2c 20 30 29 3b 0a 20 20 69  (iSegid, 0);.  i
6b30: 36 34 20 69 4c 61 73 74 20 3d 20 46 54 53 35 5f  64 iLast = FTS5_
6b40: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53  SEGMENT_ROWID(iS
6b50: 65 67 69 64 2b 31 2c 20 30 29 2d 31 3b 0a 20 20  egid+1, 0)-1;.  
6b60: 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28 70  fts5DataDelete(p
6b70: 2c 20 69 46 69 72 73 74 2c 20 69 4c 61 73 74 29  , iFirst, iLast)
6b80: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 78 44  ;.  if( p->pIdxD
6b90: 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20  eleter==0 ){.   
6ba0: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
6bb0: 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
6bc0: 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  g;.    fts5Index
6bd0: 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26  PrepareStmt(p, &
6be0: 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 2c 20  p->pIdxDeleter, 
6bf0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
6c00: 0a 20 20 20 20 20 20 20 20 20 20 22 44 45 4c 45  .          "DELE
6c10: 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71  TE FROM '%q'.'%q
6c20: 5f 69 64 78 27 20 57 48 45 52 45 20 73 65 67 69  _idx' WHERE segi
6c30: 64 3d 3f 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d=?",.          
6c40: 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43  pConfig->zDb, pC
6c50: 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20  onfig->zName.   
6c60: 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   ));.  }.  if( p
6c70: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
6c80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
6c90: 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 44  ind_int(p->pIdxD
6ca0: 65 6c 65 74 65 72 2c 20 31 2c 20 69 53 65 67 69  eleter, 1, iSegi
6cb0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
6cc0: 73 74 65 70 28 70 2d 3e 70 49 64 78 44 65 6c 65  step(p->pIdxDele
6cd0: 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20  ter);.    p->rc 
6ce0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
6cf0: 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 29 3b  p->pIdxDeleter);
6d00: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
6d10: 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63  lease a referenc
6d20: 65 20 74 6f 20 61 6e 20 46 74 73 35 53 74 72 75  e to an Fts5Stru
6d30: 63 74 75 72 65 20 6f 62 6a 65 63 74 20 72 65 74  cture object ret
6d40: 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  urned by an earl
6d50: 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  ier .** call to 
6d60: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
6d70: 64 28 29 20 6f 72 20 66 74 73 35 53 74 72 75 63  d() or fts5Struc
6d80: 74 75 72 65 44 65 63 6f 64 65 28 29 2e 0a 2a 2f  tureDecode()..*/
6d90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
6da0: 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
6db0: 65 28 46 74 73 35 53 74 72 75 63 74 75 72 65 20  e(Fts5Structure 
6dc0: 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28  *pStruct){.  if(
6dd0: 20 70 53 74 72 75 63 74 20 26 26 20 30 3e 3d 28   pStruct && 0>=(
6de0: 2d 2d 70 53 74 72 75 63 74 2d 3e 6e 52 65 66 29  --pStruct->nRef)
6df0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
6e00: 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75     assert( pStru
6e10: 63 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20  ct->nRef==0 );. 
6e20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
6e30: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
6e40: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
6e50: 65 33 5f 66 72 65 65 28 70 53 74 72 75 63 74 2d  e3_free(pStruct-
6e60: 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65 67 29  >aLevel[i].aSeg)
6e70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
6e80: 74 65 33 5f 66 72 65 65 28 70 53 74 72 75 63 74  te3_free(pStruct
6e90: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
6ea0: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
6eb0: 75 72 65 52 65 66 28 46 74 73 35 53 74 72 75 63  ureRef(Fts5Struc
6ec0: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
6ed0: 20 20 70 53 74 72 75 63 74 2d 3e 6e 52 65 66 2b    pStruct->nRef+
6ee0: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65  +;.}../*.** Dese
6ef0: 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75  rialize and retu
6f00: 72 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  rn the structure
6f10: 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e 74 6c   record currentl
6f20: 79 20 73 74 6f 72 65 64 20 69 6e 20 73 65 72 69  y stored in seri
6f30: 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72 6d 20 77  alized.** form w
6f40: 69 74 68 69 6e 20 62 75 66 66 65 72 20 70 44 61  ithin buffer pDa
6f50: 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a 2a 2a 20  ta/nData..**.** 
6f60: 54 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72  The Fts5Structur
6f70: 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65  e.aLevel[] and e
6f80: 61 63 68 20 46 74 73 35 53 74 72 75 63 74 75 72  ach Fts5Structur
6f90: 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72  eLevel.aSeg[] ar
6fa0: 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d  ray.** are over-
6fb0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 6f 6e 65  allocated by one
6fc0: 20 73 6c 6f 74 2e 20 54 68 69 73 20 61 6c 6c 6f   slot. This allo
6fd0: 77 73 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ws the structure
6fe0: 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 74 6f 20   contents.** to 
6ff0: 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79 20 65  be more easily e
7000: 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  dited..**.** If 
7010: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
7020: 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20 74   *ppOut is set t
7030: 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20 53 51  o NULL and an SQ
7040: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 0a  Lite error code.
7050: 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  ** returned. Oth
7060: 65 72 77 69 73 65 2c 20 2a 70 70 4f 75 74 20 69  erwise, *ppOut i
7070: 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
7080: 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  o the new object
7090: 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
70a0: 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
70b0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 74  tatic int fts5St
70c0: 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 0a 20  ructureDecode(. 
70d0: 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61   const u8 *pData
70e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
70f0: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
7100: 69 6e 69 6e 67 20 73 65 72 69 61 6c 69 7a 65 64  ining serialized
7110: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
7120: 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20  int nData,      
7130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7140: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
7150: 72 20 70 44 61 74 61 20 69 6e 20 62 79 74 65 73  r pData in bytes
7160: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6f   */.  int *piCoo
7170: 6b 69 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  kie,            
7180: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75        /* Configu
7190: 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 76 61  ration cookie va
71a0: 6c 75 65 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  lue */.  Fts5Str
71b0: 75 63 74 75 72 65 20 2a 2a 70 70 4f 75 74 20 20  ucture **ppOut  
71c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
71d0: 20 44 65 73 65 72 69 61 6c 69 7a 65 64 20 6f 62   Deserialized ob
71e0: 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ject */.){.  int
71f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7200: 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
7210: 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 69 6e 74 20  int iLvl;.  int 
7220: 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20 69 6e  nLevel = 0;.  in
7230: 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a  t nSegment = 0;.
7240: 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7260: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
7270: 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ace to allocate 
7280: 61 74 20 70 52 65 74 20 2a 2f 0a 20 20 46 74 73  at pRet */.  Fts
7290: 35 53 74 72 75 63 74 75 72 65 20 2a 70 52 65 74  5Structure *pRet
72a0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
72b0: 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  Structure object
72c0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20   to return */.. 
72d0: 20 2f 2a 20 47 72 61 62 20 74 68 65 20 63 6f 6f   /* Grab the coo
72e0: 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  kie value */.  i
72f0: 66 28 20 70 69 43 6f 6f 6b 69 65 20 29 20 2a 70  f( piCookie ) *p
7300: 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c 69 74 65  iCookie = sqlite
7310: 33 46 74 73 35 47 65 74 33 32 28 70 44 61 74 61  3Fts5Get32(pData
7320: 29 3b 0a 20 20 69 20 3d 20 34 3b 0a 0a 20 20 2f  );.  i = 4;..  /
7330: 2a 20 52 65 61 64 20 74 68 65 20 74 6f 74 61 6c  * Read the total
7340: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c   number of level
7350: 73 20 61 6e 64 20 73 65 67 6d 65 6e 74 73 20 66  s and segments f
7360: 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66  rom the start of
7370: 20 74 68 65 0a 20 20 2a 2a 20 73 74 72 75 63 74   the.  ** struct
7380: 75 72 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a  ure record.  */.
7390: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
73a0: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
73b0: 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20 20 69 20 2b  , nLevel);.  i +
73c0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
73d0: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 53 65  2(&pData[i], nSe
73e0: 67 6d 65 6e 74 29 3b 0a 20 20 6e 42 79 74 65 20  gment);.  nByte 
73f0: 3d 20 28 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  = (.      sizeof
7400: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29 20  (Fts5Structure) 
7410: 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
7420: 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72       /* Main str
7430: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20  ucture */.      
7440: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
7450: 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c  tureLevel) * (nL
7460: 65 76 65 6c 2d 31 29 20 20 20 20 2f 2a 20 61 4c  evel-1)    /* aL
7470: 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  evel[] array */.
7480: 20 20 29 3b 0a 20 20 70 52 65 74 20 3d 20 28 46    );.  pRet = (F
7490: 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 73 71  ts5Structure*)sq
74a0: 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
74b0: 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65 29 3b  ero(&rc, nByte);
74c0: 0a 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a  ..  if( pRet ){.
74d0: 20 20 20 20 70 52 65 74 2d 3e 6e 52 65 66 20 3d      pRet->nRef =
74e0: 20 31 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 4c   1;.    pRet->nL
74f0: 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b 0a 20  evel = nLevel;. 
7500: 20 20 20 70 52 65 74 2d 3e 6e 53 65 67 6d 65 6e     pRet->nSegmen
7510: 74 20 3d 20 6e 53 65 67 6d 65 6e 74 3b 0a 20 20  t = nSegment;.  
7520: 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74    i += sqlite3Ft
7530: 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61  s5GetVarint(&pDa
7540: 74 61 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e 57  ta[i], &pRet->nW
7550: 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20  riteCounter);.. 
7560: 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 72     for(iLvl=0; r
7570: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
7580: 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69 4c 76  iLvl<nLevel; iLv
7590: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  l++){.      Fts5
75a0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
75b0: 70 4c 76 6c 20 3d 20 26 70 52 65 74 2d 3e 61 4c  pLvl = &pRet->aL
75c0: 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
75d0: 20 20 69 6e 74 20 6e 54 6f 74 61 6c 20 3d 20 30    int nTotal = 0
75e0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67  ;.      int iSeg
75f0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d  ;..      if( i>=
7600: 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  nData ){.       
7610: 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
7620: 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
7630: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74  .        i += ft
7640: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
7650: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e  Data[i], pLvl->n
7660: 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 20 20  Merge);.        
7670: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
7680: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
7690: 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 20  nTotal);.       
76a0: 20 61 73 73 65 72 74 28 20 6e 54 6f 74 61 6c 3e   assert( nTotal>
76b0: 3d 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 3b  =pLvl->nMerge );
76c0: 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61  .        pLvl->a
76d0: 53 65 67 20 3d 20 28 46 74 73 35 53 74 72 75 63  Seg = (Fts5Struc
76e0: 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c  tureSegment*)sql
76f0: 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
7700: 72 6f 28 26 72 63 2c 20 0a 20 20 20 20 20 20 20  ro(&rc, .       
7710: 20 20 20 20 20 6e 54 6f 74 61 6c 20 2a 20 73 69       nTotal * si
7720: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7730: 72 65 53 65 67 6d 65 6e 74 29 0a 20 20 20 20 20  reSegment).     
7740: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20     );.      }.. 
7750: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
7760: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7770: 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e    pLvl->nSeg = n
7780: 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 66  Total;.        f
7790: 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
77a0: 6e 54 6f 74 61 6c 3b 20 69 53 65 67 2b 2b 29 7b  nTotal; iSeg++){
77b0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
77c0: 3e 3d 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20  >=nData ){.     
77d0: 20 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 35         rc = FTS5
77e0: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
77f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7800: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7810: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
7820: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
7830: 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  ], pLvl->aSeg[iS
7840: 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20  eg].iSegid);.   
7850: 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35         i += fts5
7860: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
7870: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65  ta[i], pLvl->aSe
7880: 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73  g[iSeg].pgnoFirs
7890: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  t);.          i 
78a0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
78b0: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c  32(&pData[i], pL
78c0: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70  vl->aSeg[iSeg].p
78d0: 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20  gnoLast);.      
78e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
78f0: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
7900: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
7910: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
7920: 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20  lease(pRet);.   
7930: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
7940: 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74   }.  }..  *ppOut
7950: 20 3d 20 70 52 65 74 3b 0a 20 20 72 65 74 75 72   = pRet;.  retur
7960: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  n rc;.}../*.**.*
7970: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
7980: 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65  s5StructureAddLe
7990: 76 65 6c 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  vel(int *pRc, Ft
79a0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
79b0: 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20 2a  Struct){.  if( *
79c0: 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
79d0: 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
79e0: 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a  ure *pStruct = *
79f0: 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20 69 6e  ppStruct;.    in
7a00: 74 20 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75  t nLevel = pStru
7a10: 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 20 20  ct->nLevel;.    
7a20: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 0a 20 20  int nByte = (.  
7a30: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
7a40: 35 53 74 72 75 63 74 75 72 65 29 20 2b 20 20 20  5Structure) +   
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7a60: 2a 20 4d 61 69 6e 20 73 74 72 75 63 74 75 72 65  * Main structure
7a70: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 69 7a 65   */.        size
7a80: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
7a90: 4c 65 76 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c  Level) * (nLevel
7aa0: 2b 31 29 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d  +1)  /* aLevel[]
7ab0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 29 3b   array */.    );
7ac0: 0a 0a 20 20 20 20 70 53 74 72 75 63 74 20 3d 20  ..    pStruct = 
7ad0: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
7ae0: 70 53 74 72 75 63 74 2c 20 6e 42 79 74 65 29 3b  pStruct, nByte);
7af0: 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74  .    if( pStruct
7b00: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
7b10: 28 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  (&pStruct->aLeve
7b20: 6c 5b 6e 4c 65 76 65 6c 5d 2c 20 30 2c 20 73 69  l[nLevel], 0, si
7b30: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7b40: 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 20 20 20  reLevel));.     
7b50: 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
7b60: 2b 2b 3b 0a 20 20 20 20 20 20 2a 70 70 53 74 72  ++;.      *ppStr
7b70: 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 20  uct = pStruct;. 
7b80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7b90: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
7ba0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  MEM;.    }.  }.}
7bb0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 65 6e 64 20 6c  ../*.** Extend l
7bc0: 65 76 65 6c 20 69 4c 76 6c 20 73 6f 20 74 68 61  evel iLvl so tha
7bd0: 74 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20  t there is room 
7be0: 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 45 78  for at least nEx
7bf0: 74 72 61 20 6d 6f 72 65 0a 2a 2a 20 73 65 67 6d  tra more.** segm
7c00: 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ents..*/.static 
7c10: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
7c20: 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 0a 20  reExtendLevel(. 
7c30: 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 46 74   int *pRc, .  Ft
7c40: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
7c50: 72 75 63 74 2c 20 0a 20 20 69 6e 74 20 69 4c 76  ruct, .  int iLv
7c60: 6c 2c 20 0a 20 20 69 6e 74 20 6e 45 78 74 72 61  l, .  int nExtra
7c70: 2c 20 0a 20 20 69 6e 74 20 62 49 6e 73 65 72 74  , .  int bInsert
7c80: 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  .){.  if( *pRc==
7c90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7ca0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
7cb0: 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
7cc0: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
7cd0: 6c 5d 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75  l];.    Fts5Stru
7ce0: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 4e  ctureSegment *aN
7cf0: 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74  ew;.    int nByt
7d00: 65 3b 0a 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  e;..    nByte = 
7d10: 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2b 20 6e 45  (pLvl->nSeg + nE
7d20: 78 74 72 61 29 20 2a 20 73 69 7a 65 6f 66 28 46  xtra) * sizeof(F
7d30: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7d40: 65 6e 74 29 3b 0a 20 20 20 20 61 4e 65 77 20 3d  ent);.    aNew =
7d50: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
7d60: 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 6e 42 79  (pLvl->aSeg, nBy
7d70: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  te);.    if( aNe
7d80: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  w ){.      if( b
7d90: 49 6e 73 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20  Insert==0 ){.   
7da0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65       memset(&aNe
7db0: 77 5b 70 4c 76 6c 2d 3e 6e 53 65 67 5d 2c 20 30  w[pLvl->nSeg], 0
7dc0: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
7dd0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20 2a  uctureSegment) *
7de0: 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20   nExtra);.      
7df0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
7e00: 6e 74 20 6e 4d 6f 76 65 20 3d 20 70 4c 76 6c 2d  nt nMove = pLvl-
7e10: 3e 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46  >nSeg * sizeof(F
7e20: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7e30: 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ent);.        me
7e40: 6d 6d 6f 76 65 28 26 61 4e 65 77 5b 6e 45 78 74  mmove(&aNew[nExt
7e50: 72 61 5d 2c 20 61 4e 65 77 2c 20 6e 4d 6f 76 65  ra], aNew, nMove
7e60: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
7e70: 74 28 61 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(aNew, 0, sizeo
7e80: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
7e90: 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61  egment) * nExtra
7ea0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7eb0: 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 61 4e   pLvl->aSeg = aN
7ec0: 65 77 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ew;.    }else{. 
7ed0: 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
7ee0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
7ef0: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74    }.}..static Ft
7f00: 73 35 53 74 72 75 63 74 75 72 65 20 2a 66 74 73  s5Structure *fts
7f10: 35 53 74 72 75 63 74 75 72 65 52 65 61 64 55 6e  5StructureReadUn
7f20: 63 61 63 68 65 64 28 46 74 73 35 49 6e 64 65 78  cached(Fts5Index
7f30: 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75   *p){.  Fts5Stru
7f40: 63 74 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b  cture *pRet = 0;
7f50: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
7f60: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
7f70: 66 69 67 3b 0a 20 20 69 6e 74 20 69 43 6f 6f 6b  fig;.  int iCook
7f80: 69 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ie;             
7f90: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67         /* Config
7fa0: 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a  uration cookie *
7fb0: 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  /.  Fts5Data *pD
7fc0: 61 74 61 3b 0a 0a 20 20 70 44 61 74 61 20 3d 20  ata;..  pData = 
7fd0: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
7fe0: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
7ff0: 4f 57 49 44 29 3b 0a 20 20 69 66 28 20 70 2d 3e  OWID);.  if( p->
8000: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8010: 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 44 6f  .    /* TODO: Do
8020: 20 77 65 20 6e 65 65 64 20 74 68 69 73 20 69 66   we need this if
8030: 20 74 68 65 20 6c 65 61 66 2d 69 6e 64 65 78 20   the leaf-index 
8040: 69 73 20 61 70 70 65 6e 64 65 64 3f 20 50 72 6f  is appended? Pro
8050: 62 61 62 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20  bably... */.    
8060: 6d 65 6d 73 65 74 28 26 70 44 61 74 61 2d 3e 70  memset(&pData->p
8070: 5b 70 44 61 74 61 2d 3e 6e 6e 5d 2c 20 30 2c 20  [pData->nn], 0, 
8080: 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e  FTS5_DATA_PADDIN
8090: 47 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  G);.    p->rc = 
80a0: 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63  fts5StructureDec
80b0: 6f 64 65 28 70 44 61 74 61 2d 3e 70 2c 20 70 44  ode(pData->p, pD
80c0: 61 74 61 2d 3e 6e 6e 2c 20 26 69 43 6f 6f 6b 69  ata->nn, &iCooki
80d0: 65 2c 20 26 70 52 65 74 29 3b 0a 20 20 20 20 69  e, &pRet);.    i
80e0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
80f0: 5f 4f 4b 20 26 26 20 70 43 6f 6e 66 69 67 2d 3e  _OK && pConfig->
8100: 69 43 6f 6f 6b 69 65 21 3d 69 43 6f 6f 6b 69 65  iCookie!=iCookie
8110: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
8120: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e  = sqlite3Fts5Con
8130: 66 69 67 4c 6f 61 64 28 70 43 6f 6e 66 69 67 2c  figLoad(pConfig,
8140: 20 69 43 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 7d   iCookie);.    }
8150: 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
8160: 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20  ease(pData);.   
8170: 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
8180: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66  TE_OK ){.      f
8190: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
81a0: 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20  ase(pRet);.     
81b0: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d   pRet = 0;.    }
81c0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
81d0: 52 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  Ret;.}..static i
81e0: 36 34 20 66 74 73 35 49 6e 64 65 78 44 61 74 61  64 fts5IndexData
81f0: 56 65 72 73 69 6f 6e 28 46 74 73 35 49 6e 64 65  Version(Fts5Inde
8200: 78 20 2a 70 29 7b 0a 20 20 69 36 34 20 69 56 65  x *p){.  i64 iVe
8210: 72 73 69 6f 6e 20 3d 20 30 3b 0a 0a 20 20 69 66  rsion = 0;..  if
8220: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
8230: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
8240: 3e 70 44 61 74 61 56 65 72 73 69 6f 6e 3d 3d 30  >pDataVersion==0
8250: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
8260: 3d 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61  = fts5IndexPrepa
8270: 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 44  reStmt(p, &p->pD
8280: 61 74 61 56 65 72 73 69 6f 6e 2c 20 0a 20 20 20  ataVersion, .   
8290: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
82a0: 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 25  printf("PRAGMA %
82b0: 51 2e 64 61 74 61 5f 76 65 72 73 69 6f 6e 22 2c  Q.data_version",
82c0: 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 7a 44 62   p->pConfig->zDb
82d0: 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ).          );. 
82e0: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29       if( p->rc )
82f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
8300: 0a 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ..    if( SQLITE
8310: 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
8320: 65 70 28 70 2d 3e 70 44 61 74 61 56 65 72 73 69  ep(p->pDataVersi
8330: 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 69 56 65  on) ){.      iVe
8340: 72 73 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f  rsion = sqlite3_
8350: 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 2d 3e  column_int64(p->
8360: 70 44 61 74 61 56 65 72 73 69 6f 6e 2c 20 30 29  pDataVersion, 0)
8370: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72  ;.    }.    p->r
8380: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
8390: 74 28 70 2d 3e 70 44 61 74 61 56 65 72 73 69 6f  t(p->pDataVersio
83a0: 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  n);.  }..  retur
83b0: 6e 20 69 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f  n iVersion;.}../
83c0: 2a 0a 2a 2a 20 52 65 61 64 2c 20 64 65 73 65 72  *.** Read, deser
83d0: 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75 72  ialize and retur
83e0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
83f0: 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  record..**.** Th
8400: 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e  e Fts5Structure.
8410: 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63  aLevel[] and eac
8420: 68 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  h Fts5StructureL
8430: 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61  evel.aSeg[] arra
8440: 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c  y.** are over-al
8450: 6c 6f 63 61 74 65 64 20 61 73 20 64 65 73 63 72  located as descr
8460: 69 62 65 64 20 66 6f 72 20 66 75 6e 63 74 69 6f  ibed for functio
8470: 6e 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  n fts5StructureD
8480: 65 63 6f 64 65 28 29 20 0a 2a 2a 20 61 62 6f 76  ecode() .** abov
8490: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  e..**.** If an e
84a0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
84b0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
84c0: 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
84d0: 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20 46  left in the.** F
84e0: 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e  ts5Index handle.
84f0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
8500: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
8510: 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
8520: 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
8530: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
8540: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35  ..*/.static Fts5
8550: 53 74 72 75 63 74 75 72 65 20 2a 66 74 73 35 53  Structure *fts5S
8560: 74 72 75 63 74 75 72 65 52 65 61 64 28 46 74 73  tructureRead(Fts
8570: 35 49 6e 64 65 78 20 2a 70 29 7b 0a 0a 20 20 69  5Index *p){..  i
8580: 66 28 20 70 2d 3e 70 53 74 72 75 63 74 3d 3d 30  f( p->pStruct==0
8590: 20 29 7b 0a 20 20 20 20 70 2d 3e 69 53 74 72 75   ){.    p->iStru
85a0: 63 74 56 65 72 73 69 6f 6e 20 3d 20 66 74 73 35  ctVersion = fts5
85b0: 49 6e 64 65 78 44 61 74 61 56 65 72 73 69 6f 6e  IndexDataVersion
85c0: 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  (p);.    if( p->
85d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
85e0: 0a 20 20 20 20 20 20 70 2d 3e 70 53 74 72 75 63  .      p->pStruc
85f0: 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
8600: 65 52 65 61 64 55 6e 63 61 63 68 65 64 28 70 29  eReadUncached(p)
8610: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
8620: 20 30 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 46   0.  else{.    F
8630: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 54  ts5Structure *pT
8640: 65 73 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  est = fts5Struct
8650: 75 72 65 52 65 61 64 55 6e 63 61 63 68 65 64 28  ureReadUncached(
8660: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 73  p);.    if( pTes
8670: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
8680: 2c 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  , j;.      asser
8690: 74 5f 6e 63 28 20 70 2d 3e 70 53 74 72 75 63 74  t_nc( p->pStruct
86a0: 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 70 54 65 73  ->nSegment==pTes
86b0: 74 2d 3e 6e 53 65 67 6d 65 6e 74 20 29 3b 0a 20  t->nSegment );. 
86c0: 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
86d0: 70 2d 3e 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  p->pStruct->nLev
86e0: 65 6c 3d 3d 70 54 65 73 74 2d 3e 6e 4c 65 76 65  el==pTest->nLeve
86f0: 6c 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  l );.      for(i
8700: 3d 30 3b 20 69 3c 70 54 65 73 74 2d 3e 6e 4c 65  =0; i<pTest->nLe
8710: 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  vel; i++){.     
8720: 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 2d     assert_nc( p-
8730: 3e 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  >pStruct->aLevel
8740: 5b 69 5d 2e 6e 4d 65 72 67 65 3d 3d 70 54 65 73  [i].nMerge==pTes
8750: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65  t->aLevel[i].nMe
8760: 72 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 61  rge );.        a
8770: 73 73 65 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74  ssert_nc( p->pSt
8780: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  ruct->aLevel[i].
8790: 6e 53 65 67 3d 3d 70 54 65 73 74 2d 3e 61 4c 65  nSeg==pTest->aLe
87a0: 76 65 6c 5b 69 5d 2e 6e 53 65 67 20 29 3b 0a 20  vel[i].nSeg );. 
87b0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
87c0: 6a 3c 70 54 65 73 74 2d 3e 61 4c 65 76 65 6c 5b  j<pTest->aLevel[
87d0: 69 5d 2e 6e 53 65 67 3b 20 6a 2b 2b 29 7b 0a 20  i].nSeg; j++){. 
87e0: 20 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72           Fts5Str
87f0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
8800: 31 20 3d 20 26 70 54 65 73 74 2d 3e 61 4c 65 76  1 = &pTest->aLev
8810: 65 6c 5b 69 5d 2e 61 53 65 67 5b 6a 5d 3b 0a 20  el[i].aSeg[j];. 
8820: 20 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72           Fts5Str
8830: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
8840: 32 20 3d 20 26 70 2d 3e 70 53 74 72 75 63 74 2d  2 = &p->pStruct-
8850: 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65 67 5b  >aLevel[i].aSeg[
8860: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  j];.          as
8870: 73 65 72 74 5f 6e 63 28 20 70 31 2d 3e 69 53 65  sert_nc( p1->iSe
8880: 67 69 64 3d 3d 70 32 2d 3e 69 53 65 67 69 64 20  gid==p2->iSegid 
8890: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
88a0: 65 72 74 5f 6e 63 28 20 70 31 2d 3e 70 67 6e 6f  ert_nc( p1->pgno
88b0: 46 69 72 73 74 3d 3d 70 32 2d 3e 70 67 6e 6f 46  First==p2->pgnoF
88c0: 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  irst );.        
88d0: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 31 2d    assert_nc( p1-
88e0: 3e 70 67 6e 6f 4c 61 73 74 3d 3d 70 32 2d 3e 70  >pgnoLast==p2->p
88f0: 67 6e 6f 4c 61 73 74 20 29 3b 0a 20 20 20 20 20  gnoLast );.     
8900: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8910: 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
8920: 52 65 6c 65 61 73 65 28 70 54 65 73 74 29 3b 0a  Release(pTest);.
8930: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
8940: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53  ..  if( p->rc!=S
8950: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
8960: 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 0;.  assert( p
8970: 2d 3e 69 53 74 72 75 63 74 56 65 72 73 69 6f 6e  ->iStructVersion
8980: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
8990: 20 70 2d 3e 70 53 74 72 75 63 74 21 3d 30 20 29   p->pStruct!=0 )
89a0: 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
89b0: 65 52 65 66 28 70 2d 3e 70 53 74 72 75 63 74 29  eRef(p->pStruct)
89c0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 53  ;.  return p->pS
89d0: 74 72 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63  truct;.}..static
89e0: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
89f0: 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 46 74  ureInvalidate(Ft
8a00: 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69  s5Index *p){.  i
8a10: 66 28 20 70 2d 3e 70 53 74 72 75 63 74 20 29 7b  f( p->pStruct ){
8a20: 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
8a30: 72 65 52 65 6c 65 61 73 65 28 70 2d 3e 70 53 74  reRelease(p->pSt
8a40: 72 75 63 74 29 3b 0a 20 20 20 20 70 2d 3e 70 53  ruct);.    p->pS
8a50: 74 72 75 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d  truct = 0;.  }.}
8a60: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
8a70: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
8a80: 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69  of segments in i
8a90: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 70  ndex structure p
8aa0: 53 74 72 75 63 74 2e 20 54 68 69 73 0a 2a 2a 20  Struct. This.** 
8ab0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
8ac0: 20 65 76 65 72 20 75 73 65 64 20 61 73 20 70 61   ever used as pa
8ad0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 63  rt of assert() c
8ae0: 6f 6e 64 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69  onditions..*/.#i
8af0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
8b00: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  G.static int fts
8b10: 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
8b20: 65 67 6d 65 6e 74 73 28 46 74 73 35 53 74 72 75  egments(Fts5Stru
8b30: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b  cture *pStruct){
8b40: 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20  .  int nSegment 
8b50: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
8b60: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
8b70: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a  er of segments *
8b80: 2f 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20  /.  if( pStruct 
8b90: 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b  ){.    int iLvl;
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bb0: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
8bc0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
8bd0: 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 66 6f  levels */.    fo
8be0: 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
8bf0: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
8c00: 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  iLvl++){.      n
8c10: 53 65 67 6d 65 6e 74 20 2b 3d 20 70 53 74 72 75  Segment += pStru
8c20: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
8c30: 2e 6e 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  .nSeg;.    }.  }
8c40: 0a 0a 20 20 72 65 74 75 72 6e 20 6e 53 65 67 6d  ..  return nSegm
8c50: 65 6e 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  ent;.}.#endif..#
8c60: 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65  define fts5Buffe
8c70: 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
8c80: 70 42 75 66 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c  pBuf, pBlob, nBl
8c90: 6f 62 29 20 7b 20 20 20 20 20 5c 0a 20 20 61 73  ob) {     \.  as
8ca0: 73 65 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 53  sert( (pBuf)->nS
8cb0: 70 61 63 65 3e 3d 28 28 70 42 75 66 29 2d 3e 6e  pace>=((pBuf)->n
8cc0: 2b 6e 42 6c 6f 62 29 20 29 3b 20 20 20 20 20 20  +nBlob) );      
8cd0: 20 20 20 20 20 20 20 5c 0a 20 20 6d 65 6d 63 70         \.  memcp
8ce0: 79 28 26 28 70 42 75 66 29 2d 3e 70 5b 28 70 42  y(&(pBuf)->p[(pB
8cf0: 75 66 29 2d 3e 6e 5d 2c 20 70 42 6c 6f 62 2c 20  uf)->n], pBlob, 
8d00: 6e 42 6c 6f 62 29 3b 20 20 20 20 20 20 20 20 20  nBlob);         
8d10: 20 20 20 20 5c 0a 20 20 28 70 42 75 66 29 2d 3e      \.  (pBuf)->
8d20: 6e 20 2b 3d 20 6e 42 6c 6f 62 3b 20 20 20 20 20  n += nBlob;     
8d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d50: 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74   \.}..#define ft
8d60: 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
8d70: 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69  ndVarint(pBuf, i
8d80: 56 61 6c 29 20 7b 20 20 20 20 20 20 20 20 20 20  Val) {          
8d90: 20 20 20 20 20 20 5c 0a 20 20 28 70 42 75 66 29        \.  (pBuf)
8da0: 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
8db0: 73 35 50 75 74 56 61 72 69 6e 74 28 26 28 70 42  s5PutVarint(&(pB
8dc0: 75 66 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e  uf)->p[(pBuf)->n
8dd0: 5d 2c 20 28 69 56 61 6c 29 29 3b 20 20 5c 0a 20  ], (iVal));  \. 
8de0: 20 61 73 73 65 72 74 28 20 28 70 42 75 66 29 2d   assert( (pBuf)-
8df0: 3e 6e 53 70 61 63 65 3e 3d 28 70 42 75 66 29 2d  >nSpace>=(pBuf)-
8e00: 3e 6e 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  >n );           
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
8e20: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 72 69 61  .}.../*.** Seria
8e30: 6c 69 7a 65 20 61 6e 64 20 73 74 6f 72 65 20 74  lize and store t
8e40: 68 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72  he "structure" r
8e50: 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ecord..**.** If 
8e60: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
8e70: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
8e80: 63 6f 64 65 20 69 6e 20 74 68 65 20 46 74 73 35  code in the Fts5
8e90: 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 20 49 66  Index object. If
8ea0: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 68 61 73   an.** error has
8eb0: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
8ec0: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
8ed0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
8ee0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
8ef0: 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 46  StructureWrite(F
8f00: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
8f10: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
8f20: 75 63 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  uct){.  if( p->r
8f30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8f40: 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 62      Fts5Buffer b
8f50: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
8f60: 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 73    /* Buffer to s
8f70: 65 72 69 61 6c 69 7a 65 20 72 65 63 6f 72 64 20  erialize record 
8f80: 69 6e 74 6f 20 2a 2f 0a 20 20 20 20 69 6e 74 20  into */.    int 
8f90: 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iLvl;           
8fa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
8fb0: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
8fc0: 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20  ough levels */. 
8fd0: 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20     int iCookie; 
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ff0: 20 2f 2a 20 43 6f 6f 6b 69 65 20 76 61 6c 75 65   /* Cookie value
9000: 20 74 6f 20 73 74 6f 72 65 20 2a 2f 0a 0a 20 20   to store */..  
9010: 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
9020: 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73  t->nSegment==fts
9030: 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
9040: 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29  egments(pStruct)
9050: 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   );.    memset(&
9060: 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  buf, 0, sizeof(F
9070: 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20  ts5Buffer));..  
9080: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
9090: 63 75 72 72 65 6e 74 20 63 6f 6e 66 69 67 75 72  current configur
90a0: 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a  ation cookie */.
90b0: 20 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 2d      iCookie = p-
90c0: 3e 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69  >pConfig->iCooki
90d0: 65 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6f 6b  e;.    if( iCook
90e0: 69 65 3c 30 20 29 20 69 43 6f 6f 6b 69 65 20 3d  ie<0 ) iCookie =
90f0: 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d   0;..    if( 0==
9100: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
9110: 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 62  rSize(&p->rc, &b
9120: 75 66 2c 20 34 2b 39 2b 39 2b 39 29 20 29 7b 0a  uf, 4+9+9+9) ){.
9130: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
9140: 35 50 75 74 33 32 28 62 75 66 2e 70 2c 20 69 43  5Put32(buf.p, iC
9150: 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 20 20 62 75  ookie);.      bu
9160: 66 2e 6e 20 3d 20 34 3b 0a 20 20 20 20 20 20 66  f.n = 4;.      f
9170: 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
9180: 65 6e 64 56 61 72 69 6e 74 28 26 62 75 66 2c 20  endVarint(&buf, 
9190: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29  pStruct->nLevel)
91a0: 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
91b0: 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
91c0: 6e 74 28 26 62 75 66 2c 20 70 53 74 72 75 63 74  nt(&buf, pStruct
91d0: 2d 3e 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ->nSegment);.   
91e0: 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
91f0: 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62  eAppendVarint(&b
9200: 75 66 2c 20 28 69 36 34 29 70 53 74 72 75 63 74  uf, (i64)pStruct
9210: 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29  ->nWriteCounter)
9220: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
9230: 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
9240: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
9250: 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  Lvl++){.      in
9260: 74 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20  t iSeg;         
9270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
9280: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
9290: 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20  hrough segments 
92a0: 2a 2f 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  */.      Fts5Str
92b0: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
92c0: 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
92d0: 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
92e0: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
92f0: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
9300: 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 4d 65   &buf, pLvl->nMe
9310: 72 67 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35  rge);.      fts5
9320: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
9330: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
9340: 20 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a 20 20   pLvl->nSeg);.  
9350: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c      assert( pLvl
9360: 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e  ->nMerge<=pLvl->
9370: 6e 53 65 67 20 29 3b 0a 0a 20 20 20 20 20 20 66  nSeg );..      f
9380: 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
9390: 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67  pLvl->nSeg; iSeg
93a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  ++){.        fts
93b0: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
93c0: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
93d0: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
93e0: 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20  g].iSegid);.    
93f0: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
9400: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
9410: 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61  c, &buf, pLvl->a
9420: 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69  Seg[iSeg].pgnoFi
9430: 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74  rst);.        ft
9440: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
9450: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
9460: 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  f, pLvl->aSeg[iS
9470: 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20  eg].pgnoLast);. 
9480: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
9490: 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
94a0: 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52  p, FTS5_STRUCTUR
94b0: 45 5f 52 4f 57 49 44 2c 20 62 75 66 2e 70 2c 20  E_ROWID, buf.p, 
94c0: 62 75 66 2e 6e 29 3b 0a 20 20 20 20 66 74 73 35  buf.n);.    fts5
94d0: 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29  BufferFree(&buf)
94e0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73  ;.  }.}..#if 0.s
94f0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
9500: 65 62 75 67 53 74 72 75 63 74 75 72 65 28 69 6e  ebugStructure(in
9510: 74 2a 2c 46 74 73 35 42 75 66 66 65 72 2a 2c 46  t*,Fts5Buffer*,F
9520: 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 3b 0a  ts5Structure*);.
9530: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
9540: 50 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 63  PrintStructure(c
9550: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 61 70 74  onst char *zCapt
9560: 69 6f 6e 2c 20 46 74 73 35 53 74 72 75 63 74 75  ion, Fts5Structu
9570: 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20  re *pStruct){.  
9580: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9590: 4f 4b 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72  OK;.  Fts5Buffer
95a0: 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26   buf;.  memset(&
95b0: 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62  buf, 0, sizeof(b
95c0: 75 66 29 29 3b 0a 20 20 66 74 73 35 44 65 62 75  uf));.  fts5Debu
95d0: 67 53 74 72 75 63 74 75 72 65 28 26 72 63 2c 20  gStructure(&rc, 
95e0: 26 62 75 66 2c 20 70 53 74 72 75 63 74 29 3b 0a  &buf, pStruct);.
95f0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74    fprintf(stdout
9600: 2c 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20 7a 43  , "%s: %s\n", zC
9610: 61 70 74 69 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a  aption, buf.p);.
9620: 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
9630: 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ;.  fts5BufferFr
9640: 65 65 28 26 62 75 66 29 3b 0a 7d 0a 23 65 6c 73  ee(&buf);.}.#els
9650: 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 50  e.# define fts5P
9660: 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 78 2c  rintStructure(x,
9670: 79 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  y).#endif..stati
9680: 63 20 69 6e 74 20 66 74 73 35 53 65 67 6d 65 6e  c int fts5Segmen
9690: 74 53 69 7a 65 28 46 74 73 35 53 74 72 75 63 74  tSize(Fts5Struct
96a0: 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
96b0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 31 20 2b 20  ){.  return 1 + 
96c0: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d  pSeg->pgnoLast -
96d0: 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
96e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
96f0: 6e 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 64 65  n a copy of inde
9700: 78 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72  x structure pStr
9710: 75 63 74 2e 20 45 78 63 65 70 74 2c 20 70 72 6f  uct. Except, pro
9720: 6d 6f 74 65 20 61 73 20 6d 61 6e 79 20 0a 2a 2a  mote as many .**
9730: 20 73 65 67 6d 65 6e 74 73 20 61 73 20 70 6f 73   segments as pos
9740: 73 69 62 6c 65 20 74 6f 20 6c 65 76 65 6c 20 69  sible to level i
9750: 50 72 6f 6d 6f 74 65 2e 20 49 66 20 61 6e 20 4f  Promote. If an O
9760: 4f 4d 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  OM occurs, NULL 
9770: 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  is .** returned.
9780: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9790: 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
97a0: 6d 6f 74 65 54 6f 28 0a 20 20 46 74 73 35 49 6e  moteTo(.  Fts5In
97b0: 64 65 78 20 2a 70 2c 0a 20 20 69 6e 74 20 69 50  dex *p,.  int iP
97c0: 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e 74 20 73 7a  romote,.  int sz
97d0: 50 72 6f 6d 6f 74 65 2c 0a 20 20 46 74 73 35 53  Promote,.  Fts5S
97e0: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
97f0: 74 0a 29 7b 0a 20 20 69 6e 74 20 69 6c 2c 20 69  t.){.  int il, i
9800: 73 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  s;.  Fts5Structu
9810: 72 65 4c 65 76 65 6c 20 2a 70 4f 75 74 20 3d 20  reLevel *pOut = 
9820: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
9830: 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a 0a 20 20 69  [iPromote];..  i
9840: 66 28 20 70 4f 75 74 2d 3e 6e 4d 65 72 67 65 3d  f( pOut->nMerge=
9850: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 6c  =0 ){.    for(il
9860: 3d 69 50 72 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c  =iPromote+1; il<
9870: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
9880: 20 69 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74   il++){.      Ft
9890: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
98a0: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
98b0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c 5d 3b 0a 20  t->aLevel[il];. 
98c0: 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e       if( pLvl->n
98d0: 4d 65 72 67 65 20 29 20 72 65 74 75 72 6e 3b 0a  Merge ) return;.
98e0: 20 20 20 20 20 20 66 6f 72 28 69 73 3d 70 4c 76        for(is=pLv
98f0: 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 73 3e 3d 30  l->nSeg-1; is>=0
9900: 3b 20 69 73 2d 2d 29 7b 0a 20 20 20 20 20 20 20  ; is--){.       
9910: 20 69 6e 74 20 73 7a 20 3d 20 66 74 73 35 53 65   int sz = fts5Se
9920: 67 6d 65 6e 74 53 69 7a 65 28 26 70 4c 76 6c 2d  gmentSize(&pLvl-
9930: 3e 61 53 65 67 5b 69 73 5d 29 3b 0a 20 20 20 20  >aSeg[is]);.    
9940: 20 20 20 20 69 66 28 20 73 7a 3e 73 7a 50 72 6f      if( sz>szPro
9950: 6d 6f 74 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  mote ) return;. 
9960: 20 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63         fts5Struc
9970: 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28  tureExtendLevel(
9980: 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c  &p->rc, pStruct,
9990: 20 69 50 72 6f 6d 6f 74 65 2c 20 31 2c 20 31 29   iPromote, 1, 1)
99a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
99b0: 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
99c0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75        memcpy(pOu
99d0: 74 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e  t->aSeg, &pLvl->
99e0: 61 53 65 67 5b 69 73 5d 2c 20 73 69 7a 65 6f 66  aSeg[is], sizeof
99f0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
9a00: 67 6d 65 6e 74 29 29 3b 0a 20 20 20 20 20 20 20  gment));.       
9a10: 20 70 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20   pOut->nSeg++;. 
9a20: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65         pLvl->nSe
9a30: 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  g--;.      }.   
9a40: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9a50: 41 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 68 61  A new segment ha
9a60: 73 20 6a 75 73 74 20 62 65 65 6e 20 77 72 69 74  s just been writ
9a70: 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 69 4c 76  ten to level iLv
9a80: 6c 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75 63  l of index struc
9a90: 74 75 72 65 0a 2a 2a 20 70 53 74 72 75 63 74 2e  ture.** pStruct.
9aa0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
9ab0: 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 6e 79  etermines if any
9ac0: 20 73 65 67 6d 65 6e 74 73 20 73 68 6f 75 6c 64   segments should
9ad0: 20 62 65 20 70 72 6f 6d 6f 74 65 64 0a 2a 2a 20   be promoted.** 
9ae0: 61 73 20 61 20 72 65 73 75 6c 74 2e 20 53 65 67  as a result. Seg
9af0: 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74  ments are promot
9b00: 65 64 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  ed in two scenar
9b10: 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
9b20: 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6a  If the segment j
9b30: 75 73 74 20 77 72 69 74 74 65 6e 20 69 73 20 73  ust written is s
9b40: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 6e 65 20  maller than one 
9b50: 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73  or more segments
9b60: 0a 2a 2a 20 20 20 20 20 20 77 69 74 68 69 6e 20  .**      within 
9b70: 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 6f 70  the previous pop
9b80: 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 69 74  ulated level, it
9b90: 20 69 73 20 70 72 6f 6d 6f 74 65 64 20 74 6f 20   is promoted to 
9ba0: 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20  the previous.** 
9bb0: 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 6c       populated l
9bc0: 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29  evel..**.**   b)
9bd0: 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20   If the segment 
9be0: 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69 73 20  just written is 
9bf0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
9c00: 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74 20 6f  newest segment o
9c10: 6e 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 6e 65  n.**      the ne
9c20: 78 74 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76  xt populated lev
9c30: 65 6c 2c 20 74 68 65 6e 20 74 68 61 74 20 73 65  el, then that se
9c40: 67 6d 65 6e 74 2c 20 61 6e 64 20 61 6e 79 20 6f  gment, and any o
9c50: 74 68 65 72 20 61 64 6a 61 63 65 6e 74 0a 2a 2a  ther adjacent.**
9c60: 20 20 20 20 20 20 73 65 67 6d 65 6e 74 73 20 74        segments t
9c70: 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73 6d 61  hat are also sma
9c80: 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ller than the on
9c90: 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20  e just written, 
9ca0: 61 72 65 20 0a 2a 2a 20 20 20 20 20 20 70 72 6f  are .**      pro
9cb0: 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  moted. .**.** If
9cc0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67   one or more seg
9cd0: 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74  ments are promot
9ce0: 65 64 2c 20 74 68 65 20 73 74 72 75 63 74 75 72  ed, the structur
9cf0: 65 20 6f 62 6a 65 63 74 20 69 73 20 75 70 64 61  e object is upda
9d00: 74 65 64 0a 2a 2a 20 74 6f 20 72 65 66 6c 65 63  ted.** to reflec
9d10: 74 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  t this..*/.stati
9d20: 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63  c void fts5Struc
9d30: 74 75 72 65 50 72 6f 6d 6f 74 65 28 0a 20 20 46  turePromote(.  F
9d40: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9d60: 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
9d70: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
9d80: 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Lvl,            
9d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
9da0: 64 65 78 20 6c 65 76 65 6c 20 6a 75 73 74 20 75  dex level just u
9db0: 70 64 61 74 65 64 20 2a 2f 0a 20 20 46 74 73 35  pdated */.  Fts5
9dc0: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
9dd0: 63 74 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ct          /* I
9de0: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a  ndex structure *
9df0: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  /.){.  if( p->rc
9e00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
9e10: 20 20 20 69 6e 74 20 69 54 73 74 3b 0a 20 20 20     int iTst;.   
9e20: 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 20 3d 20   int iPromote = 
9e30: 2d 31 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 72  -1;.    int szPr
9e40: 6f 6d 6f 74 65 20 3d 20 30 3b 20 20 20 20 20 20  omote = 0;      
9e50: 20 20 20 20 20 20 2f 2a 20 50 72 6f 6d 6f 74 65        /* Promote
9e60: 20 61 6e 79 74 68 69 6e 67 20 74 68 69 73 20 73   anything this s
9e70: 69 7a 65 20 6f 72 20 73 6d 61 6c 6c 65 72 20 2a  ize or smaller *
9e80: 2f 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  /.    Fts5Struct
9e90: 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
9ea0: 3b 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 6a  ;   /* Segment j
9eb0: 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  ust written */. 
9ec0: 20 20 20 69 6e 74 20 73 7a 53 65 67 3b 20 20 20     int szSeg;   
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ee0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 65 67 6d   /* Size of segm
9ef0: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
9f00: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 67   */.    int nSeg
9f10: 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76   = pStruct->aLev
9f20: 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 0a  el[iLvl].nSeg;..
9f30: 20 20 20 20 69 66 28 20 6e 53 65 67 3d 3d 30 20      if( nSeg==0 
9f40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 53  ) return;.    pS
9f50: 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  eg = &pStruct->a
9f60: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67  Level[iLvl].aSeg
9f70: 5b 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  [pStruct->aLevel
9f80: 5b 69 4c 76 6c 5d 2e 6e 53 65 67 2d 31 5d 3b 0a  [iLvl].nSeg-1];.
9f90: 20 20 20 20 73 7a 53 65 67 20 3d 20 28 31 20 2b      szSeg = (1 +
9fa0: 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20   pSeg->pgnoLast 
9fb0: 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  - pSeg->pgnoFirs
9fc0: 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  t);..    /* Chec
9fd0: 6b 20 66 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20  k for condition 
9fe0: 28 61 29 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  (a) */.    for(i
9ff0: 54 73 74 3d 69 4c 76 6c 2d 31 3b 20 69 54 73 74  Tst=iLvl-1; iTst
a000: 3e 3d 30 20 26 26 20 70 53 74 72 75 63 74 2d 3e  >=0 && pStruct->
a010: 61 4c 65 76 65 6c 5b 69 54 73 74 5d 2e 6e 53 65  aLevel[iTst].nSe
a020: 67 3d 3d 30 3b 20 69 54 73 74 2d 2d 29 3b 0a 20  g==0; iTst--);. 
a030: 20 20 20 69 66 28 20 69 54 73 74 3e 3d 30 20 29     if( iTst>=0 )
a040: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
a050: 20 20 20 20 20 69 6e 74 20 73 7a 4d 61 78 20 3d       int szMax =
a060: 20 30 3b 0a 20 20 20 20 20 20 46 74 73 35 53 74   0;.      Fts5St
a070: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 54  ructureLevel *pT
a080: 73 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  st = &pStruct->a
a090: 4c 65 76 65 6c 5b 69 54 73 74 5d 3b 0a 20 20 20  Level[iTst];.   
a0a0: 20 20 20 61 73 73 65 72 74 28 20 70 54 73 74 2d     assert( pTst-
a0b0: 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 3b 0a 20 20  >nMerge==0 );.  
a0c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
a0d0: 54 73 74 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b  Tst->nSeg; i++){
a0e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20  .        int sz 
a0f0: 3d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e  = pTst->aSeg[i].
a100: 70 67 6e 6f 4c 61 73 74 20 2d 20 70 54 73 74 2d  pgnoLast - pTst-
a110: 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 46 69 72  >aSeg[i].pgnoFir
a120: 73 74 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  st + 1;.        
a130: 69 66 28 20 73 7a 3e 73 7a 4d 61 78 20 29 20 73  if( sz>szMax ) s
a140: 7a 4d 61 78 20 3d 20 73 7a 3b 0a 20 20 20 20 20  zMax = sz;.     
a150: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d   }.      if( szM
a160: 61 78 3e 3d 73 7a 53 65 67 20 29 7b 0a 20 20 20  ax>=szSeg ){.   
a170: 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f       /* Conditio
a180: 6e 20 28 61 29 20 69 73 20 74 72 75 65 2e 20 50  n (a) is true. P
a190: 72 6f 6d 6f 74 65 20 74 68 65 20 6e 65 77 65 73  romote the newes
a1a0: 74 20 73 65 67 6d 65 6e 74 20 6f 6e 20 6c 65 76  t segment on lev
a1b0: 65 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  el .        ** i
a1c0: 4c 76 6c 20 74 6f 20 6c 65 76 65 6c 20 69 54 73  Lvl to level iTs
a1d0: 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  t.  */.        i
a1e0: 50 72 6f 6d 6f 74 65 20 3d 20 69 54 73 74 3b 0a  Promote = iTst;.
a1f0: 20 20 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74          szPromot
a200: 65 20 3d 20 73 7a 4d 61 78 3b 0a 20 20 20 20 20  e = szMax;.     
a210: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
a220: 20 49 66 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61   If condition (a
a230: 29 20 69 73 20 6e 6f 74 20 6d 65 74 2c 20 61 73  ) is not met, as
a240: 73 75 6d 65 20 28 62 29 20 69 73 20 74 72 75 65  sume (b) is true
a250: 2e 20 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f  . StructurePromo
a260: 74 65 54 6f 28 29 0a 20 20 20 20 2a 2a 20 69 73  teTo().    ** is
a270: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 69 74 20 69   a no-op if it i
a280: 73 20 6e 6f 74 2e 20 20 2a 2f 0a 20 20 20 20 69  s not.  */.    i
a290: 66 28 20 69 50 72 6f 6d 6f 74 65 3c 30 20 29 7b  f( iPromote<0 ){
a2a0: 0a 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20  .      iPromote 
a2b0: 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 73 7a  = iLvl;.      sz
a2c0: 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 53 65 67 3b  Promote = szSeg;
a2d0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53  .    }.    fts5S
a2e0: 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54  tructurePromoteT
a2f0: 6f 28 70 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 73  o(p, iPromote, s
a300: 7a 50 72 6f 6d 6f 74 65 2c 20 70 53 74 72 75 63  zPromote, pStruc
a310: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  t);.  }.}.../*.*
a320: 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74  * Advance the it
a330: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
a340: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
a350: 6e 74 2e 20 49 66 20 74 68 65 20 65 6e 64 20 6f  nt. If the end o
a360: 66 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73  f the .** doclis
a370: 74 2d 69 6e 64 65 78 20 70 61 67 65 20 69 73 20  t-index page is 
a380: 72 65 61 63 68 65 64 2c 20 72 65 74 75 72 6e 20  reached, return 
a390: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  non-zero..*/.sta
a3a0: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
a3b0: 78 4c 76 6c 4e 65 78 74 28 46 74 73 35 44 6c 69  xLvlNext(Fts5Dli
a3c0: 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20  dxLvl *pLvl){.  
a3d0: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 20  Fts5Data *pData 
a3e0: 3d 20 70 4c 76 6c 2d 3e 70 44 61 74 61 3b 0a 0a  = pLvl->pData;..
a3f0: 20 20 69 66 28 20 70 4c 76 6c 2d 3e 69 4f 66 66    if( pLvl->iOff
a400: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
a410: 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30  t( pLvl->bEof==0
a420: 20 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f   );.    pLvl->iO
a430: 66 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c 76 6c  ff = 1;.    pLvl
a440: 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65  ->iOff += fts5Ge
a450: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
a460: 2d 3e 70 5b 31 5d 2c 20 70 4c 76 6c 2d 3e 69 4c  ->p[1], pLvl->iL
a470: 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 70 4c  eafPgno);.    pL
a480: 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35  vl->iOff += fts5
a490: 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61  GetVarint(&pData
a4a0: 2d 3e 70 5b 70 4c 76 6c 2d 3e 69 4f 66 66 5d 2c  ->p[pLvl->iOff],
a4b0: 20 28 75 36 34 2a 29 26 70 4c 76 6c 2d 3e 69 52   (u64*)&pLvl->iR
a4c0: 6f 77 69 64 29 3b 0a 20 20 20 20 70 4c 76 6c 2d  owid);.    pLvl-
a4d0: 3e 69 46 69 72 73 74 4f 66 66 20 3d 20 70 4c 76  >iFirstOff = pLv
a4e0: 6c 2d 3e 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65  l->iOff;.  }else
a4f0: 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a  {.    int iOff;.
a500: 20 20 20 20 66 6f 72 28 69 4f 66 66 3d 70 4c 76      for(iOff=pLv
a510: 6c 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70 44  l->iOff; iOff<pD
a520: 61 74 61 2d 3e 6e 6e 3b 20 69 4f 66 66 2b 2b 29  ata->nn; iOff++)
a530: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74  {.      if( pDat
a540: 61 2d 3e 70 5b 69 4f 66 66 5d 20 29 20 62 72 65  a->p[iOff] ) bre
a550: 61 6b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ak; .    }..    
a560: 69 66 28 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e  if( iOff<pData->
a570: 6e 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  nn ){.      i64 
a580: 69 56 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c  iVal;.      pLvl
a590: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20 28  ->iLeafPgno += (
a5a0: 69 4f 66 66 20 2d 20 70 4c 76 6c 2d 3e 69 4f 66  iOff - pLvl->iOf
a5b0: 66 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 69 4f  f) + 1;.      iO
a5c0: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
a5d0: 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 4f  int(&pData->p[iO
a5e0: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c  ff], (u64*)&iVal
a5f0: 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69  );.      pLvl->i
a600: 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20  Rowid += iVal;. 
a610: 20 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20       pLvl->iOff 
a620: 3d 20 69 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73  = iOff;.    }els
a630: 65 7b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62  e{.      pLvl->b
a640: 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Eof = 1;.    }. 
a650: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 76   }..  return pLv
a660: 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  l->bEof;.}../*.*
a670: 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74  * Advance the it
a680: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
a690: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
a6a0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
a6b0: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e  t fts5DlidxIterN
a6c0: 65 78 74 52 28 46 74 73 35 49 6e 64 65 78 20 2a  extR(Fts5Index *
a6d0: 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  p, Fts5DlidxIter
a6e0: 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4c 76   *pIter, int iLv
a6f0: 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c  l){.  Fts5DlidxL
a700: 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65  vl *pLvl = &pIte
a710: 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a  r->aLvl[iLvl];..
a720: 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70    assert( iLvl<p
a730: 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20  Iter->nLvl );.  
a740: 69 66 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  if( fts5DlidxLvl
a750: 4e 65 78 74 28 70 4c 76 6c 29 20 29 7b 0a 20 20  Next(pLvl) ){.  
a760: 20 20 69 66 28 20 28 69 4c 76 6c 2b 31 29 20 3c    if( (iLvl+1) <
a770: 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a   pIter->nLvl ){.
a780: 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
a790: 74 65 72 4e 65 78 74 52 28 70 2c 20 70 49 74 65  terNextR(p, pIte
a7a0: 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20 20  r, iLvl+1);.    
a7b0: 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62 45    if( pLvl[1].bE
a7c0: 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  of==0 ){.       
a7d0: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
a7e0: 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20  (pLvl->pData);. 
a7f0: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c         memset(pL
a800: 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  vl, 0, sizeof(Ft
a810: 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
a820: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74        pLvl->pDat
a830: 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
a840: 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  (p, .           
a850: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
a860: 44 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c  D(pIter->iSegid,
a870: 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69   iLvl, pLvl[1].i
a880: 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20  LeafPgno).      
a890: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
a8a0: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 20 66   pLvl->pData ) f
a8b0: 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
a8c0: 70 4c 76 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pLvl);.      }. 
a8d0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
a8e0: 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30  rn pIter->aLvl[0
a8f0: 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63  ].bEof;.}.static
a900: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
a910: 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78  erNext(Fts5Index
a920: 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74   *p, Fts5DlidxIt
a930: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
a940: 74 75 72 6e 20 66 74 73 35 44 6c 69 64 78 49 74  turn fts5DlidxIt
a950: 65 72 4e 65 78 74 52 28 70 2c 20 70 49 74 65 72  erNextR(p, pIter
a960: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , 0);.}../*.** T
a970: 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
a980: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
a990: 61 72 67 75 6d 65 6e 74 20 68 61 73 20 74 68 65  argument has the
a9a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
a9b0: 73 20 73 65 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c  s set.** as foll
a9c0: 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ows. This functi
a9d0: 6f 6e 20 73 65 74 73 20 75 70 20 74 68 65 20 72  on sets up the r
a9e0: 65 73 74 20 6f 66 20 74 68 65 20 69 74 65 72 61  est of the itera
a9f0: 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74 0a 2a  tor so that it.*
aa00: 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
aa10: 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74  first rowid in t
aa20: 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  he doclist-index
aa30: 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 44 61 74 61 3a  ..**.**   pData:
aa40: 0a 2a 2a 20 20 20 20 20 70 6f 69 6e 74 65 72 20  .**     pointer 
aa50: 74 6f 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  to doclist-index
aa60: 20 72 65 63 6f 72 64 2c 20 0a 2a 2a 0a 2a 2a 20   record, .**.** 
aa70: 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
aa80: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 70 49 74  on is called pIt
aa90: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 69 73  er->iLeafPgno is
aaa0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
aab0: 20 74 68 65 0a 2a 2a 20 64 6f 63 6c 69 73 74 20   the.** doclist 
aac0: 69 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  is associated wi
aad0: 74 68 20 28 74 68 65 20 6f 6e 65 20 66 65 61 74  th (the one feat
aae0: 75 72 69 6e 67 20 74 68 65 20 74 65 72 6d 29 2e  uring the term).
aaf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
ab00: 74 73 35 44 6c 69 64 78 49 74 65 72 46 69 72 73  ts5DlidxIterFirs
ab10: 74 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  t(Fts5DlidxIter 
ab20: 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69  *pIter){.  int i
ab30: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
ab40: 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29  Iter->nLvl; i++)
ab50: 7b 0a 20 20 20 20 66 74 73 35 44 6c 69 64 78 4c  {.    fts5DlidxL
ab60: 76 6c 4e 65 78 74 28 26 70 49 74 65 72 2d 3e 61  vlNext(&pIter->a
ab70: 4c 76 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  Lvl[i]);.  }.  r
ab80: 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76  eturn pIter->aLv
ab90: 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 0a 73  l[0].bEof;.}...s
aba0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
abb0: 69 64 78 49 74 65 72 45 6f 66 28 46 74 73 35 49  idxIterEof(Fts5I
abc0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69  ndex *p, Fts5Dli
abd0: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
abe0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 21 3d    return p->rc!=
abf0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74  SQLITE_OK || pIt
ac00: 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66  er->aLvl[0].bEof
ac10: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
ac20: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61   fts5DlidxIterLa
ac30: 73 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  st(Fts5Index *p,
ac40: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
ac50: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pIter){.  int i;
ac60: 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 65  ..  /* Advance e
ac70: 61 63 68 20 6c 65 76 65 6c 20 74 6f 20 74 68 65  ach level to the
ac80: 20 6c 61 73 74 20 65 6e 74 72 79 20 6f 6e 20 74   last entry on t
ac90: 68 65 20 6c 61 73 74 20 70 61 67 65 20 2a 2f 0a  he last page */.
aca0: 20 20 66 6f 72 28 69 3d 70 49 74 65 72 2d 3e 6e    for(i=pIter->n
acb0: 4c 76 6c 2d 31 3b 20 70 2d 3e 72 63 3d 3d 53 51  Lvl-1; p->rc==SQ
acc0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3e 3d 30 3b  LITE_OK && i>=0;
acd0: 20 69 2d 2d 29 7b 0a 20 20 20 20 46 74 73 35 44   i--){.    Fts5D
ace0: 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20  lidxLvl *pLvl = 
acf0: 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b  &pIter->aLvl[i];
ad00: 0a 20 20 20 20 77 68 69 6c 65 28 20 66 74 73 35  .    while( fts5
ad10: 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76  DlidxLvlNext(pLv
ad20: 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76  l)==0 );.    pLv
ad30: 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 0a 20 20  l->bEof = 0;..  
ad40: 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20    if( i>0 ){.   
ad50: 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20     Fts5DlidxLvl 
ad60: 2a 70 43 68 69 6c 64 20 3d 20 26 70 4c 76 6c 5b  *pChild = &pLvl[
ad70: 2d 31 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 44  -1];.      fts5D
ad80: 61 74 61 52 65 6c 65 61 73 65 28 70 43 68 69 6c  ataRelease(pChil
ad90: 64 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20  d->pData);.     
ada0: 20 6d 65 6d 73 65 74 28 70 43 68 69 6c 64 2c 20   memset(pChild, 
adb0: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  0, sizeof(Fts5Dl
adc0: 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20  idxLvl));.      
add0: 70 43 68 69 6c 64 2d 3e 70 44 61 74 61 20 3d 20  pChild->pData = 
ade0: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
adf0: 0a 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f  .          FTS5_
ae00: 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65  DLIDX_ROWID(pIte
ae10: 72 2d 3e 69 53 65 67 69 64 2c 20 69 2d 31 2c 20  r->iSegid, i-1, 
ae20: 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29  pLvl->iLeafPgno)
ae30: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
ae40: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76    }.}../*.** Mov
ae50: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  e the iterator p
ae60: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
ae70: 79 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  y argument to th
ae80: 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
ae90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
aea0: 66 74 73 35 44 6c 69 64 78 4c 76 6c 50 72 65 76  fts5DlidxLvlPrev
aeb0: 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70  (Fts5DlidxLvl *p
aec0: 4c 76 6c 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66  Lvl){.  int iOff
aed0: 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 0a   = pLvl->iOff;..
aee0: 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e    assert( pLvl->
aef0: 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 69 66 28  bEof==0 );.  if(
af00: 20 69 4f 66 66 3c 3d 70 4c 76 6c 2d 3e 69 46 69   iOff<=pLvl->iFi
af10: 72 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 70 4c  rstOff ){.    pL
af20: 76 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  vl->bEof = 1;.  
af30: 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a 61  }else{.    u8 *a
af40: 20 3d 20 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e   = pLvl->pData->
af50: 70 3b 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b  p;.    i64 iVal;
af60: 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b  .    int iLimit;
af70: 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
af80: 20 69 6e 74 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a   int nZero = 0;.
af90: 0a 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c  .    /* Currentl
afa0: 79 20 69 4f 66 66 20 70 6f 69 6e 74 73 20 74 6f  y iOff points to
afb0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
afc0: 6f 66 20 61 20 76 61 72 69 6e 74 2e 20 54 68 69  of a varint. Thi
afd0: 73 20 62 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20  s block .    ** 
afe0: 64 65 63 72 65 6d 65 6e 74 73 20 69 4f 66 66 20  decrements iOff 
aff0: 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20  until it points 
b000: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
b010: 65 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  e of the previou
b020: 73 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 6e 74  s .    ** varint
b030: 2e 20 54 61 6b 69 6e 67 20 63 61 72 65 20 6e 6f  . Taking care no
b040: 74 20 74 6f 20 72 65 61 64 20 61 6e 79 20 6d 65  t to read any me
b050: 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 74  mory locations t
b060: 68 61 74 20 6f 63 63 75 72 0a 20 20 20 20 2a 2a  hat occur.    **
b070: 20 62 65 66 6f 72 65 20 74 68 65 20 62 75 66 66   before the buff
b080: 65 72 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 2a  er in memory.  *
b090: 2f 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 28  /.    iLimit = (
b0a0: 69 4f 66 66 3e 39 20 3f 20 69 4f 66 66 2d 39 20  iOff>9 ? iOff-9 
b0b0: 3a 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 4f  : 0);.    for(iO
b0c0: 66 66 2d 2d 3b 20 69 4f 66 66 3e 69 4c 69 6d 69  ff--; iOff>iLimi
b0d0: 74 3b 20 69 4f 66 66 2d 2d 29 7b 0a 20 20 20 20  t; iOff--){.    
b0e0: 20 20 69 66 28 20 28 61 5b 69 4f 66 66 2d 31 5d    if( (a[iOff-1]
b0f0: 20 26 20 30 78 38 30 29 3d 3d 30 20 29 20 62 72   & 0x80)==0 ) br
b100: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
b110: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  fts5GetVarint(&a
b120: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
b130: 56 61 6c 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  Val);.    pLvl->
b140: 69 52 6f 77 69 64 20 2d 3d 20 69 56 61 6c 3b 0a  iRowid -= iVal;.
b150: 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50      pLvl->iLeafP
b160: 67 6e 6f 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 53  gno--;..    /* S
b170: 6b 69 70 20 62 61 63 6b 77 61 72 64 73 20 70 61  kip backwards pa
b180: 73 74 20 61 6e 79 20 30 78 30 30 20 76 61 72 69  st any 0x00 vari
b190: 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  nts. */.    for(
b1a0: 69 69 3d 69 4f 66 66 2d 31 3b 20 69 69 3e 3d 70  ii=iOff-1; ii>=p
b1b0: 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 26  Lvl->iFirstOff &
b1c0: 26 20 61 5b 69 69 5d 3d 3d 30 78 30 30 3b 20 69  & a[ii]==0x00; i
b1d0: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 6e 5a 65 72  i--){.      nZer
b1e0: 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  o++;.    }.    i
b1f0: 66 28 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69  f( ii>=pLvl->iFi
b200: 72 73 74 4f 66 66 20 26 26 20 28 61 5b 69 69 5d  rstOff && (a[ii]
b210: 20 26 20 30 78 38 30 29 20 29 7b 0a 20 20 20 20   & 0x80) ){.    
b220: 20 20 2f 2a 20 54 68 65 20 62 79 74 65 20 69 6d    /* The byte im
b230: 6d 65 64 69 61 74 65 6c 79 20 62 65 66 6f 72 65  mediately before
b240: 20 74 68 65 20 6c 61 73 74 20 30 78 30 30 20 62   the last 0x00 b
b250: 79 74 65 20 68 61 73 20 74 68 65 20 30 78 38 30  yte has the 0x80
b260: 20 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 73 65   bit.      ** se
b270: 74 2e 20 53 6f 20 74 68 65 20 6c 61 73 74 20 30  t. So the last 0
b280: 78 30 30 20 69 73 20 6f 6e 6c 79 20 61 20 76 61  x00 is only a va
b290: 72 69 6e 74 20 30 20 69 66 20 74 68 65 72 65 20  rint 0 if there 
b2a0: 61 72 65 20 38 20 6d 6f 72 65 20 30 78 38 30 0a  are 8 more 0x80.
b2b0: 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 62        ** bytes b
b2c0: 65 66 6f 72 65 20 61 5b 69 69 5d 2e 20 2a 2f 0a  efore a[ii]. */.
b2d0: 20 20 20 20 20 20 69 6e 74 20 62 5a 65 72 6f 20        int bZero 
b2e0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
b2f0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 61 73    /* True if las
b300: 74 20 30 78 30 30 20 63 6f 75 6e 74 73 20 2a 2f  t 0x00 counts */
b310: 0a 20 20 20 20 20 20 69 66 28 20 28 69 69 2d 38  .      if( (ii-8
b320: 29 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f  )>=pLvl->iFirstO
b330: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ff ){.        in
b340: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t j;.        for
b350: 28 6a 3d 31 3b 20 6a 3c 3d 38 20 26 26 20 28 61  (j=1; j<=8 && (a
b360: 5b 69 69 2d 6a 5d 20 26 20 30 78 38 30 29 3b 20  [ii-j] & 0x80); 
b370: 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 62 5a  j++);.        bZ
b380: 65 72 6f 20 3d 20 28 6a 3e 38 29 3b 0a 20 20 20  ero = (j>8);.   
b390: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62     }.      if( b
b3a0: 5a 65 72 6f 3d 3d 30 20 29 20 6e 5a 65 72 6f 2d  Zero==0 ) nZero-
b3b0: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 76  -;.    }.    pLv
b3c0: 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2d 3d 20  l->iLeafPgno -= 
b3d0: 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 4c 76 6c 2d  nZero;.    pLvl-
b3e0: 3e 69 4f 66 66 20 3d 20 69 4f 66 66 20 2d 20 6e  >iOff = iOff - n
b3f0: 5a 65 72 6f 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Zero;.  }..  ret
b400: 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a  urn pLvl->bEof;.
b410: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
b420: 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 52  s5DlidxIterPrevR
b430: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
b440: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
b450: 74 65 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a  ter, int iLvl){.
b460: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a    Fts5DlidxLvl *
b470: 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61  pLvl = &pIter->a
b480: 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73  Lvl[iLvl];..  as
b490: 73 65 72 74 28 20 69 4c 76 6c 3c 70 49 74 65 72  sert( iLvl<pIter
b4a0: 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20  ->nLvl );.  if( 
b4b0: 66 74 73 35 44 6c 69 64 78 4c 76 6c 50 72 65 76  fts5DlidxLvlPrev
b4c0: 28 70 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69 66  (pLvl) ){.    if
b4d0: 28 20 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74  ( (iLvl+1) < pIt
b4e0: 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20  er->nLvl ){.    
b4f0: 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50    fts5DlidxIterP
b500: 72 65 76 52 28 70 2c 20 70 49 74 65 72 2c 20 69  revR(p, pIter, i
b510: 4c 76 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  Lvl+1);.      if
b520: 28 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d  ( pLvl[1].bEof==
b530: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  0 ){.        fts
b540: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76  5DataRelease(pLv
b550: 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20  l->pData);.     
b560: 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20     memset(pLvl, 
b570: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  0, sizeof(Fts5Dl
b580: 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20  idxLvl));.      
b590: 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20    pLvl->pData = 
b5a0: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
b5b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 54 53  .            FTS
b5c0: 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49  5_DLIDX_ROWID(pI
b5d0: 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76  ter->iSegid, iLv
b5e0: 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66  l, pLvl[1].iLeaf
b5f0: 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b  Pgno).        );
b600: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76  .        if( pLv
b610: 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20 20 20  l->pData ){.    
b620: 20 20 20 20 20 20 77 68 69 6c 65 28 20 66 74 73        while( fts
b630: 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c  5DlidxLvlNext(pL
b640: 76 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  vl)==0 );.      
b650: 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d      pLvl->bEof =
b660: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
b670: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
b680: 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
b690: 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d  >aLvl[0].bEof;.}
b6a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
b6b0: 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 46 74  DlidxIterPrev(Ft
b6c0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
b6d0: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
b6e0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  ){.  return fts5
b6f0: 44 6c 69 64 78 49 74 65 72 50 72 65 76 52 28 70  DlidxIterPrevR(p
b700: 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a  , pIter, 0);.}..
b710: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 64 6f 63  /*.** Free a doc
b720: 6c 69 73 74 2d 69 6e 64 65 78 20 69 74 65 72 61  list-index itera
b730: 74 6f 72 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63  tor object alloc
b740: 61 74 65 64 20 62 79 20 66 74 73 35 44 6c 69 64  ated by fts5Dlid
b750: 78 49 74 65 72 49 6e 69 74 28 29 2e 0a 2a 2f 0a  xIterInit()..*/.
b760: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
b770: 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 46 74  DlidxIterFree(Ft
b780: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
b790: 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72  er){.  if( pIter
b7a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
b7b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
b7c0: 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b  ter->nLvl; i++){
b7d0: 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52  .      fts5DataR
b7e0: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 61 4c  elease(pIter->aL
b7f0: 76 6c 5b 69 5d 2e 70 44 61 74 61 29 3b 0a 20 20  vl[i].pData);.  
b800: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
b810: 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d  free(pIter);.  }
b820: 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 44  .}..static Fts5D
b830: 6c 69 64 78 49 74 65 72 20 2a 66 74 73 35 44 6c  lidxIter *fts5Dl
b840: 69 64 78 49 74 65 72 49 6e 69 74 28 0a 20 20 46  idxIterInit(.  F
b850: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
b860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b870: 2a 20 46 74 73 35 20 42 61 63 6b 65 6e 64 20 74  * Fts5 Backend t
b880: 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
b890: 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20   */.  int bRev, 
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8b0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
b8c0: 72 20 4f 52 44 45 52 20 42 59 20 41 53 43 20 2a  r ORDER BY ASC *
b8d0: 2f 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20  /.  int iSegid, 
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8f0: 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69      /* Segment i
b900: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  d */.  int iLeaf
b910: 50 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg              
b920: 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70         /* Leaf p
b930: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f  age number to lo
b940: 61 64 20 64 6c 69 64 78 20 66 6f 72 20 2a 2f 0a  ad dlidx for */.
b950: 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74  ){.  Fts5DlidxIt
b960: 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20  er *pIter = 0;. 
b970: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 44   int i;.  int bD
b980: 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  one = 0;..  for(
b990: 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  i=0; p->rc==SQLI
b9a0: 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d  TE_OK && bDone==
b9b0: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  0; i++){.    int
b9c0: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
b9d0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 29 20 2b  Fts5DlidxIter) +
b9e0: 20 69 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35   i * sizeof(Fts5
b9f0: 44 6c 69 64 78 4c 76 6c 29 3b 0a 20 20 20 20 46  DlidxLvl);.    F
ba00: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 4e  ts5DlidxIter *pN
ba10: 65 77 3b 0a 0a 20 20 20 20 70 4e 65 77 20 3d 20  ew;..    pNew = 
ba20: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 2a 29  (Fts5DlidxIter*)
ba30: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
ba40: 70 49 74 65 72 2c 20 6e 42 79 74 65 29 3b 0a 20  pIter, nByte);. 
ba50: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
ba60: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
ba70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
ba80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
ba90: 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35  64 iRowid = FTS5
baa0: 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 69 53 65  _DLIDX_ROWID(iSe
bab0: 67 69 64 2c 20 69 2c 20 69 4c 65 61 66 50 67 29  gid, i, iLeafPg)
bac0: 3b 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64  ;.      Fts5Dlid
bad0: 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 4e  xLvl *pLvl = &pN
bae0: 65 77 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20  ew->aLvl[i];.   
baf0: 20 20 20 70 49 74 65 72 20 3d 20 70 4e 65 77 3b     pIter = pNew;
bb00: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c  .      memset(pL
bb10: 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  vl, 0, sizeof(Ft
bb20: 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
bb30: 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20      pLvl->pData 
bb40: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
bb50: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , iRowid);.     
bb60: 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61   if( pLvl->pData
bb70: 20 26 26 20 28 70 4c 76 6c 2d 3e 70 44 61 74 61   && (pLvl->pData
bb80: 2d 3e 70 5b 30 5d 20 26 20 30 78 30 30 30 31 29  ->p[0] & 0x0001)
bb90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ==0 ){.        b
bba0: 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Done = 1;.      
bbb0: 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  }.      pIter->n
bbc0: 4c 76 6c 20 3d 20 69 2b 31 3b 0a 20 20 20 20 7d  Lvl = i+1;.    }
bbd0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
bbe0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
bbf0: 20 20 20 20 70 49 74 65 72 2d 3e 69 53 65 67 69      pIter->iSegi
bc00: 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20  d = iSegid;.    
bc10: 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20  if( bRev==0 ){. 
bc20: 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
bc30: 65 72 46 69 72 73 74 28 70 49 74 65 72 29 3b 0a  erFirst(pIter);.
bc40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bc50: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61   fts5DlidxIterLa
bc60: 73 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  st(p, pIter);.  
bc70: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
bc80: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
bc90: 29 7b 0a 20 20 20 20 66 74 73 35 44 6c 69 64 78  ){.    fts5Dlidx
bca0: 49 74 65 72 46 72 65 65 28 70 49 74 65 72 29 3b  IterFree(pIter);
bcb0: 0a 20 20 20 20 70 49 74 65 72 20 3d 20 30 3b 0a  .    pIter = 0;.
bcc0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49    }..  return pI
bcd0: 74 65 72 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  ter;.}..static i
bce0: 36 34 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  64 fts5DlidxIter
bcf0: 52 6f 77 69 64 28 46 74 73 35 44 6c 69 64 78 49  Rowid(Fts5DlidxI
bd00: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72  ter *pIter){.  r
bd10: 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76  eturn pIter->aLv
bd20: 6c 5b 30 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 73  l[0].iRowid;.}.s
bd30: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
bd40: 69 64 78 49 74 65 72 50 67 6e 6f 28 46 74 73 35  idxIterPgno(Fts5
bd50: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
bd60: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65  ){.  return pIte
bd70: 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 4c 65 61 66  r->aLvl[0].iLeaf
bd80: 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  Pgno;.}../*.** L
bd90: 6f 61 64 20 74 68 65 20 6e 65 78 74 20 6c 65 61  oad the next lea
bda0: 66 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  f page into the 
bdb0: 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72  segment iterator
bdc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
bdd0: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
bde0: 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65  Page(.  Fts5Inde
bdf0: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
be00: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
be10: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
be20: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
be30: 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
be40: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
be50: 74 6f 20 61 64 76 61 6e 63 65 20 74 6f 20 6e 65  to advance to ne
be60: 78 74 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  xt page */.){.  
be70: 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b  Fts5Data *pLeaf;
be80: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
be90: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
bea0: 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 20 20 66  pIter->pSeg;.  f
beb0: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
bec0: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
bed0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
bee0: 2b 2b 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d  ++;.  if( pIter-
bef0: 3e 70 4e 65 78 74 4c 65 61 66 20 29 7b 0a 20 20  >pNextLeaf ){.  
bf00: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
bf10: 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61   pIter->pNextLea
bf20: 66 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4e  f;.    pIter->pN
bf30: 65 78 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d  extLeaf = 0;.  }
bf40: 65 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e  else if( pIter->
bf50: 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 53 65 67 2d  iLeafPgno<=pSeg-
bf60: 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20  >pgnoLast ){.   
bf70: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
bf80: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
bf90: 0a 20 20 20 20 20 20 20 20 46 54 53 35 5f 53 45  .        FTS5_SE
bfa0: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67  GMENT_ROWID(pSeg
bfb0: 2d 3e 69 53 65 67 69 64 2c 20 70 49 74 65 72 2d  ->iSegid, pIter-
bfc0: 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20  >iLeafPgno).    
bfd0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
bfe0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
bff0: 3b 0a 20 20 7d 0a 20 20 70 4c 65 61 66 20 3d 20  ;.  }.  pLeaf = 
c000: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 0a 20  pIter->pLeaf;.. 
c010: 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20   if( pLeaf ){.  
c020: 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f    pIter->iPgidxO
c030: 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65  ff = pLeaf->szLe
c040: 61 66 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35  af;.    if( fts5
c050: 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70  LeafIsTermless(p
c060: 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 70  Leaf) ){.      p
c070: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
c080: 69 73 74 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e 2b  ist = pLeaf->nn+
c090: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
c0a0: 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64      pIter->iPgid
c0b0: 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  xOff += fts5GetV
c0c0: 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e  arint32(&pLeaf->
c0d0: 70 5b 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f  p[pIter->iPgidxO
c0e0: 66 66 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 70  ff],.          p
c0f0: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
c100: 69 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ist.      );.   
c110: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
c120: 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74  Argument p point
c130: 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
c140: 6e 74 61 69 6e 69 6e 67 20 61 20 76 61 72 69 6e  ntaining a varin
c150: 74 20 74 6f 20 62 65 20 69 6e 74 65 72 70 72 65  t to be interpre
c160: 74 65 64 20 61 73 20 61 0a 2a 2a 20 70 6f 73 69  ted as a.** posi
c170: 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20 66  tion list size f
c180: 69 65 6c 64 2e 20 52 65 61 64 20 74 68 65 20 76  ield. Read the v
c190: 61 72 69 6e 74 20 61 6e 64 20 72 65 74 75 72 6e  arint and return
c1a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
c1b0: 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e 20 42 65  ytes.** read. Be
c1c0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
c1d0: 73 65 74 20 2a 70 6e 53 7a 20 74 6f 20 74 68 65  set *pnSz to the
c1e0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
c1f0: 20 69 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   in the position
c200: 0a 2a 2a 20 6c 69 73 74 2c 20 61 6e 64 20 2a 70  .** list, and *p
c210: 62 44 65 6c 20 74 6f 20 74 72 75 65 20 69 66 20  bDel to true if 
c220: 74 68 65 20 64 65 6c 65 74 65 20 66 6c 61 67 20  the delete flag 
c230: 69 73 20 73 65 74 2c 20 6f 72 20 66 61 6c 73 65  is set, or false
c240: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
c250: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 47 65  tatic int fts5Ge
c260: 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 63 6f 6e  tPoslistSize(con
c270: 73 74 20 75 38 20 2a 70 2c 20 69 6e 74 20 2a 70  st u8 *p, int *p
c280: 6e 53 7a 2c 20 69 6e 74 20 2a 70 62 44 65 6c 29  nSz, int *pbDel)
c290: 7b 0a 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 69  {.  int nSz;.  i
c2a0: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 66 74 73 35  nt n = 0;.  fts5
c2b0: 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28  FastGetVarint32(
c2c0: 70 2c 20 6e 2c 20 6e 53 7a 29 3b 0a 20 20 61 73  p, n, nSz);.  as
c2d0: 73 65 72 74 5f 6e 63 28 20 6e 53 7a 3e 3d 30 20  sert_nc( nSz>=0 
c2e0: 29 3b 0a 20 20 2a 70 6e 53 7a 20 3d 20 6e 53 7a  );.  *pnSz = nSz
c2f0: 2f 32 3b 0a 20 20 2a 70 62 44 65 6c 20 3d 20 6e  /2;.  *pbDel = n
c300: 53 7a 20 26 20 30 78 30 30 30 31 3b 0a 20 20 72  Sz & 0x0001;.  r
c310: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
c320: 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c  * Fts5SegIter.iL
c330: 65 61 66 4f 66 66 73 65 74 20 63 75 72 72 65 6e  eafOffset curren
c340: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  tly points to th
c350: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
c360: 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69  a.** position-li
c370: 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 52  st size field. R
c380: 65 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ead the value of
c390: 20 74 68 65 20 66 69 65 6c 64 20 61 6e 64 20 73   the field and s
c3a0: 74 6f 72 65 20 69 74 0a 2a 2a 20 69 6e 20 74 68  tore it.** in th
c3b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
c3c0: 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46  ables:.**.**   F
c3d0: 74 73 35 53 65 67 49 74 65 72 2e 6e 50 6f 73 0a  ts5SegIter.nPos.
c3e0: 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72  **   Fts5SegIter
c3f0: 2e 62 44 65 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61 76  .bDel.**.** Leav
c400: 65 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c  e Fts5SegIter.iL
c410: 65 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 69  eafOffset pointi
c420: 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ng to the first 
c430: 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  byte of the .** 
c440: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f  position list co
c450: 6e 74 65 6e 74 20 28 69 66 20 61 6e 79 29 2e 0a  ntent (if any)..
c460: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
c470: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
c480: 6f 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  os(Fts5Index *p,
c490: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
c4a0: 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  ter){.  if( p->r
c4b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
c4c0: 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70      int iOff = p
c4d0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
c4e0: 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f  t;  /* Offset to
c4f0: 20 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 20 20   read at */.    
c500: 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b  ASSERT_SZLEAF_OK
c510: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
c520: 20 20 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66      if( p->pConf
c530: 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
c540: 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b  5_DETAIL_NONE ){
c550: 0a 20 20 20 20 20 20 69 6e 74 20 69 45 6f 64 20  .      int iEod 
c560: 3d 20 4d 49 4e 28 70 49 74 65 72 2d 3e 69 45 6e  = MIN(pIter->iEn
c570: 64 6f 66 44 6f 63 6c 69 73 74 2c 20 70 49 74 65  dofDoclist, pIte
c580: 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  r->pLeaf->szLeaf
c590: 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
c5a0: 62 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  bDel = 0;.      
c5b0: 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 31 3b  pIter->nPos = 1;
c5c0: 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c  .      if( iOff<
c5d0: 69 45 6f 64 20 26 26 20 70 49 74 65 72 2d 3e 70  iEod && pIter->p
c5e0: 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 3d 3d 30  Leaf->p[iOff]==0
c5f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65   ){.        pIte
c600: 72 2d 3e 62 44 65 6c 20 3d 20 31 3b 0a 20 20 20  r->bDel = 1;.   
c610: 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20       iOff++;.   
c620: 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 69 45       if( iOff<iE
c630: 6f 64 20 26 26 20 70 49 74 65 72 2d 3e 70 4c 65  od && pIter->pLe
c640: 61 66 2d 3e 70 5b 69 4f 66 66 5d 3d 3d 30 20 29  af->p[iOff]==0 )
c650: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
c660: 72 2d 3e 6e 50 6f 73 20 3d 20 31 3b 0a 20 20 20  r->nPos = 1;.   
c670: 20 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20         iOff++;. 
c680: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
c690: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e          pIter->n
c6a0: 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Pos = 0;.       
c6b0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
c6c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
c6d0: 6e 53 7a 3b 0a 20 20 20 20 20 20 66 74 73 35 46  nSz;.      fts5F
c6e0: 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70  astGetVarint32(p
c6f0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 2c 20  Iter->pLeaf->p, 
c700: 69 4f 66 66 2c 20 6e 53 7a 29 3b 0a 20 20 20 20  iOff, nSz);.    
c710: 20 20 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20    pIter->bDel = 
c720: 28 6e 53 7a 20 26 20 30 78 30 30 30 31 29 3b 0a  (nSz & 0x0001);.
c730: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f        pIter->nPo
c740: 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a 20 20 20 20  s = nSz>>1;.    
c750: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 49 74    assert_nc( pIt
c760: 65 72 2d 3e 6e 50 6f 73 3e 3d 30 20 29 3b 0a 20  er->nPos>=0 );. 
c770: 20 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e     }.    pIter->
c780: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
c790: 66 66 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  ff;.  }.}..stati
c7a0: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
c7b0: 65 72 4c 6f 61 64 52 6f 77 69 64 28 46 74 73 35  erLoadRowid(Fts5
c7c0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
c7d0: 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
c7e0: 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e   u8 *a = pIter->
c7f0: 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20 20 20  pLeaf->p;       
c800: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65   /* Buffer to re
c810: 61 64 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a  ad data from */.
c820: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74    int iOff = pIt
c830: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
c840: 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41  ..  ASSERT_SZLEA
c850: 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61  F_OK(pIter->pLea
c860: 66 29 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e 3d  f);.  if( iOff>=
c870: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
c880: 4c 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35  Leaf ){.    fts5
c890: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
c8a0: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69  p, pIter);.    i
c8b0: 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  f( pIter->pLeaf=
c8c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
c8d0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
c8e0: 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
c8f0: 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 72  CORRUPT;.      r
c900: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
c910: 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20 20 20 61   iOff = 4;.    a
c920: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
c930: 3e 70 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 20 2b  >p;.  }.  iOff +
c940: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  = sqlite3Fts5Get
c950: 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
c960: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
c970: 52 6f 77 69 64 29 3b 0a 20 20 70 49 74 65 72 2d  Rowid);.  pIter-
c980: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
c990: 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74  Off;.}../*.** Ft
c9a0: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
c9b0: 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20  ffset currently 
c9c0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
c9d0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
c9e0: 0a 2a 2a 20 22 6e 53 75 66 66 69 78 22 20 66 69  .** "nSuffix" fi
c9f0: 65 6c 64 20 6f 66 20 61 20 74 65 72 6d 2e 20 46  eld of a term. F
ca00: 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
ca10: 72 20 6e 4b 65 65 70 20 63 6f 6e 74 61 69 6e 73  r nKeep contains
ca20: 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   the value.** of
ca30: 20 74 68 65 20 22 6e 50 72 65 66 69 78 22 20 66   the "nPrefix" f
ca40: 69 65 6c 64 20 28 69 66 20 74 68 65 72 65 20 77  ield (if there w
ca50: 61 73 20 6f 6e 65 20 2d 20 69 74 20 69 73 20 70  as one - it is p
ca60: 61 73 73 65 64 20 30 20 69 66 20 74 68 69 73 20  assed 0 if this 
ca70: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
ca80: 74 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d  term in the segm
ca90: 65 6e 74 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ent)..**.** This
caa0: 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61   function popula
cab0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73  tes:.**.**   Fts
cac0: 35 53 65 67 49 74 65 72 2e 74 65 72 6d 0a 2a 2a  5SegIter.term.**
cad0: 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 72     Fts5SegIter.r
cae0: 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 61 63 63 6f 72  owid.**.** accor
caf0: 64 69 6e 67 6c 79 20 61 6e 64 20 6c 65 61 76 65  dingly and leave
cb00: 73 20 28 46 74 73 35 53 65 67 49 74 65 72 2e 69  s (Fts5SegIter.i
cb10: 4c 65 61 66 4f 66 66 73 65 74 29 20 73 65 74 20  LeafOffset) set 
cb20: 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  to the content o
cb30: 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70  f.** the first p
cb40: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e 20 54 68  osition list. Th
cb50: 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
cb60: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 64 6f 63  belonging to doc
cb70: 75 6d 65 6e 74 20 0a 2a 2a 20 28 46 74 73 35 53  ument .** (Fts5S
cb80: 65 67 49 74 65 72 2e 69 52 6f 77 69 64 29 2e 0a  egIter.iRowid)..
cb90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
cba0: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65  ts5SegIterLoadTe
cbb0: 72 6d 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  rm(Fts5Index *p,
cbc0: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
cbd0: 74 65 72 2c 20 69 6e 74 20 6e 4b 65 65 70 29 7b  ter, int nKeep){
cbe0: 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72  .  u8 *a = pIter
cbf0: 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20  ->pLeaf->p;     
cc00: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
cc10: 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 2a  read data from *
cc20: 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70  /.  int iOff = p
cc30: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
cc40: 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f  t;  /* Offset to
cc50: 20 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 69 6e   read at */.  in
cc60: 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20  t nNew;         
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cc80: 20 42 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61   Bytes of new da
cc90: 74 61 20 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d  ta */..  iOff +=
cca0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
ccb0: 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29  (&a[iOff], nNew)
ccc0: 3b 0a 20 20 69 66 28 20 69 4f 66 66 2b 6e 4e 65  ;.  if( iOff+nNe
ccd0: 77 3e 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  w>pIter->pLeaf->
cce0: 6e 6e 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  nn ){.    p->rc 
ccf0: 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
cd00: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
cd10: 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20    pIter->term.n 
cd20: 3d 20 6e 4b 65 65 70 3b 0a 20 20 66 74 73 35 42  = nKeep;.  fts5B
cd30: 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
cd40: 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e  &p->rc, &pIter->
cd50: 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69  term, nNew, &a[i
cd60: 4f 66 66 5d 29 3b 0a 20 20 69 4f 66 66 20 2b 3d  Off]);.  iOff +=
cd70: 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e   nNew;.  pIter->
cd80: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20  iTermLeafOffset 
cd90: 3d 20 69 4f 66 66 3b 0a 20 20 70 49 74 65 72 2d  = iOff;.  pIter-
cda0: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d  >iTermLeafPgno =
cdb0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
cdc0: 6f 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  o;.  pIter->iLea
cdd0: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
cde0: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 50  .  if( pIter->iP
cdf0: 67 69 64 78 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  gidxOff>=pIter->
ce00: 70 4c 65 61 66 2d 3e 6e 6e 20 29 7b 0a 20 20 20  pLeaf->nn ){.   
ce10: 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
ce20: 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70  clist = pIter->p
ce30: 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65  Leaf->nn+1;.  }e
ce40: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
ce50: 74 72 61 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  tra;.    pIter->
ce60: 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73  iPgidxOff += fts
ce70: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
ce80: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
ce90: 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  ], nExtra);.    
cea0: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
ceb0: 6c 69 73 74 20 2b 3d 20 6e 45 78 74 72 61 3b 0a  list += nExtra;.
cec0: 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74    }..  fts5SegIt
ced0: 65 72 4c 6f 61 64 52 6f 77 69 64 28 70 2c 20 70  erLoadRowid(p, p
cee0: 49 74 65 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  Iter);.}..static
cef0: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
cf00: 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 2a  rNext(Fts5Index*
cf10: 2c 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c 20  , Fts5SegIter*, 
cf20: 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  int*);.static vo
cf30: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  id fts5SegIterNe
cf40: 78 74 5f 52 65 76 65 72 73 65 28 46 74 73 35 49  xt_Reverse(Fts5I
cf50: 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67 49 74  ndex*, Fts5SegIt
cf60: 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74  er*, int*);.stat
cf70: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
cf80: 74 65 72 4e 65 78 74 5f 4e 6f 6e 65 28 46 74 73  terNext_None(Fts
cf90: 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67  5Index*, Fts5Seg
cfa0: 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 73  Iter*, int*);..s
cfb0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
cfc0: 65 67 49 74 65 72 53 65 74 4e 65 78 74 28 46 74  egIterSetNext(Ft
cfd0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
cfe0: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
cff0: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c  .  if( pIter->fl
d000: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
d010: 45 52 5f 52 45 56 45 52 53 45 20 29 7b 0a 20 20  ER_REVERSE ){.  
d020: 20 20 70 49 74 65 72 2d 3e 78 4e 65 78 74 20 3d    pIter->xNext =
d030: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
d040: 5f 52 65 76 65 72 73 65 3b 0a 20 20 7d 65 6c 73  _Reverse;.  }els
d050: 65 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67  e if( p->pConfig
d060: 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
d070: 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
d080: 20 20 20 70 49 74 65 72 2d 3e 78 4e 65 78 74 20     pIter->xNext 
d090: 3d 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  = fts5SegIterNex
d0a0: 74 5f 4e 6f 6e 65 3b 0a 20 20 7d 65 6c 73 65 7b  t_None;.  }else{
d0b0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 78 4e 65 78  .    pIter->xNex
d0c0: 74 20 3d 20 66 74 73 35 53 65 67 49 74 65 72 4e  t = fts5SegIterN
d0d0: 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ext;.  }.}../*.*
d0e0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
d0f0: 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
d100: 20 70 49 74 65 72 20 74 6f 20 69 74 65 72 61 74   pIter to iterat
d110: 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 6e  e through the en
d120: 74 72 69 65 73 20 69 6e 0a 2a 2a 20 73 65 67 6d  tries in.** segm
d130: 65 6e 74 20 70 53 65 67 2e 20 54 68 65 20 69 74  ent pSeg. The it
d140: 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70  erator is left p
d150: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
d160: 69 72 73 74 20 65 6e 74 72 79 20 77 68 65 6e 20  irst entry when 
d170: 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
d180: 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a  n returns..**.**
d190: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
d1a0: 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72  urs, Fts5Index.r
d1b0: 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61  c is set to an a
d1c0: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
d1d0: 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e   code. If .** an
d1e0: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
d1f0: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
d200: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
d210: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
d220: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
d230: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
d240: 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49  terInit(.  Fts5I
d250: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
d260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
d270: 53 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  S index object *
d280: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
d290: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20  eSegment *pSeg, 
d2a0: 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
d2b0: 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f  on of segment */
d2c0: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
d2d0: 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20  pIter           
d2e0: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20     /* Object to 
d2f0: 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20  populate */.){. 
d300: 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46   if( pSeg->pgnoF
d310: 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  irst==0 ){.    /
d320: 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  * This happens i
d330: 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69 73  f the segment is
d340: 20 62 65 69 6e 67 20 75 73 65 64 20 61 73 20 61   being used as a
d350: 6e 20 69 6e 70 75 74 20 74 6f 20 61 6e 20 69 6e  n input to an in
d360: 63 72 65 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a  cremental.    **
d370: 20 6d 65 72 67 65 20 61 6e 64 20 61 6c 6c 20 64   merge and all d
d380: 61 74 61 20 68 61 73 20 61 6c 72 65 61 64 79 20  ata has already 
d390: 62 65 65 6e 20 22 74 72 69 6d 6d 65 64 22 2e 20  been "trimmed". 
d3a0: 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  See function.   
d3b0: 20 2a 2a 20 66 74 73 35 54 72 69 6d 53 65 67 6d   ** fts5TrimSegm
d3c0: 65 6e 74 73 28 29 20 66 6f 72 20 64 65 74 61 69  ents() for detai
d3d0: 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ls. In this case
d3e0: 20 6c 65 61 76 65 20 74 68 65 20 69 74 65 72 61   leave the itera
d3f0: 74 6f 72 20 65 6d 70 74 79 2e 0a 20 20 20 20 2a  tor empty..    *
d400: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  * The caller wil
d410: 6c 20 73 65 65 20 74 68 65 20 28 70 49 74 65 72  l see the (pIter
d420: 2d 3e 70 4c 65 61 66 3d 3d 30 29 20 61 6e 64 20  ->pLeaf==0) and 
d430: 61 73 73 75 6d 65 20 74 68 65 20 69 74 65 72 61  assume the itera
d440: 74 6f 72 20 69 73 0a 20 20 20 20 2a 2a 20 61 74  tor is.    ** at
d450: 20 45 4f 46 20 61 6c 72 65 61 64 79 2e 20 2a 2f   EOF already. */
d460: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
d470: 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a  er->pLeaf==0 );.
d480: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d490: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
d4a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d  LITE_OK ){.    m
d4b0: 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
d4c0: 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b  sizeof(*pIter));
d4d0: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
d4e0: 53 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72  SetNext(p, pIter
d4f0: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 53  );.    pIter->pS
d500: 65 67 20 3d 20 70 53 65 67 3b 0a 20 20 20 20 70  eg = pSeg;.    p
d510: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
d520: 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  = pSeg->pgnoFirs
d530: 74 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67  t-1;.    fts5Seg
d540: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
d550: 70 49 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  pIter);.  }..  i
d560: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
d570: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72  _OK ){.    pIter
d580: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
d590: 34 3b 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63  4;.    assert_nc
d5a0: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  ( pIter->pLeaf->
d5b0: 6e 6e 3e 34 20 29 3b 0a 20 20 20 20 61 73 73 65  nn>4 );.    asse
d5c0: 72 74 28 20 66 74 73 35 4c 65 61 66 46 69 72 73  rt( fts5LeafFirs
d5d0: 74 54 65 72 6d 4f 66 66 28 70 49 74 65 72 2d 3e  tTermOff(pIter->
d5e0: 70 4c 65 61 66 29 3d 3d 34 20 29 3b 0a 20 20 20  pLeaf)==4 );.   
d5f0: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
d600: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
d610: 2d 3e 73 7a 4c 65 61 66 2b 31 3b 0a 20 20 20 20  ->szLeaf+1;.    
d620: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54  fts5SegIterLoadT
d630: 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 30 29  erm(p, pIter, 0)
d640: 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  ;.    fts5SegIte
d650: 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
d660: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
d670: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d680: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c  is only ever cal
d690: 6c 65 64 20 6f 6e 20 69 74 65 72 61 74 6f 72 73  led on iterators
d6a0: 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c   created by call
d6b0: 73 20 74 6f 0a 2a 2a 20 46 74 73 35 49 6e 64 65  s to.** Fts5Inde
d6c0: 78 51 75 65 72 79 28 29 20 77 69 74 68 20 74 68  xQuery() with th
d6d0: 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
d6e0: 59 5f 44 45 53 43 20 66 6c 61 67 20 73 65 74 2e  Y_DESC flag set.
d6f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61  .**.** The itera
d700: 74 6f 72 20 69 73 20 69 6e 20 61 6e 20 75 6e 75  tor is in an unu
d710: 73 75 61 6c 20 73 74 61 74 65 20 77 68 65 6e 20  sual state when 
d720: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
d730: 20 63 61 6c 6c 65 64 3a 20 74 68 65 0a 2a 2a 20   called: the.** 
d740: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
d750: 66 4f 66 66 73 65 74 20 76 61 72 69 61 62 6c 65  fOffset variable
d760: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
d770: 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 74 61  ffset of the sta
d780: 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 70 6f 73  rt of.** the pos
d790: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
d7a0: 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20 66 69  field for the fi
d7b0: 72 73 74 20 72 65 6c 65 76 61 6e 74 20 72 6f 77  rst relevant row
d7c0: 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  id on the page..
d7d0: 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 72  ** Fts5SegIter.r
d7e0: 6f 77 69 64 20 69 73 20 73 65 74 2c 20 62 75 74  owid is set, but
d7f0: 20 6e 50 6f 73 20 61 6e 64 20 62 44 65 6c 20 61   nPos and bDel a
d800: 72 65 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  re not..**.** Th
d810: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64 76 61  is function adva
d820: 6e 63 65 73 20 74 68 65 20 69 74 65 72 61 74 6f  nces the iterato
d830: 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
d840: 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  nts to the last 
d850: 0a 2a 2a 20 72 65 6c 65 76 61 6e 74 20 72 6f 77  .** relevant row
d860: 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61  id on the page a
d870: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
d880: 2c 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  , initializes th
d890: 65 20 0a 2a 2a 20 61 52 6f 77 69 64 4f 66 66 73  e .** aRowidOffs
d8a0: 65 74 5b 5d 20 61 6e 64 20 69 52 6f 77 69 64 4f  et[] and iRowidO
d8b0: 66 66 73 65 74 20 76 61 72 69 61 62 6c 65 73 2e  ffset variables.
d8c0: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
d8d0: 68 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 69  he iterator.** i
d8e0: 73 20 69 6e 20 69 74 73 20 72 65 67 75 6c 61 72  s in its regular
d8f0: 20 73 74 61 74 65 20 2d 20 46 74 73 35 53 65 67   state - Fts5Seg
d900: 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74  Iter.iLeafOffset
d910: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
d920: 69 72 73 74 0a 2a 2a 20 62 79 74 65 20 6f 66 20  irst.** byte of 
d930: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
d940: 74 20 63 6f 6e 74 65 6e 74 20 61 73 73 6f 63 69  t content associ
d950: 61 74 65 64 20 77 69 74 68 20 73 61 69 64 20 72  ated with said r
d960: 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  owid..*/.static 
d970: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
d980: 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28  ReverseInitPage(
d990: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
d9a0: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
d9b0: 29 7b 0a 20 20 69 6e 74 20 65 44 65 74 61 69 6c  ){.  int eDetail
d9c0: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65   = p->pConfig->e
d9d0: 44 65 74 61 69 6c 3b 0a 20 20 69 6e 74 20 6e 20  Detail;.  int n 
d9e0: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
d9f0: 73 7a 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69 20  szLeaf;.  int i 
da00: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
da10: 66 73 65 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20  fset;.  u8 *a = 
da20: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
da30: 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66  .  int iRowidOff
da40: 73 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  set = 0;..  if( 
da50: 6e 3e 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44  n>pIter->iEndofD
da60: 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 6e 20  oclist ){.    n 
da70: 3d 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44  = pIter->iEndofD
da80: 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 41  oclist;.  }..  A
da90: 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28  SSERT_SZLEAF_OK(
daa0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
dab0: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
dac0: 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20 30 3b   i64 iDelta = 0;
dad0: 0a 0a 20 20 20 20 69 66 28 20 65 44 65 74 61 69  ..    if( eDetai
dae0: 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l==FTS5_DETAIL_N
daf0: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ONE ){.      /* 
db00: 74 6f 64 6f 20 2a 2f 0a 20 20 20 20 20 20 69 66  todo */.      if
db10: 28 20 69 3c 6e 20 26 26 20 61 5b 69 5d 3d 3d 30  ( i<n && a[i]==0
db20: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b   ){.        i++;
db30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e  .        if( i<n
db40: 20 26 26 20 61 5b 69 5d 3d 3d 30 20 29 20 69 2b   && a[i]==0 ) i+
db50: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
db60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
db70: 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69 6e 74 20  nPos;.      int 
db80: 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20 69 20  bDummy;.      i 
db90: 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73  += fts5GetPoslis
dba0: 74 53 69 7a 65 28 26 61 5b 69 5d 2c 20 26 6e 50  tSize(&a[i], &nP
dbb0: 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20  os, &bDummy);.  
dbc0: 20 20 20 20 69 20 2b 3d 20 6e 50 6f 73 3b 0a 20      i += nPos;. 
dbd0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d     }.    if( i>=
dbe0: 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  n ) break;.    i
dbf0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
dc00: 74 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26  t(&a[i], (u64*)&
dc10: 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74  iDelta);.    pIt
dc20: 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44  er->iRowid += iD
dc30: 65 6c 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  elta;..    /* If
dc40: 20 6e 65 63 65 73 73 61 72 79 2c 20 67 72 6f 77   necessary, grow
dc50: 20 74 68 65 20 70 49 74 65 72 2d 3e 61 52 6f 77   the pIter->aRow
dc60: 69 64 4f 66 66 73 65 74 5b 5d 20 61 72 72 61 79  idOffset[] array
dc70: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 52 6f  . */.    if( iRo
dc80: 77 69 64 4f 66 66 73 65 74 3e 3d 70 49 74 65 72  widOffset>=pIter
dc90: 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 29  ->nRowidOffset )
dca0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77  {.      int nNew
dcb0: 20 3d 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64   = pIter->nRowid
dcc0: 4f 66 66 73 65 74 20 2b 20 38 3b 0a 20 20 20 20  Offset + 8;.    
dcd0: 20 20 69 6e 74 20 2a 61 4e 65 77 20 3d 20 28 69    int *aNew = (i
dce0: 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  nt*)sqlite3_real
dcf0: 6c 6f 63 28 70 49 74 65 72 2d 3e 61 52 6f 77 69  loc(pIter->aRowi
dd00: 64 4f 66 66 73 65 74 2c 20 6e 4e 65 77 2a 73 69  dOffset, nNew*si
dd10: 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20  zeof(int));.    
dd20: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
dd30: 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
dd40: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
dd50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
dd60: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65      }.      pIte
dd70: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 20  r->aRowidOffset 
dd80: 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70 49  = aNew;.      pI
dd90: 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65  ter->nRowidOffse
dda0: 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a  t = nNew;.    }.
ddb0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77  .    pIter->aRow
ddc0: 69 64 4f 66 66 73 65 74 5b 69 52 6f 77 69 64 4f  idOffset[iRowidO
ddd0: 66 66 73 65 74 2b 2b 5d 20 3d 20 70 49 74 65 72  ffset++] = pIter
dde0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20  ->iLeafOffset;. 
ddf0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
de00: 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 7d 0a 20  ffset = i;.  }. 
de10: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66   pIter->iRowidOf
de20: 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66  fset = iRowidOff
de30: 73 65 74 3b 0a 20 20 66 74 73 35 53 65 67 49 74  set;.  fts5SegIt
de40: 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
de50: 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  ter);.}../*.**.*
de60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
de70: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
de80: 4e 65 77 50 61 67 65 28 46 74 73 35 49 6e 64 65  NewPage(Fts5Inde
de90: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
dea0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73  r *pIter){.  ass
deb0: 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67  ert( pIter->flag
dec0: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
ded0: 5f 52 45 56 45 52 53 45 20 29 3b 0a 20 20 61 73  _REVERSE );.  as
dee0: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
def0: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
df00: 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 0a 20 20  R_ONETERM );..  
df10: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
df20: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
df30: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
df40: 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  0;.  while( p->r
df50: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
df60: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
df70: 3e 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61  >pIter->iTermLea
df80: 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 46 74 73  fPgno ){.    Fts
df90: 35 44 61 74 61 20 2a 70 4e 65 77 3b 0a 20 20 20  5Data *pNew;.   
dfa0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
dfb0: 6f 2d 2d 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  o--;.    pNew = 
dfc0: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
dfd0: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
dfe0: 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70 49  ID(.          pI
dff0: 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  ter->pSeg->iSegi
e000: 64 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  d, pIter->iLeafP
e010: 67 6e 6f 0a 20 20 20 20 29 29 3b 0a 20 20 20 20  gno.    ));.    
e020: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
e030: 20 20 2f 2a 20 69 54 65 72 6d 4c 65 61 66 4f 66    /* iTermLeafOf
e040: 66 73 65 74 20 6d 61 79 20 62 65 20 65 71 75 61  fset may be equa
e050: 6c 20 74 6f 20 73 7a 4c 65 61 66 20 69 66 20 74  l to szLeaf if t
e060: 68 65 20 74 65 72 6d 20 69 73 20 74 68 65 20 6c  he term is the l
e070: 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  ast.      ** thi
e080: 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2d  ng on the page -
e090: 20 69 2e 65 2e 20 74 68 65 20 66 69 72 73 74 20   i.e. the first 
e0a0: 72 6f 77 69 64 20 69 73 20 6f 6e 20 74 68 65 20  rowid is on the 
e0b0: 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65 2e 0a  following page..
e0c0: 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
e0d0: 20 63 61 73 65 20 6c 65 61 76 65 20 70 49 74 65   case leave pIte
e0e0: 72 2d 3e 70 4c 65 61 66 3d 3d 30 2c 20 74 68 69  r->pLeaf==0, thi
e0f0: 73 20 69 74 65 72 61 74 6f 72 20 69 73 20 61 74  s iterator is at
e100: 20 45 4f 46 2e 20 2a 2f 0a 20 20 20 20 20 20 69   EOF. */.      i
e110: 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  f( pIter->iLeafP
e120: 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 54 65 72  gno==pIter->iTer
e130: 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20  mLeafPgno ){.   
e140: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
e150: 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a  er->pLeaf==0 );.
e160: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
e170: 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  r->iTermLeafOffs
e180: 65 74 3c 70 4e 65 77 2d 3e 73 7a 4c 65 61 66 20  et<pNew->szLeaf 
e190: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
e1a0: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77  er->pLeaf = pNew
e1b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
e1c0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
e1d0: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
e1e0: 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  fOffset;.       
e1f0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
e200: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77          int iRow
e210: 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69  idOff;.        i
e220: 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c  RowidOff = fts5L
e230: 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
e240: 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20  (pNew);.        
e250: 69 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b  if( iRowidOff ){
e260: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
e270: 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a  ->pLeaf = pNew;.
e280: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
e290: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
e2a0: 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20  RowidOff;.      
e2b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
e2c0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c     if( pIter->pL
e2d0: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 75  eaf ){.        u
e2e0: 38 20 2a 61 20 3d 20 26 70 49 74 65 72 2d 3e 70  8 *a = &pIter->p
e2f0: 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69  Leaf->p[pIter->i
e300: 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20  LeafOffset];.   
e310: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
e320: 66 4f 66 66 73 65 74 20 2b 3d 20 66 74 73 35 47  fOffset += fts5G
e330: 65 74 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34  etVarint(a, (u64
e340: 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
e350: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
e360: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e370: 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
e380: 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20  elease(pNew);.  
e390: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
e3a0: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c  .  if( pIter->pL
e3b0: 65 61 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72  eaf ){.    pIter
e3c0: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
e3d0: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
e3e0: 6e 6e 2b 31 3b 0a 20 20 20 20 66 74 73 35 53 65  nn+1;.    fts5Se
e3f0: 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
e400: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
e410: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
e420: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
e430: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
e440: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
e450: 67 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79  gument currently
e460: 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  .** points to a 
e470: 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 2e 20 41  delete marker. A
e480: 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 20 69   delete marker i
e490: 73 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20  s an entry with 
e4a0: 61 20 30 20 62 79 74 65 0a 2a 2a 20 70 6f 73 69  a 0 byte.** posi
e4b0: 74 69 6f 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74  tion-list..*/.st
e4c0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c  atic int fts5Mul
e4d0: 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 46 74  tiIterIsEmpty(Ft
e4e0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
e4f0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
e500: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
e510: 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
e520: 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31  [pIter->aFirst[1
e530: 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20 72 65 74  ].iFirst];.  ret
e540: 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49  urn (p->rc==SQLI
e550: 54 45 5f 4f 4b 20 26 26 20 70 53 65 67 2d 3e 70  TE_OK && pSeg->p
e560: 4c 65 61 66 20 26 26 20 70 53 65 67 2d 3e 6e 50  Leaf && pSeg->nP
e570: 6f 73 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  os==0);.}../*.**
e580: 20 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f   Advance iterato
e590: 72 20 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e  r pIter to the n
e5a0: 65 78 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a  ext entry..**.**
e5b0: 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   This version of
e5c0: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
e5d0: 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  () is only used 
e5e0: 62 79 20 72 65 76 65 72 73 65 20 69 74 65 72 61  by reverse itera
e5f0: 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tors..*/.static 
e600: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
e610: 4e 65 78 74 5f 52 65 76 65 72 73 65 28 0a 20 20  Next_Reverse(.  
e620: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e640: 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
e650: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
e660: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
e670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
e680: 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
e690: 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 55  ce */.  int *pbU
e6a0: 6e 75 73 65 64 20 20 20 20 20 20 20 20 20 20 20  nused           
e6b0: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65          /* Unuse
e6c0: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
e6d0: 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
e6e0: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
e6f0: 56 45 52 53 45 20 29 3b 0a 20 20 61 73 73 65 72  VERSE );.  asser
e700: 74 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c  t( pIter->pNextL
e710: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53  eaf==0 );.  UNUS
e720: 45 44 5f 50 41 52 41 4d 28 70 62 55 6e 75 73 65  ED_PARAM(pbUnuse
e730: 64 29 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72  d);..  if( pIter
e740: 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30  ->iRowidOffset>0
e750: 20 29 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20   ){.    u8 *a = 
e760: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
e770: 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20  .    int iOff;. 
e780: 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a     i64 iDelta;..
e790: 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
e7a0: 64 4f 66 66 73 65 74 2d 2d 3b 0a 20 20 20 20 70  dOffset--;.    p
e7b0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
e7c0: 74 20 3d 20 70 49 74 65 72 2d 3e 61 52 6f 77 69  t = pIter->aRowi
e7d0: 64 4f 66 66 73 65 74 5b 70 49 74 65 72 2d 3e 69  dOffset[pIter->i
e7e0: 52 6f 77 69 64 4f 66 66 73 65 74 5d 3b 0a 20 20  RowidOffset];.  
e7f0: 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
e800: 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
e810: 0a 20 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65  .    iOff = pIte
e820: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a  r->iLeafOffset;.
e830: 20 20 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66      if( p->pConf
e840: 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53  ig->eDetail!=FTS
e850: 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b  5_DETAIL_NONE ){
e860: 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 70  .      iOff += p
e870: 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20  Iter->nPos;.    
e880: 7d 0a 20 20 20 20 66 74 73 35 47 65 74 56 61 72  }.    fts5GetVar
e890: 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75  int(&a[iOff], (u
e8a0: 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
e8b0: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
e8c0: 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c  -= iDelta;.  }el
e8d0: 73 65 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49  se{.    fts5SegI
e8e0: 74 65 72 52 65 76 65 72 73 65 4e 65 77 50 61 67  terReverseNewPag
e8f0: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d  e(p, pIter);.  }
e900: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
e910: 65 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72  e iterator pIter
e920: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
e930: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76  ry..**.** This v
e940: 65 72 73 69 6f 6e 20 6f 66 20 66 74 73 35 53 65  ersion of fts5Se
e950: 67 49 74 65 72 4e 65 78 74 28 29 20 69 73 20 6f  gIterNext() is o
e960: 6e 6c 79 20 75 73 65 64 20 69 66 20 64 65 74 61  nly used if deta
e970: 69 6c 3d 6e 6f 6e 65 20 61 6e 64 20 74 68 65 0a  il=none and the.
e980: 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e  ** iterator is n
e990: 6f 74 20 61 20 72 65 76 65 72 73 65 20 64 69 72  ot a reverse dir
e9a0: 65 63 74 69 6f 6e 20 69 74 65 72 61 74 6f 72 2e  ection iterator.
e9b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e9c0: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f  fts5SegIterNext_
e9d0: 4e 6f 6e 65 28 0a 20 20 46 74 73 35 49 6e 64 65  None(.  Fts5Inde
e9e0: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
e9f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
ea00: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
ea10: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
ea20: 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
ea30: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
ea40: 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20  to advance */.  
ea50: 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20  int *pbNewTerm  
ea60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea70: 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66 6f 72 20  /* OUT: Set for 
ea80: 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20  new term */.){. 
ea90: 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 61 73   int iOff;..  as
eaa0: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
eab0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65  ITE_OK );.  asse
eac0: 72 74 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67  rt( (pIter->flag
ead0: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
eae0: 5f 52 45 56 45 52 53 45 29 3d 3d 30 20 29 3b 0a  _REVERSE)==0 );.
eaf0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f    assert( p->pCo
eb00: 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46  nfig->eDetail==F
eb10: 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
eb20: 29 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c  );..  ASSERT_SZL
eb30: 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c  EAF_OK(pIter->pL
eb40: 65 61 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 70  eaf);.  iOff = p
eb50: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
eb60: 74 3b 0a 0a 20 20 2f 2a 20 4e 65 78 74 20 65 6e  t;..  /* Next en
eb70: 74 72 79 20 69 73 20 6f 6e 20 74 68 65 20 6e 65  try is on the ne
eb80: 78 74 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28  xt page */.  if(
eb90: 20 70 49 74 65 72 2d 3e 70 53 65 67 20 26 26 20   pIter->pSeg && 
eba0: 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65  iOff>=pIter->pLe
ebb0: 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
ebc0: 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
ebd0: 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
ebe0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 7c  .    if( p->rc |
ebf0: 7c 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  | pIter->pLeaf==
ec00: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
ec10: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 3d 20  pIter->iRowid = 
ec20: 30 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b  0;.    iOff = 4;
ec30: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 4f 66 66  .  }..  if( iOff
ec40: 3c 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f  <pIter->iEndofDo
ec50: 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  clist ){.    /* 
ec60: 4e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e  Next entry is on
ec70: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
ec80: 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 44 65  e */.    i64 iDe
ec90: 6c 74 61 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  lta;.    iOff +=
eca0: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
ecb0: 61 72 69 6e 74 28 26 70 49 74 65 72 2d 3e 70 4c  arint(&pIter->pL
ecc0: 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  eaf->p[iOff], (u
ecd0: 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
ece0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
ecf0: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20  fset = iOff;.   
ed00: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b   pIter->iRowid +
ed10: 3d 20 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73  = iDelta;.  }els
ed20: 65 20 69 66 28 20 28 70 49 74 65 72 2d 3e 66 6c  e if( (pIter->fl
ed30: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
ed40: 45 52 5f 4f 4e 45 54 45 52 4d 29 3d 3d 30 20 29  ER_ONETERM)==0 )
ed50: 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  {.    if( pIter-
ed60: 3e 70 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69  >pSeg ){.      i
ed70: 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20  nt nKeep = 0;.  
ed80: 20 20 20 20 69 66 28 20 69 4f 66 66 21 3d 66 74      if( iOff!=ft
ed90: 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f  s5LeafFirstTermO
eda0: 66 66 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  ff(pIter->pLeaf)
edb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66   ){.        iOff
edc0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
edd0: 74 33 32 28 26 70 49 74 65 72 2d 3e 70 4c 65 61  t32(&pIter->pLea
ede0: 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65  f->p[iOff], nKee
edf0: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
ee00: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
ee10: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20  fset = iOff;.   
ee20: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
ee30: 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c  adTerm(p, pIter,
ee40: 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 7d 65 6c   nKeep);.    }el
ee50: 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  se{.      const 
ee60: 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20  u8 *pList = 0;. 
ee70: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
ee80: 2a 7a 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20  *zTerm = 0;.    
ee90: 20 20 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20 20    int nList;.   
eea0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
eeb0: 73 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48  shScanNext(p->pH
eec0: 61 73 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ash);.      sqli
eed0: 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
eee0: 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26  ntry(p->pHash, &
eef0: 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26  zTerm, &pList, &
ef00: 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66  nList);.      if
ef10: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
ef20: 6f 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b  o next_none_eof;
ef30: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  .      pIter->pL
ef40: 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c  eaf->p = (u8*)pL
ef50: 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72  ist;.      pIter
ef60: 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 6e 4c  ->pLeaf->nn = nL
ef70: 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72  ist;.      pIter
ef80: 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  ->pLeaf->szLeaf 
ef90: 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70  = nList;.      p
efa0: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
efb0: 69 73 74 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  ist = nList;.   
efc0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
efd0: 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 26  fferSet(&p->rc,&
efe0: 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 28 69 6e  pIter->term, (in
eff0: 74 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c  t)strlen(zTerm),
f000: 20 28 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20   (u8*)zTerm);.  
f010: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
f020: 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74  Offset = fts5Get
f030: 56 61 72 69 6e 74 28 70 4c 69 73 74 2c 20 28 75  Varint(pList, (u
f040: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
f050: 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  id);.    }..    
f060: 69 66 28 20 70 62 4e 65 77 54 65 72 6d 20 29 20  if( pbNewTerm ) 
f070: 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a  *pbNewTerm = 1;.
f080: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 6f 74    }else{.    got
f090: 6f 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b  o next_none_eof;
f0a0: 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49  .  }..  fts5SegI
f0b0: 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
f0c0: 49 74 65 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Iter);..  return
f0d0: 3b 0a 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66  ;. next_none_eof
f0e0: 3a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  :.  fts5DataRele
f0f0: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
f100: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  );.  pIter->pLea
f110: 66 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  f = 0;.}.../*.**
f120: 20 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f   Advance iterato
f130: 72 20 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e  r pIter to the n
f140: 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a  ext entry. .**.*
f150: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
f160: 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e  curs, Fts5Index.
f170: 72 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  rc is set to an 
f180: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
f190: 72 20 63 6f 64 65 2e 20 49 74 20 0a 2a 2a 20 69  r code. It .** i
f1a0: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
f1b0: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
f1c0: 20 69 74 65 72 61 74 6f 72 20 72 65 61 63 68 65   iterator reache
f1d0: 73 20 45 4f 46 2e 20 49 66 20 61 6e 20 65 72 72  s EOF. If an err
f1e0: 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61  or has .** alrea
f1f0: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
f200: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
f210: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
f220: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
f230: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
f240: 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49  terNext(.  Fts5I
f250: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
f260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
f270: 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
f280: 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
f290: 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
f2a0: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
f2b0: 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f  or to advance */
f2c0: 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72  .  int *pbNewTer
f2d0: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
f2e0: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66     /* OUT: Set f
f2f0: 6f 72 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29  or new term */.)
f300: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c  {.  Fts5Data *pL
f310: 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  eaf = pIter->pLe
f320: 61 66 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a  af;.  int iOff;.
f330: 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d    int bNewTerm =
f340: 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20   0;.  int nKeep 
f350: 3d 20 30 3b 0a 20 20 75 38 20 2a 61 3b 0a 20 20  = 0;.  u8 *a;.  
f360: 69 6e 74 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74  int n;..  assert
f370: 28 20 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 7c  ( pbNewTerm==0 |
f380: 7c 20 2a 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20  | *pbNewTerm==0 
f390: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
f3a0: 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
f3b0: 21 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  !=FTS5_DETAIL_NO
f3c0: 4e 45 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72  NE );..  /* Sear
f3d0: 63 68 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f  ch for the end o
f3e0: 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  f the position l
f3f0: 69 73 74 20 77 69 74 68 69 6e 20 74 68 65 20 63  ist within the c
f400: 75 72 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a  urrent page. */.
f410: 20 20 61 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a    a = pLeaf->p;.
f420: 20 20 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c    n = pLeaf->szL
f430: 65 61 66 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53  eaf;..  ASSERT_S
f440: 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b  ZLEAF_OK(pLeaf);
f450: 0a 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d  .  iOff = pIter-
f460: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 20 70  >iLeafOffset + p
f470: 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 69  Iter->nPos;..  i
f480: 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  f( iOff<n ){.   
f490: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 65 6e 74   /* The next ent
f4a0: 72 79 20 69 73 20 6f 6e 20 74 68 65 20 63 75 72  ry is on the cur
f4b0: 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20  rent page. */.  
f4c0: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66    assert_nc( iOf
f4d0: 66 3c 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66  f<=pIter->iEndof
f4e0: 44 6f 63 6c 69 73 74 20 29 3b 0a 20 20 20 20 69  Doclist );.    i
f4f0: 66 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  f( iOff>=pIter->
f500: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b  iEndofDoclist ){
f510: 0a 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20  .      bNewTerm 
f520: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = 1;.      if( i
f530: 4f 66 66 21 3d 66 74 73 35 4c 65 61 66 46 69 72  Off!=fts5LeafFir
f540: 73 74 54 65 72 6d 4f 66 66 28 70 4c 65 61 66 29  stTermOff(pLeaf)
f550: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66   ){.        iOff
f560: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
f570: 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b  t32(&a[iOff], nK
f580: 65 65 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eep);.      }.  
f590: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
f5a0: 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  64 iDelta;.     
f5b0: 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33   iOff += sqlite3
f5c0: 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  Fts5GetVarint(&a
f5d0: 5b 69 4f 66 66 5d 2c 20 26 69 44 65 6c 74 61 29  [iOff], &iDelta)
f5e0: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  ;.      pIter->i
f5f0: 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
f600: 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63  .      assert_nc
f610: 28 20 69 44 65 6c 74 61 3e 30 20 29 3b 0a 20 20  ( iDelta>0 );.  
f620: 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69    }.    pIter->i
f630: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
f640: 66 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  f;..  }else if( 
f650: 70 49 74 65 72 2d 3e 70 53 65 67 3d 3d 30 20 29  pIter->pSeg==0 )
f660: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a  {.    const u8 *
f670: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 63  pList = 0;.    c
f680: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
f690: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4c   = 0;.    int nL
f6a0: 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  ist = 0;.    ass
f6b0: 65 72 74 28 20 28 70 49 74 65 72 2d 3e 66 6c 61  ert( (pIter->fla
f6c0: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
f6d0: 52 5f 4f 4e 45 54 45 52 4d 29 20 7c 7c 20 70 62  R_ONETERM) || pb
f6e0: 4e 65 77 54 65 72 6d 20 29 3b 0a 20 20 20 20 69  NewTerm );.    i
f6f0: 66 28 20 30 3d 3d 28 70 49 74 65 72 2d 3e 66 6c  f( 0==(pIter->fl
f700: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
f710: 45 52 5f 4f 4e 45 54 45 52 4d 29 20 29 7b 0a 20  ER_ONETERM) ){. 
f720: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
f730: 48 61 73 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e  HashScanNext(p->
f740: 70 48 61 73 68 29 3b 0a 20 20 20 20 20 20 73 71  pHash);.      sq
f750: 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
f760: 6e 45 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c  nEntry(p->pHash,
f770: 20 26 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c   &zTerm, &pList,
f780: 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a   &nList);.    }.
f790: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
f7a0: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61   ){.      fts5Da
f7b0: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
f7c0: 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70  >pLeaf);.      p
f7d0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
f7e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f7f0: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e    pIter->pLeaf->
f800: 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a  p = (u8*)pList;.
f810: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
f820: 61 66 2d 3e 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a  af->nn = nList;.
f830: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
f840: 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69  af->szLeaf = nLi
f850: 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  st;.      pIter-
f860: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
f870: 20 6e 4c 69 73 74 2b 31 3b 0a 20 20 20 20 20 20   nList+1;.      
f880: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
f890: 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49  rSet(&p->rc, &pI
f8a0: 74 65 72 2d 3e 74 65 72 6d 2c 20 28 69 6e 74 29  ter->term, (int)
f8b0: 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 0a 20  strlen(zTerm),. 
f8c0: 20 20 20 20 20 20 20 20 20 28 75 38 2a 29 7a 54           (u8*)zT
f8d0: 65 72 6d 29 3b 0a 20 20 20 20 20 20 70 49 74 65  erm);.      pIte
f8e0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
f8f0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70   fts5GetVarint(p
f900: 4c 69 73 74 2c 20 28 75 36 34 2a 29 26 70 49 74  List, (u64*)&pIt
f910: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
f920: 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20     *pbNewTerm = 
f930: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
f940: 7b 0a 20 20 20 20 69 4f 66 66 20 3d 20 30 3b 0a  {.    iOff = 0;.
f950: 20 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72      /* Next entr
f960: 79 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20  y is not on the 
f970: 63 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a  current page */.
f980: 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3d      while( iOff=
f990: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  =0 ){.      fts5
f9a0: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
f9b0: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
f9c0: 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e   pLeaf = pIter->
f9d0: 70 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 66 28  pLeaf;.      if(
f9e0: 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61   pLeaf==0 ) brea
f9f0: 6b 3b 0a 20 20 20 20 20 20 41 53 53 45 52 54 5f  k;.      ASSERT_
fa00: 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29  SZLEAF_OK(pLeaf)
fa10: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 4f 66  ;.      if( (iOf
fa20: 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  f = fts5LeafFirs
fa30: 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29  tRowidOff(pLeaf)
fa40: 29 20 26 26 20 69 4f 66 66 3c 70 4c 65 61 66 2d  ) && iOff<pLeaf-
fa50: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
fa60: 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74     iOff += sqlit
fa70: 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
fa80: 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
fa90: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
faa0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
fab0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
fac0: 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20 20  et = iOff;..    
fad0: 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e      if( pLeaf->n
fae0: 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  n>pLeaf->szLeaf 
faf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
fb00: 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20  er->iPgidxOff = 
fb10: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2b 20  pLeaf->szLeaf + 
fb20: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
fb30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
fb40: 70 4c 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e  pLeaf->p[pLeaf->
fb50: 73 7a 4c 65 61 66 5d 2c 20 70 49 74 65 72 2d 3e  szLeaf], pIter->
fb60: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20  iEndofDoclist.  
fb70: 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
fb80: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
fb90: 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28  }.      else if(
fba0: 20 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66   pLeaf->nn>pLeaf
fbb0: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
fbc0: 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64      pIter->iPgid
fbd0: 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a  xOff = pLeaf->sz
fbe0: 4c 65 61 66 20 2b 20 66 74 73 35 47 65 74 56 61  Leaf + fts5GetVa
fbf0: 72 69 6e 74 33 32 28 0a 20 20 20 20 20 20 20 20  rint32(.        
fc00: 20 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70 4c      &pLeaf->p[pL
fc10: 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 69 4f  eaf->szLeaf], iO
fc20: 66 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  ff.            )
fc30: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
fc40: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
fc50: 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 70 49 74  Off;.        pIt
fc60: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
fc70: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
fc80: 20 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a    bNewTerm = 1;.
fc90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
fca0: 73 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c 70 4c  sert_nc( iOff<pL
fcb0: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 3b 0a 20  eaf->szLeaf );. 
fcc0: 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e 70 4c       if( iOff>pL
fcd0: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
fce0: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46         p->rc = F
fcf0: 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
fd00: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
fd10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
fd20: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
fd30: 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f  e iterator is no
fd40: 77 20 61 74 20 45 4f 46 2e 20 49 66 20 73 6f 2c  w at EOF. If so,
fd50: 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a   return early. *
fd60: 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  /.  if( pIter->p
fd70: 4c 65 61 66 20 29 7b 0a 20 20 20 20 69 66 28 20  Leaf ){.    if( 
fd80: 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20 20 20  bNewTerm ){.    
fd90: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c 61    if( pIter->fla
fda0: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
fdb0: 52 5f 4f 4e 45 54 45 52 4d 20 29 7b 0a 20 20 20  R_ONETERM ){.   
fdc0: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
fdd0: 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
fde0: 66 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  f);.        pIte
fdf0: 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r->pLeaf = 0;.  
fe00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fe10: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
fe20: 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c  adTerm(p, pIter,
fe30: 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 20   nKeep);.       
fe40: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
fe50: 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
fe60: 20 20 20 20 20 20 20 20 69 66 28 20 70 62 4e 65          if( pbNe
fe70: 77 54 65 72 6d 20 29 20 2a 70 62 4e 65 77 54 65  wTerm ) *pbNewTe
fe80: 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rm = 1;.      }.
fe90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fea0: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
feb0: 67 20 63 6f 75 6c 64 20 62 65 20 64 6f 6e 65 20  g could be done 
fec0: 62 79 20 63 61 6c 6c 69 6e 67 20 66 74 73 35 53  by calling fts5S
fed0: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 29  egIterLoadNPos()
fee0: 2e 20 42 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  . But.      ** t
fef0: 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 70 61 72  his block is par
ff00: 74 69 63 75 6c 61 72 6c 79 20 70 65 72 66 6f 72  ticularly perfor
ff10: 6d 61 6e 63 65 20 63 72 69 74 69 63 61 6c 2c 20  mance critical, 
ff20: 73 6f 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20  so equivalent.  
ff30: 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 69      ** code is i
ff40: 6e 6c 69 6e 65 64 2e 20 0a 20 20 20 20 20 20 2a  nlined. .      *
ff50: 2a 0a 20 20 20 20 20 20 2a 2a 20 4c 61 74 65 72  *.      ** Later
ff60: 3a 20 53 77 69 74 63 68 65 64 20 62 61 63 6b 20  : Switched back 
ff70: 74 6f 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  to fts5SegIterLo
ff80: 61 64 4e 50 6f 73 28 29 20 62 65 63 61 75 73 65  adNPos() because
ff90: 20 69 74 20 73 75 70 70 6f 72 74 73 0a 20 20 20   it supports.   
ffa0: 20 20 20 2a 2a 20 64 65 74 61 69 6c 3d 6e 6f 6e     ** detail=non
ffb0: 65 20 6d 6f 64 65 2e 20 4e 6f 74 20 69 64 65 61  e mode. Not idea
ffc0: 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
ffd0: 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 20 20 20    int nSz;.     
ffe0: 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
fff0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
10000 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61     fts5FastGetVa
10010 72 69 6e 74 33 32 28 70 49 74 65 72 2d 3e 70 4c  rint32(pIter->pL
10020 65 61 66 2d 3e 70 2c 20 70 49 74 65 72 2d 3e 69  eaf->p, pIter->i
10030 4c 65 61 66 4f 66 66 73 65 74 2c 20 6e 53 7a 29  LeafOffset, nSz)
10040 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62  ;.      pIter->b
10050 44 65 6c 20 3d 20 28 6e 53 7a 20 26 20 30 78 30  Del = (nSz & 0x0
10060 30 30 31 29 3b 0a 20 20 20 20 20 20 70 49 74 65  001);.      pIte
10070 72 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31  r->nPos = nSz>>1
10080 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e  ;.      assert_n
10090 63 28 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3e 3d  c( pIter->nPos>=
100a0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  0 );.    }.  }.}
100b0 0a 0a 23 64 65 66 69 6e 65 20 53 57 41 50 56 41  ..#define SWAPVA
100c0 4c 28 54 2c 20 61 2c 20 62 29 20 7b 20 54 20 74  L(T, a, b) { T t
100d0 6d 70 3b 20 74 6d 70 3d 61 3b 20 61 3d 62 3b 20  mp; tmp=a; a=b; 
100e0 62 3d 74 6d 70 3b 20 7d 0a 0a 23 64 65 66 69 6e  b=tmp; }..#defin
100f0 65 20 66 74 73 35 49 6e 64 65 78 53 6b 69 70 56  e fts5IndexSkipV
10100 61 72 69 6e 74 28 61 2c 20 69 4f 66 66 29 20 7b  arint(a, iOff) {
10110 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
10120 69 6e 74 20 69 45 6e 64 20 3d 20 69 4f 66 66 2b  int iEnd = iOff+
10130 39 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  9;              
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10150 5c 0a 20 20 77 68 69 6c 65 28 20 28 61 5b 69 4f  \.  while( (a[iO
10160 66 66 2b 2b 5d 20 26 20 30 78 38 30 29 20 26 26  ff++] & 0x80) &&
10170 20 69 4f 66 66 3c 69 45 6e 64 20 29 3b 20 20 20   iOff<iEnd );   
10180 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49      \.}../*.** I
10190 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75  terator pIter cu
101a0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
101b0 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69  o the first rowi
101c0 64 20 69 6e 20 61 20 64 6f 63 6c 69 73 74 2e 20  d in a doclist. 
101d0 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
101e0 20 73 65 74 73 20 74 68 65 20 69 74 65 72 61 74   sets the iterat
101f0 6f 72 20 75 70 20 73 6f 20 74 68 61 74 20 69 74  or up so that it
10200 65 72 61 74 65 73 20 69 6e 20 72 65 76 65 72 73  erates in revers
10210 65 20 6f 72 64 65 72 20 74 68 72 6f 75 67 68 0a  e order through.
10220 2a 2a 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 0a  ** the doclist..
10230 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
10240 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
10250 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
10260 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
10270 65 72 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78  er){.  Fts5Dlidx
10280 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 70  Iter *pDlidx = p
10290 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20  Iter->pDlidx;.  
102a0 46 74 73 35 44 61 74 61 20 2a 70 4c 61 73 74 20  Fts5Data *pLast 
102b0 3d 20 30 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c  = 0;.  int pgnoL
102c0 61 73 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ast = 0;..  if( 
102d0 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 69 6e  pDlidx ){.    in
102e0 74 20 69 53 65 67 69 64 20 3d 20 70 49 74 65 72  t iSegid = pIter
102f0 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  ->pSeg->iSegid;.
10300 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 66      pgnoLast = f
10310 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
10320 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 70 4c  (pDlidx);.    pL
10330 61 73 74 20 3d 20 66 74 73 35 44 61 74 61 52 65  ast = fts5DataRe
10340 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45  ad(p, FTS5_SEGME
10350 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c  NT_ROWID(iSegid,
10360 20 70 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20 7d   pgnoLast));.  }
10370 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 44 61  else{.    Fts5Da
10380 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65  ta *pLeaf = pIte
10390 72 2d 3e 70 4c 65 61 66 3b 20 20 20 20 20 20 20  r->pLeaf;       
103a0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61    /* Current lea
103b0 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20 20 20 2f  f data */..    /
103c0 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 46 74 73  * Currently, Fts
103d0 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
103e0 66 73 65 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  fset points to t
103f0 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
10400 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e  .    ** position
10410 2d 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 66 6f  -list content fo
10420 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  r the current ro
10430 77 69 64 2e 20 42 61 63 6b 20 69 74 20 75 70 20  wid. Back it up 
10440 73 6f 20 74 68 61 74 20 69 74 0a 20 20 20 20 2a  so that it.    *
10450 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
10460 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 6f 73  start of the pos
10470 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
10480 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20 20 69 6e  field. */.    in
10490 74 20 69 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20  t iPoslist;.    
104a0 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  if( pIter->iTerm
104b0 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d  LeafPgno==pIter-
104c0 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  >iLeafPgno ){.  
104d0 20 20 20 20 69 50 6f 73 6c 69 73 74 20 3d 20 70      iPoslist = p
104e0 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f  Iter->iTermLeafO
104f0 66 66 73 65 74 3b 0a 20 20 20 20 7d 65 6c 73 65  ffset;.    }else
10500 7b 0a 20 20 20 20 20 20 69 50 6f 73 6c 69 73 74  {.      iPoslist
10510 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 4;.    }.    
10520 66 74 73 35 49 6e 64 65 78 53 6b 69 70 56 61 72  fts5IndexSkipVar
10530 69 6e 74 28 70 4c 65 61 66 2d 3e 70 2c 20 69 50  int(pLeaf->p, iP
10540 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 70 49 74  oslist);.    pIt
10550 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
10560 3d 20 69 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 20  = iPoslist;..   
10570 20 2f 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 64   /* If this cond
10580 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 74 68  ition is true th
10590 65 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  en the largest r
105a0 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63 75 72  owid for the cur
105b0 72 65 6e 74 0a 20 20 20 20 2a 2a 20 74 65 72 6d  rent.    ** term
105c0 20 6d 61 79 20 6e 6f 74 20 62 65 20 73 74 6f 72   may not be stor
105d0 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ed on the curren
105e0 74 20 70 61 67 65 2e 20 53 6f 20 73 65 61 72 63  t page. So searc
105f0 68 20 66 6f 72 77 61 72 64 20 74 6f 0a 20 20 20  h forward to.   
10600 20 2a 2a 20 73 65 65 20 77 68 65 72 65 20 73 61   ** see where sa
10610 69 64 20 72 6f 77 69 64 20 72 65 61 6c 6c 79 20  id rowid really 
10620 69 73 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  is.  */.    if( 
10630 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
10640 6c 69 73 74 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c  list>=pLeaf->szL
10650 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  eaf ){.      int
10660 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 46 74 73   pgno;.      Fts
10670 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
10680 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d  t *pSeg = pIter-
10690 3e 70 53 65 67 3b 0a 0a 20 20 20 20 20 20 2f 2a  >pSeg;..      /*
106a0 20 54 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20   The last rowid 
106b0 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20 6d  in the doclist m
106c0 61 79 20 6e 6f 74 20 62 65 20 6f 6e 20 74 68 65  ay not be on the
106d0 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 53   current page. S
106e0 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2a 20 66  earch.      ** f
106f0 6f 72 77 61 72 64 20 74 6f 20 66 69 6e 64 20 74  orward to find t
10700 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69  he page containi
10710 6e 67 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69  ng the last rowi
10720 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  d.  */.      for
10730 28 70 67 6e 6f 3d 70 49 74 65 72 2d 3e 69 4c 65  (pgno=pIter->iLe
10740 61 66 50 67 6e 6f 2b 31 3b 20 21 70 2d 3e 72 63  afPgno+1; !p->rc
10750 20 26 26 20 70 67 6e 6f 3c 3d 70 53 65 67 2d 3e   && pgno<=pSeg->
10760 70 67 6e 6f 4c 61 73 74 3b 20 70 67 6e 6f 2b 2b  pgnoLast; pgno++
10770 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  ){.        i64 i
10780 41 62 73 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  Abs = FTS5_SEGME
10790 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69  NT_ROWID(pSeg->i
107a0 53 65 67 69 64 2c 20 70 67 6e 6f 29 3b 0a 20 20  Segid, pgno);.  
107b0 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a        Fts5Data *
107c0 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61 52  pNew = fts5DataR
107d0 65 61 64 28 70 2c 20 69 41 62 73 29 3b 0a 20 20  ead(p, iAbs);.  
107e0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
107f0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
10800 69 52 6f 77 69 64 2c 20 62 54 65 72 6d 6c 65 73  iRowid, bTermles
10810 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f  s;.          iRo
10820 77 69 64 20 3d 20 66 74 73 35 4c 65 61 66 46 69  wid = fts5LeafFi
10830 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4e 65 77  rstRowidOff(pNew
10840 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 54 65  );.          bTe
10850 72 6d 6c 65 73 73 20 3d 20 66 74 73 35 4c 65 61  rmless = fts5Lea
10860 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4e 65 77  fIsTermless(pNew
10870 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
10880 20 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20   iRowid ){.     
10890 20 20 20 20 20 20 20 53 57 41 50 56 41 4c 28 46         SWAPVAL(F
108a0 74 73 35 44 61 74 61 2a 2c 20 70 4e 65 77 2c 20  ts5Data*, pNew, 
108b0 70 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pLast);.        
108c0 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 70      pgnoLast = p
108d0 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  gno;.          }
108e0 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44  .          fts5D
108f0 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77 29  ataRelease(pNew)
10900 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
10910 62 54 65 72 6d 6c 65 73 73 3d 3d 30 20 29 20 62  bTermless==0 ) b
10920 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
10930 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10940 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 61 73 74  }..  /* If pLast
10950 20 69 73 20 4e 55 4c 4c 20 61 74 20 74 68 69 73   is NULL at this
10960 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 65   point, then the
10970 20 6c 61 73 74 20 72 6f 77 69 64 20 66 6f 72 20   last rowid for 
10980 74 68 69 73 20 64 6f 63 6c 69 73 74 0a 20 20 2a  this doclist.  *
10990 2a 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61  * lies on the pa
109a0 67 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 64  ge currently ind
109b0 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74  icated by the it
109c0 65 72 61 74 6f 72 2e 20 49 6e 20 74 68 69 73 20  erator. In this 
109d0 63 61 73 65 20 0a 20 20 2a 2a 20 70 49 74 65 72  case .  ** pIter
109e0 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 69 73  ->iLeafOffset is
109f0 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20   already set to 
10a00 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 6f 73  point to the pos
10a10 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a  ition-list size.
10a20 20 20 2a 2a 20 66 69 65 6c 64 20 61 73 73 6f 63    ** field assoc
10a30 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66  iated with the f
10a40 69 72 73 74 20 72 65 6c 65 76 61 6e 74 20 72 6f  irst relevant ro
10a50 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  wid on the page.
10a60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69  .  **.  ** Or, i
10a70 66 20 70 4c 61 73 74 20 69 73 20 6e 6f 6e 2d 4e  f pLast is non-N
10a80 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
10a90 74 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  the page that co
10aa0 6e 74 61 69 6e 73 20 74 68 65 20 6c 61 73 74 0a  ntains the last.
10ab0 20 20 2a 2a 20 72 6f 77 69 64 2e 20 49 6e 20 74    ** rowid. In t
10ac0 68 69 73 20 63 61 73 65 20 63 6f 6e 66 69 67 75  his case configu
10ad0 72 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  re the iterator 
10ae0 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
10af0 73 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69  s to the.  ** fi
10b00 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 69  rst rowid on thi
10b10 73 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  s page..  */.  i
10b20 66 28 20 70 4c 61 73 74 20 29 7b 0a 20 20 20 20  f( pLast ){.    
10b30 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 66 74  int iOff;.    ft
10b40 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
10b50 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
10b60 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
10b70 70 4c 61 73 74 3b 0a 20 20 20 20 70 49 74 65 72  pLast;.    pIter
10b80 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 67  ->iLeafPgno = pg
10b90 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 69 4f 66 66  noLast;.    iOff
10ba0 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
10bb0 52 6f 77 69 64 4f 66 66 28 70 4c 61 73 74 29 3b  RowidOff(pLast);
10bc0 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73  .    iOff += fts
10bd0 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 61 73  5GetVarint(&pLas
10be0 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t->p[iOff], (u64
10bf0 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
10c00 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  );.    pIter->iL
10c10 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
10c20 3b 0a 0a 20 20 20 20 69 66 28 20 66 74 73 35 4c  ;..    if( fts5L
10c30 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c  eafIsTermless(pL
10c40 61 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70 49  ast) ){.      pI
10c50 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
10c60 73 74 20 3d 20 70 4c 61 73 74 2d 3e 6e 6e 2b 31  st = pLast->nn+1
10c70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10c80 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
10c90 44 6f 63 6c 69 73 74 20 3d 20 66 74 73 35 4c 65  Doclist = fts5Le
10ca0 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70  afFirstTermOff(p
10cb0 4c 61 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Last);.    }..  
10cc0 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72  }..  fts5SegIter
10cd0 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28  ReverseInitPage(
10ce0 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  p, pIter);.}../*
10cf0 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
10d00 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  er currently poi
10d10 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
10d20 20 72 6f 77 69 64 20 6f 66 20 61 20 64 6f 63 6c   rowid of a docl
10d30 69 73 74 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73  ist..** There is
10d40 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
10d50 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
10d60 20 74 68 65 20 66 69 6e 61 6c 20 74 65 72 6d 20   the final term 
10d70 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a  on the current .
10d80 2a 2a 20 70 61 67 65 2e 20 49 66 20 74 68 65 20  ** page. If the 
10d90 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20  current term is 
10da0 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e  the last term on
10db0 20 74 68 65 20 70 61 67 65 2c 20 6c 6f 61 64 20   the page, load 
10dc0 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d  the .** doclist-
10dd0 69 6e 64 65 78 20 66 72 6f 6d 20 64 69 73 6b 20  index from disk 
10de0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  and initialize a
10df0 6e 20 69 74 65 72 61 74 6f 72 20 61 74 20 28 70  n iterator at (p
10e00 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 2e 0a 2a  Iter->pDlidx)..*
10e10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
10e20 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44 6c 69  s5SegIterLoadDli
10e30 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  dx(Fts5Index *p,
10e40 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
10e50 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 53 65 67  ter){.  int iSeg
10e60 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e   = pIter->pSeg->
10e70 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 62 52  iSegid;.  int bR
10e80 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61  ev = (pIter->fla
10e90 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
10ea0 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74  R_REVERSE);.  Ft
10eb0 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20  s5Data *pLeaf = 
10ec0 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20 2f 2a  pIter->pLeaf; /*
10ed0 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61   Current leaf da
10ee0 74 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ta */..  assert(
10ef0 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
10f00 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
10f10 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74  TERM );.  assert
10f20 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3d  ( pIter->pDlidx=
10f30 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  =0 );..  /* Chec
10f40 6b 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  k if the current
10f50 20 64 6f 63 6c 69 73 74 20 65 6e 64 73 20 6f 6e   doclist ends on
10f60 20 74 68 69 73 20 70 61 67 65 2e 20 49 66 20 69   this page. If i
10f70 74 20 64 6f 65 73 2c 20 72 65 74 75 72 6e 0a 20  t does, return. 
10f80 20 2a 2a 20 65 61 72 6c 79 20 77 69 74 68 6f 75   ** early withou
10f90 74 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 6f  t loading the do
10fa0 63 6c 69 73 74 2d 69 6e 64 65 78 20 28 61 73 20  clist-index (as 
10fb0 69 74 20 62 65 6c 6f 6e 67 73 20 74 6f 20 61 20  it belongs to a 
10fc0 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a 20 74  different.  ** t
10fd0 65 72 6d 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49  erm. */.  if( pI
10fe0 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
10ff0 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66  no==pIter->iLeaf
11000 50 67 6e 6f 20 0a 20 20 20 26 26 20 70 49 74 65  Pgno .   && pIte
11010 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
11020 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 0a  <pLeaf->szLeaf .
11030 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b    ){.    return;
11040 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 70  .  }..  pIter->p
11050 44 6c 69 64 78 20 3d 20 66 74 73 35 44 6c 69 64  Dlidx = fts5Dlid
11060 78 49 74 65 72 49 6e 69 74 28 70 2c 20 62 52 65  xIterInit(p, bRe
11070 76 2c 20 69 53 65 67 2c 20 70 49 74 65 72 2d 3e  v, iSeg, pIter->
11080 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a  iTermLeafPgno);.
11090 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65  }../*.** The ite
110a0 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73  rator object pas
110b0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
110c0 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65  d argument curre
110d0 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  ntly contains.**
110e0 20 6e 6f 20 76 61 6c 69 64 20 76 61 6c 75 65 73   no valid values
110f0 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20   except for the 
11100 46 74 73 35 53 65 67 49 74 65 72 2e 70 4c 65 61  Fts5SegIter.pLea
11110 66 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c  f member variabl
11120 65 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  e. This.** funct
11130 69 6f 6e 20 73 65 61 72 63 68 65 73 20 74 68 65  ion searches the
11140 20 6c 65 61 66 20 70 61 67 65 20 66 6f 72 20 61   leaf page for a
11150 20 74 65 72 6d 20 6d 61 74 63 68 69 6e 67 20 28   term matching (
11160 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 2a 2a  pTerm/nTerm)..**
11170 0a 2a 2a 20 49 66 20 74 68 65 20 73 70 65 63 69  .** If the speci
11180 66 69 65 64 20 74 65 72 6d 20 69 73 20 66 6f 75  fied term is fou
11190 6e 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  nd on the page, 
111a0 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 6f  then the iterato
111b0 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69  r is left.** poi
111c0 6e 74 69 6e 67 20 74 6f 20 69 74 2e 20 49 66 20  nting to it. If 
111d0 61 72 67 75 6d 65 6e 74 20 62 47 65 20 69 73 20  argument bGe is 
111e0 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 74 65 72  zero and the ter
111f0 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 0a  m is not found,.
11200 2a 2a 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ** the iterator 
11210 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
11220 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49   at EOF..**.** I
11230 66 20 62 47 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  f bGe is non-zer
11240 6f 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66  o and the specif
11250 69 65 64 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  ied term is not 
11260 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 0a  found, then the.
11270 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c  ** iterator is l
11280 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
11290 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 74 65 72  the smallest ter
112a0 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74  m in the segment
112b0 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67   that.** is larg
112c0 65 72 20 74 68 61 6e 20 74 68 65 20 73 70 65 63  er than the spec
112d0 69 66 69 65 64 20 74 65 72 6d 2c 20 65 76 65 6e  ified term, even
112e0 20 69 66 20 74 68 69 73 20 74 65 72 6d 20 69 73   if this term is
112f0 20 6e 6f 74 20 6f 6e 20 74 68 65 0a 2a 2a 20 63   not on the.** c
11300 75 72 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2f 0a  urrent page..*/.
11310 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
11320 4c 65 61 66 53 65 65 6b 28 0a 20 20 46 74 73 35  LeafSeek(.  Fts5
11330 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
11340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
11350 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 63  eave any error c
11360 6f 64 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ode here */.  in
11370 74 20 62 47 65 2c 20 20 20 20 20 20 20 20 20 20  t bGe,          
11380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11390 20 54 72 75 65 20 66 6f 72 20 61 20 3e 3d 20 73   True for a >= s
113a0 65 61 72 63 68 20 2a 2f 0a 20 20 46 74 73 35 53  earch */.  Fts5S
113b0 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  egIter *pIter,  
113c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
113d0 65 72 61 74 6f 72 20 74 6f 20 73 65 65 6b 20 2a  erator to seek *
113e0 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
113f0 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20  erm, int nTerm  
11400 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
11410 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 29 7b 0a  earch for */.){.
11420 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 63 6f    int iOff;.  co
11430 6e 73 74 20 75 38 20 2a 61 20 3d 20 70 49 74 65  nst u8 *a = pIte
11440 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 69  r->pLeaf->p;.  i
11450 6e 74 20 73 7a 4c 65 61 66 20 3d 20 70 49 74 65  nt szLeaf = pIte
11460 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  r->pLeaf->szLeaf
11470 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65  ;.  int n = pIte
11480 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a 20  r->pLeaf->nn;.. 
11490 20 69 6e 74 20 6e 4d 61 74 63 68 20 3d 20 30 3b   int nMatch = 0;
114a0 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30  .  int nKeep = 0
114b0 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30  ;.  int nNew = 0
114c0 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66  ;.  int iTermOff
114d0 3b 0a 20 20 69 6e 74 20 69 50 67 69 64 78 3b 20  ;.  int iPgidx; 
114e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114f0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
11500 66 66 73 65 74 20 69 6e 20 70 67 69 64 78 20 2a  ffset in pgidx *
11510 2f 0a 20 20 69 6e 74 20 62 45 6e 64 4f 66 50 61  /.  int bEndOfPa
11520 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
11530 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
11540 5f 4f 4b 20 29 3b 0a 0a 20 20 69 50 67 69 64 78  _OK );..  iPgidx
11550 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 69 50 67   = szLeaf;.  iPg
11560 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61  idx += fts5GetVa
11570 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78  rint32(&a[iPgidx
11580 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20  ], iTermOff);.  
11590 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
115a0 0a 20 20 69 66 28 20 69 4f 66 66 3e 6e 20 29 7b  .  if( iOff>n ){
115b0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53  .    p->rc = FTS
115c0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  5_CORRUPT;.    r
115d0 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 77 68  eturn;.  }..  wh
115e0 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f  ile( 1 ){..    /
115f0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
11600 20 6d 61 6e 79 20 6e 65 77 20 62 79 74 65 73 20   many new bytes 
11610 61 72 65 20 69 6e 20 74 68 69 73 20 74 65 72 6d  are in this term
11620 20 2a 2f 0a 20 20 20 20 66 74 73 35 46 61 73 74   */.    fts5Fast
11630 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20 69  GetVarint32(a, i
11640 4f 66 66 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20  Off, nNew);.    
11650 69 66 28 20 6e 4b 65 65 70 3c 6e 4d 61 74 63 68  if( nKeep<nMatch
11660 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
11670 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20  earch_failed;.  
11680 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
11690 20 6e 4b 65 65 70 3e 3d 6e 4d 61 74 63 68 20 29   nKeep>=nMatch )
116a0 3b 0a 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3d  ;.    if( nKeep=
116b0 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  =nMatch ){.     
116c0 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 20   int nCmp;.     
116d0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 6e 43   int i;.      nC
116e0 6d 70 20 3d 20 4d 49 4e 28 6e 4e 65 77 2c 20 6e  mp = MIN(nNew, n
116f0 54 65 72 6d 2d 6e 4d 61 74 63 68 29 3b 0a 20 20  Term-nMatch);.  
11700 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
11710 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cmp; i++){.     
11720 20 20 20 69 66 28 20 61 5b 69 4f 66 66 2b 69 5d     if( a[iOff+i]
11730 21 3d 70 54 65 72 6d 5b 6e 4d 61 74 63 68 2b 69  !=pTerm[nMatch+i
11740 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
11750 20 7d 0a 20 20 20 20 20 20 6e 4d 61 74 63 68 20   }.      nMatch 
11760 2b 3d 20 69 3b 0a 0a 20 20 20 20 20 20 69 66 28  += i;..      if(
11770 20 6e 54 65 72 6d 3d 3d 6e 4d 61 74 63 68 20 29   nTerm==nMatch )
11780 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d  {.        if( i=
11790 3d 6e 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20  =nNew ){.       
117a0 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 73     goto search_s
117b0 75 63 63 65 73 73 3b 0a 20 20 20 20 20 20 20 20  uccess;.        
117c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
117d0 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61 69   goto search_fai
117e0 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
117f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
11800 3c 6e 4e 65 77 20 26 26 20 61 5b 69 4f 66 66 2b  <nNew && a[iOff+
11810 69 5d 3e 70 54 65 72 6d 5b 6e 4d 61 74 63 68 5d  i]>pTerm[nMatch]
11820 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
11830 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a   search_failed;.
11840 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
11850 20 20 20 69 66 28 20 69 50 67 69 64 78 3e 3d 6e     if( iPgidx>=n
11860 20 29 7b 0a 20 20 20 20 20 20 62 45 6e 64 4f 66   ){.      bEndOf
11870 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Page = 1;.      
11880 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
11890 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35    iPgidx += fts5
118a0 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
118b0 50 67 69 64 78 5d 2c 20 6e 4b 65 65 70 29 3b 0a  Pgidx], nKeep);.
118c0 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d 20      iTermOff += 
118d0 6e 4b 65 65 70 3b 0a 20 20 20 20 69 4f 66 66 20  nKeep;.    iOff 
118e0 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20 20 20  = iTermOff;..   
118f0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 4b 65   /* Read the nKe
11900 65 70 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ep field of the 
11910 6e 65 78 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  next term. */.  
11920 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72    fts5FastGetVar
11930 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e  int32(a, iOff, n
11940 4b 65 65 70 29 3b 0a 20 20 7d 0a 0a 20 73 65 61  Keep);.  }.. sea
11950 72 63 68 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66  rch_failed:.  if
11960 28 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ( bGe==0 ){.    
11970 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
11980 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
11990 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
119a0 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  = 0;.    return;
119b0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 45 6e  .  }else if( bEn
119c0 64 4f 66 50 61 67 65 20 29 7b 0a 20 20 20 20 64  dOfPage ){.    d
119d0 6f 20 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65  o {.      fts5Se
119e0 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
119f0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 69   pIter);.      i
11a00 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  f( pIter->pLeaf=
11a10 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
11a20 20 20 20 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c     a = pIter->pL
11a30 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69 66  eaf->p;.      if
11a40 28 20 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d  ( fts5LeafIsTerm
11a50 6c 65 73 73 28 70 49 74 65 72 2d 3e 70 4c 65 61  less(pIter->pLea
11a60 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  f)==0 ){.       
11a70 20 69 50 67 69 64 78 20 3d 20 70 49 74 65 72 2d   iPgidx = pIter-
11a80 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a  >pLeaf->szLeaf;.
11a90 20 20 20 20 20 20 20 20 69 50 67 69 64 78 20 2b          iPgidx +
11aa0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
11ab0 32 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  2(&pIter->pLeaf-
11ac0 3e 70 5b 69 50 67 69 64 78 5d 2c 20 69 4f 66 66  >p[iPgidx], iOff
11ad0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
11ae0 4f 66 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 70  Off<4 || iOff>=p
11af0 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
11b00 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
11b10 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
11b20 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  RRUPT;.        }
11b30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
11b40 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20 20 20  nKeep = 0;.     
11b50 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20 3d 20       iTermOff = 
11b60 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20  iOff;.          
11b70 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  n = pIter->pLeaf
11b80 2d 3e 6e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  ->nn;.          
11b90 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
11ba0 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
11bb0 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , nNew);.       
11bc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
11bd0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11be0 7d 77 68 69 6c 65 28 20 31 20 29 3b 0a 20 20 7d  }while( 1 );.  }
11bf0 0a 0a 20 73 65 61 72 63 68 5f 73 75 63 63 65 73  .. search_succes
11c00 73 3a 0a 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65  s:..  pIter->iLe
11c10 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 20  afOffset = iOff 
11c20 2b 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d  + nNew;.  pIter-
11c30 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74  >iTermLeafOffset
11c40 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
11c50 66 66 73 65 74 3b 0a 20 20 70 49 74 65 72 2d 3e  ffset;.  pIter->
11c60 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d 20  iTermLeafPgno = 
11c70 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
11c80 3b 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 53  ;..  fts5BufferS
11c90 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65  et(&p->rc, &pIte
11ca0 72 2d 3e 74 65 72 6d 2c 20 6e 4b 65 65 70 2c 20  r->term, nKeep, 
11cb0 70 54 65 72 6d 29 3b 0a 20 20 66 74 73 35 42 75  pTerm);.  fts5Bu
11cc0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
11cd0 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74  p->rc, &pIter->t
11ce0 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69 4f  erm, nNew, &a[iO
11cf0 66 66 5d 29 3b 0a 0a 20 20 69 66 28 20 69 50 67  ff]);..  if( iPg
11d00 69 64 78 3e 3d 6e 20 29 7b 0a 20 20 20 20 70 49  idx>=n ){.    pI
11d10 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
11d20 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  st = pIter->pLea
11d30 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65  f->nn+1;.  }else
11d40 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61  {.    int nExtra
11d50 3b 0a 20 20 20 20 69 50 67 69 64 78 20 2b 3d 20  ;.    iPgidx += 
11d60 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
11d70 26 61 5b 69 50 67 69 64 78 5d 2c 20 6e 45 78 74  &a[iPgidx], nExt
11d80 72 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ra);.    pIter->
11d90 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
11da0 69 54 65 72 6d 4f 66 66 20 2b 20 6e 45 78 74 72  iTermOff + nExtr
11db0 61 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e  a;.  }.  pIter->
11dc0 69 50 67 69 64 78 4f 66 66 20 3d 20 69 50 67 69  iPgidxOff = iPgi
11dd0 64 78 3b 0a 0a 20 20 66 74 73 35 53 65 67 49 74  dx;..  fts5SegIt
11de0 65 72 4c 6f 61 64 52 6f 77 69 64 28 70 2c 20 70  erLoadRowid(p, p
11df0 49 74 65 72 29 3b 0a 20 20 66 74 73 35 53 65 67  Iter);.  fts5Seg
11e00 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20  IterLoadNPos(p, 
11e10 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pIter);.}../*.**
11e20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
11e30 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20  object pIter to 
11e40 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20 70 54  point to term pT
11e50 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e  erm/nTerm within
11e60 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 70 53 65 67   segment.** pSeg
11e70 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
11e80 20 73 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68   such term in th
11e90 65 20 69 6e 64 65 78 2c 20 74 68 65 20 69 74 65  e index, the ite
11ea0 72 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20  rator is set to 
11eb0 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  EOF..**.** If an
11ec0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46   error occurs, F
11ed0 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73  ts5Index.rc is s
11ee0 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72  et to an appropr
11ef0 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
11f00 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72   If .** an error
11f10 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
11f20 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
11f30 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
11f40 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
11f50 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
11f60 64 20 66 74 73 35 53 65 67 49 74 65 72 53 65 65  d fts5SegIterSee
11f70 6b 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64  kInit(.  Fts5Ind
11f80 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
11f90 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
11fa0 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f   backend */.  co
11fb0 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69  nst u8 *pTerm, i
11fc0 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a  nt nTerm,     /*
11fd0 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f   Term to seek to
11fe0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12000 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
12010 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66   FTS5INDEX_XXX f
12020 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 74  lags */.  Fts5St
12030 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
12040 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73  pSeg,     /* Des
12050 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d  cription of segm
12060 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ent */.  Fts5Seg
12070 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
12080 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
12090 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a  ct to populate *
120a0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 50 67 20 3d  /.){.  int iPg =
120b0 20 31 3b 0a 20 20 69 6e 74 20 62 47 65 20 3d 20   1;.  int bGe = 
120c0 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
120d0 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3b 0a  EX_QUERY_SCAN);.
120e0 20 20 69 6e 74 20 62 44 6c 69 64 78 20 3d 20 30    int bDlidx = 0
120f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12100 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
12110 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d  re is a doclist-
12120 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61 73 73 65  index */..  asse
12130 72 74 28 20 62 47 65 3d 3d 30 20 7c 7c 20 28 66  rt( bGe==0 || (f
12140 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
12150 5f 51 55 45 52 59 5f 44 45 53 43 29 3d 3d 30 20  _QUERY_DESC)==0 
12160 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 65  );.  assert( pTe
12170 72 6d 20 26 26 20 6e 54 65 72 6d 20 29 3b 0a 20  rm && nTerm );. 
12180 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
12190 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29  , sizeof(*pIter)
121a0 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 53 65 67  );.  pIter->pSeg
121b0 20 3d 20 70 53 65 67 3b 0a 0a 20 20 2f 2a 20 54   = pSeg;..  /* T
121c0 68 69 73 20 62 6c 6f 63 6b 20 73 65 74 73 20 73  his block sets s
121d0 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20 69 50  tack variable iP
121e0 67 20 74 6f 20 74 68 65 20 6c 65 61 66 20 70 61  g to the leaf pa
121f0 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20 6d  ge number that m
12200 61 79 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20  ay.  ** contain 
12210 74 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72  term (pTerm/nTer
12220 6d 29 2c 20 69 66 20 69 74 20 69 73 20 70 72 65  m), if it is pre
12230 73 65 6e 74 20 69 6e 20 74 68 65 20 73 65 67 6d  sent in the segm
12240 65 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ent. */.  if( p-
12250 3e 70 49 64 78 53 65 6c 65 63 74 3d 3d 30 20 29  >pIdxSelect==0 )
12260 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  {.    Fts5Config
12270 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
12280 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35  Config;.    fts5
12290 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74  IndexPrepareStmt
122a0 28 70 2c 20 26 70 2d 3e 70 49 64 78 53 65 6c 65  (p, &p->pIdxSele
122b0 63 74 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  ct, sqlite3_mpri
122c0 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
122d0 53 45 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d  SELECT pgno FROM
122e0 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27 20 57   '%q'.'%q_idx' W
122f0 48 45 52 45 20 22 0a 20 20 20 20 20 20 20 20 20  HERE ".         
12300 20 22 73 65 67 69 64 3d 3f 20 41 4e 44 20 74 65   "segid=? AND te
12310 72 6d 3c 3d 3f 20 4f 52 44 45 52 20 42 59 20 74  rm<=? ORDER BY t
12320 65 72 6d 20 44 45 53 43 20 4c 49 4d 49 54 20 31  erm DESC LIMIT 1
12330 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ",.          pCo
12340 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66  nfig->zDb, pConf
12350 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29  ig->zName.    ))
12360 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72  ;.  }.  if( p->r
12370 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  c ) return;.  sq
12380 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
12390 2d 3e 70 49 64 78 53 65 6c 65 63 74 2c 20 31 2c  ->pIdxSelect, 1,
123a0 20 70 53 65 67 2d 3e 69 53 65 67 69 64 29 3b 0a   pSeg->iSegid);.
123b0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62    sqlite3_bind_b
123c0 6c 6f 62 28 70 2d 3e 70 49 64 78 53 65 6c 65 63  lob(p->pIdxSelec
123d0 74 2c 20 32 2c 20 70 54 65 72 6d 2c 20 6e 54 65  t, 2, pTerm, nTe
123e0 72 6d 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  rm, SQLITE_STATI
123f0 43 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  C);.  if( SQLITE
12400 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
12410 65 70 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74  ep(p->pIdxSelect
12420 29 20 29 7b 0a 20 20 20 20 69 36 34 20 76 61 6c  ) ){.    i64 val
12430 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
12440 6e 5f 69 6e 74 28 70 2d 3e 70 49 64 78 53 65 6c  n_int(p->pIdxSel
12450 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 50 67  ect, 0);.    iPg
12460 20 3d 20 28 69 6e 74 29 28 76 61 6c 3e 3e 31 29   = (int)(val>>1)
12470 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20 28  ;.    bDlidx = (
12480 76 61 6c 20 26 20 30 78 30 30 30 31 29 3b 0a 20  val & 0x0001);. 
12490 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c   }.  p->rc = sql
124a0 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 49  ite3_reset(p->pI
124b0 64 78 53 65 6c 65 63 74 29 3b 0a 0a 20 20 69 66  dxSelect);..  if
124c0 28 20 69 50 67 3c 70 53 65 67 2d 3e 70 67 6e 6f  ( iPg<pSeg->pgno
124d0 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69 50 67  First ){.    iPg
124e0 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72   = pSeg->pgnoFir
124f0 73 74 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d  st;.    bDlidx =
12500 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72   0;.  }..  pIter
12510 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50  ->iLeafPgno = iP
12520 67 20 2d 20 31 3b 0a 20 20 66 74 73 35 53 65 67  g - 1;.  fts5Seg
12530 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
12540 70 49 74 65 72 29 3b 0a 0a 20 20 69 66 28 20 70  pIter);..  if( p
12550 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
12560 20 20 20 66 74 73 35 4c 65 61 66 53 65 65 6b 28     fts5LeafSeek(
12570 70 2c 20 62 47 65 2c 20 70 49 74 65 72 2c 20 70  p, bGe, pIter, p
12580 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
12590 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
125a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 47 65  SQLITE_OK && bGe
125b0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 74 65 72  ==0 ){.    pIter
125c0 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f  ->flags |= FTS5_
125d0 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b  SEGITER_ONETERM;
125e0 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
125f0 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69  pLeaf ){.      i
12600 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49  f( flags & FTS5I
12610 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20  NDEX_QUERY_DESC 
12620 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  ){.        pIter
12630 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f  ->flags |= FTS5_
12640 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b  SEGITER_REVERSE;
12650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
12660 66 28 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20  f( bDlidx ){.   
12670 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
12680 4c 6f 61 64 44 6c 69 64 78 28 70 2c 20 70 49 74  LoadDlidx(p, pIt
12690 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
126a0 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46     if( flags & F
126b0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
126c0 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ESC ){.        f
126d0 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
126e0 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
126f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
12700 20 20 66 74 73 35 53 65 67 49 74 65 72 53 65 74    fts5SegIterSet
12710 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a  Next(p, pIter);.
12720 0a 20 20 2f 2a 20 45 69 74 68 65 72 3a 0a 20 20  .  /* Either:.  
12730 2a 2a 0a 20 20 2a 2a 20 20 20 31 29 20 61 6e 20  **.  **   1) an 
12740 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
12750 65 64 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 32 29  ed, or.  **   2)
12760 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f   the iterator po
12770 69 6e 74 73 20 74 6f 20 45 4f 46 2c 20 6f 72 0a  ints to EOF, or.
12780 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20 69 74    **   3) the it
12790 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f  erator points to
127a0 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 74   an entry with t
127b0 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d  erm (pTerm/nTerm
127c0 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 34 29 20  ), or.  **   4) 
127d0 74 68 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55  the FTS5INDEX_QU
127e0 45 52 59 5f 53 43 41 4e 20 66 6c 61 67 20 77 61  ERY_SCAN flag wa
127f0 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 69 74  s set and the it
12800 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 0a 20 20  erator points.  
12810 2a 2a 20 20 20 20 20 20 74 6f 20 61 6e 20 65 6e  **      to an en
12820 74 72 79 20 77 69 74 68 20 61 20 74 65 72 6d 20  try with a term 
12830 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
12840 65 71 75 61 6c 20 74 6f 20 28 70 54 65 72 6d 2f  equal to (pTerm/
12850 6e 54 65 72 6d 29 2e 0a 20 20 2a 2f 0a 20 20 61  nTerm)..  */.  a
12860 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
12870 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20  LITE_OK         
12880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128a0 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 7c 7c 20 70   /* 1 */.   || p
128b0 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 20  Iter->pLeaf==0  
128c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
128f0 32 20 2a 2f 0a 20 20 20 7c 7c 20 66 74 73 35 42  2 */.   || fts5B
12900 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62  ufferCompareBlob
12910 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70  (&pIter->term, p
12920 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3d 3d 30 20  Term, nTerm)==0 
12930 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20 2a 2f           /* 3 */
12940 0a 20 20 20 7c 7c 20 28 62 47 65 20 26 26 20 66  .   || (bGe && f
12950 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65  ts5BufferCompare
12960 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e 74 65 72  Blob(&pIter->ter
12970 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29  m, pTerm, nTerm)
12980 3e 30 29 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 29  >0)  /* 4 */.  )
12990 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
129a0 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74  alize the object
129b0 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
129c0 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54  to term pTerm/nT
129d0 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 0a 2a  erm within the.*
129e0 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  * in-memory hash
129f0 20 74 61 62 6c 65 2e 20 49 66 20 74 68 65 72 65   table. If there
12a00 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d   is no such term
12a10 20 69 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62   in the hash-tab
12a20 6c 65 2c 20 74 68 65 20 0a 2a 2a 20 69 74 65 72  le, the .** iter
12a30 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45  ator is set to E
12a40 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  OF..**.** If an 
12a50 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74  error occurs, Ft
12a60 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65  s5Index.rc is se
12a70 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69  t to an appropri
12a80 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ate error code. 
12a90 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  If .** an error 
12aa0 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
12ab0 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
12ac0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
12ad0 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
12ae0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12af0 20 66 74 73 35 53 65 67 49 74 65 72 48 61 73 68   fts5SegIterHash
12b00 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Init(.  Fts5Inde
12b10 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
12b20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
12b30 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e  backend */.  con
12b40 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e  st u8 *pTerm, in
12b50 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20  t nTerm,     /* 
12b60 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20  Term to seek to 
12b70 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
12b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b90 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
12ba0 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c  FTS5INDEX_XXX fl
12bb0 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ags */.  Fts5Seg
12bc0 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
12bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
12be0 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a  ct to populate *
12bf0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20  /.){.  const u8 
12c00 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e  *pList = 0;.  in
12c10 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63  t nList = 0;.  c
12c20 6f 6e 73 74 20 75 38 20 2a 7a 20 3d 20 30 3b 0a  onst u8 *z = 0;.
12c30 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a 20 20    int n = 0;..  
12c40 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68  assert( p->pHash
12c50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
12c60 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
12c70 3b 0a 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d  ;..  if( pTerm==
12c80 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54  0 || (flags & FT
12c90 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
12ca0 41 4e 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  AN) ){.    p->rc
12cb0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61   = sqlite3Fts5Ha
12cc0 73 68 53 63 61 6e 49 6e 69 74 28 70 2d 3e 70 48  shScanInit(p->pH
12cd0 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  ash, (const char
12ce0 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  *)pTerm, nTerm);
12cf0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
12d00 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d  HashScanEntry(p-
12d10 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63  >pHash, (const c
12d20 68 61 72 2a 2a 29 26 7a 2c 20 26 70 4c 69 73 74  har**)&z, &pList
12d30 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 6e  , &nList);.    n
12d40 20 3d 20 28 7a 20 3f 20 28 69 6e 74 29 73 74 72   = (z ? (int)str
12d50 6c 65 6e 28 28 63 6f 6e 73 74 20 63 68 61 72 2a  len((const char*
12d60 29 7a 29 20 3a 20 30 29 3b 0a 20 20 7d 65 6c 73  )z) : 0);.  }els
12d70 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c  e{.    pIter->fl
12d80 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49  ags |= FTS5_SEGI
12d90 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20  TER_ONETERM;.   
12da0 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
12db0 51 75 65 72 79 28 70 2d 3e 70 48 61 73 68 2c 20  Query(p->pHash, 
12dc0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 65  (const char*)pTe
12dd0 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 70 4c 69 73  rm, nTerm, &pLis
12de0 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20  t, &nList);.    
12df0 7a 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 6e  z = pTerm;.    n
12e00 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 7d 0a 0a 20   = nTerm;.  }.. 
12e10 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
12e20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
12e30 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  f;.    sqlite3Ft
12e40 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
12e50 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d  rc, &pIter->term
12e60 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 70 4c 65  , n, z);.    pLe
12e70 61 66 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c  af = fts5IdxMall
12e80 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73  oc(p, sizeof(Fts
12e90 35 44 61 74 61 29 29 3b 0a 20 20 20 20 69 66 28  5Data));.    if(
12ea0 20 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75   pLeaf==0 ) retu
12eb0 72 6e 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 70  rn;.    pLeaf->p
12ec0 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20   = (u8*)pList;. 
12ed0 20 20 20 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 70     pLeaf->nn = p
12ee0 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e  Leaf->szLeaf = n
12ef0 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d  List;.    pIter-
12f00 3e 70 4c 65 61 66 20 3d 20 70 4c 65 61 66 3b 0a  >pLeaf = pLeaf;.
12f10 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
12f20 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74  Offset = fts5Get
12f30 56 61 72 69 6e 74 28 70 4c 65 61 66 2d 3e 70 2c  Varint(pLeaf->p,
12f40 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
12f50 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 49 74 65  Rowid);.    pIte
12f60 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
12f70 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a 20   = pLeaf->nn;.. 
12f80 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46     if( flags & F
12f90 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
12fa0 45 53 43 20 29 7b 0a 20 20 20 20 20 20 70 49 74  ESC ){.      pIt
12fb0 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53  er->flags |= FTS
12fc0 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
12fd0 45 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  E;.      fts5Seg
12fe0 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50  IterReverseInitP
12ff0 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
13000 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13010 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
13020 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
13030 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35     }.  }..  fts5
13040 53 65 67 49 74 65 72 53 65 74 4e 65 78 74 28 70  SegIterSetNext(p
13050 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pIter);.}../*.
13060 2a 2a 20 5a 65 72 6f 20 74 68 65 20 69 74 65 72  ** Zero the iter
13070 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
13080 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
13090 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
130a0 20 66 74 73 35 53 65 67 49 74 65 72 43 6c 65 61   fts5SegIterClea
130b0 72 28 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  r(Fts5SegIter *p
130c0 49 74 65 72 29 7b 0a 20 20 66 74 73 35 42 75 66  Iter){.  fts5Buf
130d0 66 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e  ferFree(&pIter->
130e0 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 44 61 74  term);.  fts5Dat
130f0 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
13100 70 4c 65 61 66 29 3b 0a 20 20 66 74 73 35 44 61  pLeaf);.  fts5Da
13110 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
13120 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20 66  >pNextLeaf);.  f
13130 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
13140 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b  (pIter->pDlidx);
13150 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
13160 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66  pIter->aRowidOff
13170 73 65 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  set);.  memset(p
13180 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
13190 46 74 73 35 53 65 67 49 74 65 72 29 29 3b 0a 7d  Fts5SegIter));.}
131a0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
131b0 44 45 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  DEBUG../*.** Thi
131c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
131d0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
131e0 65 20 62 69 67 20 61 73 73 65 72 74 28 29 20 70  e big assert() p
131f0 72 6f 63 65 64 75 72 65 20 69 6d 70 6c 65 6d 65  rocedure impleme
13200 6e 74 65 64 20 62 79 0a 2a 2a 20 66 74 73 35 41  nted by.** fts5A
13210 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65  ssertMultiIterSe
13220 74 75 70 28 29 2e 20 49 74 20 65 6e 73 75 72 65  tup(). It ensure
13230 73 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  s that the resul
13240 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  t currently stor
13250 65 64 0a 2a 2a 20 69 6e 20 2a 70 52 65 73 20 69  ed.** in *pRes i
13260 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65  s the correct re
13270 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e  sult of comparin
13280 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  g the current po
13290 73 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a 2a  sitions of the.*
132a0 2a 20 74 77 6f 20 69 74 65 72 61 74 6f 72 73 2e  * two iterators.
132b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
132c0 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72  fts5AssertCompar
132d0 69 73 6f 6e 52 65 73 75 6c 74 28 0a 20 20 46 74  isonResult(.  Ft
132e0 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a  s5Iter *pIter, .
132f0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
13300 31 2c 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  1,.  Fts5SegIter
13310 20 2a 70 32 2c 0a 20 20 46 74 73 35 43 52 65 73   *p2,.  Fts5CRes
13320 75 6c 74 20 2a 70 52 65 73 0a 29 7b 0a 20 20 69  ult *pRes.){.  i
13330 6e 74 20 69 31 20 3d 20 70 31 20 2d 20 70 49 74  nt i1 = p1 - pIt
13340 65 72 2d 3e 61 53 65 67 3b 0a 20 20 69 6e 74 20  er->aSeg;.  int 
13350 69 32 20 3d 20 70 32 20 2d 20 70 49 74 65 72 2d  i2 = p2 - pIter-
13360 3e 61 53 65 67 3b 0a 0a 20 20 69 66 28 20 70 31  >aSeg;..  if( p1
13370 2d 3e 70 4c 65 61 66 20 7c 7c 20 70 32 2d 3e 70  ->pLeaf || p2->p
13380 4c 65 61 66 20 29 7b 0a 20 20 20 20 69 66 28 20  Leaf ){.    if( 
13390 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a  p1->pLeaf==0 ){.
133a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
133b0 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20 29  es->iFirst==i2 )
133c0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
133d0 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a  p2->pLeaf==0 ){.
133e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
133f0 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20 29  es->iFirst==i1 )
13400 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13410 20 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49     int nMin = MI
13420 4e 28 70 31 2d 3e 74 65 72 6d 2e 6e 2c 20 70 32  N(p1->term.n, p2
13430 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20  ->term.n);.     
13440 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d   int res = memcm
13450 70 28 70 31 2d 3e 74 65 72 6d 2e 70 2c 20 70 32  p(p1->term.p, p2
13460 2d 3e 74 65 72 6d 2e 70 2c 20 6e 4d 69 6e 29 3b  ->term.p, nMin);
13470 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d  .      if( res==
13480 30 20 29 20 72 65 73 20 3d 20 70 31 2d 3e 74 65  0 ) res = p1->te
13490 72 6d 2e 6e 20 2d 20 70 32 2d 3e 74 65 72 6d 2e  rm.n - p2->term.
134a0 6e 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65  n;..      if( re
134b0 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  s==0 ){.        
134c0 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54  assert( pRes->bT
134d0 65 72 6d 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20  ermEq==1 );.    
134e0 20 20 20 20 61 73 73 65 72 74 28 20 70 31 2d 3e      assert( p1->
134f0 69 52 6f 77 69 64 21 3d 70 32 2d 3e 69 52 6f 77  iRowid!=p2->iRow
13500 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  id );.        re
13510 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69 64  s = ((p1->iRowid
13520 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d   > p2->iRowid)==
13530 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d  pIter->bRev) ? -
13540 31 20 3a 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  1 : 1;.      }el
13550 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
13560 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45  rt( pRes->bTermE
13570 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  q==0 );.      }.
13580 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30  .      if( res<0
13590 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
135a0 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74  rt( pRes->iFirst
135b0 3d 3d 69 31 20 29 3b 0a 20 20 20 20 20 20 7d 65  ==i1 );.      }e
135c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
135d0 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73  ert( pRes->iFirs
135e0 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 20 20 7d  t==i2 );.      }
135f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
13600 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
13610 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c  n is a no-op unl
13620 65 73 73 20 53 51 4c 49 54 45 5f 44 45 42 55 47  ess SQLITE_DEBUG
13630 20 69 73 20 64 65 66 69 6e 65 64 20 77 68 65 6e   is defined when
13640 20 74 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20   this module.** 
13650 69 73 20 63 6f 6d 70 69 6c 65 64 2e 20 49 6e 20  is compiled. In 
13660 74 68 61 74 20 63 61 73 65 2c 20 74 68 69 73 20  that case, this 
13670 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 73 73 65  function is esse
13680 6e 74 69 61 6c 6c 79 20 61 6e 20 61 73 73 65 72  ntially an asser
13690 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  t() .** statemen
136a0 74 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79  t used to verify
136b0 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
136c0 74 73 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d  ts of the pIter-
136d0 3e 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 0a  >aFirst[] array.
136e0 2a 2a 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a  ** are correct..
136f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
13700 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74  ts5AssertMultiIt
13710 65 72 53 65 74 75 70 28 46 74 73 35 49 6e 64 65  erSetup(Fts5Inde
13720 78 20 2a 70 2c 20 46 74 73 35 49 74 65 72 20 2a  x *p, Fts5Iter *
13730 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d  pIter){.  if( p-
13740 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
13750 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
13760 72 20 2a 70 46 69 72 73 74 20 3d 20 26 70 49 74  r *pFirst = &pIt
13770 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
13780 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
13790 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ];.    int i;.
137a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 46  .    assert( (pF
137b0 69 72 73 74 2d 3e 70 4c 65 61 66 3d 3d 30 29 3d  irst->pLeaf==0)=
137c0 3d 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f  =pIter->base.bEo
137d0 66 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  f );..    /* Che
137e0 63 6b 20 74 68 61 74 20 70 49 74 65 72 2d 3e 69  ck that pIter->i
137f0 53 77 69 74 63 68 52 6f 77 69 64 20 69 73 20 73  SwitchRowid is s
13800 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f  et correctly. */
13810 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
13820 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b  pIter->nSeg; i++
13830 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ){.      Fts5Seg
13840 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65  Iter *p1 = &pIte
13850 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20  r->aSeg[i];.    
13860 20 20 61 73 73 65 72 74 28 20 70 31 3d 3d 70 46    assert( p1==pF
13870 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 20 20  irst .          
13880 20 7c 7c 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30   || p1->pLeaf==0
13890 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
138a0 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72  fts5BufferCompar
138b0 65 28 26 70 46 69 72 73 74 2d 3e 74 65 72 6d 2c  e(&pFirst->term,
138c0 20 26 70 31 2d 3e 74 65 72 6d 29 20 0a 20 20 20   &p1->term) .   
138d0 20 20 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e 69          || p1->i
138e0 52 6f 77 69 64 3d 3d 70 49 74 65 72 2d 3e 69 53  Rowid==pIter->iS
138f0 77 69 74 63 68 52 6f 77 69 64 0a 20 20 20 20 20  witchRowid.     
13900 20 20 20 20 20 20 7c 7c 20 28 70 31 2d 3e 69 52        || (p1->iR
13910 6f 77 69 64 3c 70 49 74 65 72 2d 3e 69 53 77 69  owid<pIter->iSwi
13920 74 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  tchRowid)==pIter
13930 2d 3e 62 52 65 76 0a 20 20 20 20 20 20 29 3b 0a  ->bRev.      );.
13940 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
13950 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65  =0; i<pIter->nSe
13960 67 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20  g; i+=2){.      
13970 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 20  Fts5SegIter *p1 
13980 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
13990 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ];.      Fts5Seg
139a0 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74 65  Iter *p2 = &pIte
139b0 72 2d 3e 61 53 65 67 5b 69 2b 31 5d 3b 0a 20 20  r->aSeg[i+1];.  
139c0 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20      Fts5CResult 
139d0 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e  *pRes = &pIter->
139e0 61 46 69 72 73 74 5b 28 70 49 74 65 72 2d 3e 6e  aFirst[(pIter->n
139f0 53 65 67 20 2b 20 69 29 20 2f 20 32 5d 3b 0a 20  Seg + i) / 2];. 
13a00 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74 43       fts5AssertC
13a10 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28  omparisonResult(
13a20 70 49 74 65 72 2c 20 70 31 2c 20 70 32 2c 20 70  pIter, p1, p2, p
13a30 52 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Res);.    }..   
13a40 20 66 6f 72 28 69 3d 31 3b 20 69 3c 28 70 49 74   for(i=1; i<(pIt
13a50 65 72 2d 3e 6e 53 65 67 20 2f 20 32 29 3b 20 69  er->nSeg / 2); i
13a60 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35  +=2){.      Fts5
13a70 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70  SegIter *p1 = &p
13a80 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
13a90 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32 5d 2e 69  r->aFirst[i*2].i
13aa0 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46  First ];.      F
13ab0 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d  ts5SegIter *p2 =
13ac0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   &pIter->aSeg[ p
13ad0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32  Iter->aFirst[i*2
13ae0 2b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  +1].iFirst ];.  
13af0 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20      Fts5CResult 
13b00 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e  *pRes = &pIter->
13b10 61 46 69 72 73 74 5b 69 5d 3b 0a 20 20 20 20 20  aFirst[i];.     
13b20 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61   fts5AssertCompa
13b30 72 69 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65  risonResult(pIte
13b40 72 2c 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29  r, p1, p2, pRes)
13b50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
13b60 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73  lse.# define fts
13b70 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
13b80 53 65 74 75 70 28 78 2c 79 29 0a 23 65 6e 64 69  Setup(x,y).#endi
13b90 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65 20  f../*.** Do the 
13ba0 63 6f 6d 70 61 72 69 73 6f 6e 20 6e 65 63 65 73  comparison neces
13bb0 73 61 72 79 20 74 6f 20 70 6f 70 75 6c 61 74 65  sary to populate
13bc0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
13bd0 4f 75 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Out]..**.** If t
13be0 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
13bf0 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  e is non-zero, t
13c00 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 69 6e  hen it is the in
13c10 64 65 78 20 6f 66 20 61 6e 20 65 6e 74 72 79 0a  dex of an entry.
13c20 2a 2a 20 69 6e 20 74 68 65 20 70 49 74 65 72 2d  ** in the pIter-
13c30 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 20 74 68  >aSeg[] array th
13c40 61 74 20 69 73 20 28 61 29 20 6e 6f 74 20 61 74  at is (a) not at
13c50 20 45 4f 46 2c 20 61 6e 64 20 28 62 29 20 70 6f   EOF, and (b) po
13c60 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 6b  inting.** to a k
13c70 65 79 20 74 68 61 74 20 69 73 20 61 20 64 75 70  ey that is a dup
13c80 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65  licate of anothe
13c90 72 2c 20 68 69 67 68 65 72 20 70 72 69 6f 72 69  r, higher priori
13ca0 74 79 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 2d  ty, .** segment-
13cb0 69 74 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20  iterator in the 
13cc0 70 53 65 67 2d 3e 61 53 65 67 5b 5d 20 61 72 72  pSeg->aSeg[] arr
13cd0 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ay..*/.static in
13ce0 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44  t fts5MultiIterD
13cf0 6f 43 6f 6d 70 61 72 65 28 46 74 73 35 49 74 65  oCompare(Fts5Ite
13d00 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4f  r *pIter, int iO
13d10 75 74 29 7b 0a 20 20 69 6e 74 20 69 31 3b 20 20  ut){.  int i1;  
13d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d30 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
13d40 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 46 74 73  of left-hand Fts
13d50 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e  5SegIter */.  in
13d60 74 20 69 32 3b 20 20 20 20 20 20 20 20 20 20 20  t i2;           
13d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13d80 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d   Index of right-
13d90 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72  hand Fts5SegIter
13da0 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 73 3b 0a   */.  int iRes;.
13db0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
13dc0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
13dd0 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 46    /* Left-hand F
13de0 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20  ts5SegIter */.  
13df0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 3b  Fts5SegIter *p2;
13e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e10 2f 2a 20 52 69 67 68 74 2d 68 61 6e 64 20 46 74  /* Right-hand Ft
13e20 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46  s5SegIter */.  F
13e30 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
13e40 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73   = &pIter->aFirs
13e50 74 5b 69 4f 75 74 5d 3b 0a 0a 20 20 61 73 73 65  t[iOut];..  asse
13e60 72 74 28 20 69 4f 75 74 3c 70 49 74 65 72 2d 3e  rt( iOut<pIter->
13e70 6e 53 65 67 20 26 26 20 69 4f 75 74 3e 30 20 29  nSeg && iOut>0 )
13e80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
13e90 72 2d 3e 62 52 65 76 3d 3d 30 20 7c 7c 20 70 49  r->bRev==0 || pI
13ea0 74 65 72 2d 3e 62 52 65 76 3d 3d 31 20 29 3b 0a  ter->bRev==1 );.
13eb0 0a 20 20 69 66 28 20 69 4f 75 74 3e 3d 28 70 49  .  if( iOut>=(pI
13ec0 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 29 7b 0a  ter->nSeg/2) ){.
13ed0 20 20 20 20 69 31 20 3d 20 28 69 4f 75 74 20 2d      i1 = (iOut -
13ee0 20 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20   pIter->nSeg/2) 
13ef0 2a 20 32 3b 0a 20 20 20 20 69 32 20 3d 20 69 31  * 2;.    i2 = i1
13f00 20 2b 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   + 1;.  }else{. 
13f10 20 20 20 69 31 20 3d 20 70 49 74 65 72 2d 3e 61     i1 = pIter->a
13f20 46 69 72 73 74 5b 69 4f 75 74 2a 32 5d 2e 69 46  First[iOut*2].iF
13f30 69 72 73 74 3b 0a 20 20 20 20 69 32 20 3d 20 70  irst;.    i2 = p
13f40 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75  Iter->aFirst[iOu
13f50 74 2a 32 2b 31 5d 2e 69 46 69 72 73 74 3b 0a 20  t*2+1].iFirst;. 
13f60 20 7d 0a 20 20 70 31 20 3d 20 26 70 49 74 65 72   }.  p1 = &pIter
13f70 2d 3e 61 53 65 67 5b 69 31 5d 3b 0a 20 20 70 32  ->aSeg[i1];.  p2
13f80 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
13f90 69 32 5d 3b 0a 0a 20 20 70 52 65 73 2d 3e 62 54  i2];..  pRes->bT
13fa0 65 72 6d 45 71 20 3d 20 30 3b 0a 20 20 69 66 28  ermEq = 0;.  if(
13fb0 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b   p1->pLeaf==0 ){
13fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
13fd0 20 70 31 20 69 73 20 61 74 20 45 4f 46 20 2a 2f   p1 is at EOF */
13fe0 0a 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a  .    iRes = i2;.
13ff0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e    }else if( p2->
14000 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20  pLeaf==0 ){     
14010 2f 2a 20 49 66 20 70 32 20 69 73 20 61 74 20 45  /* If p2 is at E
14020 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d  OF */.    iRes =
14030 20 69 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   i1;.  }else{.  
14040 20 20 69 6e 74 20 72 65 73 20 3d 20 66 74 73 35    int res = fts5
14050 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70  BufferCompare(&p
14060 31 2d 3e 74 65 72 6d 2c 20 26 70 32 2d 3e 74 65  1->term, &p2->te
14070 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  rm);.    if( res
14080 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
14090 65 72 74 28 20 69 32 3e 69 31 20 29 3b 0a 20 20  ert( i2>i1 );.  
140a0 20 20 20 20 61 73 73 65 72 74 28 20 69 32 21 3d      assert( i2!=
140b0 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65 73 2d  0 );.      pRes-
140c0 3e 62 54 65 72 6d 45 71 20 3d 20 31 3b 0a 20 20  >bTermEq = 1;.  
140d0 20 20 20 20 69 66 28 20 70 31 2d 3e 69 52 6f 77      if( p1->iRow
140e0 69 64 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29  id==p2->iRowid )
140f0 7b 0a 20 20 20 20 20 20 20 20 70 31 2d 3e 62 44  {.        p1->bD
14100 65 6c 20 3d 20 70 32 2d 3e 62 44 65 6c 3b 0a 20  el = p2->bDel;. 
14110 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 32         return i2
14120 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14130 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77  res = ((p1->iRow
14140 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29  id > p2->iRowid)
14150 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f  ==pIter->bRev) ?
14160 20 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a   -1 : +1;.    }.
14170 20 20 20 20 61 73 73 65 72 74 28 20 72 65 73 21      assert( res!
14180 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65  =0 );.    if( re
14190 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65  s<0 ){.      iRe
141a0 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73  s = i1;.    }els
141b0 65 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20  e{.      iRes = 
141c0 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  i2;.    }.  }.. 
141d0 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20   pRes->iFirst = 
141e0 28 75 31 36 29 69 52 65 73 3b 0a 20 20 72 65 74  (u16)iRes;.  ret
141f0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
14200 4d 6f 76 65 20 74 68 65 20 73 65 67 2d 69 74 65  Move the seg-ite
14210 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
14220 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
14230 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 69   rowid on page i
14240 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49 74 20  LeafPgno..** It 
14250 69 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20 6c  is an error if l
14260 65 61 66 20 69 4c 65 61 66 50 67 6e 6f 20 64 6f  eaf iLeafPgno do
14270 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
14280 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 69  contains no rowi
14290 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
142a0 69 64 20 66 74 73 35 53 65 67 49 74 65 72 47 6f  id fts5SegIterGo
142b0 74 6f 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e  toPage(.  Fts5In
142c0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
142d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
142e0 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
142f0 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
14300 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
14310 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
14320 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a  r to advance */.
14330 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 0a    int iLeafPgno.
14340 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65  ){.  assert( iLe
14350 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c  afPgno>pIter->iL
14360 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 69 66  eafPgno );..  if
14370 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65  ( iLeafPgno>pIte
14380 72 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  r->pSeg->pgnoLas
14390 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  t ){.    p->rc =
143a0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
143b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
143c0 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
143d0 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20  r->pNextLeaf);. 
143e0 20 20 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c     pIter->pNextL
143f0 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 49 74  eaf = 0;.    pIt
14400 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  er->iLeafPgno = 
14410 69 4c 65 61 66 50 67 6e 6f 2d 31 3b 0a 20 20 20  iLeafPgno-1;.   
14420 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
14430 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
14440 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
14450 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
14460 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
14470 3d 3d 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a  ==iLeafPgno );..
14480 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
14490 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
144a0 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
144b0 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d    u8 *a = pIter-
144c0 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20  >pLeaf->p;.     
144d0 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e   int n = pIter->
144e0 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a  pLeaf->szLeaf;..
144f0 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73        iOff = fts
14500 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
14510 66 66 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  ff(pIter->pLeaf)
14520 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66  ;.      if( iOff
14530 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b  <4 || iOff>=n ){
14540 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
14550 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
14560 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14570 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
14580 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  GetVarint(&a[iOf
14590 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  f], (u64*)&pIter
145a0 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
145b0 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
145c0 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20  ffset = iOff;.  
145d0 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
145e0 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
145f0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
14600 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
14610 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72  Advance the iter
14620 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
14630 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
14640 6e 74 20 75 6e 74 69 6c 20 69 74 20 69 73 20 61  nt until it is a
14650 74 20 6f 72 20 0a 2a 2a 20 70 61 73 74 20 72 6f  t or .** past ro
14660 77 69 64 20 69 46 72 6f 6d 2e 20 52 65 67 61 72  wid iFrom. Regar
14670 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
14680 75 65 20 6f 66 20 69 46 72 6f 6d 2c 20 74 68 65  ue of iFrom, the
14690 20 69 74 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20   iterator is.** 
146a0 61 6c 77 61 79 73 20 61 64 76 61 6e 63 65 64 20  always advanced 
146b0 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0a 2a  at least once..*
146c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
146d0 73 35 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f  s5SegIterNextFro
146e0 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
146f0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
14700 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
14710 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
14720 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
14730 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
14740 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
14750 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 36 34  advance */.  i64
14760 20 69 4d 61 74 63 68 20 20 20 20 20 20 20 20 20   iMatch         
14770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14780 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72  Advance iterator
14790 20 61 74 20 6c 65 61 73 74 20 74 68 69 73 20 66   at least this f
147a0 61 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62  ar */.){.  int b
147b0 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c  Rev = (pIter->fl
147c0 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
147d0 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46  ER_REVERSE);.  F
147e0 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
147f0 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44  lidx = pIter->pD
14800 6c 69 64 78 3b 0a 20 20 69 6e 74 20 69 4c 65 61  lidx;.  int iLea
14810 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69  fPgno = pIter->i
14820 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  LeafPgno;.  int 
14830 62 4d 6f 76 65 20 3d 20 31 3b 0a 0a 20 20 61 73  bMove = 1;..  as
14840 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
14850 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
14860 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61  R_ONETERM );.  a
14870 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44  ssert( pIter->pD
14880 6c 69 64 78 20 29 3b 0a 20 20 61 73 73 65 72 74  lidx );.  assert
14890 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29  ( pIter->pLeaf )
148a0 3b 0a 0a 20 20 69 66 28 20 62 52 65 76 3d 3d 30  ;..  if( bRev==0
148b0 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 21   ){.    while( !
148c0 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
148d0 28 70 2c 20 70 44 6c 69 64 78 29 20 26 26 20 69  (p, pDlidx) && i
148e0 4d 61 74 63 68 3e 66 74 73 35 44 6c 69 64 78 49  Match>fts5DlidxI
148f0 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29  terRowid(pDlidx)
14900 20 29 7b 0a 20 20 20 20 20 20 69 4c 65 61 66 50   ){.      iLeafP
14910 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49  gno = fts5DlidxI
14920 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b  terPgno(pDlidx);
14930 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
14940 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69  IterNext(p, pDli
14950 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  dx);.    }.    a
14960 73 73 65 72 74 5f 6e 63 28 20 69 4c 65 61 66 50  ssert_nc( iLeafP
14970 67 6e 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c 65 61  gno>=pIter->iLea
14980 66 50 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20 29  fPgno || p->rc )
14990 3b 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66 50  ;.    if( iLeafP
149a0 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66  gno>pIter->iLeaf
149b0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 66 74  Pgno ){.      ft
149c0 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67  s5SegIterGotoPag
149d0 65 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 65 61  e(p, pIter, iLea
149e0 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 62 4d  fPgno);.      bM
149f0 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ove = 0;.    }. 
14a00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
14a10 72 74 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74  rt( pIter->pNext
14a20 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Leaf==0 );.    a
14a30 73 73 65 72 74 28 20 69 4d 61 74 63 68 3c 70 49  ssert( iMatch<pI
14a40 74 65 72 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20  ter->iRowid );. 
14a50 20 20 20 77 68 69 6c 65 28 20 21 66 74 73 35 44     while( !fts5D
14a60 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
14a70 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74 63 68  Dlidx) && iMatch
14a80 3c 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f  <fts5DlidxIterRo
14a90 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b 0a 20  wid(pDlidx) ){. 
14aa0 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
14ab0 65 72 50 72 65 76 28 70 2c 20 70 44 6c 69 64 78  erPrev(p, pDlidx
14ac0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 65  );.    }.    iLe
14ad0 61 66 50 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69  afPgno = fts5Dli
14ae0 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
14af0 78 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  x);..    assert(
14b00 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f   fts5DlidxIterEo
14b10 66 28 70 2c 20 70 44 6c 69 64 78 29 20 7c 7c 20  f(p, pDlidx) || 
14b20 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 49 74 65 72  iLeafPgno<=pIter
14b30 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a  ->iLeafPgno );..
14b40 20 20 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e      if( iLeafPgn
14b50 6f 3c 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  o<pIter->iLeafPg
14b60 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  no ){.      pIte
14b70 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69  r->iLeafPgno = i
14b80 4c 65 61 66 50 67 6e 6f 2b 31 3b 0a 20 20 20 20  LeafPgno+1;.    
14b90 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
14ba0 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70  erseNewPage(p, p
14bb0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 62 4d 6f  Iter);.      bMo
14bc0 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ve = 0;.    }.  
14bd0 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28  }..  do{.    if(
14be0 20 62 4d 6f 76 65 20 26 26 20 70 2d 3e 72 63 3d   bMove && p->rc=
14bf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 49 74  =SQLITE_OK ) pIt
14c00 65 72 2d 3e 78 4e 65 78 74 28 70 2c 20 70 49 74  er->xNext(p, pIt
14c10 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  er, 0);.    if( 
14c20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
14c30 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
14c40 20 62 52 65 76 3d 3d 30 20 26 26 20 70 49 74 65   bRev==0 && pIte
14c50 72 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63  r->iRowid>=iMatc
14c60 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  h ) break;.    i
14c70 66 28 20 62 52 65 76 21 3d 30 20 26 26 20 70 49  f( bRev!=0 && pI
14c80 74 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d 61  ter->iRowid<=iMa
14c90 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  tch ) break;.   
14ca0 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 77   bMove = 1;.  }w
14cb0 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
14cc0 49 54 45 5f 4f 4b 20 29 3b 0a 7d 0a 0a 0a 2f 2a  ITE_OK );.}.../*
14cd0 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 69 74 65  .** Free the ite
14ce0 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73  rator object pas
14cf0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
14d00 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  d argument..*/.s
14d10 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
14d20 75 6c 74 69 49 74 65 72 46 72 65 65 28 46 74 73  ultiIterFree(Fts
14d30 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  5Iter *pIter){. 
14d40 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20   if( pIter ){.  
14d50 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
14d60 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
14d70 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Seg; i++){.     
14d80 20 66 74 73 35 53 65 67 49 74 65 72 43 6c 65 61   fts5SegIterClea
14d90 72 28 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  r(&pIter->aSeg[i
14da0 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  ]);.    }.    ft
14db0 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
14dc0 73 65 28 70 49 74 65 72 2d 3e 70 53 74 72 75 63  se(pIter->pStruc
14dd0 74 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  t);.    fts5Buff
14de0 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 70  erFree(&pIter->p
14df0 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  oslist);.    sql
14e00 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29  ite3_free(pIter)
14e10 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
14e20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
14e30 65 72 41 64 76 61 6e 63 65 64 28 0a 20 20 46 74  erAdvanced(.  Ft
14e40 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
14e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14e60 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f   FTS5 backend to
14e70 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20   iterate within 
14e80 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  */.  Fts5Iter *p
14e90 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
14ea0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
14eb0 20 74 6f 20 75 70 64 61 74 65 20 61 46 69 72 73   to update aFirs
14ec0 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f  t[] array for */
14ed0 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65 64 2c  .  int iChanged,
14ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ef0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73     /* Index of s
14f00 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74  ub-iterator just
14f10 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20 69   advanced */.  i
14f20 6e 74 20 69 4d 69 6e 73 65 74 20 20 20 20 20 20  nt iMinset      
14f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14f40 2a 20 4d 69 6e 69 6d 75 6d 20 65 6e 74 72 79 20  * Minimum entry 
14f50 69 6e 20 61 46 69 72 73 74 5b 5d 20 74 6f 20 73  in aFirst[] to s
14f60 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  et */.){.  int i
14f70 3b 0a 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72  ;.  for(i=(pIter
14f80 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29  ->nSeg+iChanged)
14f90 2f 32 3b 20 69 3e 3d 69 4d 69 6e 73 65 74 20 26  /2; i>=iMinset &
14fa0 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
14fb0 4f 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20  OK; i=i/2){.    
14fc0 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 69 66 28  int iEq;.    if(
14fd0 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74   (iEq = fts5Mult
14fe0 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70  iIterDoCompare(p
14ff0 49 74 65 72 2c 20 69 29 29 20 29 7b 0a 20 20 20  Iter, i)) ){.   
15000 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
15010 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
15020 53 65 67 5b 69 45 71 5d 3b 0a 20 20 20 20 20 20  Seg[iEq];.      
15030 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
15040 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
15050 20 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c    pSeg->xNext(p,
15060 20 70 53 65 67 2c 20 30 29 3b 0a 20 20 20 20 20   pSeg, 0);.     
15070 20 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67   i = pIter->nSeg
15080 20 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20   + iEq;.    }.  
15090 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 2d 69  }.}../*.** Sub-i
150a0 74 65 72 61 74 6f 72 20 69 43 68 61 6e 67 65 64  terator iChanged
150b0 20 6f 66 20 69 74 65 72 61 74 6f 72 20 70 49 74   of iterator pIt
150c0 65 72 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  er has just been
150d0 20 61 64 76 61 6e 63 65 64 2e 20 49 74 20 73 74   advanced. It st
150e0 69 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ill.** points to
150f0 20 74 68 65 20 73 61 6d 65 20 74 65 72 6d 20 74   the same term t
15100 68 6f 75 67 68 20 2d 20 6a 75 73 74 20 61 20 64  hough - just a d
15110 69 66 66 65 72 65 6e 74 20 72 6f 77 69 64 2e 20  ifferent rowid. 
15120 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
15130 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 70 64   attempts to upd
15140 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ate the contents
15150 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d 3e 61   of the pIter->a
15160 46 69 72 73 74 5b 5d 20 61 63 63 6f 72 64 69 6e  First[] accordin
15170 67 6c 79 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f  gly..** If it do
15180 65 73 20 73 6f 20 73 75 63 63 65 73 73 66 75 6c  es so successful
15190 6c 79 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  ly, 0 is returne
151a0 64 2e 20 4f 74 68 65 72 77 69 73 65 20 31 2e 0a  d. Otherwise 1..
151b0 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72  **.** If non-zer
151c0 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  o is returned, t
151d0 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
151e0 20 63 61 6c 6c 20 66 74 73 35 4d 75 6c 74 69 49   call fts5MultiI
151f0 74 65 72 41 64 76 61 6e 63 65 64 28 29 0a 2a 2a  terAdvanced().**
15200 20 6f 6e 20 74 68 65 20 69 74 65 72 61 74 6f 72   on the iterator
15210 20 69 6e 73 74 65 61 64 2e 20 54 68 61 74 20 66   instead. That f
15220 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65  unction does the
15230 20 73 61 6d 65 20 61 73 20 74 68 69 73 20 6f 6e   same as this on
15240 65 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61  e, except.** tha
15250 74 20 69 74 20 64 65 61 6c 73 20 77 69 74 68 20  t it deals with 
15260 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
15270 20 63 61 73 65 73 20 61 73 20 77 65 6c 6c 2e 0a   cases as well..
15280 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 66  */ .static int f
15290 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
152a0 6e 63 65 52 6f 77 69 64 28 0a 20 20 46 74 73 35  nceRowid(.  Fts5
152b0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
152c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
152d0 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64 61 74  terator to updat
152e0 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79  e aFirst[] array
152f0 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43   for */.  int iC
15300 68 61 6e 67 65 64 2c 20 20 20 20 20 20 20 20 20  hanged,         
15310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
15320 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72 61 74  ex of sub-iterat
15330 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63 65 64  or just advanced
15340 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
15350 72 20 2a 2a 70 70 46 69 72 73 74 0a 29 7b 0a 20  r **ppFirst.){. 
15360 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 4e   Fts5SegIter *pN
15370 65 77 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  ew = &pIter->aSe
15380 67 5b 69 43 68 61 6e 67 65 64 5d 3b 0a 0a 20 20  g[iChanged];..  
15390 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64  if( pNew->iRowid
153a0 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68  ==pIter->iSwitch
153b0 52 6f 77 69 64 0a 20 20 20 7c 7c 20 28 70 4e 65  Rowid.   || (pNe
153c0 77 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65 72 2d  w->iRowid<pIter-
153d0 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d  >iSwitchRowid)==
153e0 70 49 74 65 72 2d 3e 62 52 65 76 0a 20 20 29 7b  pIter->bRev.  ){
153f0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
15400 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 4f 74  Fts5SegIter *pOt
15410 68 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  her = &pIter->aS
15420 65 67 5b 69 43 68 61 6e 67 65 64 20 5e 20 30 78  eg[iChanged ^ 0x
15430 30 30 30 31 5d 3b 0a 20 20 20 20 70 49 74 65 72  0001];.    pIter
15440 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d  ->iSwitchRowid =
15450 20 70 49 74 65 72 2d 3e 62 52 65 76 20 3f 20 53   pIter->bRev ? S
15460 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20  MALLEST_INT64 : 
15470 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20  LARGEST_INT64;. 
15480 20 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d     for(i=(pIter-
15490 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f  >nSeg+iChanged)/
154a0 32 3b 20 31 3b 20 69 3d 69 2f 32 29 7b 0a 20 20  2; 1; i=i/2){.  
154b0 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20      Fts5CResult 
154c0 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e  *pRes = &pIter->
154d0 61 46 69 72 73 74 5b 69 5d 3b 0a 0a 20 20 20 20  aFirst[i];..    
154e0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
154f0 70 4c 65 61 66 20 29 3b 0a 20 20 20 20 20 20 61  pLeaf );.      a
15500 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65  ssert( pRes->bTe
15510 72 6d 45 71 3d 3d 30 20 7c 7c 20 70 4f 74 68 65  rmEq==0 || pOthe
15520 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 20  r->pLeaf );..   
15530 20 20 20 69 66 28 20 70 52 65 73 2d 3e 62 54 65     if( pRes->bTe
15540 72 6d 45 71 20 29 7b 0a 20 20 20 20 20 20 20 20  rmEq ){.        
15550 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64  if( pNew->iRowid
15560 3d 3d 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64  ==pOther->iRowid
15570 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
15580 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
15590 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65  }else if( (pOthe
155a0 72 2d 3e 69 52 6f 77 69 64 3e 70 4e 65 77 2d 3e  r->iRowid>pNew->
155b0 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e  iRowid)==pIter->
155c0 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  bRev ){.        
155d0 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68    pIter->iSwitch
155e0 52 6f 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e  Rowid = pOther->
155f0 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  iRowid;.        
15600 20 20 70 4e 65 77 20 3d 20 70 4f 74 68 65 72 3b    pNew = pOther;
15610 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
15620 66 28 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f 77  f( (pOther->iRow
15630 69 64 3e 70 49 74 65 72 2d 3e 69 53 77 69 74 63  id>pIter->iSwitc
15640 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e  hRowid)==pIter->
15650 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  bRev ){.        
15660 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68    pIter->iSwitch
15670 52 6f 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e  Rowid = pOther->
15680 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  iRowid;.        
15690 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
156a0 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 28  pRes->iFirst = (
156b0 75 31 36 29 28 70 4e 65 77 20 2d 20 70 49 74 65  u16)(pNew - pIte
156c0 72 2d 3e 61 53 65 67 29 3b 0a 20 20 20 20 20 20  r->aSeg);.      
156d0 69 66 28 20 69 3d 3d 31 20 29 20 62 72 65 61 6b  if( i==1 ) break
156e0 3b 0a 0a 20 20 20 20 20 20 70 4f 74 68 65 72 20  ;..      pOther 
156f0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  = &pIter->aSeg[ 
15700 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 20  pIter->aFirst[i 
15710 5e 20 30 78 30 30 30 31 5d 2e 69 46 69 72 73 74  ^ 0x0001].iFirst
15720 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   ];.    }.  }.. 
15730 20 2a 70 70 46 69 72 73 74 20 3d 20 70 4e 65 77   *ppFirst = pNew
15740 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
15750 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
15760 49 74 65 72 2d 3e 62 45 6f 66 20 76 61 72 69 61  Iter->bEof varia
15770 62 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ble based on the
15780 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 73 75   state of the su
15790 62 2d 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a  b-iterators..*/.
157a0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
157b0 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28  MultiIterSetEof(
157c0 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29  Fts5Iter *pIter)
157d0 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  {.  Fts5SegIter 
157e0 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
157f0 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
15800 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
15810 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 62  .  pIter->base.b
15820 45 6f 66 20 3d 20 70 53 65 67 2d 3e 70 4c 65 61  Eof = pSeg->pLea
15830 66 3d 3d 30 3b 0a 20 20 70 49 74 65 72 2d 3e 69  f==0;.  pIter->i
15840 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70 53  SwitchRowid = pS
15850 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  eg->iRowid;.}../
15860 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74  *.** Move the it
15870 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  erator to the ne
15880 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a  xt entry. .**.**
15890 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
158a0 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
158b0 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74  de is left in Ft
158c0 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 74 20 69  s5Index.rc. It i
158d0 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69 64  s not .** consid
158e0 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66  ered an error if
158f0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65   the iterator re
15900 61 63 68 65 73 20 45 4f 46 2c 20 6f 72 20 69 66  aches EOF, or if
15910 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 61   it is already a
15920 74 20 0a 2a 2a 20 45 4f 46 20 77 68 65 6e 20 74  t .** EOF when t
15930 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
15940 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
15950 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
15960 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35  IterNext(.  Fts5
15970 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
15980 35 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20  5Iter *pIter,.  
15990 69 6e 74 20 62 46 72 6f 6d 2c 20 20 20 20 20 20  int bFrom,      
159a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159b0 2f 2a 20 54 72 75 65 20 69 66 20 61 72 67 75 6d  /* True if argum
159c0 65 6e 74 20 69 46 72 6f 6d 20 69 73 20 76 61 6c  ent iFrom is val
159d0 69 64 20 2a 2f 0a 20 20 69 36 34 20 69 46 72 6f  id */.  i64 iFro
159e0 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
159f0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e          /* Advan
15a00 63 65 20 61 74 20 6c 65 61 73 74 20 61 73 20 66  ce at least as f
15a10 61 72 20 61 73 20 74 68 69 73 20 2a 2f 0a 29 7b  ar as this */.){
15a20 0a 20 20 69 6e 74 20 62 55 73 65 46 72 6f 6d 20  .  int bUseFrom 
15a30 3d 20 62 46 72 6f 6d 3b 0a 20 20 77 68 69 6c 65  = bFrom;.  while
15a40 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
15a50 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 46  OK ){.    int iF
15a60 69 72 73 74 20 3d 20 70 49 74 65 72 2d 3e 61 46  irst = pIter->aF
15a70 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b 0a  irst[1].iFirst;.
15a80 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d      int bNewTerm
15a90 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 53 65   = 0;.    Fts5Se
15aa0 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
15ab0 49 74 65 72 2d 3e 61 53 65 67 5b 69 46 69 72 73  Iter->aSeg[iFirs
15ac0 74 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t];.    assert( 
15ad0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
15ae0 20 29 3b 0a 20 20 20 20 69 66 28 20 62 55 73 65   );.    if( bUse
15af0 46 72 6f 6d 20 26 26 20 70 53 65 67 2d 3e 70 44  From && pSeg->pD
15b00 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20 66 74  lidx ){.      ft
15b10 73 35 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f  s5SegIterNextFro
15b20 6d 28 70 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d  m(p, pSeg, iFrom
15b30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
15b40 20 20 20 20 70 53 65 67 2d 3e 78 4e 65 78 74 28      pSeg->xNext(
15b50 70 2c 20 70 53 65 67 2c 20 26 62 4e 65 77 54 65  p, pSeg, &bNewTe
15b60 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rm);.    }..    
15b70 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d  if( pSeg->pLeaf=
15b80 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d 20 0a  =0 || bNewTerm .
15b90 20 20 20 20 20 7c 7c 20 66 74 73 35 4d 75 6c 74       || fts5Mult
15ba0 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f 77 69  iIterAdvanceRowi
15bb0 64 28 70 49 74 65 72 2c 20 69 46 69 72 73 74 2c  d(pIter, iFirst,
15bc0 20 26 70 53 65 67 29 0a 20 20 20 20 29 7b 0a 20   &pSeg).    ){. 
15bd0 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
15be0 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70 49  erAdvanced(p, pI
15bf0 74 65 72 2c 20 69 46 69 72 73 74 2c 20 31 29 3b  ter, iFirst, 1);
15c00 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
15c10 49 74 65 72 53 65 74 45 6f 66 28 70 49 74 65 72  IterSetEof(pIter
15c20 29 3b 0a 20 20 20 20 20 20 70 53 65 67 20 3d 20  );.      pSeg = 
15c30 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74  &pIter->aSeg[pIt
15c40 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
15c50 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 69 66 28  irst];.      if(
15c60 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20   pSeg->pLeaf==0 
15c70 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a  ) return;.    }.
15c80 0a 20 20 20 20 66 74 73 35 41 73 73 65 72 74 4d  .    fts5AssertM
15c90 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 70 2c  ultiIterSetup(p,
15ca0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73   pIter);.    ass
15cb0 65 72 74 28 20 70 53 65 67 3d 3d 26 70 49 74 65  ert( pSeg==&pIte
15cc0 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e 61  r->aSeg[pIter->a
15cd0 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d  First[1].iFirst]
15ce0 20 26 26 20 70 53 65 67 2d 3e 70 4c 65 61 66 20   && pSeg->pLeaf 
15cf0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
15d00 2d 3e 62 53 6b 69 70 45 6d 70 74 79 3d 3d 30 20  ->bSkipEmpty==0 
15d10 7c 7c 20 70 53 65 67 2d 3e 6e 50 6f 73 20 29 7b  || pSeg->nPos ){
15d20 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53  .      pIter->xS
15d30 65 74 4f 75 74 70 75 74 73 28 70 49 74 65 72 2c  etOutputs(pIter,
15d40 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20 72 65   pSeg);.      re
15d50 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
15d60 62 55 73 65 46 72 6f 6d 20 3d 20 30 3b 0a 20 20  bUseFrom = 0;.  
15d70 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
15d80 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
15d90 78 74 32 28 0a 20 20 46 74 73 35 49 6e 64 65 78  xt2(.  Fts5Index
15da0 20 2a 70 2c 20 0a 20 20 46 74 73 35 49 74 65 72   *p, .  Fts5Iter
15db0 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20 2a   *pIter,.  int *
15dc0 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20 20 20  pbNewTerm       
15dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
15de0 54 3a 20 54 72 75 65 20 69 66 20 2a 6d 69 67 68  T: True if *migh
15df0 74 2a 20 62 65 20 6e 65 77 20 74 65 72 6d 20 2a  t* be new term *
15e00 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
15e10 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79  Iter->bSkipEmpty
15e20 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   );.  if( p->rc=
15e30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15e40 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 6e 74    do {.      int
15e50 20 69 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d   iFirst = pIter-
15e60 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
15e70 74 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  t;.      Fts5Seg
15e80 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
15e90 74 65 72 2d 3e 61 53 65 67 5b 69 46 69 72 73 74  ter->aSeg[iFirst
15ea0 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65  ];.      int bNe
15eb0 77 54 65 72 6d 20 3d 20 30 3b 0a 0a 20 20 20 20  wTerm = 0;..    
15ec0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
15ed0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
15ee0 20 20 20 20 70 53 65 67 2d 3e 78 4e 65 78 74 28      pSeg->xNext(
15ef0 70 2c 20 70 53 65 67 2c 20 26 62 4e 65 77 54 65  p, pSeg, &bNewTe
15f00 72 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  rm);.      if( p
15f10 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c  Seg->pLeaf==0 ||
15f20 20 62 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20   bNewTerm .     
15f30 20 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74    || fts5MultiIt
15f40 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70  erAdvanceRowid(p
15f50 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20 26 70  Iter, iFirst, &p
15f60 53 65 67 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  Seg).      ){.  
15f70 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
15f80 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70  terAdvanced(p, p
15f90 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20 31 29  Iter, iFirst, 1)
15fa0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  ;.        fts5Mu
15fb0 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 70 49  ltiIterSetEof(pI
15fc0 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  ter);.        *p
15fd0 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20  bNewTerm = 1;.  
15fe0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15ff0 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20     *pbNewTerm = 
16000 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
16010 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69   fts5AssertMulti
16020 49 74 65 72 53 65 74 75 70 28 70 2c 20 70 49 74  IterSetup(p, pIt
16030 65 72 29 3b 0a 0a 20 20 20 20 7d 77 68 69 6c 65  er);..    }while
16040 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49  ( fts5MultiIterI
16050 73 45 6d 70 74 79 28 70 2c 20 70 49 74 65 72 29  sEmpty(p, pIter)
16060 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   );.  }.}..stati
16070 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53  c void fts5IterS
16080 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6f 70 28 46  etOutputs_Noop(F
16090 74 73 35 49 74 65 72 20 2a 70 55 6e 75 73 65 64  ts5Iter *pUnused
160a0 31 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  1, Fts5SegIter *
160b0 70 55 6e 75 73 65 64 32 29 7b 0a 20 20 55 4e 55  pUnused2){.  UNU
160c0 53 45 44 5f 50 41 52 41 4d 32 28 70 55 6e 75 73  SED_PARAM2(pUnus
160d0 65 64 31 2c 20 70 55 6e 75 73 65 64 32 29 3b 0a  ed1, pUnused2);.
160e0 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 49 74  }..static Fts5It
160f0 65 72 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65  er *fts5MultiIte
16100 72 41 6c 6c 6f 63 28 0a 20 20 46 74 73 35 49 6e  rAlloc(.  Fts5In
16110 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
16120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
16130 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65  5 backend to ite
16140 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20  rate within */. 
16150 20 69 6e 74 20 6e 53 65 67 0a 29 7b 0a 20 20 46   int nSeg.){.  F
16160 74 73 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20  ts5Iter *pNew;. 
16170 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20   int nSlot;     
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16190 20 2f 2a 20 50 6f 77 65 72 20 6f 66 20 74 77 6f   /* Power of two
161a0 20 3e 3d 20 6e 53 65 67 20 2a 2f 0a 0a 20 20 66   >= nSeg */..  f
161b0 6f 72 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c 6f  or(nSlot=2; nSlo
161c0 74 3c 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e 53  t<nSeg; nSlot=nS
161d0 6c 6f 74 2a 32 29 3b 0a 20 20 70 4e 65 77 20 3d  lot*2);.  pNew =
161e0 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70   fts5IdxMalloc(p
161f0 2c 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  , .      sizeof(
16200 46 74 73 35 49 74 65 72 29 20 2b 20 20 20 20 20  Fts5Iter) +     
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16220 70 4e 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 69  pNew */.      si
16230 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74 65 72  zeof(Fts5SegIter
16240 29 20 2a 20 28 6e 53 6c 6f 74 2d 31 29 20 2b 20  ) * (nSlot-1) + 
16250 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 53 65 67 5b    /* pNew->aSeg[
16260 5d 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f  ] */.      sizeo
16270 66 28 46 74 73 35 43 52 65 73 75 6c 74 29 20 2a  f(Fts5CResult) *
16280 20 6e 53 6c 6f 74 20 20 20 20 20 20 20 20 20 2f   nSlot         /
16290 2a 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 5d  * pNew->aFirst[]
162a0 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 70   */.  );.  if( p
162b0 4e 65 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  New ){.    pNew-
162c0 3e 6e 53 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a 20  >nSeg = nSlot;. 
162d0 20 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 20     pNew->aFirst 
162e0 3d 20 28 46 74 73 35 43 52 65 73 75 6c 74 2a 29  = (Fts5CResult*)
162f0 26 70 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c 6f  &pNew->aSeg[nSlo
16300 74 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 49  t];.    pNew->pI
16310 6e 64 65 78 20 3d 20 70 3b 0a 20 20 20 20 70 4e  ndex = p;.    pN
16320 65 77 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20  ew->xSetOutputs 
16330 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  = fts5IterSetOut
16340 70 75 74 73 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a 20  puts_Noop;.  }. 
16350 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
16360 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
16370 35 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b  5PoslistCallback
16380 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
16390 55 6e 75 73 65 64 2c 20 0a 20 20 76 6f 69 64 20  Unused, .  void 
163a0 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f  *pContext, .  co
163b0 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20  nst u8 *pChunk, 
163c0 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20  int nChunk.){.  
163d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 55 6e  UNUSED_PARAM(pUn
163e0 75 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74 5f  used);.  assert_
163f0 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b  nc( nChunk>=0 );
16400 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20  .  if( nChunk>0 
16410 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  ){.    fts5Buffe
16420 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
16430 28 46 74 73 35 42 75 66 66 65 72 2a 29 70 43 6f  (Fts5Buffer*)pCo
16440 6e 74 65 78 74 2c 20 70 43 68 75 6e 6b 2c 20 6e  ntext, pChunk, n
16450 43 68 75 6e 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 74  Chunk);.  }.}..t
16460 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 6f  ypedef struct Po
16470 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78  slistCallbackCtx
16480 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b   PoslistCallback
16490 43 74 78 3b 0a 73 74 72 75 63 74 20 50 6f 73 6c  Ctx;.struct Posl
164a0 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 7b  istCallbackCtx {
164b0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
164c0 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Buf;            
164d0 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20     /* Append to 
164e0 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20  this buffer */. 
164f0 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
16500 6c 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  lset;           
16510 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74   /* Restrict mat
16520 63 68 65 73 20 74 6f 20 74 68 69 73 20 63 6f 6c  ches to this col
16530 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74  umn */.  int eSt
16540 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
16550 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20           /* See 
16560 61 62 6f 76 65 20 2a 2f 0a 7d 3b 0a 0a 74 79 70  above */.};..typ
16570 65 64 65 66 20 73 74 72 75 63 74 20 50 6f 73 6c  edef struct Posl
16580 69 73 74 4f 66 66 73 65 74 73 43 74 78 20 50 6f  istOffsetsCtx Po
16590 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78 3b  slistOffsetsCtx;
165a0 0a 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74 4f  .struct PoslistO
165b0 66 66 73 65 74 73 43 74 78 20 7b 0a 20 20 46 74  ffsetsCtx {.  Ft
165c0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20  s5Buffer *pBuf; 
165d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
165e0 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20   Append to this 
165f0 62 75 66 66 65 72 20 2a 2f 0a 20 20 46 74 73 35  buffer */.  Fts5
16600 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b  Colset *pColset;
16610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16620 65 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20  estrict matches 
16630 74 6f 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a  to this column *
16640 2f 0a 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20  /.  int iRead;. 
16650 20 69 6e 74 20 69 57 72 69 74 65 3b 0a 7d 3b 0a   int iWrite;.};.
16660 0a 2f 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 4d 61 6b  ./*.** TODO: Mak
16670 65 20 74 68 69 73 20 6d 6f 72 65 20 65 66 66 69  e this more effi
16680 63 69 65 6e 74 21 0a 2a 2f 0a 73 74 61 74 69 63  cient!.*/.static
16690 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 43 6f   int fts5IndexCo
166a0 6c 73 65 74 54 65 73 74 28 46 74 73 35 43 6f 6c  lsetTest(Fts5Col
166b0 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 69 6e  set *pColset, in
166c0 74 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69  t iCol){.  int i
166d0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
166e0 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b  Colset->nCol; i+
166f0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  +){.    if( pCol
16700 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 3d 3d 69  set->aiCol[i]==i
16710 43 6f 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  Col ) return 1;.
16720 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
16730 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
16740 74 73 35 50 6f 73 6c 69 73 74 4f 66 66 73 65 74  ts5PoslistOffset
16750 73 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73  sCallback(.  Fts
16760 35 49 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c  5Index *pUnused,
16770 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65   .  void *pConte
16780 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20  xt, .  const u8 
16790 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68  *pChunk, int nCh
167a0 75 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74  unk.){.  Poslist
167b0 4f 66 66 73 65 74 73 43 74 78 20 2a 70 43 74 78  OffsetsCtx *pCtx
167c0 20 3d 20 28 50 6f 73 6c 69 73 74 4f 66 66 73 65   = (PoslistOffse
167d0 74 73 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b  tsCtx*)pContext;
167e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  .  UNUSED_PARAM(
167f0 70 55 6e 75 73 65 64 29 3b 0a 20 20 61 73 73 65  pUnused);.  asse
16800 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30  rt_nc( nChunk>=0
16810 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b   );.  if( nChunk
16820 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20  >0 ){.    int i 
16830 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
16840 69 3c 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20  i<nChunk ){.    
16850 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20    int iVal;.    
16860 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
16870 72 69 6e 74 33 32 28 26 70 43 68 75 6e 6b 5b 69  rint32(&pChunk[i
16880 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20  ], iVal);.      
16890 69 56 61 6c 20 2b 3d 20 70 43 74 78 2d 3e 69 52  iVal += pCtx->iR
168a0 65 61 64 20 2d 20 32 3b 0a 20 20 20 20 20 20 70  ead - 2;.      p
168b0 43 74 78 2d 3e 69 52 65 61 64 20 3d 20 69 56 61  Ctx->iRead = iVa
168c0 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73  l;.      if( fts
168d0 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74  5IndexColsetTest
168e0 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20  (pCtx->pColset, 
168f0 69 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  iVal) ){.       
16900 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
16910 70 70 65 6e 64 56 61 72 69 6e 74 28 70 43 74 78  ppendVarint(pCtx
16920 2d 3e 70 42 75 66 2c 20 69 56 61 6c 20 2b 20 32  ->pBuf, iVal + 2
16930 20 2d 20 70 43 74 78 2d 3e 69 57 72 69 74 65 29   - pCtx->iWrite)
16940 3b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e  ;.        pCtx->
16950 69 57 72 69 74 65 20 3d 20 69 56 61 6c 3b 0a 20  iWrite = iVal;. 
16960 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16970 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
16980 66 74 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65  fts5PoslistFilte
16990 72 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73  rCallback(.  Fts
169a0 35 49 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c  5Index *pUnused,
169b0 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78  .  void *pContex
169c0 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  t, .  const u8 *
169d0 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75  pChunk, int nChu
169e0 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74 43  nk.){.  PoslistC
169f0 61 6c 6c 62 61 63 6b 43 74 78 20 2a 70 43 74 78  allbackCtx *pCtx
16a00 20 3d 20 28 50 6f 73 6c 69 73 74 43 61 6c 6c 62   = (PoslistCallb
16a10 61 63 6b 43 74 78 2a 29 70 43 6f 6e 74 65 78 74  ackCtx*)pContext
16a20 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
16a30 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 61 73 73  (pUnused);.  ass
16a40 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d  ert_nc( nChunk>=
16a50 30 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e  0 );.  if( nChun
16a60 6b 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  k>0 ){.    /* Se
16a70 61 72 63 68 20 74 68 72 6f 75 67 68 20 74 6f 20  arch through to 
16a80 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 76  find the first v
16a90 61 72 69 6e 74 20 77 69 74 68 20 76 61 6c 75 65  arint with value
16aa0 20 31 2e 20 54 68 69 73 20 69 73 20 74 68 65 0a   1. This is the.
16ab0 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20      ** start of 
16ac0 74 68 65 20 6e 65 78 74 20 63 6f 6c 75 6d 6e 73  the next columns
16ad0 20 68 69 74 73 2e 20 2a 2f 0a 20 20 20 20 69 6e   hits. */.    in
16ae0 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  t i = 0;.    int
16af0 20 69 53 74 61 72 74 20 3d 20 30 3b 0a 0a 20 20   iStart = 0;..  
16b00 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53 74 61    if( pCtx->eSta
16b10 74 65 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  te==2 ){.      i
16b20 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 66  nt iCol;.      f
16b30 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
16b40 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69 43  32(pChunk, i, iC
16b50 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66  ol);.      if( f
16b60 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65  ts5IndexColsetTe
16b70 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74  st(pCtx->pColset
16b80 2c 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  , iCol) ){.     
16b90 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20     pCtx->eState 
16ba0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66 74 73  = 1;.        fts
16bb0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
16bc0 64 56 61 72 69 6e 74 28 70 43 74 78 2d 3e 70 42  dVarint(pCtx->pB
16bd0 75 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  uf, 1);.      }e
16be0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74  lse{.        pCt
16bf0 78 2d 3e 65 53 74 61 74 65 20 3d 20 30 3b 0a 20  x->eState = 0;. 
16c00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
16c10 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 77 68 69    do {.      whi
16c20 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20 26 26 20  le( i<nChunk && 
16c30 70 43 68 75 6e 6b 5b 69 5d 21 3d 30 78 30 31 20  pChunk[i]!=0x01 
16c40 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
16c50 28 20 70 43 68 75 6e 6b 5b 69 5d 20 26 20 30 78  ( pChunk[i] & 0x
16c60 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20  80 ) i++;.      
16c70 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    i++;.      }. 
16c80 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65       if( pCtx->e
16c90 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  State ){.       
16ca0 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
16cb0 70 70 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d 3e  ppendBlob(pCtx->
16cc0 70 42 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69 53  pBuf, &pChunk[iS
16cd0 74 61 72 74 5d 2c 20 69 2d 69 53 74 61 72 74 29  tart], i-iStart)
16ce0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16cf0 69 66 28 20 69 3c 6e 43 68 75 6e 6b 20 29 7b 0a  if( i<nChunk ){.
16d00 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
16d10 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
16d20 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 69 2b   = i;.        i+
16d30 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  +;.        if( i
16d40 3e 3d 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20  >=nChunk ){.    
16d50 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61        pCtx->eSta
16d60 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  te = 2;.        
16d70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16d80 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69   fts5FastGetVari
16d90 6e 74 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20  nt32(pChunk, i, 
16da0 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  iCol);.         
16db0 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20   pCtx->eState = 
16dc0 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54  fts5IndexColsetT
16dd0 65 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65  est(pCtx->pColse
16de0 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, iCol);.      
16df0 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53      if( pCtx->eS
16e00 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tate ){.        
16e10 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
16e20 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 43 74  feAppendBlob(pCt
16e30 78 2d 3e 70 42 75 66 2c 20 26 70 43 68 75 6e 6b  x->pBuf, &pChunk
16e40 5b 69 53 74 61 72 74 5d 2c 20 69 2d 69 53 74 61  [iStart], i-iSta
16e50 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rt);.           
16e60 20 69 53 74 61 72 74 20 3d 20 69 3b 0a 20 20 20   iStart = i;.   
16e70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16e80 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
16e90 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20  while( i<nChunk 
16ea0 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
16eb0 20 76 6f 69 64 20 66 74 73 35 43 68 75 6e 6b 49   void fts5ChunkI
16ec0 74 65 72 61 74 65 28 0a 20 20 46 74 73 35 49 6e  terate(.  Fts5In
16ed0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
16ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
16ef0 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  ex object */.  F
16f00 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
16f10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
16f20 2a 20 50 6f 73 6c 69 73 74 20 6f 66 20 74 68 69  * Poslist of thi
16f30 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  s iterator */.  
16f40 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20  void *pCtx,     
16f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f60 2f 2a 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e 74  /* Context point
16f70 65 72 20 66 6f 72 20 78 43 68 75 6e 6b 20 63 61  er for xChunk ca
16f80 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64  llback */.  void
16f90 20 28 2a 78 43 68 75 6e 6b 29 28 46 74 73 35 49   (*xChunk)(Fts5I
16fa0 6e 64 65 78 2a 2c 20 76 6f 69 64 2a 2c 20 63 6f  ndex*, void*, co
16fb0 6e 73 74 20 75 38 2a 2c 20 69 6e 74 29 0a 29 7b  nst u8*, int).){
16fc0 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70 53  .  int nRem = pS
16fd0 65 67 2d 3e 6e 50 6f 73 3b 20 20 20 20 20 20 20  eg->nPos;       
16fe0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
16ff0 62 79 74 65 73 20 73 74 69 6c 6c 20 74 6f 20 63  bytes still to c
17000 6f 6d 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  ome */.  Fts5Dat
17010 61 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20  a *pData = 0;.  
17020 75 38 20 2a 70 43 68 75 6e 6b 20 3d 20 26 70 53  u8 *pChunk = &pS
17030 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65  eg->pLeaf->p[pSe
17040 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b  g->iLeafOffset];
17050 0a 20 20 69 6e 74 20 6e 43 68 75 6e 6b 20 3d 20  .  int nChunk = 
17060 4d 49 4e 28 6e 52 65 6d 2c 20 70 53 65 67 2d 3e  MIN(nRem, pSeg->
17070 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2d 20  pLeaf->szLeaf - 
17080 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
17090 74 29 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 20 3d  t);.  int pgno =
170a0 20 70 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f   pSeg->iLeafPgno
170b0 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 53 61 76 65  ;.  int pgnoSave
170c0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73   = 0;..  /* This
170d0 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
170e0 6f 74 6d 77 6f 72 6b 20 77 69 74 68 20 64 65 74  otmwork with det
170f0 61 69 6c 3d 6e 6f 6e 65 20 64 61 74 61 62 61 73  ail=none databas
17100 65 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  es. */.  assert(
17110 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
17120 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49  tail!=FTS5_DETAI
17130 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 69 66 28  L_NONE );..  if(
17140 20 28 70 53 65 67 2d 3e 66 6c 61 67 73 20 26 20   (pSeg->flags & 
17150 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
17160 45 52 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ERSE)==0 ){.    
17170 70 67 6e 6f 53 61 76 65 20 3d 20 70 67 6e 6f 2b  pgnoSave = pgno+
17180 31 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  1;.  }..  while(
17190 20 31 20 29 7b 0a 20 20 20 20 78 43 68 75 6e 6b   1 ){.    xChunk
171a0 28 70 2c 20 70 43 74 78 2c 20 70 43 68 75 6e 6b  (p, pCtx, pChunk
171b0 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20 20 20 20 6e  , nChunk);.    n
171c0 52 65 6d 20 2d 3d 20 6e 43 68 75 6e 6b 3b 0a 20  Rem -= nChunk;. 
171d0 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
171e0 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20 69  se(pData);.    i
171f0 66 28 20 6e 52 65 6d 3c 3d 30 20 29 7b 0a 20 20  f( nRem<=0 ){.  
17200 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17210 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 67 6e 6f  else{.      pgno
17220 2b 2b 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20  ++;.      pData 
17230 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
17240 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  , FTS5_SEGMENT_R
17250 4f 57 49 44 28 70 53 65 67 2d 3e 70 53 65 67 2d  OWID(pSeg->pSeg-
17260 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f 29 29 3b  >iSegid, pgno));
17270 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61  .      if( pData
17280 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
17290 20 20 20 70 43 68 75 6e 6b 20 3d 20 26 70 44 61     pChunk = &pDa
172a0 74 61 2d 3e 70 5b 34 5d 3b 0a 20 20 20 20 20 20  ta->p[4];.      
172b0 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65  nChunk = MIN(nRe
172c0 6d 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66  m, pData->szLeaf
172d0 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28   - 4);.      if(
172e0 20 70 67 6e 6f 3d 3d 70 67 6e 6f 53 61 76 65 20   pgno==pgnoSave 
172f0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
17300 74 28 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65  t( pSeg->pNextLe
17310 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  af==0 );.       
17320 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66   pSeg->pNextLeaf
17330 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20   = pData;.      
17340 20 20 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20    pData = 0;.   
17350 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
17360 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72  ../*.** Iterator
17370 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79   pIter currently
17380 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c   points to a val
17390 69 64 20 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f  id entry (not EO
173a0 46 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  F). This.** func
173b0 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 74 68 65  tion appends the
173c0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64   position list d
173d0 61 74 61 20 66 6f 72 20 74 68 65 20 63 75 72 72  ata for the curr
173e0 65 6e 74 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20  ent entry to.** 
173f0 62 75 66 66 65 72 20 70 42 75 66 2e 20 49 74 20  buffer pBuf. It 
17400 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20  does not make a 
17410 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69  copy of the posi
17420 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 2a  tion-list size.*
17430 2a 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74  * field..*/.stat
17440 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 69  ic void fts5Segi
17450 74 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74  terPoslist(.  Ft
17460 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74  s5Index *p,.  Ft
17470 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c  s5SegIter *pSeg,
17480 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
17490 43 6f 6c 73 65 74 2c 0a 20 20 46 74 73 35 42 75  Colset,.  Fts5Bu
174a0 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20  ffer *pBuf.){.  
174b0 69 66 28 20 30 3d 3d 66 74 73 35 42 75 66 66 65  if( 0==fts5Buffe
174c0 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42  rGrow(&p->rc, pB
174d0 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 29 20  uf, pSeg->nPos) 
174e0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73  ){.    if( pCols
174f0 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  et==0 ){.      f
17500 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28  ts5ChunkIterate(
17510 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29  p, pSeg, (void*)
17520 70 42 75 66 2c 20 66 74 73 35 50 6f 73 6c 69 73  pBuf, fts5Poslis
17530 74 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  tCallback);.    
17540 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
17550 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
17560 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
17570 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  L_FULL ){.      
17580 20 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63    PoslistCallbac
17590 6b 43 74 78 20 73 43 74 78 3b 0a 20 20 20 20 20  kCtx sCtx;.     
175a0 20 20 20 73 43 74 78 2e 70 42 75 66 20 3d 20 70     sCtx.pBuf = p
175b0 42 75 66 3b 0a 20 20 20 20 20 20 20 20 73 43 74  Buf;.        sCt
175c0 78 2e 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c  x.pColset = pCol
175d0 73 65 74 3b 0a 20 20 20 20 20 20 20 20 73 43 74  set;.        sCt
175e0 78 2e 65 53 74 61 74 65 20 3d 20 66 74 73 35 49  x.eState = fts5I
175f0 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70  ndexColsetTest(p
17600 43 6f 6c 73 65 74 2c 20 30 29 3b 0a 20 20 20 20  Colset, 0);.    
17610 20 20 20 20 61 73 73 65 72 74 28 20 73 43 74 78      assert( sCtx
17620 2e 65 53 74 61 74 65 3d 3d 30 20 7c 7c 20 73 43  .eState==0 || sC
17630 74 78 2e 65 53 74 61 74 65 3d 3d 31 20 29 3b 0a  tx.eState==1 );.
17640 20 20 20 20 20 20 20 20 66 74 73 35 43 68 75 6e          fts5Chun
17650 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65 67  kIterate(p, pSeg
17660 2c 20 28 76 6f 69 64 2a 29 26 73 43 74 78 2c 20  , (void*)&sCtx, 
17670 66 74 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65  fts5PoslistFilte
17680 72 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  rCallback);.    
17690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
176a0 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43   PoslistOffsetsC
176b0 74 78 20 73 43 74 78 3b 0a 20 20 20 20 20 20 20  tx sCtx;.       
176c0 20 6d 65 6d 73 65 74 28 26 73 43 74 78 2c 20 30   memset(&sCtx, 0
176d0 2c 20 73 69 7a 65 6f 66 28 73 43 74 78 29 29 3b  , sizeof(sCtx));
176e0 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 70 42  .        sCtx.pB
176f0 75 66 20 3d 20 70 42 75 66 3b 0a 20 20 20 20 20  uf = pBuf;.     
17700 20 20 20 73 43 74 78 2e 70 43 6f 6c 73 65 74 20     sCtx.pColset 
17710 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20 20  = pColset;.     
17720 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
17730 61 74 65 28 70 2c 20 70 53 65 67 2c 20 28 76 6f  ate(p, pSeg, (vo
17740 69 64 2a 29 26 73 43 74 78 2c 20 66 74 73 35 50  id*)&sCtx, fts5P
17750 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 61 6c  oslistOffsetsCal
17760 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  lback);.      }.
17770 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
17780 2a 2a 20 49 4e 2f 4f 55 54 20 70 61 72 61 6d 65  ** IN/OUT parame
17790 74 65 72 20 28 2a 70 61 29 20 70 6f 69 6e 74 73  ter (*pa) points
177a0 20 74 6f 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c   to a position l
177b0 69 73 74 20 6e 20 62 79 74 65 73 20 69 6e 20 73  ist n bytes in s
177c0 69 7a 65 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70  ize. If.** the p
177d0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  osition list con
177e0 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f  tains entries fo
177f0 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 74  r column iCol, t
17800 68 65 6e 20 28 2a 70 61 29 20 69 73 20 73 65 74  hen (*pa) is set
17810 0a 2a 2a 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  .** to point to 
17820 74 68 65 20 73 75 62 2d 70 6f 73 69 74 69 6f 6e  the sub-position
17830 2d 6c 69 73 74 20 66 6f 72 20 74 68 61 74 20 63  -list for that c
17840 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20 6e 75  olumn and the nu
17850 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 79 74 65 73  mber of.** bytes
17860 20 69 6e 20 69 74 20 72 65 74 75 72 6e 65 64 2e   in it returned.
17870 20 4f 72 2c 20 69 66 20 74 68 65 20 61 72 67 75   Or, if the argu
17880 6d 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69  ment position li
17890 73 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63  st does not.** c
178a0 6f 6e 74 61 69 6e 20 61 6e 79 20 65 6e 74 72 69  ontain any entri
178b0 65 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43  es for column iC
178c0 6f 6c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ol, return 0..*/
178d0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
178e0 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28  IndexExtractCol(
178f0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 61  .  const u8 **pa
17900 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17910 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f     /* IN/OUT: Po
17920 69 6e 74 65 72 20 74 6f 20 70 6f 73 6c 69 73 74  inter to poslist
17930 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
17940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17950 20 20 20 20 20 20 2f 2a 20 49 4e 3a 20 53 69 7a        /* IN: Siz
17960 65 20 6f 66 20 70 6f 73 6c 69 73 74 20 69 6e 20  e of poslist in 
17970 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  bytes */.  int i
17980 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Col             
17990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
179a0 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63 74 20  lumn to extract 
179b0 66 72 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a  from poslist */.
179c0 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e  ){.  int iCurren
179d0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
179e0 20 20 20 20 20 2f 2a 20 41 6e 79 74 68 69 6e 67       /* Anything
179f0 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
17a00 74 20 30 78 30 31 20 69 73 20 63 6f 6c 20 30 20  t 0x01 is col 0 
17a10 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
17a20 20 3d 20 2a 70 61 3b 0a 20 20 63 6f 6e 73 74 20   = *pa;.  const 
17a30 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 5b 6e 5d  u8 *pEnd = &p[n]
17a40 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  ;         /* One
17a50 20 62 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f   byte past end o
17a60 66 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  f position list 
17a70 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 69 43 6f  */..  while( iCo
17a80 6c 3e 69 43 75 72 72 65 6e 74 20 29 7b 0a 20 20  l>iCurrent ){.  
17a90 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f 69    /* Advance poi
17aa0 6e 74 65 72 20 70 20 75 6e 74 69 6c 20 69 74 20  nter p until it 
17ab0 70 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f  points to pEnd o
17ac0 72 20 61 6e 20 30 78 30 31 20 62 79 74 65 20 74  r an 0x01 byte t
17ad0 68 61 74 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  hat is.    ** no
17ae0 74 20 70 61 72 74 20 6f 66 20 61 20 76 61 72 69  t part of a vari
17af0 6e 74 2e 20 4e 6f 74 65 20 74 68 61 74 20 69 74  nt. Note that it
17b00 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
17b10 20 66 6f 72 20 61 20 6e 65 67 61 74 69 76 65 0a   for a negative.
17b20 20 20 20 20 2a 2a 20 6f 72 20 65 78 74 72 65 6d      ** or extrem
17b30 65 6c 79 20 6c 61 72 67 65 20 76 61 72 69 6e 74  ely large varint
17b40 20 74 6f 20 6f 63 63 75 72 20 77 69 74 68 69 6e   to occur within
17b50 20 61 6e 20 75 6e 63 6f 72 72 75 70 74 65 64 20   an uncorrupted 
17b60 70 6f 73 69 74 69 6f 6e 20 0a 20 20 20 20 2a 2a  position .    **
17b70 20 6c 69 73 74 2e 20 53 6f 20 74 68 65 20 6c 61   list. So the la
17b80 73 74 20 62 79 74 65 20 6f 66 20 65 61 63 68 20  st byte of each 
17b90 76 61 72 69 6e 74 20 6d 61 79 20 62 65 20 61 73  varint may be as
17ba0 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 20  sumed to have a 
17bb0 63 6c 65 61 72 0a 20 20 20 20 2a 2a 20 30 78 38  clear.    ** 0x8
17bc0 30 20 62 69 74 2e 20 20 2a 2f 0a 20 20 20 20 77  0 bit.  */.    w
17bd0 68 69 6c 65 28 20 2a 70 21 3d 30 78 30 31 20 29  hile( *p!=0x01 )
17be0 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a  {.      while( *
17bf0 70 2b 2b 20 26 20 30 78 38 30 20 29 3b 0a 20 20  p++ & 0x80 );.  
17c00 20 20 20 20 69 66 28 20 70 3e 3d 70 45 6e 64 20      if( p>=pEnd 
17c10 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
17c20 7d 0a 20 20 20 20 2a 70 61 20 3d 20 70 2b 2b 3b  }.    *pa = p++;
17c30 0a 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20  .    iCurrent = 
17c40 2a 70 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 43  *p++;.    if( iC
17c50 75 72 72 65 6e 74 20 26 20 30 78 38 30 20 29 7b  urrent & 0x80 ){
17c60 0a 20 20 20 20 20 20 70 2d 2d 3b 0a 20 20 20 20  .      p--;.    
17c70 20 20 70 20 2b 3d 20 66 74 73 35 47 65 74 56 61    p += fts5GetVa
17c80 72 69 6e 74 33 32 28 70 2c 20 69 43 75 72 72 65  rint32(p, iCurre
17c90 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nt);.    }.  }. 
17ca0 20 69 66 28 20 69 43 6f 6c 21 3d 69 43 75 72 72   if( iCol!=iCurr
17cb0 65 6e 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ent ) return 0;.
17cc0 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 70 6f  .  /* Advance po
17cd0 69 6e 74 65 72 20 70 20 75 6e 74 69 6c 20 69 74  inter p until it
17ce0 20 70 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64 20   points to pEnd 
17cf0 6f 72 20 61 6e 20 30 78 30 31 20 62 79 74 65 20  or an 0x01 byte 
17d00 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6e 6f 74  that is.  ** not
17d10 20 70 61 72 74 20 6f 66 20 61 20 76 61 72 69 6e   part of a varin
17d20 74 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 3c  t */.  while( p<
17d30 70 45 6e 64 20 26 26 20 2a 70 21 3d 30 78 30 31  pEnd && *p!=0x01
17d40 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a   ){.    while( *
17d50 70 2b 2b 20 26 20 30 78 38 30 20 29 3b 0a 20 20  p++ & 0x80 );.  
17d60 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 20 2d 20  }..  return p - 
17d70 28 2a 70 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  (*pa);.}..static
17d80 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 45 78   int fts5IndexEx
17d90 74 72 61 63 74 43 6f 6c 73 65 74 20 28 0a 20 20  tractColset (.  
17da0 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
17db0 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
17dc0 2f 2a 20 43 6f 6c 73 65 74 20 74 6f 20 66 69 6c  /* Colset to fil
17dd0 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  ter on */.  cons
17de0 74 20 75 38 20 2a 70 50 6f 73 2c 20 69 6e 74 20  t u8 *pPos, int 
17df0 6e 50 6f 73 2c 20 20 20 20 20 20 20 2f 2a 20 50  nPos,       /* P
17e00 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  osition list */.
17e10 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
17e20 75 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  uf              
17e30 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
17e40 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  er */.){.  int r
17e50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17e60 20 69 6e 74 20 69 3b 0a 0a 20 20 66 74 73 35 42   int i;..  fts5B
17e70 75 66 66 65 72 5a 65 72 6f 28 70 42 75 66 29 3b  ufferZero(pBuf);
17e80 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43  .  for(i=0; i<pC
17e90 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  olset->nCol; i++
17ea0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20  ){.    const u8 
17eb0 2a 70 53 75 62 20 3d 20 70 50 6f 73 3b 0a 20 20  *pSub = pPos;.  
17ec0 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 66 74 73    int nSub = fts
17ed0 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c  5IndexExtractCol
17ee0 28 26 70 53 75 62 2c 20 6e 50 6f 73 2c 20 70 43  (&pSub, nPos, pC
17ef0 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 29  olset->aiCol[i])
17f00 3b 0a 20 20 20 20 69 66 28 20 6e 53 75 62 20 29  ;.    if( nSub )
17f10 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  {.      fts5Buff
17f20 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 72 63  erAppendBlob(&rc
17f30 2c 20 70 42 75 66 2c 20 6e 53 75 62 2c 20 70 53  , pBuf, nSub, pS
17f40 75 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ub);.    }.  }. 
17f50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17f60 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73  *.** xSetOutputs
17f70 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62   callback used b
17f80 79 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 74 61  y detail=none ta
17f90 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bles..*/.static 
17fa0 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65 74  void fts5IterSet
17fb0 4f 75 74 70 75 74 73 5f 4e 6f 6e 65 28 46 74 73  Outputs_None(Fts
17fc0 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74  5Iter *pIter, Ft
17fd0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29  s5SegIter *pSeg)
17fe0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  {.  assert( pIte
17ff0 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66  r->pIndex->pConf
18000 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
18010 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b  5_DETAIL_NONE );
18020 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69  .  pIter->base.i
18030 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52  Rowid = pSeg->iR
18040 6f 77 69 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62  owid;.  pIter->b
18050 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 53 65 67  ase.nData = pSeg
18060 2d 3e 6e 50 6f 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->nPos;.}../*.**
18070 20 78 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c   xSetOutputs cal
18080 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 64 65  lback used by de
18090 74 61 69 6c 3d 66 75 6c 6c 20 61 6e 64 20 64 65  tail=full and de
180a0 74 61 69 6c 3d 63 6f 6c 20 74 61 62 6c 65 73 20  tail=col tables 
180b0 77 68 65 6e 20 6e 6f 0a 2a 2a 20 63 6f 6c 75 6d  when no.** colum
180c0 6e 20 66 69 6c 74 65 72 73 20 61 72 65 20 73 70  n filters are sp
180d0 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74  ecified..*/.stat
180e0 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72  ic void fts5Iter
180f0 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 63 6f 6c  SetOutputs_Nocol
18100 73 65 74 28 46 74 73 35 49 74 65 72 20 2a 70 49  set(Fts5Iter *pI
18110 74 65 72 2c 20 46 74 73 35 53 65 67 49 74 65 72  ter, Fts5SegIter
18120 20 2a 70 53 65 67 29 7b 0a 20 20 70 49 74 65 72   *pSeg){.  pIter
18130 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20  ->base.iRowid = 
18140 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20  pSeg->iRowid;.  
18150 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74  pIter->base.nDat
18160 61 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a  a = pSeg->nPos;.
18170 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
18180 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69  ->pIndex->pConfi
18190 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35  g->eDetail!=FTS5
181a0 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a  _DETAIL_NONE );.
181b0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
181c0 3e 70 43 6f 6c 73 65 74 3d 3d 30 20 29 3b 0a 0a  >pColset==0 );..
181d0 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61    if( pSeg->iLea
181e0 66 4f 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50  fOffset+pSeg->nP
181f0 6f 73 3c 3d 70 53 65 67 2d 3e 70 4c 65 61 66 2d  os<=pSeg->pLeaf-
18200 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 2f  >szLeaf ){.    /
18210 2a 20 41 6c 6c 20 64 61 74 61 20 69 73 20 73 74  * All data is st
18220 6f 72 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72  ored on the curr
18230 65 6e 74 20 70 61 67 65 2e 20 50 6f 70 75 6c 61  ent page. Popula
18240 74 65 20 74 68 65 20 6f 75 74 70 75 74 20 0a 20  te the output . 
18250 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20     ** variables 
18260 74 6f 20 70 6f 69 6e 74 20 69 6e 74 6f 20 74 68  to point into th
18270 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 70 61  e body of the pa
18280 67 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  ge object. */.  
18290 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44    pIter->base.pD
182a0 61 74 61 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65  ata = &pSeg->pLe
182b0 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61  af->p[pSeg->iLea
182c0 66 4f 66 66 73 65 74 5d 3b 0a 20 20 7d 65 6c 73  fOffset];.  }els
182d0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 61  e{.    /* The da
182e0 74 61 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ta is distribute
182f0 64 20 6f 76 65 72 20 74 77 6f 20 6f 72 20 6d 6f  d over two or mo
18300 72 65 20 70 61 67 65 73 2e 20 43 6f 70 79 20 69  re pages. Copy i
18310 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a  t into the.    *
18320 2a 20 46 74 73 35 49 74 65 72 2e 70 6f 73 6c 69  * Fts5Iter.posli
18330 73 74 20 62 75 66 66 65 72 20 61 6e 64 20 74 68  st buffer and th
18340 65 6e 20 73 65 74 20 74 68 65 20 6f 75 74 70 75  en set the outpu
18350 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69  t pointer to poi
18360 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 69  nt.    ** to thi
18370 73 20 62 75 66 66 65 72 2e 20 20 2a 2f 0a 20 20  s buffer.  */.  
18380 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
18390 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  (&pIter->poslist
183a0 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67 69 74  );.    fts5Segit
183b0 65 72 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d  erPoslist(pIter-
183c0 3e 70 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 30  >pIndex, pSeg, 0
183d0 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  , &pIter->poslis
183e0 74 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62  t);.    pIter->b
183f0 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65  ase.pData = pIte
18400 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20  r->poslist.p;.  
18410 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f  }.}../*.** xSetO
18420 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20  utputs callback 
18430 75 73 65 64 20 62 79 20 64 65 74 61 69 6c 3d 63  used by detail=c
18440 6f 6c 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ol when there is
18450 20 61 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72   a column filter
18460 0a 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72  .** and there ar
18470 65 20 31 30 30 20 6f 72 20 6d 6f 72 65 20 63 6f  e 100 or more co
18480 6c 75 6d 6e 73 2e 20 41 6c 73 6f 20 63 61 6c 6c  lumns. Also call
18490 65 64 20 61 73 20 61 20 66 61 6c 6c 62 61 63 6b  ed as a fallback
184a0 20 66 72 6f 6d 0a 2a 2a 20 66 74 73 35 49 74 65   from.** fts5Ite
184b0 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 31  rSetOutputs_Col1
184c0 30 30 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  00 if the column
184d0 2d 6c 69 73 74 20 73 70 61 6e 73 20 6d 6f 72 65  -list spans more
184e0 20 74 68 61 6e 20 6f 6e 65 20 70 61 67 65 2e 0a   than one page..
184f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
18500 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
18510 73 5f 43 6f 6c 28 46 74 73 35 49 74 65 72 20 2a  s_Col(Fts5Iter *
18520 70 49 74 65 72 2c 20 46 74 73 35 53 65 67 49 74  pIter, Fts5SegIt
18530 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 66 74 73  er *pSeg){.  fts
18540 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74  5BufferZero(&pIt
18550 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20  er->poslist);.  
18560 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69  fts5SegiterPosli
18570 73 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  st(pIter->pIndex
18580 2c 20 70 53 65 67 2c 20 70 49 74 65 72 2d 3e 70  , pSeg, pIter->p
18590 43 6f 6c 73 65 74 2c 20 26 70 49 74 65 72 2d 3e  Colset, &pIter->
185a0 70 6f 73 6c 69 73 74 29 3b 0a 20 20 70 49 74 65  poslist);.  pIte
185b0 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d  r->base.iRowid =
185c0 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20   pSeg->iRowid;. 
185d0 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61   pIter->base.pDa
185e0 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c  ta = pIter->posl
185f0 69 73 74 2e 70 3b 0a 20 20 70 49 74 65 72 2d 3e  ist.p;.  pIter->
18600 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 49 74  base.nData = pIt
18610 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 7d  er->poslist.n;.}
18620 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70  ../*.** xSetOutp
18630 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65  uts callback use
18640 64 20 77 68 65 6e 3a 20 0a 2a 2a 0a 2a 2a 20 20  d when: .**.**  
18650 20 2a 20 64 65 74 61 69 6c 3d 63 6f 6c 2c 0a 2a   * detail=col,.*
18660 2a 20 20 20 2a 20 74 68 65 72 65 20 69 73 20 61  *   * there is a
18670 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 2c 20   column filter, 
18680 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 74  and.**   * the t
18690 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 31 30  able contains 10
186a0 30 20 6f 72 20 66 65 77 65 72 20 63 6f 6c 75 6d  0 or fewer colum
186b0 6e 73 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ns. .**.** The l
186c0 61 73 74 20 70 6f 69 6e 74 20 69 73 20 74 6f 20  ast point is to 
186d0 65 6e 73 75 72 65 20 61 6c 6c 20 63 6f 6c 75 6d  ensure all colum
186e0 6e 20 6e 75 6d 62 65 72 73 20 61 72 65 20 73 74  n numbers are st
186f0 6f 72 65 64 20 61 73 20 0a 2a 2a 20 73 69 6e 67  ored as .** sing
18700 6c 65 2d 62 79 74 65 20 76 61 72 69 6e 74 73 2e  le-byte varints.
18710 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18720 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
18730 74 73 5f 43 6f 6c 31 30 30 28 46 74 73 35 49 74  ts_Col100(Fts5It
18740 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53  er *pIter, Fts5S
18750 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 0a  egIter *pSeg){..
18760 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
18770 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67  >pIndex->pConfig
18780 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
18790 44 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20 29  DETAIL_COLUMNS )
187a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
187b0 72 2d 3e 70 43 6f 6c 73 65 74 20 29 3b 0a 0a 20  r->pColset );.. 
187c0 20 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66   if( pSeg->iLeaf
187d0 4f 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f  Offset+pSeg->nPo
187e0 73 3e 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73  s>pSeg->pLeaf->s
187f0 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73  zLeaf ){.    fts
18800 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
18810 43 6f 6c 28 70 49 74 65 72 2c 20 70 53 65 67 29  Col(pIter, pSeg)
18820 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
18830 38 20 2a 61 20 3d 20 28 75 38 2a 29 26 70 53 65  8 *a = (u8*)&pSe
18840 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67  g->pLeaf->p[pSeg
18850 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a  ->iLeafOffset];.
18860 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 28      u8 *pEnd = (
18870 75 38 2a 29 26 61 5b 70 53 65 67 2d 3e 6e 50 6f  u8*)&a[pSeg->nPo
18880 73 5d 3b 20 0a 20 20 20 20 69 6e 74 20 69 50 72  s]; .    int iPr
18890 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ev = 0;.    int 
188a0 2a 61 69 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e  *aiCol = pIter->
188b0 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 3b 0a  pColset->aiCol;.
188c0 20 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 45 6e      int *aiColEn
188d0 64 20 3d 20 26 61 69 43 6f 6c 5b 70 49 74 65 72  d = &aiCol[pIter
188e0 2d 3e 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 5d  ->pColset->nCol]
188f0 3b 0a 0a 20 20 20 20 75 38 20 2a 61 4f 75 74 20  ;..    u8 *aOut 
18900 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  = pIter->poslist
18910 2e 70 3b 0a 20 20 20 20 69 6e 74 20 69 50 72 65  .p;.    int iPre
18920 76 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 70  vOut = 0;..    p
18930 49 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69  Iter->base.iRowi
18940 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64  d = pSeg->iRowid
18950 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 61 3c  ;..    while( a<
18960 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 69 50  pEnd ){.      iP
18970 72 65 76 20 2b 3d 20 28 69 6e 74 29 61 2b 2b 5b  rev += (int)a++[
18980 30 5d 20 2d 20 32 3b 0a 20 20 20 20 20 20 77 68  0] - 2;.      wh
18990 69 6c 65 28 20 2a 61 69 43 6f 6c 3c 69 50 72 65  ile( *aiCol<iPre
189a0 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 69 43  v ){.        aiC
189b0 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66  ol++;.        if
189c0 28 20 61 69 43 6f 6c 3d 3d 61 69 43 6f 6c 45 6e  ( aiCol==aiColEn
189d0 64 20 29 20 67 6f 74 6f 20 73 65 74 6f 75 74 70  d ) goto setoutp
189e0 75 74 73 5f 63 6f 6c 5f 6f 75 74 3b 0a 20 20 20  uts_col_out;.   
189f0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 2a     }.      if( *
18a00 61 69 43 6f 6c 3d 3d 69 50 72 65 76 20 29 7b 0a  aiCol==iPrev ){.
18a10 20 20 20 20 20 20 20 20 2a 61 4f 75 74 2b 2b 20          *aOut++ 
18a20 3d 20 28 69 50 72 65 76 20 2d 20 69 50 72 65 76  = (iPrev - iPrev
18a30 4f 75 74 29 20 2b 20 32 3b 0a 20 20 20 20 20 20  Out) + 2;.      
18a40 20 20 69 50 72 65 76 4f 75 74 20 3d 20 69 50 72    iPrevOut = iPr
18a50 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ev;.      }.    
18a60 7d 0a 0a 73 65 74 6f 75 74 70 75 74 73 5f 63 6f  }..setoutputs_co
18a70 6c 5f 6f 75 74 3a 0a 20 20 20 20 70 49 74 65 72  l_out:.    pIter
18a80 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70  ->base.pData = p
18a90 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b  Iter->poslist.p;
18aa0 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65  .    pIter->base
18ab0 2e 6e 44 61 74 61 20 3d 20 61 4f 75 74 20 2d 20  .nData = aOut - 
18ac0 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70  pIter->poslist.p
18ad0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78  ;.  }.}../*.** x
18ae0 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62  SetOutputs callb
18af0 61 63 6b 20 75 73 65 64 20 62 79 20 64 65 74 61  ack used by deta
18b00 69 6c 3d 66 75 6c 6c 20 77 68 65 6e 20 74 68 65  il=full when the
18b10 72 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 66  re is a column f
18b20 69 6c 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilter..*/.static
18b30 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65   void fts5IterSe
18b40 74 4f 75 74 70 75 74 73 5f 46 75 6c 6c 28 46 74  tOutputs_Full(Ft
18b50 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46  s5Iter *pIter, F
18b60 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
18b70 29 7b 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  ){.  Fts5Colset 
18b80 2a 70 43 6f 6c 73 65 74 20 3d 20 70 49 74 65 72  *pColset = pIter
18b90 2d 3e 70 43 6f 6c 73 65 74 3b 0a 20 20 70 49 74  ->pColset;.  pIt
18ba0 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20  er->base.iRowid 
18bb0 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a  = pSeg->iRowid;.
18bc0 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
18bd0 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69  ->pIndex->pConfi
18be0 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  g->eDetail==FTS5
18bf0 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 3b 0a  _DETAIL_FULL );.
18c00 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 73 65    assert( pColse
18c10 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 65 67  t );..  if( pSeg
18c20 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70 53  ->iLeafOffset+pS
18c30 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e  eg->nPos<=pSeg->
18c40 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
18c50 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 64 61 74 61  .    /* All data
18c60 20 69 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68   is stored on th
18c70 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
18c80 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 75 74  Populate the out
18c90 70 75 74 20 0a 20 20 20 20 2a 2a 20 76 61 72 69  put .    ** vari
18ca0 61 62 6c 65 73 20 74 6f 20 70 6f 69 6e 74 20 69  ables to point i
18cb0 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20  nto the body of 
18cc0 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 2e  the page object.
18cd0 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 38   */.    const u8
18ce0 20 2a 61 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65   *a = &pSeg->pLe
18cf0 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61  af->p[pSeg->iLea
18d00 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 69 66  fOffset];.    if
18d10 28 20 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d  ( pColset->nCol=
18d20 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  =1 ){.      pIte
18d30 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20  r->base.nData = 
18d40 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74  fts5IndexExtract
18d50 43 6f 6c 28 26 61 2c 20 70 53 65 67 2d 3e 6e 50  Col(&a, pSeg->nP
18d60 6f 73 2c 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f  os,pColset->aiCo
18d70 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 49 74  l[0]);.      pIt
18d80 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d  er->base.pData =
18d90 20 61 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   a;.    }else{. 
18da0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a       fts5BufferZ
18db0 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c  ero(&pIter->posl
18dc0 69 73 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ist);.      fts5
18dd0 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 73  IndexExtractCols
18de0 65 74 28 70 43 6f 6c 73 65 74 2c 20 61 2c 20 70  et(pColset, a, p
18df0 53 65 67 2d 3e 6e 50 6f 73 2c 20 26 70 49 74 65  Seg->nPos, &pIte
18e00 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
18e10 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70     pIter->base.p
18e20 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f  Data = pIter->po
18e30 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 20 20 70  slist.p;.      p
18e40 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61  Iter->base.nData
18e50 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73   = pIter->poslis
18e60 74 2e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  t.n;.    }.  }el
18e70 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64  se{.    /* The d
18e80 61 74 61 20 69 73 20 64 69 73 74 72 69 62 75 74  ata is distribut
18e90 65 64 20 6f 76 65 72 20 74 77 6f 20 6f 72 20 6d  ed over two or m
18ea0 6f 72 65 20 70 61 67 65 73 2e 20 43 6f 70 79 20  ore pages. Copy 
18eb0 69 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  it into the.    
18ec0 2a 2a 20 46 74 73 35 49 74 65 72 2e 70 6f 73 6c  ** Fts5Iter.posl
18ed0 69 73 74 20 62 75 66 66 65 72 20 61 6e 64 20 74  ist buffer and t
18ee0 68 65 6e 20 73 65 74 20 74 68 65 20 6f 75 74 70  hen set the outp
18ef0 75 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f  ut pointer to po
18f00 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  int.    ** to th
18f10 69 73 20 62 75 66 66 65 72 2e 20 20 2a 2f 0a 20  is buffer.  */. 
18f20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
18f30 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  o(&pIter->poslis
18f40 74 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67 69  t);.    fts5Segi
18f50 74 65 72 50 6f 73 6c 69 73 74 28 70 49 74 65 72  terPoslist(pIter
18f60 2d 3e 70 49 6e 64 65 78 2c 20 70 53 65 67 2c 20  ->pIndex, pSeg, 
18f70 70 43 6f 6c 73 65 74 2c 20 26 70 49 74 65 72 2d  pColset, &pIter-
18f80 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 70  >poslist);.    p
18f90 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61  Iter->base.pData
18fa0 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73   = pIter->poslis
18fb0 74 2e 70 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  t.p;.    pIter->
18fc0 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 49 74  base.nData = pIt
18fd0 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20  er->poslist.n;. 
18fe0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
18ff0 64 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  d fts5IterSetOut
19000 70 75 74 43 62 28 69 6e 74 20 2a 70 52 63 2c 20  putCb(int *pRc, 
19010 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29  Fts5Iter *pIter)
19020 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  {.  if( *pRc==SQ
19030 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
19040 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
19050 69 67 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64  ig = pIter->pInd
19060 65 78 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20  ex->pConfig;.   
19070 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44   if( pConfig->eD
19080 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
19090 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  IL_NONE ){.     
190a0 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70   pIter->xSetOutp
190b0 75 74 73 20 3d 20 66 74 73 35 49 74 65 72 53 65  uts = fts5IterSe
190c0 74 4f 75 74 70 75 74 73 5f 4e 6f 6e 65 3b 0a 20  tOutputs_None;. 
190d0 20 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65 20 69     }..    else i
190e0 66 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65  f( pIter->pColse
190f0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49  t==0 ){.      pI
19100 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73  ter->xSetOutputs
19110 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75   = fts5IterSetOu
19120 74 70 75 74 73 5f 4e 6f 63 6f 6c 73 65 74 3b 0a  tputs_Nocolset;.
19130 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65 20      }..    else 
19140 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65  if( pConfig->eDe
19150 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
19160 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  L_FULL ){.      
19170 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75  pIter->xSetOutpu
19180 74 73 20 3d 20 66 74 73 35 49 74 65 72 53 65 74  ts = fts5IterSet
19190 4f 75 74 70 75 74 73 5f 46 75 6c 6c 3b 0a 20 20  Outputs_Full;.  
191a0 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65 7b 0a 20    }..    else{. 
191b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
191c0 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46  nfig->eDetail==F
191d0 54 53 35 5f 44 45 54 41 49 4c 5f 43 4f 4c 55 4d  TS5_DETAIL_COLUM
191e0 4e 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NS );.      if( 
191f0 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3c 3d 31  pConfig->nCol<=1
19200 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  00 ){.        pI
19210 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73  ter->xSetOutputs
19220 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75   = fts5IterSetOu
19230 74 70 75 74 73 5f 43 6f 6c 31 30 30 3b 0a 20 20  tputs_Col100;.  
19240 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
19250 35 42 75 66 66 65 72 53 69 7a 65 28 70 52 63 2c  5BufferSize(pRc,
19260 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74   &pIter->poslist
19270 2c 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 29  , pConfig->nCol)
19280 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
19290 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53         pIter->xS
192a0 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35  etOutputs = fts5
192b0 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43  IterSetOutputs_C
192c0 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ol;.      }.    
192d0 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  }.  }.}.../*.** 
192e0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 46  Allocate a new F
192f0 74 73 35 49 74 65 72 20 6f 62 6a 65 63 74 2e 0a  ts5Iter object..
19300 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62  **.** The new ob
19310 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 75 73 65  ject will be use
19320 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
19330 6f 75 67 68 20 64 61 74 61 20 69 6e 20 73 74 72  ough data in str
19340 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 0a  ucture pStruct..
19350 2a 2a 20 49 66 20 69 4c 65 76 65 6c 20 69 73 20  ** If iLevel is 
19360 2d 76 65 2c 20 74 68 65 6e 20 61 6c 6c 20 64 61  -ve, then all da
19370 74 61 20 69 6e 20 61 6c 6c 20 73 65 67 6d 65 6e  ta in all segmen
19380 74 73 20 69 73 20 6d 65 72 67 65 64 2e 20 4f 72  ts is merged. Or
19390 2c 20 69 66 20 69 4c 65 76 65 6c 0a 2a 2a 20 69  , if iLevel.** i
193a0 73 20 7a 65 72 6f 20 6f 72 20 67 72 65 61 74 65  s zero or greate
193b0 72 2c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  r, data from the
193c0 20 66 69 72 73 74 20 6e 53 65 67 6d 65 6e 74 20   first nSegment 
193d0 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65  segments on leve
193e0 6c 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 6d  l iLevel.** is m
193f0 65 72 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  erged..**.** The
19400 20 69 74 65 72 61 74 6f 72 20 69 6e 69 74 69 61   iterator initia
19410 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  lly points to th
19420 65 20 66 69 72 73 74 20 74 65 72 6d 2f 72 6f 77  e first term/row
19430 69 64 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  id entry in the 
19440 0a 2a 2a 20 69 74 65 72 61 74 65 64 20 64 61 74  .** iterated dat
19450 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
19460 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  d fts5MultiIterN
19470 65 77 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ew(.  Fts5Index 
19480 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
19490 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
194a0 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65  ckend to iterate
194b0 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73   within */.  Fts
194c0 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
194d0 75 63 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  uct,         /* 
194e0 53 74 72 75 63 74 75 72 65 20 6f 66 20 73 70 65  Structure of spe
194f0 63 69 66 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20  cific index */. 
19500 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
19510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19520 20 2f 2a 20 46 54 53 35 49 4e 44 45 58 5f 51 55   /* FTS5INDEX_QU
19530 45 52 59 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  ERY_XXX flags */
19540 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
19550 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20  Colset,         
19560 20 20 20 2f 2a 20 43 6f 6c 73 65 74 20 74 6f 20     /* Colset to 
19570 66 69 6c 74 65 72 20 6f 6e 20 28 6f 72 20 4e 55  filter on (or NU
19580 4c 4c 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  LL) */.  const u
19590 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  8 *pTerm, int nT
195a0 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d  erm,     /* Term
195b0 20 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f 72 20   to seek to (or 
195c0 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69 6e 74  NULL/0) */.  int
195d0 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20   iLevel,        
195e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
195f0 4c 65 76 65 6c 20 74 6f 20 69 74 65 72 61 74 65  Level to iterate
19600 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20 2a 2f   (-1 for all) */
19610 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 2c  .  int nSegment,
19620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19630 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19640 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67  segments to merg
19650 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20 2a 2f  e (iLevel>=0) */
19660 0a 20 20 46 74 73 35 49 74 65 72 20 2a 2a 70 70  .  Fts5Iter **pp
19670 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
19680 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74     /* New object
19690 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 65   */.){.  int nSe
196a0 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
196b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
196c0 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 2d 69 74  er of segment-it
196d0 65 72 73 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20  ers in use */.  
196e0 69 6e 74 20 69 49 74 65 72 20 3d 20 30 3b 20 20  int iIter = 0;  
196f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19700 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67  /* */.  int iSeg
19710 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19720 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
19730 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
19740 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  gh segments */. 
19750 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
19760 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46 74 73  vel *pLvl;.  Fts
19770 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20  5Iter *pNew;..  
19780 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 3d 3d  assert( (pTerm==
19790 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30 29 20 7c  0 && nTerm==0) |
197a0 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b 0a 0a 20  | iLevel<0 );.. 
197b0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
197c0 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6d  ce for the new m
197d0 75 6c 74 69 2d 73 65 67 2d 69 74 65 72 61 74 6f  ulti-seg-iterato
197e0 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72  r. */.  if( p->r
197f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19800 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30      if( iLevel<0
19810 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
19820 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ( pStruct->nSegm
19830 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75  ent==fts5Structu
19840 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
19850 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20  pStruct) );.    
19860 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74    nSeg = pStruct
19870 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20  ->nSegment;.    
19880 20 20 6e 53 65 67 20 2b 3d 20 28 70 2d 3e 70 48    nSeg += (p->pH
19890 61 73 68 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ash ? 1 : 0);.  
198a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
198b0 53 65 67 20 3d 20 4d 49 4e 28 70 53 74 72 75 63  Seg = MIN(pStruc
198c0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c  t->aLevel[iLevel
198d0 5d 2e 6e 53 65 67 2c 20 6e 53 65 67 6d 65 6e 74  ].nSeg, nSegment
198e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
198f0 70 70 4f 75 74 20 3d 20 70 4e 65 77 20 3d 20 66  ppOut = pNew = f
19900 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f  ts5MultiIterAllo
19910 63 28 70 2c 20 6e 53 65 67 29 3b 0a 20 20 69 66  c(p, nSeg);.  if
19920 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
19930 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e 62 52 65 76  rn;.  pNew->bRev
19940 20 3d 20 28 30 21 3d 28 66 6c 61 67 73 20 26 20   = (0!=(flags & 
19950 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
19960 44 45 53 43 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  DESC));.  pNew->
19970 62 53 6b 69 70 45 6d 70 74 79 20 3d 20 28 30 21  bSkipEmpty = (0!
19980 3d 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e  =(flags & FTS5IN
19990 44 45 58 5f 51 55 45 52 59 5f 53 4b 49 50 45 4d  DEX_QUERY_SKIPEM
199a0 50 54 59 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  PTY));.  pNew->p
199b0 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74  Struct = pStruct
199c0 3b 0a 20 20 70 4e 65 77 2d 3e 70 43 6f 6c 73 65  ;.  pNew->pColse
199d0 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 66  t = pColset;.  f
199e0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 66 28  ts5StructureRef(
199f0 70 53 74 72 75 63 74 29 3b 0a 20 20 69 66 28 20  pStruct);.  if( 
19a00 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
19a10 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55  EX_QUERY_NOOUTPU
19a20 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73  T)==0 ){.    fts
19a30 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 43 62  5IterSetOutputCb
19a40 28 26 70 2d 3e 72 63 2c 20 70 4e 65 77 29 3b 0a  (&p->rc, pNew);.
19a50 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
19a60 6c 69 7a 65 20 65 61 63 68 20 6f 66 20 74 68 65  lize each of the
19a70 20 63 6f 6d 70 6f 6e 65 6e 74 20 73 65 67 6d 65   component segme
19a80 6e 74 20 69 74 65 72 61 74 6f 72 73 2e 20 2a 2f  nt iterators. */
19a90 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
19aa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
19ab0 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20  f( iLevel<0 ){. 
19ac0 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
19ad0 72 65 4c 65 76 65 6c 20 2a 70 45 6e 64 20 3d 20  reLevel *pEnd = 
19ae0 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
19af0 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  [pStruct->nLevel
19b00 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ];.      if( p->
19b10 70 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20  pHash ){.       
19b20 20 2f 2a 20 41 64 64 20 61 20 73 65 67 6d 65 6e   /* Add a segmen
19b30 74 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 74  t iterator for t
19b40 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
19b50 6e 74 73 20 6f 66 20 74 68 65 20 68 61 73 68 20  nts of the hash 
19b60 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  table. */.      
19b70 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
19b80 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53  Iter = &pNew->aS
19b90 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20  eg[iIter++];.   
19ba0 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
19bb0 48 61 73 68 49 6e 69 74 28 70 2c 20 70 54 65 72  HashInit(p, pTer
19bc0 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c  m, nTerm, flags,
19bd0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   pIter);.      }
19be0 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 76 6c 3d  .      for(pLvl=
19bf0 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
19c00 5b 30 5d 3b 20 70 4c 76 6c 3c 70 45 6e 64 3b 20  [0]; pLvl<pEnd; 
19c10 70 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pLvl++){.       
19c20 20 66 6f 72 28 69 53 65 67 3d 70 4c 76 6c 2d 3e   for(iSeg=pLvl->
19c30 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b  nSeg-1; iSeg>=0;
19c40 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20   iSeg--){.      
19c50 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
19c60 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
19c70 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65   &pLvl->aSeg[iSe
19c80 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 46 74  g];.          Ft
19c90 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
19ca0 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69   = &pNew->aSeg[i
19cb0 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20  Iter++];.       
19cc0 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
19cd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
19ce0 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28 70  ts5SegIterInit(p
19cf0 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a  , pSeg, pIter);.
19d00 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
19d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
19d20 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74  5SegIterSeekInit
19d30 28 70 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d  (p, pTerm, nTerm
19d40 2c 20 66 6c 61 67 73 2c 20 70 53 65 67 2c 20 70  , flags, pSeg, p
19d50 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Iter);.         
19d60 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
19d70 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
19d80 20 20 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53        pLvl = &pS
19d90 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
19da0 65 76 65 6c 5d 3b 0a 20 20 20 20 20 20 66 6f 72  evel];.      for
19db0 28 69 53 65 67 3d 6e 53 65 67 2d 31 3b 20 69 53  (iSeg=nSeg-1; iS
19dc0 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a  eg>=0; iSeg--){.
19dd0 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
19de0 74 65 72 49 6e 69 74 28 70 2c 20 26 70 4c 76 6c  terInit(p, &pLvl
19df0 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2c 20 26 70  ->aSeg[iSeg], &p
19e00 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b  New->aSeg[iIter+
19e10 2b 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +]);.      }.   
19e20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69   }.    assert( i
19e30 49 74 65 72 3d 3d 6e 53 65 67 20 29 3b 0a 20 20  Iter==nSeg );.  
19e40 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  }..  /* If the a
19e50 62 6f 76 65 20 77 61 73 20 73 75 63 63 65 73 73  bove was success
19e60 66 75 6c 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e  ful, each compon
19e70 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 6e 6f  ent iterators no
19e80 77 20 70 6f 69 6e 74 73 20 0a 20 20 2a 2a 20 74  w points .  ** t
19e90 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
19ea0 79 20 69 6e 20 69 74 73 20 73 65 67 6d 65 6e 74  y in its segment
19eb0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
19ec0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 0a 20  nitialize the . 
19ed0 20 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72   ** aFirst[] arr
19ee0 61 79 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  ay. Or, if an er
19ef0 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
19f00 2c 20 66 72 65 65 20 74 68 65 20 69 74 65 72 61  , free the itera
19f10 74 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20  tor.  ** object 
19f20 61 6e 64 20 73 65 74 20 74 68 65 20 6f 75 74 70  and set the outp
19f30 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e  ut variable to N
19f40 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ULL.  */.  if( p
19f50 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
19f60 29 7b 0a 20 20 20 20 66 6f 72 28 69 49 74 65 72  ){.    for(iIter
19f70 3d 70 4e 65 77 2d 3e 6e 53 65 67 2d 31 3b 20 69  =pNew->nSeg-1; i
19f80 49 74 65 72 3e 30 3b 20 69 49 74 65 72 2d 2d 29  Iter>0; iIter--)
19f90 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 45 71 3b  {.      int iEq;
19fa0 0a 20 20 20 20 20 20 69 66 28 20 28 69 45 71 20  .      if( (iEq 
19fb0 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44  = fts5MultiIterD
19fc0 6f 43 6f 6d 70 61 72 65 28 70 4e 65 77 2c 20 69  oCompare(pNew, i
19fd0 49 74 65 72 29 29 20 29 7b 0a 20 20 20 20 20 20  Iter)) ){.      
19fe0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
19ff0 53 65 67 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65  Seg = &pNew->aSe
1a000 67 5b 69 45 71 5d 3b 0a 20 20 20 20 20 20 20 20  g[iEq];.        
1a010 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1a020 45 5f 4f 4b 20 29 20 70 53 65 67 2d 3e 78 4e 65  E_OK ) pSeg->xNe
1a030 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29 3b 0a  xt(p, pSeg, 0);.
1a040 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
1a050 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c  iIterAdvanced(p,
1a060 20 70 4e 65 77 2c 20 69 45 71 2c 20 69 49 74 65   pNew, iEq, iIte
1a070 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
1a080 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  }.    fts5MultiI
1a090 74 65 72 53 65 74 45 6f 66 28 70 4e 65 77 29 3b  terSetEof(pNew);
1a0a0 0a 20 20 20 20 66 74 73 35 41 73 73 65 72 74 4d  .    fts5AssertM
1a0b0 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 70 2c  ultiIterSetup(p,
1a0c0 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28   pNew);..    if(
1a0d0 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74   pNew->bSkipEmpt
1a0e0 79 20 26 26 20 66 74 73 35 4d 75 6c 74 69 49 74  y && fts5MultiIt
1a0f0 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70 4e 65  erIsEmpty(p, pNe
1a100 77 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  w) ){.      fts5
1a110 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
1a120 20 70 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20   pNew, 0, 0);.  
1a130 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 65 77    }else if( pNew
1a140 2d 3e 62 61 73 65 2e 62 45 6f 66 3d 3d 30 20 29  ->base.bEof==0 )
1a150 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  {.      Fts5SegI
1a160 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 4e 65  ter *pSeg = &pNe
1a170 77 2d 3e 61 53 65 67 5b 70 4e 65 77 2d 3e 61 46  w->aSeg[pNew->aF
1a180 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b  irst[1].iFirst];
1a190 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 53 65  .      pNew->xSe
1a1a0 74 4f 75 74 70 75 74 73 28 70 4e 65 77 2c 20 70  tOutputs(pNew, p
1a1b0 53 65 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  Seg);.    }..  }
1a1c0 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 4d 75  else{.    fts5Mu
1a1d0 6c 74 69 49 74 65 72 46 72 65 65 28 70 4e 65 77  ltiIterFree(pNew
1a1e0 29 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20  );.    *ppOut = 
1a1f0 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
1a200 43 72 65 61 74 65 20 61 6e 20 46 74 73 35 49 74  Create an Fts5It
1a210 65 72 20 74 68 61 74 20 69 74 65 72 61 74 65 73  er that iterates
1a220 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 6f 63   through the doc
1a230 6c 69 73 74 20 70 72 6f 76 69 64 65 64 0a 2a 2a  list provided.**
1a240 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
1a250 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
1a260 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
1a270 69 49 74 65 72 4e 65 77 32 28 0a 20 20 46 74 73  iIterNew2(.  Fts
1a280 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
1a290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a2a0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20  FTS5 backend to 
1a2b0 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a  iterate within *
1a2c0 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  /.  Fts5Data *pD
1a2d0 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
1a2e0 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 74      /* Doclist t
1a2f0 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
1a300 68 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63  h */.  int bDesc
1a310 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a320 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
1a330 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f  or descending ro
1a340 77 69 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 46  wid order */.  F
1a350 74 73 35 49 74 65 72 20 2a 2a 70 70 4f 75 74 20  ts5Iter **ppOut 
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a370 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a  * New object */.
1a380 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  ){.  Fts5Iter *p
1a390 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 66 74  New;.  pNew = ft
1a3a0 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63  s5MultiIterAlloc
1a3b0 28 70 2c 20 32 29 3b 0a 20 20 69 66 28 20 70 4e  (p, 2);.  if( pN
1a3c0 65 77 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65  ew ){.    Fts5Se
1a3d0 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26  gIter *pIter = &
1a3e0 70 4e 65 77 2d 3e 61 53 65 67 5b 31 5d 3b 0a 0a  pNew->aSeg[1];..
1a3f0 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73      pIter->flags
1a400 20 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   = FTS5_SEGITER_
1a410 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28  ONETERM;.    if(
1a420 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 3e 30   pData->szLeaf>0
1a430 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
1a440 3e 70 4c 65 61 66 20 3d 20 70 44 61 74 61 3b 0a  >pLeaf = pData;.
1a450 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
1a460 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47  afOffset = fts5G
1a470 65 74 56 61 72 69 6e 74 28 70 44 61 74 61 2d 3e  etVarint(pData->
1a480 70 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  p, (u64*)&pIter-
1a490 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  >iRowid);.      
1a4a0 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
1a4b0 6c 69 73 74 20 3d 20 70 44 61 74 61 2d 3e 6e 6e  list = pData->nn
1a4c0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 46  ;.      pNew->aF
1a4d0 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 3d  irst[1].iFirst =
1a4e0 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44   1;.      if( bD
1a4f0 65 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70  esc ){.        p
1a500 4e 65 77 2d 3e 62 52 65 76 20 3d 20 31 3b 0a 20  New->bRev = 1;. 
1a510 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c         pIter->fl
1a520 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49  ags |= FTS5_SEGI
1a530 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20  TER_REVERSE;.   
1a540 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
1a550 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28  ReverseInitPage(
1a560 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
1a570 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a580 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
1a590 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
1a5a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44 61       }.      pDa
1a5b0 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ta = 0;.    }els
1a5c0 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 62  e{.      pNew->b
1a5d0 61 73 65 2e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  ase.bEof = 1;.  
1a5e0 20 20 7d 0a 20 20 20 20 66 74 73 35 53 65 67 49    }.    fts5SegI
1a5f0 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20 70 49  terSetNext(p, pI
1a600 74 65 72 29 3b 0a 0a 20 20 20 20 2a 70 70 4f 75  ter);..    *ppOu
1a610 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20  t = pNew;.  }.. 
1a620 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
1a630 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pData);.}../*.*
1a640 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1a650 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
1a660 20 61 74 20 45 4f 46 20 6f 72 20 69 66 20 61 6e   at EOF or if an
1a670 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
1a680 72 65 64 2e 20 0a 2a 2a 20 46 61 6c 73 65 20 6f  red. .** False o
1a690 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
1a6a0 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74  tic int fts5Mult
1a6b0 69 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64  iIterEof(Fts5Ind
1a6c0 65 78 20 2a 70 2c 20 46 74 73 35 49 74 65 72 20  ex *p, Fts5Iter 
1a6d0 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72  *pIter){.  asser
1a6e0 74 28 20 70 2d 3e 72 63 20 0a 20 20 20 20 20 20  t( p->rc .      
1a6f0 7c 7c 20 28 70 49 74 65 72 2d 3e 61 53 65 67 5b  || (pIter->aSeg[
1a700 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
1a710 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66  ].iFirst ].pLeaf
1a720 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62 61 73  ==0)==pIter->bas
1a730 65 2e 62 45 6f 66 20 0a 20 20 29 3b 0a 20 20 72  e.bEof .  );.  r
1a740 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20  eturn (p->rc || 
1a750 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66  pIter->base.bEof
1a760 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1a770 72 6e 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  rn the rowid of 
1a780 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
1a790 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
1a7a0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  ently points.** 
1a7b0 74 6f 2e 20 49 66 20 74 68 65 20 69 74 65 72 61  to. If the itera
1a7c0 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f  tor points to EO
1a7d0 46 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  F when this func
1a7e0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
1a7f0 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 61 72  he.** results ar
1a800 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  e undefined..*/.
1a810 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35 4d  static i64 fts5M
1a820 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 46 74  ultiIterRowid(Ft
1a830 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  s5Iter *pIter){.
1a840 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
1a850 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
1a860 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
1a870 2e 70 4c 65 61 66 20 29 3b 0a 20 20 72 65 74 75  .pLeaf );.  retu
1a880 72 6e 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  rn pIter->aSeg[ 
1a890 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
1a8a0 2e 69 46 69 72 73 74 20 5d 2e 69 52 6f 77 69 64  .iFirst ].iRowid
1a8b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
1a8c0 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20  the iterator to 
1a8d0 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 61  the next entry a
1a8e0 74 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  t or following i
1a8f0 4d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  Match..*/.static
1a900 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
1a910 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46  terNextFrom(.  F
1a920 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1a930 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c  Fts5Iter *pIter,
1a940 20 0a 20 20 69 36 34 20 69 4d 61 74 63 68 0a 29   .  i64 iMatch.)
1a950 7b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  {.  while( 1 ){.
1a960 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a      i64 iRowid;.
1a970 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
1a980 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20  rNext(p, pIter, 
1a990 31 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 20 20  1, iMatch);.    
1a9a0 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65  if( fts5MultiIte
1a9b0 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29  rEof(p, pIter) )
1a9c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 52 6f 77   break;.    iRow
1a9d0 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  id = fts5MultiIt
1a9e0 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a  erRowid(pIter);.
1a9f0 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62      if( pIter->b
1aa00 52 65 76 3d 3d 30 20 26 26 20 69 52 6f 77 69 64  Rev==0 && iRowid
1aa10 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b  >=iMatch ) break
1aa20 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
1aa30 3e 62 52 65 76 21 3d 30 20 26 26 20 69 52 6f 77  >bRev!=0 && iRow
1aa40 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65  id<=iMatch ) bre
1aa50 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ak;.  }.}../*.**
1aa60 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1aa70 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  r to a buffer co
1aa80 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 72  ntaining the ter
1aa90 6d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  m associated wit
1aaa0 68 20 74 68 65 20 0a 2a 2a 20 65 6e 74 72 79 20  h the .** entry 
1aab0 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f  that the iterato
1aac0 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
1aad0 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  ts to..*/.static
1aae0 20 63 6f 6e 73 74 20 75 38 20 2a 66 74 73 35 4d   const u8 *fts5M
1aaf0 75 6c 74 69 49 74 65 72 54 65 72 6d 28 46 74 73  ultiIterTerm(Fts
1ab00 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e  5Iter *pIter, in
1ab10 74 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35 53 65  t *pn){.  Fts5Se
1ab20 67 49 74 65 72 20 2a 70 20 3d 20 26 70 49 74 65  gIter *p = &pIte
1ab30 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
1ab40 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
1ab50 20 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d 3e 74   ];.  *pn = p->t
1ab60 65 72 6d 2e 6e 3b 0a 20 20 72 65 74 75 72 6e 20  erm.n;.  return 
1ab70 70 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a 2f 2a  p->term.p;.}../*
1ab80 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
1ab90 65 77 20 73 65 67 6d 65 6e 74 2d 69 64 20 66 6f  ew segment-id fo
1aba0 72 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  r the structure 
1abb0 70 53 74 72 75 63 74 2e 20 54 68 65 20 6e 65 77  pStruct. The new
1abc0 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 69 64 20 6d   segment.** id m
1abd0 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 31  ust be between 1
1abe0 20 61 6e 64 20 36 35 33 33 35 20 69 6e 63 6c 75   and 65335 inclu
1abf0 73 69 76 65 2c 20 61 6e 64 20 6d 75 73 74 20 6e  sive, and must n
1ac00 6f 74 20 62 65 20 75 73 65 64 20 62 79 20 0a 2a  ot be used by .*
1ac10 2a 20 61 6e 79 20 63 75 72 72 65 6e 74 6c 79 20  * any currently 
1ac20 65 78 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74  existing segment
1ac30 2e 20 49 66 20 61 20 66 72 65 65 20 73 65 67 6d  . If a free segm
1ac40 65 6e 74 20 69 64 20 63 61 6e 6e 6f 74 20 62 65  ent id cannot be
1ac50 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54   found,.** SQLIT
1ac60 45 5f 46 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  E_FULL is return
1ac70 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
1ac80 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
1ac90 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
1aca0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
1acb0 6f 2d 6f 70 2e 20 30 20 69 73 20 0a 2a 2a 20 72  o-op. 0 is .** r
1acc0 65 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20  eturned in this 
1acd0 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
1ace0 69 6e 74 20 66 74 73 35 41 6c 6c 6f 63 61 74 65  int fts5Allocate
1acf0 53 65 67 69 64 28 46 74 73 35 49 6e 64 65 78 20  Segid(Fts5Index 
1ad00 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74 75 72  *p, Fts5Structur
1ad10 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
1ad20 6e 74 20 69 53 65 67 69 64 20 3d 20 30 3b 0a 0a  nt iSegid = 0;..
1ad30 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1ad40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1ad50 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ( pStruct->nSegm
1ad60 65 6e 74 3e 3d 46 54 53 35 5f 4d 41 58 5f 53 45  ent>=FTS5_MAX_SE
1ad70 47 4d 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 70  GMENT ){.      p
1ad80 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55  ->rc = SQLITE_FU
1ad90 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
1ada0 20 20 20 20 20 2f 2a 20 46 54 53 35 5f 4d 41 58       /* FTS5_MAX
1adb0 5f 53 45 47 4d 45 4e 54 20 69 73 20 63 75 72 72  _SEGMENT is curr
1adc0 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 61 73  ently defined as
1add0 20 32 30 30 30 2e 20 53 6f 20 74 68 65 20 66 6f   2000. So the fo
1ade0 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a  llowing.      **
1adf0 20 61 72 72 61 79 20 69 73 20 36 33 20 65 6c 65   array is 63 ele
1ae00 6d 65 6e 74 73 2c 20 6f 72 20 32 35 32 20 62 79  ments, or 252 by
1ae10 74 65 73 2c 20 69 6e 20 73 69 7a 65 2e 20 20 2a  tes, in size.  *
1ae20 2f 0a 20 20 20 20 20 20 75 33 32 20 61 55 73 65  /.      u32 aUse
1ae30 64 5b 28 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d  d[(FTS5_MAX_SEGM
1ae40 45 4e 54 2b 33 31 29 20 2f 20 33 32 5d 3b 0a 20  ENT+31) / 32];. 
1ae50 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69       int iLvl, i
1ae60 53 65 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Seg;.      int i
1ae70 3b 0a 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b  ;.      u32 mask
1ae80 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61  ;.      memset(a
1ae90 55 73 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Used, 0, sizeof(
1aea0 61 55 73 65 64 29 29 3b 0a 20 20 20 20 20 20 66  aUsed));.      f
1aeb0 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
1aec0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
1aed0 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
1aee0 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
1aef0 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  eg<pStruct->aLev
1af00 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69  el[iLvl].nSeg; i
1af10 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
1af20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53 74 72    int iId = pStr
1af30 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
1af40 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65  ].aSeg[iSeg].iSe
1af50 67 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 69  gid;.          i
1af60 66 28 20 69 49 64 3c 3d 46 54 53 35 5f 4d 41 58  f( iId<=FTS5_MAX
1af70 5f 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20 20 20  _SEGMENT ){.    
1af80 20 20 20 20 20 20 20 20 61 55 73 65 64 5b 28 69          aUsed[(i
1af90 49 64 2d 31 29 20 2f 20 33 32 5d 20 7c 3d 20 31  Id-1) / 32] |= 1
1afa0 20 3c 3c 20 28 28 69 49 64 2d 31 29 20 25 20 33   << ((iId-1) % 3
1afb0 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  2);.          }.
1afc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1afd0 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  }..      for(i=0
1afe0 3b 20 61 55 73 65 64 5b 69 5d 3d 3d 30 78 46 46  ; aUsed[i]==0xFF
1aff0 46 46 46 46 46 46 3b 20 69 2b 2b 29 3b 0a 20 20  FFFFFF; i++);.  
1b000 20 20 20 20 6d 61 73 6b 20 3d 20 61 55 73 65 64      mask = aUsed
1b010 5b 69 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  [i];.      for(i
1b020 53 65 67 69 64 3d 30 3b 20 6d 61 73 6b 20 26 20  Segid=0; mask & 
1b030 28 31 20 3c 3c 20 69 53 65 67 69 64 29 3b 20 69  (1 << iSegid); i
1b040 53 65 67 69 64 2b 2b 29 3b 0a 20 20 20 20 20 20  Segid++);.      
1b050 69 53 65 67 69 64 20 2b 3d 20 31 20 2b 20 69 2a  iSegid += 1 + i*
1b060 33 32 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  32;..#ifdef SQLI
1b070 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 66  TE_DEBUG.      f
1b080 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
1b090 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
1b0a0 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
1b0b0 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
1b0c0 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  eg<pStruct->aLev
1b0d0 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69  el[iLvl].nSeg; i
1b0e0 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
1b0f0 20 20 61 73 73 65 72 74 28 20 69 53 65 67 69 64    assert( iSegid
1b100 21 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  !=pStruct->aLeve
1b110 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65  l[iLvl].aSeg[iSe
1b120 67 5d 2e 69 53 65 67 69 64 20 29 3b 0a 20 20 20  g].iSegid );.   
1b130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1b140 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 65       assert( iSe
1b150 67 69 64 3e 30 20 26 26 20 69 53 65 67 69 64 3c  gid>0 && iSegid<
1b160 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e  =FTS5_MAX_SEGMEN
1b170 54 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  T );.#endif.    
1b180 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1b190 69 53 65 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iSegid;.}../*.**
1b1a0 20 44 69 73 63 61 72 64 20 61 6c 6c 20 64 61 74   Discard all dat
1b1b0 61 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68  a currently cach
1b1c0 65 64 20 69 6e 20 74 68 65 20 68 61 73 68 2d 74  ed in the hash-t
1b1d0 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
1b1e0 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 44   void fts5IndexD
1b1f0 69 73 63 61 72 64 44 61 74 61 28 46 74 73 35 49  iscardData(Fts5I
1b200 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61 73 73 65  ndex *p){.  asse
1b210 72 74 28 20 70 2d 3e 70 48 61 73 68 20 7c 7c 20  rt( p->pHash || 
1b220 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d  p->nPendingData=
1b230 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
1b240 48 61 73 68 20 29 7b 0a 20 20 20 20 73 71 6c 69  Hash ){.    sqli
1b250 74 65 33 46 74 73 35 48 61 73 68 43 6c 65 61 72  te3Fts5HashClear
1b260 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20  (p->pHash);.    
1b270 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
1b280 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
1b290 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
1b2a0 65 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 2c  e of the prefix,
1b2b0 20 69 6e 20 62 79 74 65 73 2c 20 74 68 61 74 20   in bytes, that 
1b2c0 62 75 66 66 65 72 20 0a 2a 2a 20 28 70 4e 65 77  buffer .** (pNew
1b2d0 2f 3c 6c 65 6e 67 74 68 2d 75 6e 6b 6e 6f 77 6e  /<length-unknown
1b2e0 3e 29 20 73 68 61 72 65 73 20 77 69 74 68 20 62  >) shares with b
1b2f0 75 66 66 65 72 20 28 70 4f 6c 64 2f 6e 4f 6c 64  uffer (pOld/nOld
1b300 29 2e 0a 2a 2a 0a 2a 2a 20 42 75 66 66 65 72 20  )..**.** Buffer 
1b310 28 70 4e 65 77 2f 3c 6c 65 6e 67 74 68 2d 75 6e  (pNew/<length-un
1b320 6b 6e 6f 77 6e 3e 29 20 69 73 20 67 75 61 72 61  known>) is guara
1b330 6e 74 65 65 64 20 74 6f 20 62 65 20 67 72 65 61  nteed to be grea
1b340 74 65 72 20 0a 2a 2a 20 74 68 61 6e 20 62 75 66  ter .** than buf
1b350 66 65 72 20 28 70 4f 6c 64 2f 6e 4f 6c 64 29 2e  fer (pOld/nOld).
1b360 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1b370 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts5PrefixCompres
1b380 73 28 69 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e 73  s(int nOld, cons
1b390 74 20 75 38 20 2a 70 4f 6c 64 2c 20 63 6f 6e 73  t u8 *pOld, cons
1b3a0 74 20 75 38 20 2a 70 4e 65 77 29 7b 0a 20 20 69  t u8 *pNew){.  i
1b3b0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1b3c0 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
1b3d0 20 20 20 69 66 28 20 70 4f 6c 64 5b 69 5d 21 3d     if( pOld[i]!=
1b3e0 70 4e 65 77 5b 69 5d 20 29 20 62 72 65 61 6b 3b  pNew[i] ) break;
1b3f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
1b400 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1b410 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 43 6c  fts5WriteDlidxCl
1b420 65 61 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ear(.  Fts5Index
1b430 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
1b440 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a  riter *pWriter,.
1b450 20 20 69 6e 74 20 62 46 6c 75 73 68 20 20 20 20    int bFlush    
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b470 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 77 72    /* If true, wr
1b480 69 74 65 20 64 6c 69 64 78 20 74 6f 20 64 69 73  ite dlidx to dis
1b490 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  k */.){.  int i;
1b4a0 0a 20 20 61 73 73 65 72 74 28 20 62 46 6c 75 73  .  assert( bFlus
1b4b0 68 3d 3d 30 20 7c 7c 20 28 70 57 72 69 74 65 72  h==0 || (pWriter
1b4c0 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20 70 57  ->nDlidx>0 && pW
1b4d0 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d  riter->aDlidx[0]
1b4e0 2e 62 75 66 2e 6e 3e 30 29 20 29 3b 0a 20 20 66  .buf.n>0) );.  f
1b4f0 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69 74 65  or(i=0; i<pWrite
1b500 72 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b 29 7b  r->nDlidx; i++){
1b510 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 57 72  .    Fts5DlidxWr
1b520 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26  iter *pDlidx = &
1b530 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1b540 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 6c 69  i];.    if( pDli
1b550 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 20 62  dx->buf.n==0 ) b
1b560 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 46  reak;.    if( bF
1b570 6c 75 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73  lush ){.      as
1b580 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 70 67  sert( pDlidx->pg
1b590 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  no!=0 );.      f
1b5a0 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
1b5b0 0a 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f  .          FTS5_
1b5c0 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 57 72 69  DLIDX_ROWID(pWri
1b5d0 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20  ter->iSegid, i, 
1b5e0 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20  pDlidx->pgno),. 
1b5f0 20 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 2d           pDlidx-
1b600 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e  >buf.p, pDlidx->
1b610 62 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20  buf.n.      );. 
1b620 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1b630 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  Fts5BufferZero(&
1b640 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20  pDlidx->buf);.  
1b650 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56    pDlidx->bPrevV
1b660 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  alid = 0;.  }.}.
1b670 0a 2f 2a 0a 2a 2a 20 47 72 6f 77 20 74 68 65 20  ./*.** Grow the 
1b680 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1b690 5d 20 61 72 72 61 79 20 74 6f 20 61 74 20 6c 65  ] array to at le
1b6a0 61 73 74 20 6e 4c 76 6c 20 65 6c 65 6d 65 6e 74  ast nLvl element
1b6b0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 41 6e  s in size..** An
1b6c0 79 20 6e 65 77 20 61 72 72 61 79 20 65 6c 65 6d  y new array elem
1b6d0 65 6e 74 73 20 61 72 65 20 7a 65 72 6f 65 64 20  ents are zeroed 
1b6e0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1b6f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b700 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 47 72  fts5WriteDlidxGr
1b710 6f 77 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ow(.  Fts5Index 
1b720 2a 70 2c 0a 20 20 46 74 73 35 53 65 67 57 72 69  *p,.  Fts5SegWri
1b730 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20  ter *pWriter,.  
1b740 69 6e 74 20 6e 4c 76 6c 0a 29 7b 0a 20 20 69 66  int nLvl.){.  if
1b750 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1b760 4f 4b 20 26 26 20 6e 4c 76 6c 3e 3d 70 57 72 69  OK && nLvl>=pWri
1b770 74 65 72 2d 3e 6e 44 6c 69 64 78 20 29 7b 0a 20  ter->nDlidx ){. 
1b780 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74     Fts5DlidxWrit
1b790 65 72 20 2a 61 44 6c 69 64 78 20 3d 20 28 46 74  er *aDlidx = (Ft
1b7a0 73 35 44 6c 69 64 78 57 72 69 74 65 72 2a 29 73  s5DlidxWriter*)s
1b7b0 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a  qlite3_realloc(.
1b7c0 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d          pWriter-
1b7d0 3e 61 44 6c 69 64 78 2c 20 73 69 7a 65 6f 66 28  >aDlidx, sizeof(
1b7e0 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 29  Fts5DlidxWriter)
1b7f0 20 2a 20 6e 4c 76 6c 0a 20 20 20 20 29 3b 0a 20   * nLvl.    );. 
1b800 20 20 20 69 66 28 20 61 44 6c 69 64 78 3d 3d 30     if( aDlidx==0
1b810 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
1b820 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1b830 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b840 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
1b850 65 6f 66 28 46 74 73 35 44 6c 69 64 78 57 72 69  eof(Fts5DlidxWri
1b860 74 65 72 29 20 2a 20 28 6e 4c 76 6c 20 2d 20 70  ter) * (nLvl - p
1b870 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 29 3b  Writer->nDlidx);
1b880 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61  .      memset(&a
1b890 44 6c 69 64 78 5b 70 57 72 69 74 65 72 2d 3e 6e  Dlidx[pWriter->n
1b8a0 44 6c 69 64 78 5d 2c 20 30 2c 20 6e 42 79 74 65  Dlidx], 0, nByte
1b8b0 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72  );.      pWriter
1b8c0 2d 3e 61 44 6c 69 64 78 20 3d 20 61 44 6c 69 64  ->aDlidx = aDlid
1b8d0 78 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72  x;.      pWriter
1b8e0 2d 3e 6e 44 6c 69 64 78 20 3d 20 6e 4c 76 6c 3b  ->nDlidx = nLvl;
1b8f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1b900 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a  urn p->rc;.}../*
1b910 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
1b920 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  nt doclist-index
1b930 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 69 6e   accumulating in
1b940 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
1b950 5b 5d 20 69 73 20 6c 61 72 67 65 0a 2a 2a 20 65  [] is large.** e
1b960 6e 6f 75 67 68 2c 20 66 6c 75 73 68 20 69 74 20  nough, flush it 
1b970 74 6f 20 64 69 73 6b 20 61 6e 64 20 72 65 74 75  to disk and retu
1b980 72 6e 20 31 2e 20 4f 74 68 65 72 77 69 73 65 20  rn 1. Otherwise 
1b990 64 69 73 63 61 72 64 20 69 74 20 61 6e 64 20 72  discard it and r
1b9a0 65 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a  eturn.** zero..*
1b9b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1b9c0 35 57 72 69 74 65 46 6c 75 73 68 44 6c 69 64 78  5WriteFlushDlidx
1b9d0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
1b9e0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
1b9f0 72 69 74 65 72 29 7b 0a 20 20 69 6e 74 20 62 46  riter){.  int bF
1ba00 6c 61 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  lag = 0;..  /* I
1ba10 66 20 74 68 65 72 65 20 77 65 72 65 20 46 54 53  f there were FTS
1ba20 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45  5_MIN_DLIDX_SIZE
1ba30 20 6f 72 20 6d 6f 72 65 20 65 6d 70 74 79 20 6c   or more empty l
1ba40 65 61 66 20 70 61 67 65 73 20 77 72 69 74 74 65  eaf pages writte
1ba50 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61  n.  ** to the da
1ba60 74 61 62 61 73 65 2c 20 61 6c 73 6f 20 77 72 69  tabase, also wri
1ba70 74 65 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  te the doclist-i
1ba80 6e 64 65 78 20 74 6f 20 64 69 73 6b 2e 20 20 2a  ndex to disk.  *
1ba90 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  /.  if( pWriter-
1baa0 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e  >aDlidx[0].buf.n
1bab0 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e 6e  >0 && pWriter->n
1bac0 45 6d 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f  Empty>=FTS5_MIN_
1bad0 44 4c 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20  DLIDX_SIZE ){.  
1bae0 20 20 62 46 6c 61 67 20 3d 20 31 3b 0a 20 20 7d    bFlag = 1;.  }
1baf0 0a 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64  .  fts5WriteDlid
1bb00 78 43 6c 65 61 72 28 70 2c 20 70 57 72 69 74 65  xClear(p, pWrite
1bb10 72 2c 20 62 46 6c 61 67 29 3b 0a 20 20 70 57 72  r, bFlag);.  pWr
1bb20 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30  iter->nEmpty = 0
1bb30 3b 0a 20 20 72 65 74 75 72 6e 20 62 46 6c 61 67  ;.  return bFlag
1bb40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1bb50 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1bb60 65 64 20 77 68 65 6e 65 76 65 72 20 70 72 6f 63  ed whenever proc
1bb70 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 64 6f  essing of the do
1bb80 63 6c 69 73 74 20 66 6f 72 20 74 68 65 20 0a 2a  clist for the .*
1bb90 2a 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20 6c  * last term on l
1bba0 65 61 66 20 70 61 67 65 20 28 70 57 72 69 74 65  eaf page (pWrite
1bbb0 72 2d 3e 69 42 74 50 61 67 65 29 20 69 73 20 63  r->iBtPage) is c
1bbc0 6f 6d 70 6c 65 74 65 64 2e 20 0a 2a 2a 0a 2a 2a  ompleted. .**.**
1bbd0 20 54 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64   The doclist-ind
1bbe0 65 78 20 66 6f 72 20 74 68 61 74 20 74 65 72 6d  ex for that term
1bbf0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74   is currently st
1bc00 6f 72 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 77  ored in-memory w
1bc10 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73  ithin the.** Fts
1bc20 35 53 65 67 57 72 69 74 65 72 2e 61 44 6c 69 64  5SegWriter.aDlid
1bc30 78 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 69 74  x[] array. If it
1bc40 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
1bc50 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
1bc60 2a 2a 20 77 72 69 74 65 73 20 69 74 20 6f 75 74  ** writes it out
1bc70 20 74 6f 20 64 69 73 6b 2e 20 4f 72 2c 20 69 66   to disk. Or, if
1bc80 20 69 74 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c   it is too small
1bc90 20 74 6f 20 62 6f 74 68 65 72 20 77 69 74 68 2c   to bother with,
1bca0 20 64 69 73 63 61 72 64 73 0a 2a 2a 20 69 74 2e   discards.** it.
1bcb0 0a 2a 2a 0a 2a 2a 20 46 74 73 35 53 65 67 57 72  .**.** Fts5SegWr
1bcc0 69 74 65 72 2e 62 74 74 65 72 6d 20 63 75 72 72  iter.btterm curr
1bcd0 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74  ently contains t
1bce0 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e  he first term on
1bcf0 20 70 61 67 65 20 69 42 74 50 61 67 65 2e 0a 2a   page iBtPage..*
1bd00 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1bd10 73 35 57 72 69 74 65 46 6c 75 73 68 42 74 72 65  s5WriteFlushBtre
1bd20 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
1bd30 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1bd40 57 72 69 74 65 72 29 7b 0a 20 20 69 6e 74 20 62  Writer){.  int b
1bd50 46 6c 61 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  Flag;..  assert(
1bd60 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67   pWriter->iBtPag
1bd70 65 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 6e 45  e || pWriter->nE
1bd80 6d 70 74 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28  mpty==0 );.  if(
1bd90 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67   pWriter->iBtPag
1bda0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
1bdb0 20 62 46 6c 61 67 20 3d 20 66 74 73 35 57 72 69   bFlag = fts5Wri
1bdc0 74 65 46 6c 75 73 68 44 6c 69 64 78 28 70 2c 20  teFlushDlidx(p, 
1bdd0 70 57 72 69 74 65 72 29 3b 0a 0a 20 20 69 66 28  pWriter);..  if(
1bde0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1bdf0 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  K ){.    const c
1be00 68 61 72 20 2a 7a 20 3d 20 28 70 57 72 69 74 65  har *z = (pWrite
1be10 72 2d 3e 62 74 74 65 72 6d 2e 6e 3e 30 3f 28 63  r->btterm.n>0?(c
1be20 6f 6e 73 74 20 63 68 61 72 2a 29 70 57 72 69 74  onst char*)pWrit
1be30 65 72 2d 3e 62 74 74 65 72 6d 2e 70 3a 22 22 29  er->btterm.p:"")
1be40 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ;.    /* The fol
1be50 6c 6f 77 69 6e 67 20 77 61 73 20 61 6c 72 65 61  lowing was alrea
1be60 64 79 20 64 6f 6e 65 20 69 6e 20 66 74 73 35 57  dy done in fts5W
1be70 72 69 74 65 49 6e 69 74 28 29 3a 20 2a 2f 0a 20  riteInit(): */. 
1be80 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 62 69     /* sqlite3_bi
1be90 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57 72  nd_int(p->pIdxWr
1bea0 69 74 65 72 2c 20 31 2c 20 70 57 72 69 74 65 72  iter, 1, pWriter
1beb0 2d 3e 69 53 65 67 69 64 29 3b 20 2a 2f 0a 20 20  ->iSegid); */.  
1bec0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62    sqlite3_bind_b
1bed0 6c 6f 62 28 70 2d 3e 70 49 64 78 57 72 69 74 65  lob(p->pIdxWrite
1bee0 72 2c 20 32 2c 20 7a 2c 20 70 57 72 69 74 65 72  r, 2, z, pWriter
1bef0 2d 3e 62 74 74 65 72 6d 2e 6e 2c 20 53 51 4c 49  ->btterm.n, SQLI
1bf00 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
1bf10 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
1bf20 36 34 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72  64(p->pIdxWriter
1bf30 2c 20 33 2c 20 62 46 6c 61 67 20 2b 20 28 28 69  , 3, bFlag + ((i
1bf40 36 34 29 70 57 72 69 74 65 72 2d 3e 69 42 74 50  64)pWriter->iBtP
1bf50 61 67 65 3c 3c 31 29 29 3b 0a 20 20 20 20 73 71  age<<1));.    sq
1bf60 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49  lite3_step(p->pI
1bf70 64 78 57 72 69 74 65 72 29 3b 0a 20 20 20 20 70  dxWriter);.    p
1bf80 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  ->rc = sqlite3_r
1bf90 65 73 65 74 28 70 2d 3e 70 49 64 78 57 72 69 74  eset(p->pIdxWrit
1bfa0 65 72 29 3b 0a 20 20 7d 0a 20 20 70 57 72 69 74  er);.  }.  pWrit
1bfb0 65 72 2d 3e 69 42 74 50 61 67 65 20 3d 20 30 3b  er->iBtPage = 0;
1bfc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
1bfd0 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  s called once fo
1bfe0 72 20 65 61 63 68 20 6c 65 61 66 20 70 61 67 65  r each leaf page
1bff0 20 65 78 63 65 70 74 20 74 68 65 20 66 69 72 73   except the firs
1c000 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  t that contains.
1c010 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ** at least one 
1c020 74 65 72 6d 2e 20 41 72 67 75 6d 65 6e 74 20 28  term. Argument (
1c030 6e 54 65 72 6d 2f 70 54 65 72 6d 29 20 69 73 20  nTerm/pTerm) is 
1c040 74 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 2d 20  the split-key - 
1c050 61 20 74 65 72 6d 20 74 68 61 74 0a 2a 2a 20 69  a term that.** i
1c060 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c  s larger than al
1c070 6c 20 74 65 72 6d 73 20 77 72 69 74 74 65 6e 20  l terms written 
1c080 74 6f 20 65 61 72 6c 69 65 72 20 6c 65 61 76 65  to earlier leave
1c090 73 2c 20 61 6e 64 20 65 71 75 61 6c 20 74 6f 20  s, and equal to 
1c0a0 6f 72 0a 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68  or.** smaller th
1c0b0 61 6e 20 74 68 65 20 66 69 72 73 74 20 74 65 72  an the first ter
1c0c0 6d 20 6f 6e 20 74 68 65 20 6e 65 77 20 6c 65 61  m on the new lea
1c0d0 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  f..**.** If an e
1c0e0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
1c0f0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65  error code is le
1c100 66 74 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e  ft in Fts5Index.
1c110 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 0a  rc. If an error.
1c120 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  ** has already o
1c130 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
1c140 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1c150 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
1c160 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
1c170 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72  oid fts5WriteBtr
1c180 65 65 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e  eeTerm(.  Fts5In
1c190 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
1c1a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
1c1b0 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
1c1c0 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69   */.  Fts5SegWri
1c1d0 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20  ter *pWriter,   
1c1e0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20        /* Writer 
1c1f0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
1c200 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20  nTerm, const u8 
1c210 2a 70 54 65 72 6d 20 20 20 20 20 20 2f 2a 20 46  *pTerm      /* F
1c220 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 6e 65 77  irst term on new
1c230 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 66 74   page */.){.  ft
1c240 73 35 57 72 69 74 65 46 6c 75 73 68 42 74 72 65  s5WriteFlushBtre
1c250 65 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  e(p, pWriter);. 
1c260 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
1c270 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d  p->rc, &pWriter-
1c280 3e 62 74 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  >btterm, nTerm, 
1c290 70 54 65 72 6d 29 3b 0a 20 20 70 57 72 69 74 65  pTerm);.  pWrite
1c2a0 72 2d 3e 69 42 74 50 61 67 65 20 3d 20 70 57 72  r->iBtPage = pWr
1c2b0 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e  iter->writer.pgn
1c2c0 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  o;.}../*.** This
1c2d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1c2e0 6c 65 64 20 77 68 65 6e 20 66 6c 75 73 68 69 6e  led when flushin
1c2f0 67 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 68  g a leaf page th
1c300 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a  at contains no.*
1c310 2a 20 74 65 72 6d 73 20 61 74 20 61 6c 6c 20 74  * terms at all t
1c320 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  o disk..*/.stati
1c330 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
1c340 42 74 72 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46  BtreeNoTerm(.  F
1c350 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
1c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c370 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
1c380 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
1c390 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
1c3a0 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  r          /* Wr
1c3b0 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  iter object */.)
1c3c0 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  {.  /* If there 
1c3d0 77 65 72 65 20 6e 6f 20 72 6f 77 69 64 73 20 6f  were no rowids o
1c3e0 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  n the leaf page 
1c3f0 65 69 74 68 65 72 20 61 6e 64 20 74 68 65 20 64  either and the d
1c400 6f 63 6c 69 73 74 2d 69 6e 64 65 78 0a 20 20 2a  oclist-index.  *
1c410 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
1c420 65 6e 20 73 74 61 72 74 65 64 2c 20 61 70 70 65  en started, appe
1c430 6e 64 20 61 6e 20 30 78 30 30 20 62 79 74 65 20  nd an 0x00 byte 
1c440 74 6f 20 69 74 2e 20 20 2a 2f 0a 20 20 69 66 28  to it.  */.  if(
1c450 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1c460 52 6f 77 69 64 49 6e 50 61 67 65 20 26 26 20 70  RowidInPage && p
1c470 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30  Writer->aDlidx[0
1c480 5d 2e 62 75 66 2e 6e 3e 30 20 29 7b 0a 20 20 20  ].buf.n>0 ){.   
1c490 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72   Fts5DlidxWriter
1c4a0 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69   *pDlidx = &pWri
1c4b0 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 3b 0a  ter->aDlidx[0];.
1c4c0 20 20 20 20 61 73 73 65 72 74 28 20 70 44 6c 69      assert( pDli
1c4d0 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 29  dx->bPrevValid )
1c4e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
1c4f0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1c500 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c  int(&p->rc, &pDl
1c510 69 64 78 2d 3e 62 75 66 2c 20 30 29 3b 0a 20 20  idx->buf, 0);.  
1c520 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  }..  /* Incremen
1c530 74 20 74 68 65 20 22 6e 75 6d 62 65 72 20 6f 66  t the "number of
1c540 20 73 65 71 75 65 6e 74 69 61 6c 20 6c 65 61 76   sequential leav
1c550 65 73 20 77 69 74 68 6f 75 74 20 61 20 74 65 72  es without a ter
1c560 6d 22 20 63 6f 75 6e 74 65 72 2e 20 2a 2f 0a 20  m" counter. */. 
1c570 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79   pWriter->nEmpty
1c580 2b 2b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36  ++;.}..static i6
1c590 34 20 66 74 73 35 44 6c 69 64 78 45 78 74 72 61  4 fts5DlidxExtra
1c5a0 63 74 46 69 72 73 74 52 6f 77 69 64 28 46 74 73  ctFirstRowid(Fts
1c5b0 35 42 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a  5Buffer *pBuf){.
1c5c0 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20    i64 iRowid;.  
1c5d0 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 69 4f 66  int iOff;..  iOf
1c5e0 66 20 3d 20 31 20 2b 20 66 74 73 35 47 65 74 56  f = 1 + fts5GetV
1c5f0 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 31  arint(&pBuf->p[1
1c600 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64  ], (u64*)&iRowid
1c610 29 3b 0a 20 20 66 74 73 35 47 65 74 56 61 72 69  );.  fts5GetVari
1c620 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69 4f 66 66  nt(&pBuf->p[iOff
1c630 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64  ], (u64*)&iRowid
1c640 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 6f 77  );.  return iRow
1c650 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77  id;.}../*.** Row
1c660 69 64 20 69 52 6f 77 69 64 20 68 61 73 20 6a 75  id iRowid has ju
1c670 73 74 20 62 65 65 6e 20 61 70 70 65 6e 64 65 64  st been appended
1c680 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
1c690 6c 65 61 66 20 70 61 67 65 2e 20 49 74 20 69 73  leaf page. It is
1c6a0 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6f 6e   the.** first on
1c6b0 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20   the page. This 
1c6c0 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
1c6d0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
1c6e0 65 6e 74 72 79 20 74 6f 20 74 68 65 20 63 75 72  entry to the cur
1c6f0 72 65 6e 74 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d  rent.** doclist-
1c700 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
1c710 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 44   void fts5WriteD
1c720 6c 69 64 78 41 70 70 65 6e 64 28 0a 20 20 46 74  lidxAppend(.  Ft
1c730 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
1c740 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
1c750 72 69 74 65 72 2c 20 0a 20 20 69 36 34 20 69 52  riter, .  i64 iR
1c760 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  owid.){.  int i;
1c770 0a 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30  .  int bDone = 0
1c780 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d  ;..  for(i=0; p-
1c790 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1c7a0 26 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29  & bDone==0; i++)
1c7b0 7b 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a  {.    i64 iVal;.
1c7c0 20 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69      Fts5DlidxWri
1c7d0 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70  ter *pDlidx = &p
1c7e0 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69  Writer->aDlidx[i
1c7f0 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 44 6c 69  ];..    if( pDli
1c800 64 78 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43  dx->buf.n>=p->pC
1c810 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20  onfig->pgsz ){. 
1c820 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72       /* The curr
1c830 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  ent doclist-inde
1c840 78 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2e 20  x page is full. 
1c850 57 72 69 74 65 20 69 74 20 74 6f 20 64 69 73 6b  Write it to disk
1c860 20 61 6e 64 20 70 75 73 68 0a 20 20 20 20 20 20   and push.      
1c870 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 69 52 6f  ** a copy of iRo
1c880 77 69 64 20 28 77 68 69 63 68 20 77 69 6c 6c 20  wid (which will 
1c890 62 65 63 6f 6d 65 20 74 68 65 20 66 69 72 73 74  become the first
1c8a0 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 6e 65   rowid on the ne
1c8b0 78 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c  xt.      ** docl
1c8c0 69 73 74 2d 69 6e 64 65 78 20 6c 65 61 66 20 70  ist-index leaf p
1c8d0 61 67 65 29 20 75 70 20 69 6e 74 6f 20 74 68 65  age) up into the
1c8e0 20 6e 65 78 74 20 6c 65 76 65 6c 20 6f 66 20 74   next level of t
1c8f0 68 65 20 62 2d 74 72 65 65 20 0a 20 20 20 20 20  he b-tree .     
1c900 20 2a 2a 20 68 69 65 72 61 72 63 68 79 2e 20 49   ** hierarchy. I
1c910 66 20 74 68 65 20 6e 6f 64 65 20 62 65 69 6e 67  f the node being
1c920 20 66 6c 75 73 68 65 64 20 69 73 20 63 75 72 72   flushed is curr
1c930 65 6e 74 6c 79 20 74 68 65 20 72 6f 6f 74 20 6e  ently the root n
1c940 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6c  ode,.      ** al
1c950 73 6f 20 70 75 73 68 20 69 74 73 20 66 69 72 73  so push its firs
1c960 74 20 72 6f 77 69 64 20 75 70 77 61 72 64 73 2e  t rowid upwards.
1c970 20 2a 2f 0a 20 20 20 20 20 20 70 44 6c 69 64 78   */.      pDlidx
1c980 2d 3e 62 75 66 2e 70 5b 30 5d 20 3d 20 30 78 30  ->buf.p[0] = 0x0
1c990 31 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 74 68 65  1;    /* Not the
1c9a0 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20   root node */.  
1c9b0 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74      fts5DataWrit
1c9c0 65 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  e(p, .          
1c9d0 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44  FTS5_DLIDX_ROWID
1c9e0 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64  (pWriter->iSegid
1c9f0 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e  , i, pDlidx->pgn
1ca00 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44  o),.          pD
1ca10 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c  lidx->buf.p, pDl
1ca20 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20  idx->buf.n.     
1ca30 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72   );.      fts5Wr
1ca40 69 74 65 44 6c 69 64 78 47 72 6f 77 28 70 2c 20  iteDlidxGrow(p, 
1ca50 70 57 72 69 74 65 72 2c 20 69 2b 32 29 3b 0a 20  pWriter, i+2);. 
1ca60 20 20 20 20 20 70 44 6c 69 64 78 20 3d 20 26 70       pDlidx = &p
1ca70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69  Writer->aDlidx[i
1ca80 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ];.      if( p->
1ca90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1caa0 20 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2e 6e   pDlidx[1].buf.n
1cab0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
1cac0 36 34 20 69 46 69 72 73 74 20 3d 20 66 74 73 35  64 iFirst = fts5
1cad0 44 6c 69 64 78 45 78 74 72 61 63 74 46 69 72 73  DlidxExtractFirs
1cae0 74 52 6f 77 69 64 28 26 70 44 6c 69 64 78 2d 3e  tRowid(&pDlidx->
1caf0 62 75 66 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  buf);..        /
1cb00 2a 20 54 68 69 73 20 77 61 73 20 74 68 65 20 72  * This was the r
1cb10 6f 6f 74 20 6e 6f 64 65 2e 20 50 75 73 68 20 69  oot node. Push i
1cb20 74 73 20 66 69 72 73 74 20 72 6f 77 69 64 20 75  ts first rowid u
1cb30 70 20 74 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f  p to the new roo
1cb40 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 44  t. */.        pD
1cb50 6c 69 64 78 5b 31 5d 2e 70 67 6e 6f 20 3d 20 70  lidx[1].pgno = p
1cb60 44 6c 69 64 78 2d 3e 70 67 6e 6f 3b 0a 20 20 20  Dlidx->pgno;.   
1cb70 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1cb80 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1cb90 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69  nt(&p->rc, &pDli
1cba0 64 78 5b 31 5d 2e 62 75 66 2c 20 30 29 3b 0a 20  dx[1].buf, 0);. 
1cbb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
1cbc0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1cbd0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44  rint(&p->rc, &pD
1cbe0 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 70 44 6c  lidx[1].buf, pDl
1cbf0 69 64 78 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  idx->pgno);.    
1cc00 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
1cc10 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1cc20 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
1cc30 78 5b 31 5d 2e 62 75 66 2c 20 69 46 69 72 73 74  x[1].buf, iFirst
1cc40 29 3b 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64  );.        pDlid
1cc50 78 5b 31 5d 2e 62 50 72 65 76 56 61 6c 69 64 20  x[1].bPrevValid 
1cc60 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 44 6c  = 1;.        pDl
1cc70 69 64 78 5b 31 5d 2e 69 50 72 65 76 20 3d 20 69  idx[1].iPrev = i
1cc80 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  First;.      }..
1cc90 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
1cca0 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 44 6c  5BufferZero(&pDl
1ccb0 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20  idx->buf);.     
1ccc0 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61   pDlidx->bPrevVa
1ccd0 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  lid = 0;.      p
1cce0 44 6c 69 64 78 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20  Dlidx->pgno++;. 
1ccf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cd00 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d  bDone = 1;.    }
1cd10 0a 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64 78  ..    if( pDlidx
1cd20 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 29 7b 0a  ->bPrevValid ){.
1cd30 20 20 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f        iVal = iRo
1cd40 77 69 64 20 2d 20 70 44 6c 69 64 78 2d 3e 69 50  wid - pDlidx->iP
1cd50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rev;.    }else{.
1cd60 20 20 20 20 20 20 69 36 34 20 69 50 67 6e 6f 20        i64 iPgno 
1cd70 3d 20 28 69 3d 3d 30 20 3f 20 70 57 72 69 74 65  = (i==0 ? pWrite
1cd80 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3a  r->writer.pgno :
1cd90 20 70 44 6c 69 64 78 5b 2d 31 5d 2e 70 67 6e 6f   pDlidx[-1].pgno
1cda0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1cdb0 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d   pDlidx->buf.n==
1cdc0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1cdd0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
1cde0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1cdf0 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 21   &pDlidx->buf, !
1ce00 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73 71  bDone);.      sq
1ce10 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1ce20 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1ce30 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66  rc, &pDlidx->buf
1ce40 2c 20 69 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20  , iPgno);.      
1ce50 69 56 61 6c 20 3d 20 69 52 6f 77 69 64 3b 0a 20  iVal = iRowid;. 
1ce60 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
1ce70 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
1ce80 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1ce90 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69 56  &pDlidx->buf, iV
1cea0 61 6c 29 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d  al);.    pDlidx-
1ceb0 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 31 3b  >bPrevValid = 1;
1cec0 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 69 50 72  .    pDlidx->iPr
1ced0 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d  ev = iRowid;.  }
1cee0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1cef0 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
1cf00 61 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  af(Fts5Index *p,
1cf10 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1cf20 70 57 72 69 74 65 72 29 7b 0a 20 20 73 74 61 74  pWriter){.  stat
1cf30 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
1cf40 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20 30 78 30  [] = { 0x00, 0x0
1cf50 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 3b  0, 0x00, 0x00 };
1cf60 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65  .  Fts5PageWrite
1cf70 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69  r *pPage = &pWri
1cf80 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69  ter->writer;.  i
1cf90 36 34 20 69 52 6f 77 69 64 3b 0a 0a 20 20 61 73  64 iRowid;..  as
1cfa0 73 65 72 74 28 20 28 70 50 61 67 65 2d 3e 70 67  sert( (pPage->pg
1cfb0 69 64 78 2e 6e 3d 3d 30 29 3d 3d 28 70 57 72 69  idx.n==0)==(pWri
1cfc0 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49  ter->bFirstTermI
1cfd0 6e 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  nPage) );..  /* 
1cfe0 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20 68  Set the szLeaf h
1cff0 65 61 64 65 72 20 66 69 65 6c 64 2e 20 2a 2f 0a  eader field. */.
1d000 20 20 61 73 73 65 72 74 28 20 30 3d 3d 66 74 73    assert( 0==fts
1d010 35 47 65 74 55 31 36 28 26 70 50 61 67 65 2d 3e  5GetU16(&pPage->
1d020 62 75 66 2e 70 5b 32 5d 29 20 29 3b 0a 20 20 66  buf.p[2]) );.  f
1d030 74 73 35 50 75 74 55 31 36 28 26 70 50 61 67 65  ts5PutU16(&pPage
1d040 2d 3e 62 75 66 2e 70 5b 32 5d 2c 20 28 75 31 36  ->buf.p[2], (u16
1d050 29 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a  )pPage->buf.n);.
1d060 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
1d070 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
1d080 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 74 65   ){.    /* No te
1d090 72 6d 20 77 61 73 20 77 72 69 74 74 65 6e 20 74  rm was written t
1d0a0 6f 20 74 68 69 73 20 70 61 67 65 2e 20 2a 2f 0a  o this page. */.
1d0b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1d0c0 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30 20 29 3b  e->pgidx.n==0 );
1d0d0 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74  .    fts5WriteBt
1d0e0 72 65 65 4e 6f 54 65 72 6d 28 70 2c 20 70 57 72  reeNoTerm(p, pWr
1d0f0 69 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iter);.  }else{.
1d100 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68      /* Append th
1d110 65 20 70 67 69 64 78 20 74 6f 20 74 68 65 20 70  e pgidx to the p
1d120 61 67 65 20 62 75 66 66 65 72 2e 20 53 65 74 20  age buffer. Set 
1d130 74 68 65 20 73 7a 4c 65 61 66 20 68 65 61 64 65  the szLeaf heade
1d140 72 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20 20  r field. */.    
1d150 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1d160 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
1d170 61 67 65 2d 3e 62 75 66 2c 20 70 50 61 67 65 2d  age->buf, pPage-
1d180 3e 70 67 69 64 78 2e 6e 2c 20 70 50 61 67 65 2d  >pgidx.n, pPage-
1d190 3e 70 67 69 64 78 2e 70 29 3b 0a 20 20 7d 0a 0a  >pgidx.p);.  }..
1d1a0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
1d1b0 61 67 65 20 6f 75 74 20 74 6f 20 64 69 73 6b 20  age out to disk 
1d1c0 2a 2f 0a 20 20 69 52 6f 77 69 64 20 3d 20 46 54  */.  iRowid = FT
1d1d0 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
1d1e0 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64  (pWriter->iSegid
1d1f0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
1d200 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
1d210 70 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65  p, iRowid, pPage
1d220 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e  ->buf.p, pPage->
1d230 62 75 66 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e  buf.n);..  /* In
1d240 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 65 78  itialize the nex
1d250 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73  t page. */.  fts
1d260 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61  5BufferZero(&pPa
1d270 67 65 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35  ge->buf);.  fts5
1d280 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67  BufferZero(&pPag
1d290 65 2d 3e 70 67 69 64 78 29 3b 0a 20 20 66 74 73  e->pgidx);.  fts
1d2a0 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1d2b0 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  b(&p->rc, &pPage
1d2c0 2d 3e 62 75 66 2c 20 34 2c 20 7a 65 72 6f 29 3b  ->buf, 4, zero);
1d2d0 0a 20 20 70 50 61 67 65 2d 3e 69 50 72 65 76 50  .  pPage->iPrevP
1d2e0 67 69 64 78 20 3d 20 30 3b 0a 20 20 70 50 61 67  gidx = 0;.  pPag
1d2f0 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a  e->pgno++;..  /*
1d300 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6c 65   Increase the le
1d310 61 76 65 73 20 77 72 69 74 74 65 6e 20 63 6f 75  aves written cou
1d320 6e 74 65 72 20 2a 2f 0a 20 20 70 57 72 69 74 65  nter */.  pWrite
1d330 72 2d 3e 6e 4c 65 61 66 57 72 69 74 74 65 6e 2b  r->nLeafWritten+
1d340 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 77  +;..  /* The new
1d350 20 6c 65 61 66 20 68 6f 6c 64 73 20 6e 6f 20 74   leaf holds no t
1d360 65 72 6d 73 20 6f 72 20 72 6f 77 69 64 73 20 2a  erms or rowids *
1d370 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  /.  pWriter->bFi
1d380 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20  rstTermInPage = 
1d390 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46  1;.  pWriter->bF
1d3a0 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
1d3b0 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  = 1;.}../*.** Ap
1d3c0 70 65 6e 64 20 74 65 72 6d 20 70 54 65 72 6d 2f  pend term pTerm/
1d3d0 6e 54 65 72 6d 20 74 6f 20 74 68 65 20 73 65 67  nTerm to the seg
1d3e0 6d 65 6e 74 20 62 65 69 6e 67 20 77 72 69 74 74  ment being writt
1d3f0 65 6e 20 62 79 20 74 68 65 20 77 72 69 74 65 72  en by the writer
1d400 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
1d410 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1d420 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  t..**.** If an e
1d430 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
1d440 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72   the Fts5Index.r
1d450 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  c error code. If
1d460 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a   an error has .*
1d470 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  * already occurr
1d480 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
1d490 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  n is a no-op..*/
1d4a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1d4b0 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d  5WriteAppendTerm
1d4c0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1d4d0 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  , .  Fts5SegWrit
1d4e0 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69  er *pWriter,.  i
1d4f0 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20  nt nTerm, const 
1d500 75 38 20 2a 70 54 65 72 6d 20 0a 29 7b 0a 20 20  u8 *pTerm .){.  
1d510 69 6e 74 20 6e 50 72 65 66 69 78 3b 20 20 20 20  int nPrefix;    
1d520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d530 2f 2a 20 42 79 74 65 73 20 6f 66 20 70 72 65 66  /* Bytes of pref
1d540 69 78 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 66  ix compression f
1d550 6f 72 20 74 65 72 6d 20 2a 2f 0a 20 20 46 74 73  or term */.  Fts
1d560 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61  5PageWriter *pPa
1d570 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77  ge = &pWriter->w
1d580 72 69 74 65 72 3b 0a 20 20 46 74 73 35 42 75 66  riter;.  Fts5Buf
1d590 66 65 72 20 2a 70 50 67 69 64 78 20 3d 20 26 70  fer *pPgidx = &p
1d5a0 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70  Writer->writer.p
1d5b0 67 69 64 78 3b 0a 0a 20 20 61 73 73 65 72 74 28  gidx;..  assert(
1d5c0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1d5d0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
1d5e0 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d 34 20 29  Page->buf.n>=4 )
1d5f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1d600 65 2d 3e 62 75 66 2e 6e 3e 34 20 7c 7c 20 70 57  e->buf.n>4 || pW
1d610 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
1d620 6d 49 6e 50 61 67 65 20 29 3b 0a 0a 20 20 2f 2a  mInPage );..  /*
1d630 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
1d640 6c 65 61 66 20 70 61 67 65 20 69 73 20 66 75 6c  leaf page is ful
1d650 6c 2c 20 66 6c 75 73 68 20 69 74 20 74 6f 20 64  l, flush it to d
1d660 69 73 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 28 70  isk. */.  if( (p
1d670 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50  Page->buf.n + pP
1d680 67 69 64 78 2d 3e 6e 20 2b 20 6e 54 65 72 6d 20  gidx->n + nTerm 
1d690 2b 20 32 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67  + 2)>=p->pConfig
1d6a0 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 69 66  ->pgsz ){.    if
1d6b0 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34  ( pPage->buf.n>4
1d6c0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72   ){.      fts5Wr
1d6d0 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20  iteFlushLeaf(p, 
1d6e0 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a  pWriter);.    }.
1d6f0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 47 72      fts5BufferGr
1d700 6f 77 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  ow(&p->rc, &pPag
1d710 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 2b 46 54  e->buf, nTerm+FT
1d720 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29  S5_DATA_PADDING)
1d730 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 4f  ;.  }.  .  /* TO
1d740 44 4f 31 3a 20 55 70 64 61 74 69 6e 67 20 70 67  DO1: Updating pg
1d750 69 64 78 20 68 65 72 65 2e 20 2a 2f 0a 20 20 70  idx here. */.  p
1d760 50 67 69 64 78 2d 3e 6e 20 2b 3d 20 73 71 6c 69  Pgidx->n += sqli
1d770 74 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74  te3Fts5PutVarint
1d780 28 0a 20 20 20 20 20 20 26 70 50 67 69 64 78 2d  (.      &pPgidx-
1d790 3e 70 5b 70 50 67 69 64 78 2d 3e 6e 5d 2c 20 70  >p[pPgidx->n], p
1d7a0 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2d 20 70 50  Page->buf.n - pP
1d7b0 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64 78 0a  age->iPrevPgidx.
1d7c0 20 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 50    );.  pPage->iP
1d7d0 72 65 76 50 67 69 64 78 20 3d 20 70 50 61 67 65  revPgidx = pPage
1d7e0 2d 3e 62 75 66 2e 6e 3b 0a 23 69 66 20 30 0a 20  ->buf.n;.#if 0. 
1d7f0 20 66 74 73 35 50 75 74 55 31 36 28 26 70 50 67   fts5PutU16(&pPg
1d800 69 64 78 2d 3e 70 5b 70 50 67 69 64 78 2d 3e 6e  idx->p[pPgidx->n
1d810 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29  ], pPage->buf.n)
1d820 3b 0a 20 20 70 50 67 69 64 78 2d 3e 6e 20 2b 3d  ;.  pPgidx->n +=
1d830 20 32 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66   2;.#endif..  if
1d840 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
1d850 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20  tTermInPage ){. 
1d860 20 20 20 6e 50 72 65 66 69 78 20 3d 20 30 3b 0a     nPrefix = 0;.
1d870 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
1d880 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno!=1 ){.      
1d890 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 66  /* This is the f
1d8a0 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 61 20 6c  irst term on a l
1d8b0 65 61 66 20 74 68 61 74 20 69 73 20 6e 6f 74 20  eaf that is not 
1d8c0 74 68 65 20 6c 65 66 74 6d 6f 73 74 20 6c 65 61  the leftmost lea
1d8d0 66 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  f in.      ** th
1d8e0 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  e segment b-tree
1d8f0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
1d900 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
1d910 6f 20 61 64 64 20 61 20 74 65 72 6d 20 74 6f 0a  o add a term to.
1d920 20 20 20 20 20 20 2a 2a 20 74 68 65 20 62 2d 74        ** the b-t
1d930 72 65 65 20 68 69 65 72 61 72 63 68 79 20 74 68  ree hierarchy th
1d940 61 74 20 69 73 20 28 61 29 20 6c 61 72 67 65 72  at is (a) larger
1d950 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73   than the larges
1d960 74 20 74 65 72 6d 20 0a 20 20 20 20 20 20 2a 2a  t term .      **
1d970 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e   already written
1d980 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20   to the segment 
1d990 61 6e 64 20 28 62 29 20 73 6d 61 6c 6c 65 72 20  and (b) smaller 
1d9a0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1d9b0 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 74  .      ** this t
1d9c0 65 72 6d 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  erm. In other wo
1d9d0 72 64 73 2c 20 61 20 70 72 65 66 69 78 20 6f 66  rds, a prefix of
1d9e0 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 74   (pTerm/nTerm) t
1d9f0 68 61 74 20 69 73 20 6f 6e 65 0a 20 20 20 20 20  hat is one.     
1da00 20 2a 2a 20 62 79 74 65 20 6c 6f 6e 67 65 72 20   ** byte longer 
1da10 74 68 61 6e 20 74 68 65 20 6c 6f 6e 67 65 73 74  than the longest
1da20 20 70 72 65 66 69 78 20 28 70 54 65 72 6d 2f 6e   prefix (pTerm/n
1da30 54 65 72 6d 29 20 73 68 61 72 65 73 20 77 69 74  Term) shares wit
1da40 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70  h the.      ** p
1da50 72 65 76 69 6f 75 73 20 74 65 72 6d 2e 20 0a 20  revious term. . 
1da60 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1da70 20 55 73 75 61 6c 6c 79 2c 20 74 68 65 20 70 72   Usually, the pr
1da80 65 76 69 6f 75 73 20 74 65 72 6d 20 69 73 20 61  evious term is a
1da90 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 50 61 67  vailable in pPag
1daa0 65 2d 3e 74 65 72 6d 2e 20 54 68 65 20 65 78 63  e->term. The exc
1dab0 65 70 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  eption.      ** 
1dac0 69 73 20 69 66 20 74 68 69 73 20 69 73 20 74 68  is if this is th
1dad0 65 20 66 69 72 73 74 20 74 65 72 6d 20 77 72 69  e first term wri
1dae0 74 74 65 6e 20 69 6e 20 61 6e 20 69 6e 63 72 65  tten in an incre
1daf0 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20 73 74 65  mental-merge ste
1db00 70 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74  p..      ** In t
1db10 68 69 73 20 63 61 73 65 20 74 68 65 20 70 72 65  his case the pre
1db20 76 69 6f 75 73 20 74 65 72 6d 20 69 73 20 6e 6f  vious term is no
1db30 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 73 6f 20  t available, so 
1db40 6a 75 73 74 20 77 72 69 74 65 20 61 0a 20 20 20  just write a.   
1db50 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 28 70     ** copy of (p
1db60 54 65 72 6d 2f 6e 54 65 72 6d 29 20 69 6e 74 6f  Term/nTerm) into
1db70 20 74 68 65 20 70 61 72 65 6e 74 20 6e 6f 64 65   the parent node
1db80 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67 68 74  . This is slight
1db90 6c 79 0a 20 20 20 20 20 20 2a 2a 20 69 6e 65 66  ly.      ** inef
1dba0 66 69 63 69 65 6e 74 2c 20 62 75 74 20 73 74 69  ficient, but sti
1dbb0 6c 6c 20 63 6f 72 72 65 63 74 2e 20 20 2a 2f 0a  ll correct.  */.
1dbc0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 6e 54        int n = nT
1dbd0 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  erm;.      if( p
1dbe0 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 20 29 7b 0a  Page->term.n ){.
1dbf0 20 20 20 20 20 20 20 20 6e 20 3d 20 31 20 2b 20          n = 1 + 
1dc00 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65  fts5PrefixCompre
1dc10 73 73 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e  ss(pPage->term.n
1dc20 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c  , pPage->term.p,
1dc30 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d   pTerm);.      }
1dc40 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
1dc50 42 74 72 65 65 54 65 72 6d 28 70 2c 20 70 57 72  BtreeTerm(p, pWr
1dc60 69 74 65 72 2c 20 6e 2c 20 70 54 65 72 6d 29 3b  iter, n, pTerm);
1dc70 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 26  .      pPage = &
1dc80 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b  pWriter->writer;
1dc90 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1dca0 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74      nPrefix = ft
1dcb0 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73  s5PrefixCompress
1dcc0 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20  (pPage->term.n, 
1dcd0 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 70  pPage->term.p, p
1dce0 54 65 72 6d 29 3b 0a 20 20 20 20 66 74 73 35 42  Term);.    fts5B
1dcf0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1dd00 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
1dd10 2d 3e 62 75 66 2c 20 6e 50 72 65 66 69 78 29 3b  ->buf, nPrefix);
1dd20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e  .  }..  /* Appen
1dd30 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
1dd40 62 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61 74  bytes of new dat
1dd50 61 2c 20 74 68 65 6e 20 74 68 65 20 74 65 72 6d  a, then the term
1dd60 20 64 61 74 61 20 69 74 73 65 6c 66 0a 20 20 2a   data itself.  *
1dd70 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2e 20 2a  * to the page. *
1dd80 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  /.  fts5BufferAp
1dd90 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1dda0 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
1ddb0 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 29  nTerm - nPrefix)
1ddc0 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  ;.  fts5BufferAp
1ddd0 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1dde0 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54   &pPage->buf, nT
1ddf0 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 2c 20 26  erm - nPrefix, &
1de00 70 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 29 3b  pTerm[nPrefix]);
1de10 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
1de20 65 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72  e Fts5PageWriter
1de30 2e 74 65 72 6d 20 66 69 65 6c 64 2e 20 2a 2f 0a  .term field. */.
1de40 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
1de50 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1de60 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65  term, nTerm, pTe
1de70 72 6d 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  rm);.  pWriter->
1de80 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
1de90 20 3d 20 30 3b 0a 0a 20 20 70 57 72 69 74 65 72   = 0;..  pWriter
1dea0 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
1deb0 61 67 65 20 3d 20 30 3b 0a 20 20 70 57 72 69 74  age = 0;.  pWrit
1dec0 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
1ded0 6e 44 6f 63 6c 69 73 74 20 3d 20 31 3b 0a 0a 20  nDoclist = 1;.. 
1dee0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c   assert( p->rc |
1def0 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69  | (pWriter->nDli
1df00 64 78 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d  dx>0 && pWriter-
1df10 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e  >aDlidx[0].buf.n
1df20 3d 3d 30 29 20 29 3b 0a 20 20 70 57 72 69 74 65  ==0) );.  pWrite
1df30 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 70 67 6e  r->aDlidx[0].pgn
1df40 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
1df50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
1df60 20 61 20 72 6f 77 69 64 20 61 6e 64 20 70 6f 73   a rowid and pos
1df70 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
1df80 66 69 65 6c 64 20 74 6f 20 74 68 65 20 77 72 69  field to the wri
1df90 74 65 72 73 20 6f 75 74 70 75 74 2e 20 0a 2a 2f  ters output. .*/
1dfa0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1dfb0 35 57 72 69 74 65 41 70 70 65 6e 64 52 6f 77 69  5WriteAppendRowi
1dfc0 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  d(.  Fts5Index *
1dfd0 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
1dfe0 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20  ter *pWriter,.  
1dff0 69 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20  i64 iRowid.){.  
1e000 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1e010 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35  E_OK ){.    Fts5
1e020 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67  PageWriter *pPag
1e030 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72  e = &pWriter->wr
1e040 69 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 28  iter;..    if( (
1e050 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70  pPage->buf.n + p
1e060 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 29 3e 3d  Page->pgidx.n)>=
1e070 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a  p->pConfig->pgsz
1e080 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72   ){.      fts5Wr
1e090 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20  iteFlushLeaf(p, 
1e0a0 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a  pWriter);.    }.
1e0b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
1e0c0 69 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72  is to be the fir
1e0d0 73 74 20 72 6f 77 69 64 20 77 72 69 74 74 65 6e  st rowid written
1e0e0 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 73 65   to the page, se
1e0f0 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 6f  t the .    ** ro
1e100 77 69 64 2d 70 6f 69 6e 74 65 72 20 69 6e 20 74  wid-pointer in t
1e110 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 2e 20  he page-header. 
1e120 41 6c 73 6f 20 61 70 70 65 6e 64 20 61 20 76 61  Also append a va
1e130 6c 75 65 20 74 6f 20 74 68 65 20 64 6c 69 64 78  lue to the dlidx
1e140 0a 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2c 20  .    ** buffer, 
1e150 69 6e 20 63 61 73 65 20 61 20 64 6f 63 6c 69 73  in case a doclis
1e160 74 2d 69 6e 64 65 78 20 69 73 20 72 65 71 75 69  t-index is requi
1e170 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  red.  */.    if(
1e180 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1e190 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20  RowidInPage ){. 
1e1a0 20 20 20 20 20 66 74 73 35 50 75 74 55 31 36 28       fts5PutU16(
1e1b0 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 28 75  pPage->buf.p, (u
1e1c0 31 36 29 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29  16)pPage->buf.n)
1e1d0 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  ;.      fts5Writ
1e1e0 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20  eDlidxAppend(p, 
1e1f0 70 57 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29  pWriter, iRowid)
1e200 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1e210 57 72 69 74 65 20 74 68 65 20 72 6f 77 69 64 2e  Write the rowid.
1e220 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72 69   */.    if( pWri
1e230 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
1e240 49 6e 44 6f 63 6c 69 73 74 20 7c 7c 20 70 57 72  InDoclist || pWr
1e250 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
1e260 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20  dInPage ){.     
1e270 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1e280 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1e290 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f  &pPage->buf, iRo
1e2a0 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  wid);.    }else{
1e2b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e2c0 2d 3e 72 63 20 7c 7c 20 69 52 6f 77 69 64 3e 70  ->rc || iRowid>p
1e2d0 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77  Writer->iPrevRow
1e2e0 69 64 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35  id );.      fts5
1e2f0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1e300 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  nt(&p->rc, &pPag
1e310 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 20 2d  e->buf, iRowid -
1e320 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52   pWriter->iPrevR
1e330 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  owid);.    }.   
1e340 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52   pWriter->iPrevR
1e350 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20  owid = iRowid;. 
1e360 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72     pWriter->bFir
1e370 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74  stRowidInDoclist
1e380 20 3d 20 30 3b 0a 20 20 20 20 70 57 72 69 74 65   = 0;.    pWrite
1e390 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
1e3a0 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  Page = 0;.  }.}.
1e3b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1e3c0 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c  5WriteAppendPosl
1e3d0 69 73 74 44 61 74 61 28 0a 20 20 46 74 73 35 49  istData(.  Fts5I
1e3e0 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
1e3f0 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1e400 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20  er, .  const u8 
1e410 2a 61 44 61 74 61 2c 20 0a 20 20 69 6e 74 20 6e  *aData, .  int n
1e420 44 61 74 61 0a 29 7b 0a 20 20 46 74 73 35 50 61  Data.){.  Fts5Pa
1e430 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20  geWriter *pPage 
1e440 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  = &pWriter->writ
1e450 65 72 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  er;.  const u8 *
1e460 61 20 3d 20 61 44 61 74 61 3b 0a 20 20 69 6e 74  a = aData;.  int
1e470 20 6e 20 3d 20 6e 44 61 74 61 3b 0a 20 20 0a 20   n = nData;.  . 
1e480 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e   assert( p->pCon
1e490 66 69 67 2d 3e 70 67 73 7a 3e 30 20 29 3b 0a 20  fig->pgsz>0 );. 
1e4a0 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
1e4b0 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20 26  QLITE_OK .     &
1e4c0 26 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20  & (pPage->buf.n 
1e4d0 2b 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e  + pPage->pgidx.n
1e4e0 20 2b 20 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69   + n)>=p->pConfi
1e4f0 67 2d 3e 70 67 73 7a 20 0a 20 20 29 7b 0a 20 20  g->pgsz .  ){.  
1e500 20 20 69 6e 74 20 6e 52 65 71 20 3d 20 70 2d 3e    int nReq = p->
1e510 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2d 20  pConfig->pgsz - 
1e520 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2d 20 70  pPage->buf.n - p
1e530 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3b 0a 20  Page->pgidx.n;. 
1e540 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 30     int nCopy = 0
1e550 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 43 6f  ;.    while( nCo
1e560 70 79 3c 6e 52 65 71 20 29 7b 0a 20 20 20 20 20  py<nReq ){.     
1e570 20 69 36 34 20 64 75 6d 6d 79 3b 0a 20 20 20 20   i64 dummy;.    
1e580 20 20 6e 43 6f 70 79 20 2b 3d 20 66 74 73 35 47    nCopy += fts5G
1e590 65 74 56 61 72 69 6e 74 28 26 61 5b 6e 43 6f 70  etVarint(&a[nCop
1e5a0 79 5d 2c 20 28 75 36 34 2a 29 26 64 75 6d 6d 79  y], (u64*)&dummy
1e5b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
1e5c0 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1e5d0 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  b(&p->rc, &pPage
1e5e0 2d 3e 62 75 66 2c 20 6e 43 6f 70 79 2c 20 61 29  ->buf, nCopy, a)
1e5f0 3b 0a 20 20 20 20 61 20 2b 3d 20 6e 43 6f 70 79  ;.    a += nCopy
1e600 3b 0a 20 20 20 20 6e 20 2d 3d 20 6e 43 6f 70 79  ;.    n -= nCopy
1e610 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46  ;.    fts5WriteF
1e620 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69  lushLeaf(p, pWri
1e630 74 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ter);.  }.  if( 
1e640 6e 3e 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42  n>0 ){.    fts5B
1e650 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
1e660 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1e670 62 75 66 2c 20 6e 2c 20 61 29 3b 0a 20 20 7d 0a  buf, n, a);.  }.
1e680 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61  }../*.** Flush a
1e690 6e 79 20 64 61 74 61 20 63 61 63 68 65 64 20 62  ny data cached b
1e6a0 79 20 74 68 65 20 77 72 69 74 65 72 20 6f 62 6a  y the writer obj
1e6b0 65 63 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ect to the datab
1e6c0 61 73 65 2e 20 46 72 65 65 20 61 6e 79 0a 2a 2a  ase. Free any.**
1e6d0 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73   allocations ass
1e6e0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1e6f0 20 77 72 69 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   writer..*/.stat
1e700 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
1e710 65 46 69 6e 69 73 68 28 0a 20 20 46 74 73 35 49  eFinish(.  Fts5I
1e720 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
1e730 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1e740 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57  er,         /* W
1e750 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  riter object */.
1e760 20 20 69 6e 74 20 2a 70 6e 4c 65 61 66 20 20 20    int *pnLeaf   
1e770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e780 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72    /* OUT: Number
1e790 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 69   of leaf pages i
1e7a0 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a 20  n b-tree */.){. 
1e7b0 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 50 61   int i;.  Fts5Pa
1e7c0 67 65 57 72 69 74 65 72 20 2a 70 4c 65 61 66 20  geWriter *pLeaf 
1e7d0 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  = &pWriter->writ
1e7e0 65 72 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  er;.  if( p->rc=
1e7f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e800 20 20 61 73 73 65 72 74 28 20 70 4c 65 61 66 2d    assert( pLeaf-
1e810 3e 70 67 6e 6f 3e 3d 31 20 29 3b 0a 20 20 20 20  >pgno>=1 );.    
1e820 69 66 28 20 70 4c 65 61 66 2d 3e 62 75 66 2e 6e  if( pLeaf->buf.n
1e830 3e 34 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  >4 ){.      fts5
1e840 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
1e850 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  , pWriter);.    
1e860 7d 0a 20 20 20 20 2a 70 6e 4c 65 61 66 20 3d 20  }.    *pnLeaf = 
1e870 70 4c 65 61 66 2d 3e 70 67 6e 6f 2d 31 3b 0a 20  pLeaf->pgno-1;. 
1e880 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 70 67     if( pLeaf->pg
1e890 6e 6f 3e 31 20 29 7b 0a 20 20 20 20 20 20 66 74  no>1 ){.      ft
1e8a0 73 35 57 72 69 74 65 46 6c 75 73 68 42 74 72 65  s5WriteFlushBtre
1e8b0 65 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  e(p, pWriter);. 
1e8c0 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42     }.  }.  fts5B
1e8d0 75 66 66 65 72 46 72 65 65 28 26 70 4c 65 61 66  ufferFree(&pLeaf
1e8e0 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 42  ->term);.  fts5B
1e8f0 75 66 66 65 72 46 72 65 65 28 26 70 4c 65 61 66  ufferFree(&pLeaf
1e900 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42 75  ->buf);.  fts5Bu
1e910 66 66 65 72 46 72 65 65 28 26 70 4c 65 61 66 2d  fferFree(&pLeaf-
1e920 3e 70 67 69 64 78 29 3b 0a 20 20 66 74 73 35 42  >pgidx);.  fts5B
1e930 75 66 66 65 72 46 72 65 65 28 26 70 57 72 69 74  ufferFree(&pWrit
1e940 65 72 2d 3e 62 74 74 65 72 6d 29 3b 0a 0a 20 20  er->btterm);..  
1e950 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69 74  for(i=0; i<pWrit
1e960 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b 29  er->nDlidx; i++)
1e970 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
1e980 35 42 75 66 66 65 72 46 72 65 65 28 26 70 57 72  5BufferFree(&pWr
1e990 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 2e  iter->aDlidx[i].
1e9a0 62 75 66 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  buf);.  }.  sqli
1e9b0 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65 72  te3_free(pWriter
1e9c0 2d 3e 61 44 6c 69 64 78 29 3b 0a 7d 0a 0a 73 74  ->aDlidx);.}..st
1e9d0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1e9e0 69 74 65 49 6e 69 74 28 0a 20 20 46 74 73 35 49  iteInit(.  Fts5I
1e9f0 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
1ea00 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1ea10 65 72 2c 20 0a 20 20 69 6e 74 20 69 53 65 67 69  er, .  int iSegi
1ea20 64 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  d.){.  const int
1ea30 20 6e 42 75 66 66 65 72 20 3d 20 70 2d 3e 70 43   nBuffer = p->pC
1ea40 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2b 20 46 54  onfig->pgsz + FT
1ea50 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 3b  S5_DATA_PADDING;
1ea60 0a 0a 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74  ..  memset(pWrit
1ea70 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
1ea80 73 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20  s5SegWriter));. 
1ea90 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64   pWriter->iSegid
1eaa0 20 3d 20 69 53 65 67 69 64 3b 0a 0a 20 20 66 74   = iSegid;..  ft
1eab0 73 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77  s5WriteDlidxGrow
1eac0 28 70 2c 20 70 57 72 69 74 65 72 2c 20 31 29 3b  (p, pWriter, 1);
1ead0 0a 20 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74  .  pWriter->writ
1eae0 65 72 2e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 70  er.pgno = 1;.  p
1eaf0 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
1eb00 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  rmInPage = 1;.  
1eb10 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65  pWriter->iBtPage
1eb20 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 1;..  assert(
1eb30 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72   pWriter->writer
1eb40 2e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 61  .buf.n==0 );.  a
1eb50 73 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e  ssert( pWriter->
1eb60 77 72 69 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d  writer.pgidx.n==
1eb70 30 20 29 3b 0a 0a 20 20 2f 2a 20 47 72 6f 77 20  0 );..  /* Grow 
1eb80 74 68 65 20 74 77 6f 20 62 75 66 66 65 72 73 20  the two buffers 
1eb90 74 6f 20 70 67 73 7a 20 2b 20 70 61 64 64 69 6e  to pgsz + paddin
1eba0 67 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  g bytes in size.
1ebb0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 74 73   */.  sqlite3Fts
1ebc0 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e  5BufferSize(&p->
1ebd0 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 77 72  rc, &pWriter->wr
1ebe0 69 74 65 72 2e 70 67 69 64 78 2c 20 6e 42 75 66  iter.pgidx, nBuf
1ebf0 66 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  fer);.  sqlite3F
1ec00 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70  ts5BufferSize(&p
1ec10 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e  ->rc, &pWriter->
1ec20 77 72 69 74 65 72 2e 62 75 66 2c 20 6e 42 75 66  writer.buf, nBuf
1ec30 66 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  fer);..  if( p->
1ec40 70 49 64 78 57 72 69 74 65 72 3d 3d 30 20 29 7b  pIdxWriter==0 ){
1ec50 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20  .    Fts5Config 
1ec60 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
1ec70 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49  onfig;.    fts5I
1ec80 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
1ec90 70 2c 20 26 70 2d 3e 70 49 64 78 57 72 69 74 65  p, &p->pIdxWrite
1eca0 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  r, sqlite3_mprin
1ecb0 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 49  tf(.          "I
1ecc0 4e 53 45 52 54 20 49 4e 54 4f 20 27 25 71 27 2e  NSERT INTO '%q'.
1ecd0 27 25 71 5f 69 64 78 27 28 73 65 67 69 64 2c 74  '%q_idx'(segid,t
1ece0 65 72 6d 2c 70 67 6e 6f 29 20 56 41 4c 55 45 53  erm,pgno) VALUES
1ecf0 28 3f 2c 3f 2c 3f 29 22 2c 20 0a 20 20 20 20 20  (?,?,?)", .     
1ed00 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
1ed10 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  b, pConfig->zNam
1ed20 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 0a 20  e.    ));.  }.. 
1ed30 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1ed40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
1ed50 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 34  Initialize the 4
1ed60 2d 62 79 74 65 20 6c 65 61 66 2d 70 61 67 65 20  -byte leaf-page 
1ed70 68 65 61 64 65 72 20 74 6f 20 30 78 30 30 2e 20  header to 0x00. 
1ed80 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 57  */.    memset(pW
1ed90 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75  riter->writer.bu
1eda0 66 2e 70 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20  f.p, 0, 4);.    
1edb0 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e  pWriter->writer.
1edc0 62 75 66 2e 6e 20 3d 20 34 3b 0a 0a 20 20 20 20  buf.n = 4;..    
1edd0 2f 2a 20 42 69 6e 64 20 74 68 65 20 63 75 72 72  /* Bind the curr
1ede0 65 6e 74 20 6f 75 74 70 75 74 20 73 65 67 6d 65  ent output segme
1edf0 6e 74 20 69 64 20 74 6f 20 74 68 65 20 69 6e 64  nt id to the ind
1ee00 65 78 2d 77 72 69 74 65 72 2e 20 54 68 69 73 20  ex-writer. This 
1ee10 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 6f 70 74  is an.    ** opt
1ee20 69 6d 69 7a 61 74 69 6f 6e 20 6f 76 65 72 20 62  imization over b
1ee30 69 6e 64 69 6e 67 20 74 68 65 20 73 61 6d 65 20  inding the same 
1ee40 76 61 6c 75 65 20 6f 76 65 72 20 61 6e 64 20 6f  value over and o
1ee50 76 65 72 20 61 73 20 72 6f 77 73 20 61 72 65 0a  ver as rows are.
1ee60 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 65 64 20      ** inserted 
1ee70 69 6e 74 6f 20 25 5f 69 64 78 20 62 79 20 74 68  into %_idx by th
1ee80 65 20 63 75 72 72 65 6e 74 20 77 72 69 74 65 72  e current writer
1ee90 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  .  */.    sqlite
1eea0 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49  3_bind_int(p->pI
1eeb0 64 78 57 72 69 74 65 72 2c 20 31 2c 20 70 57 72  dxWriter, 1, pWr
1eec0 69 74 65 72 2d 3e 69 53 65 67 69 64 29 3b 0a 20  iter->iSegid);. 
1eed0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72   }.}../*.** Iter
1eee0 61 74 6f 72 20 70 49 74 65 72 20 77 61 73 20 75  ator pIter was u
1eef0 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
1ef00 68 72 6f 75 67 68 20 74 68 65 20 69 6e 70 75 74  hrough the input
1ef10 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 6f 6e 20   segments of on 
1ef20 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61  an.** incrementa
1ef30 6c 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f  l merge operatio
1ef40 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  n. This function
1ef50 20 69 73 20 63 61 6c 6c 65 64 20 69 66 20 74 68   is called if th
1ef60 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a  e incremental.**
1ef70 20 6d 65 72 67 65 20 73 74 65 70 20 68 61 73 20   merge step has 
1ef80 66 69 6e 69 73 68 65 64 20 62 75 74 20 74 68 65  finished but the
1ef90 20 69 6e 70 75 74 20 68 61 73 20 6e 6f 74 20 62   input has not b
1efa0 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65  een completely e
1efb0 78 68 61 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61  xhausted..*/.sta
1efc0 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 72 69  tic void fts5Tri
1efd0 6d 53 65 67 6d 65 6e 74 73 28 46 74 73 35 49 6e  mSegments(Fts5In
1efe0 64 65 78 20 2a 70 2c 20 46 74 73 35 49 74 65 72  dex *p, Fts5Iter
1eff0 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
1f000 69 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  i;.  Fts5Buffer 
1f010 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62  buf;.  memset(&b
1f020 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  uf, 0, sizeof(Ft
1f030 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 66 6f  s5Buffer));.  fo
1f040 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
1f050 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSeg; i++){.    
1f060 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
1f070 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
1f080 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65  [i];.    if( pSe
1f090 67 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20  g->pSeg==0 ){.  
1f0a0 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a      /* no-op */.
1f0b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53      }else if( pS
1f0c0 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a  eg->pLeaf==0 ){.
1f0d0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6b 65 79        /* All key
1f0e0 73 20 66 72 6f 6d 20 74 68 69 73 20 69 6e 70 75  s from this inpu
1f0f0 74 20 73 65 67 6d 65 6e 74 20 68 61 76 65 20 62  t segment have b
1f100 65 65 6e 20 74 72 61 6e 73 66 65 72 65 64 20 74  een transfered t
1f110 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 0a 20 20  o the output..  
1f120 20 20 20 20 2a 2a 20 53 65 74 20 62 6f 74 68 20      ** Set both 
1f130 74 68 65 20 66 69 72 73 74 20 61 6e 64 20 6c 61  the first and la
1f140 73 74 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20  st page-numbers 
1f150 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65  to 0 to indicate
1f160 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
1f170 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 6e 6f  ** segment is no
1f180 77 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20  w empty. */.    
1f190 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67    pSeg->pSeg->pg
1f1a0 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 20 20 20 20  noLast = 0;.    
1f1b0 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67    pSeg->pSeg->pg
1f1c0 6e 6f 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 20  noFirst = 0;.   
1f1d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1f1e0 74 20 69 4f 66 66 20 3d 20 70 53 65 67 2d 3e 69  t iOff = pSeg->i
1f1f0 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 20  TermLeafOffset; 
1f200 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 6e      /* Offset on
1f210 20 6e 65 77 20 66 69 72 73 74 20 6c 65 61 66 20   new first leaf 
1f220 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 36  page */.      i6
1f230 34 20 69 4c 65 61 66 52 6f 77 69 64 3b 0a 20 20  4 iLeafRowid;.  
1f240 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 44      Fts5Data *pD
1f250 61 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ata;.      int i
1f260 49 64 20 3d 20 70 53 65 67 2d 3e 70 53 65 67 2d  Id = pSeg->pSeg-
1f270 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 75  >iSegid;.      u
1f280 38 20 61 48 64 72 5b 34 5d 20 3d 20 7b 30 78 30  8 aHdr[4] = {0x0
1f290 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  0, 0x00, 0x00, 0
1f2a0 78 30 30 7d 3b 0a 0a 20 20 20 20 20 20 69 4c 65  x00};..      iLe
1f2b0 61 66 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53  afRowid = FTS5_S
1f2c0 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64  EGMENT_ROWID(iId
1f2d0 2c 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61  , pSeg->iTermLea
1f2e0 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 44  fPgno);.      pD
1f2f0 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65  ata = fts5DataRe
1f300 61 64 28 70 2c 20 69 4c 65 61 66 52 6f 77 69 64  ad(p, iLeafRowid
1f310 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61  );.      if( pDa
1f320 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  ta ){.        ft
1f330 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 62 75  s5BufferZero(&bu
1f340 66 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  f);.        fts5
1f350 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72  BufferGrow(&p->r
1f360 63 2c 20 26 62 75 66 2c 20 70 44 61 74 61 2d 3e  c, &buf, pData->
1f370 6e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  nn);.        fts
1f380 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1f390 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  b(&p->rc, &buf, 
1f3a0 73 69 7a 65 6f 66 28 61 48 64 72 29 2c 20 61 48  sizeof(aHdr), aH
1f3b0 64 72 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  dr);.        fts
1f3c0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1f3d0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
1f3e0 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 29 3b  , pSeg->term.n);
1f3f0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1f400 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1f410 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67  ->rc, &buf, pSeg
1f420 2d 3e 74 65 72 6d 2e 6e 2c 20 70 53 65 67 2d 3e  ->term.n, pSeg->
1f430 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20 20  term.p);.       
1f440 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1f450 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62  dBlob(&p->rc, &b
1f460 75 66 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61  uf, pData->szLea
1f470 66 2d 69 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e  f-iOff, &pData->
1f480 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20  p[iOff]);.      
1f490 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1f4a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f4b0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 73      /* Set the s
1f4c0 7a 4c 65 61 66 20 66 69 65 6c 64 20 2a 2f 0a 20  zLeaf field */. 
1f4d0 20 20 20 20 20 20 20 20 20 66 74 73 35 50 75 74           fts5Put
1f4e0 55 31 36 28 26 62 75 66 2e 70 5b 32 5d 2c 20 28  U16(&buf.p[2], (
1f4f0 75 31 36 29 62 75 66 2e 6e 29 3b 0a 20 20 20 20  u16)buf.n);.    
1f500 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1f510 2a 20 53 65 74 20 75 70 20 74 68 65 20 6e 65 77  * Set up the new
1f520 20 70 61 67 65 2d 69 6e 64 65 78 20 61 72 72 61   page-index arra
1f530 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73  y */.        fts
1f540 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1f550 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
1f560 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 4);.        if
1f570 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e  ( pSeg->iLeafPgn
1f580 6f 3d 3d 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65  o==pSeg->iTermLe
1f590 61 66 50 67 6e 6f 20 0a 20 20 20 20 20 20 20 20  afPgno .        
1f5a0 20 26 26 20 70 53 65 67 2d 3e 69 45 6e 64 6f 66   && pSeg->iEndof
1f5b0 44 6f 63 6c 69 73 74 3c 70 44 61 74 61 2d 3e 73  Doclist<pData->s
1f5c0 7a 4c 65 61 66 20 0a 20 20 20 20 20 20 20 20 29  zLeaf .        )
1f5d0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1f5e0 6e 44 69 66 66 20 3d 20 70 44 61 74 61 2d 3e 73  nDiff = pData->s
1f5f0 7a 4c 65 61 66 20 2d 20 70 53 65 67 2d 3e 69 45  zLeaf - pSeg->iE
1f600 6e 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 20 20 20  ndofDoclist;.   
1f610 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1f620 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1f630 2d 3e 72 63 2c 20 26 62 75 66 2c 20 62 75 66 2e  ->rc, &buf, buf.
1f640 6e 20 2d 20 31 20 2d 20 6e 44 69 66 66 20 2d 20  n - 1 - nDiff - 
1f650 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  4);.          ft
1f660 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1f670 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ob(&p->rc, &buf,
1f680 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1f690 70 44 61 74 61 2d 3e 6e 6e 20 2d 20 70 53 65 67  pData->nn - pSeg
1f6a0 2d 3e 69 50 67 69 64 78 4f 66 66 2c 20 26 70 44  ->iPgidxOff, &pD
1f6b0 61 74 61 2d 3e 70 5b 70 53 65 67 2d 3e 69 50 67  ata->p[pSeg->iPg
1f6c0 69 64 78 4f 66 66 5d 0a 20 20 20 20 20 20 20 20  idxOff].        
1f6d0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a    );.        }..
1f6e0 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
1f6f0 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a  Release(pData);.
1f700 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53          pSeg->pS
1f710 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20  eg->pgnoFirst = 
1f720 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50  pSeg->iTermLeafP
1f730 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 66 74 73  gno;.        fts
1f740 35 44 61 74 61 44 65 6c 65 74 65 28 70 2c 20 46  5DataDelete(p, F
1f750 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
1f760 44 28 69 49 64 2c 20 31 29 2c 20 69 4c 65 61 66  D(iId, 1), iLeaf
1f770 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
1f780 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c  fts5DataWrite(p,
1f790 20 69 4c 65 61 66 52 6f 77 69 64 2c 20 62 75 66   iLeafRowid, buf
1f7a0 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20 20  .p, buf.n);.    
1f7b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1f7c0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
1f7d0 62 75 66 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  buf);.}..static 
1f7e0 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 43 68  void fts5MergeCh
1f7f0 75 6e 6b 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46  unkCallback(.  F
1f800 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1f810 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 63  void *pCtx, .  c
1f820 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c  onst u8 *pChunk,
1f830 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20   int nChunk.){. 
1f840 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1f850 70 57 72 69 74 65 72 20 3d 20 28 46 74 73 35 53  pWriter = (Fts5S
1f860 65 67 57 72 69 74 65 72 2a 29 70 43 74 78 3b 0a  egWriter*)pCtx;.
1f870 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e    fts5WriteAppen
1f880 64 50 6f 73 6c 69 73 74 44 61 74 61 28 70 2c 20  dPoslistData(p, 
1f890 70 57 72 69 74 65 72 2c 20 70 43 68 75 6e 6b 2c  pWriter, pChunk,
1f8a0 20 6e 43 68 75 6e 6b 29 3b 0a 7d 0a 0a 2f 2a 0a   nChunk);.}../*.
1f8b0 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  **.*/.static voi
1f8c0 64 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65  d fts5IndexMerge
1f8d0 4c 65 76 65 6c 28 0a 20 20 46 74 73 35 49 6e 64  Level(.  Fts5Ind
1f8e0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
1f8f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
1f900 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
1f910 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
1f920 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20  re **ppStruct,  
1f930 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
1f940 53 74 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65  Stucture of inde
1f950 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c  x */.  int iLvl,
1f960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f970 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20         /* Level 
1f980 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 66 72  to read input fr
1f990 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52  om */.  int *pnR
1f9a0 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
1f9b0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1f9c0 20 75 70 20 74 6f 20 74 68 69 73 20 6d 61 6e 79   up to this many
1f9d0 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20 2a   output leaves *
1f9e0 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  /.){.  Fts5Struc
1f9f0 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
1fa00 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73  *ppStruct;.  Fts
1fa10 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
1fa20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74  *pLvl = &pStruct
1fa30 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
1fa40 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
1fa50 65 76 65 6c 20 2a 70 4c 76 6c 4f 75 74 3b 0a 20  evel *pLvlOut;. 
1fa60 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
1fa70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 49   = 0;       /* I
1fa80 74 65 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20  terator to read 
1fa90 69 6e 70 75 74 20 64 61 74 61 20 2a 2f 0a 20 20  input data */.  
1faa0 69 6e 74 20 6e 52 65 6d 20 3d 20 70 6e 52 65 6d  int nRem = pnRem
1fab0 20 3f 20 2a 70 6e 52 65 6d 20 3a 20 30 3b 20 20   ? *pnRem : 0;  
1fac0 2f 2a 20 4f 75 74 70 75 74 20 6c 65 61 66 20 70  /* Output leaf p
1fad0 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69  ages left to wri
1fae0 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70  te */.  int nInp
1faf0 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
1fb00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1fb10 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65  r of input segme
1fb20 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  nts */.  Fts5Seg
1fb30 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 20  Writer writer;  
1fb40 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1fb50 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  er object */.  F
1fb60 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
1fb70 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f  ent *pSeg;     /
1fb80 2a 20 4f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  * Output segment
1fb90 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
1fba0 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 62 4f 6c   term;.  int bOl
1fbb0 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  dest;           
1fbc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1fbd0 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 73   if the output s
1fbe0 65 67 6d 65 6e 74 20 69 73 20 74 68 65 20 6f 6c  egment is the ol
1fbf0 64 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44  dest */.  int eD
1fc00 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66  etail = p->pConf
1fc10 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 63  ig->eDetail;.  c
1fc20 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
1fc30 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
1fc40 5f 4e 4f 4f 55 54 50 55 54 3b 0a 0a 20 20 61 73  _NOOUTPUT;..  as
1fc50 73 65 72 74 28 20 69 4c 76 6c 3c 70 53 74 72 75  sert( iLvl<pStru
1fc60 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20 20  ct->nLevel );.  
1fc70 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d  assert( pLvl->nM
1fc80 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67  erge<=pLvl->nSeg
1fc90 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 77   );..  memset(&w
1fca0 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  riter, 0, sizeof
1fcb0 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29 29  (Fts5SegWriter))
1fcc0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d  ;.  memset(&term
1fcd0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
1fce0 42 75 66 66 65 72 29 29 3b 0a 20 20 69 66 28 20  Buffer));.  if( 
1fcf0 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a  pLvl->nMerge ){.
1fd00 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70      pLvlOut = &p
1fd10 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1fd20 4c 76 6c 2b 31 5d 3b 0a 20 20 20 20 61 73 73 65  Lvl+1];.    asse
1fd30 72 74 28 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65  rt( pLvlOut->nSe
1fd40 67 3e 30 20 29 3b 0a 20 20 20 20 6e 49 6e 70 75  g>0 );.    nInpu
1fd50 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  t = pLvl->nMerge
1fd60 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c  ;.    pSeg = &pL
1fd70 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c  vlOut->aSeg[pLvl
1fd80 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d 3b 0a 0a 20  Out->nSeg-1];.. 
1fd90 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69 74     fts5WriteInit
1fda0 28 70 2c 20 26 77 72 69 74 65 72 2c 20 70 53 65  (p, &writer, pSe
1fdb0 67 2d 3e 69 53 65 67 69 64 29 3b 0a 20 20 20 20  g->iSegid);.    
1fdc0 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 70 67  writer.writer.pg
1fdd0 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  no = pSeg->pgnoL
1fde0 61 73 74 2b 31 3b 0a 20 20 20 20 77 72 69 74 65  ast+1;.    write
1fdf0 72 2e 69 42 74 50 61 67 65 20 3d 20 30 3b 0a 20  r.iBtPage = 0;. 
1fe00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1fe10 69 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c  iSegid = fts5All
1fe20 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20 70 53  ocateSegid(p, pS
1fe30 74 72 75 63 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  truct);..    /* 
1fe40 45 78 74 65 6e 64 20 74 68 65 20 46 74 73 35 53  Extend the Fts5S
1fe50 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20  tructure object 
1fe60 61 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  as required to e
1fe70 6e 73 75 72 65 20 74 68 65 20 6f 75 74 70 75 74  nsure the output
1fe80 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20  .    ** segment 
1fe90 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 69  exists. */.    i
1fea0 66 28 20 69 4c 76 6c 3d 3d 70 53 74 72 75 63 74  f( iLvl==pStruct
1feb0 2d 3e 6e 4c 65 76 65 6c 2d 31 20 29 7b 0a 20 20  ->nLevel-1 ){.  
1fec0 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
1fed0 65 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63  eAddLevel(&p->rc
1fee0 2c 20 70 70 53 74 72 75 63 74 29 3b 0a 20 20 20  , ppStruct);.   
1fef0 20 20 20 70 53 74 72 75 63 74 20 3d 20 2a 70 70     pStruct = *pp
1ff00 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 0a 20 20  Struct;.    }.  
1ff10 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45    fts5StructureE
1ff20 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72  xtendLevel(&p->r
1ff30 63 2c 20 70 53 74 72 75 63 74 2c 20 69 4c 76 6c  c, pStruct, iLvl
1ff40 2b 31 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69  +1, 1, 0);.    i
1ff50 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  f( p->rc ) retur
1ff60 6e 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70  n;.    pLvl = &p
1ff70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1ff80 4c 76 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75  Lvl];.    pLvlOu
1ff90 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  t = &pStruct->aL
1ffa0 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 0a 20  evel[iLvl+1];.. 
1ffb0 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69 74     fts5WriteInit
1ffc0 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 53 65  (p, &writer, iSe
1ffd0 67 69 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64  gid);..    /* Ad
1ffe0 64 20 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e  d the new segmen
1fff0 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  t to the output 
20000 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 70 53 65  level */.    pSe
20010 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53  g = &pLvlOut->aS
20020 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67  eg[pLvlOut->nSeg
20030 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e  ];.    pLvlOut->
20040 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 70 53 65 67  nSeg++;.    pSeg
20050 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b  ->pgnoFirst = 1;
20060 0a 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69  .    pSeg->iSegi
20070 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20  d = iSegid;.    
20080 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
20090 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  t++;..    /* Rea
200a0 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 61 6c 6c  d input from all
200b0 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65   segments in the
200c0 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a   input level */.
200d0 20 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76      nInput = pLv
200e0 6c 2d 3e 6e 53 65 67 3b 0a 20 20 7d 0a 20 20 62  l->nSeg;.  }.  b
200f0 4f 6c 64 65 73 74 20 3d 20 28 70 4c 76 6c 4f 75  Oldest = (pLvlOu
20100 74 2d 3e 6e 53 65 67 3d 3d 31 20 26 26 20 70 53  t->nSeg==1 && pS
20110 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 69  truct->nLevel==i
20120 4c 76 6c 2b 32 29 3b 0a 0a 20 20 61 73 73 65 72  Lvl+2);..  asser
20130 74 28 20 69 4c 76 6c 3e 3d 30 20 29 3b 0a 20 20  t( iLvl>=0 );.  
20140 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65  for(fts5MultiIte
20150 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c  rNew(p, pStruct,
20160 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 30 2c   flags, 0, 0, 0,
20170 20 69 4c 76 6c 2c 20 6e 49 6e 70 75 74 2c 20 26   iLvl, nInput, &
20180 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74  pIter);.      ft
20190 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
201a0 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20  , pIter)==0;.   
201b0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
201c0 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30  Next(p, pIter, 0
201d0 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 46 74  , 0).  ){.    Ft
201e0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 49  s5SegIter *pSegI
201f0 74 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  ter = &pIter->aS
20200 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
20210 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  t[1].iFirst ];. 
20220 20 20 20 69 6e 74 20 6e 50 6f 73 3b 20 20 20 20     int nPos;    
20230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20240 20 2f 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73   /* position-lis
20250 74 20 73 69 7a 65 20 66 69 65 6c 64 20 76 61 6c  t size field val
20260 75 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54  ue */.    int nT
20270 65 72 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75  erm;.    const u
20280 38 20 2a 70 54 65 72 6d 3b 0a 0a 20 20 20 20 2f  8 *pTerm;..    /
20290 2a 20 43 68 65 63 6b 20 66 6f 72 20 6b 65 79 20  * Check for key 
202a0 61 6e 6e 69 68 69 6c 61 74 69 6f 6e 2e 20 2a 2f  annihilation. */
202b0 0a 20 20 20 20 69 66 28 20 70 53 65 67 49 74 65  .    if( pSegIte
202c0 72 2d 3e 6e 50 6f 73 3d 3d 30 20 26 26 20 28 62  r->nPos==0 && (b
202d0 4f 6c 64 65 73 74 20 7c 7c 20 70 53 65 67 49 74  Oldest || pSegIt
202e0 65 72 2d 3e 62 44 65 6c 3d 3d 30 29 20 29 20 63  er->bDel==0) ) c
202f0 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 70 54  ontinue;..    pT
20300 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  erm = fts5MultiI
20310 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26  terTerm(pIter, &
20320 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20  nTerm);.    if( 
20330 6e 54 65 72 6d 21 3d 74 65 72 6d 2e 6e 20 7c 7c  nTerm!=term.n ||
20340 20 6d 65 6d 63 6d 70 28 70 54 65 72 6d 2c 20 74   memcmp(pTerm, t
20350 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 29 20 29 7b  erm.p, nTerm) ){
20360 0a 20 20 20 20 20 20 69 66 28 20 70 6e 52 65 6d  .      if( pnRem
20370 20 26 26 20 77 72 69 74 65 72 2e 6e 4c 65 61 66   && writer.nLeaf
20380 57 72 69 74 74 65 6e 3e 6e 52 65 6d 20 29 7b 0a  Written>nRem ){.
20390 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
203a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
203b0 20 54 68 69 73 20 69 73 20 61 20 6e 65 77 20 74   This is a new t
203c0 65 72 6d 2e 20 41 70 70 65 6e 64 20 61 20 74 65  erm. Append a te
203d0 72 6d 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  rm to the output
203e0 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20   segment. */.   
203f0 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65     fts5WriteAppe
20400 6e 64 54 65 72 6d 28 70 2c 20 26 77 72 69 74 65  ndTerm(p, &write
20410 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29  r, nTerm, pTerm)
20420 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
20430 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 74  erSet(&p->rc, &t
20440 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  erm, nTerm, pTer
20450 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  m);.    }..    /
20460 2a 20 41 70 70 65 6e 64 20 74 68 65 20 72 6f 77  * Append the row
20470 69 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  id to the output
20480 20 2a 2f 0a 20 20 20 20 2f 2a 20 57 52 49 54 45   */.    /* WRITE
20490 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20  POSLISTSIZE */. 
204a0 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65     fts5WriteAppe
204b0 6e 64 52 6f 77 69 64 28 70 2c 20 26 77 72 69 74  ndRowid(p, &writ
204c0 65 72 2c 20 66 74 73 35 4d 75 6c 74 69 49 74 65  er, fts5MultiIte
204d0 72 52 6f 77 69 64 28 70 49 74 65 72 29 29 3b 0a  rRowid(pIter));.
204e0 0a 20 20 20 20 69 66 28 20 65 44 65 74 61 69 6c  .    if( eDetail
204f0 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  ==FTS5_DETAIL_NO
20500 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  NE ){.      if( 
20510 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 20 29  pSegIter->bDel )
20520 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  {.        fts5Bu
20530 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
20540 28 26 70 2d 3e 72 63 2c 20 26 77 72 69 74 65 72  (&p->rc, &writer
20550 2e 77 72 69 74 65 72 2e 62 75 66 2c 20 30 29 3b  .writer.buf, 0);
20560 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
20570 67 49 74 65 72 2d 3e 6e 50 6f 73 3e 30 20 29 7b  gIter->nPos>0 ){
20580 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42  .          fts5B
20590 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
205a0 74 28 26 70 2d 3e 72 63 2c 20 26 77 72 69 74 65  t(&p->rc, &write
205b0 72 2e 77 72 69 74 65 72 2e 62 75 66 2c 20 30 29  r.writer.buf, 0)
205c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
205d0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
205e0 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74       /* Append t
205f0 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
20600 20 64 61 74 61 20 74 6f 20 74 68 65 20 6f 75 74   data to the out
20610 70 75 74 20 2a 2f 0a 20 20 20 20 20 20 6e 50 6f  put */.      nPo
20620 73 20 3d 20 70 53 65 67 49 74 65 72 2d 3e 6e 50  s = pSegIter->nP
20630 6f 73 2a 32 20 2b 20 70 53 65 67 49 74 65 72 2d  os*2 + pSegIter-
20640 3e 62 44 65 6c 3b 0a 20 20 20 20 20 20 66 74 73  >bDel;.      fts
20650 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
20660 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77 72 69  int(&p->rc, &wri
20670 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66 2c 20  ter.writer.buf, 
20680 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20 66 74 73  nPos);.      fts
20690 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c  5ChunkIterate(p,
206a0 20 70 53 65 67 49 74 65 72 2c 20 28 76 6f 69 64   pSegIter, (void
206b0 2a 29 26 77 72 69 74 65 72 2c 20 66 74 73 35 4d  *)&writer, fts5M
206c0 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62 61 63  ergeChunkCallbac
206d0 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  k);.    }.  }.. 
206e0 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 6c 61   /* Flush the la
206f0 73 74 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20  st leaf page to 
20700 64 69 73 6b 2e 20 53 65 74 20 74 68 65 20 6f 75  disk. Set the ou
20710 74 70 75 74 20 73 65 67 6d 65 6e 74 20 62 2d 74  tput segment b-t
20720 72 65 65 20 68 65 69 67 68 74 0a 20 20 2a 2a 20  ree height.  ** 
20730 61 6e 64 20 6c 61 73 74 20 6c 65 61 66 20 70 61  and last leaf pa
20740 67 65 20 6e 75 6d 62 65 72 20 61 74 20 74 68 65  ge number at the
20750 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 2a 2f 0a   same time.  */.
20760 20 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73    fts5WriteFinis
20770 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70  h(p, &writer, &p
20780 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a  Seg->pgnoLast);.
20790 0a 20 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69  .  if( fts5Multi
207a0 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72  IterEof(p, pIter
207b0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
207c0 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  .    /* Remove t
207d0 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67  he redundant seg
207e0 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 25  ments from the %
207f0 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20  _data table */. 
20800 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49     for(i=0; i<nI
20810 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nput; i++){.    
20820 20 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65    fts5DataRemove
20830 53 65 67 6d 65 6e 74 28 70 2c 20 70 4c 76 6c 2d  Segment(p, pLvl-
20840 3e 61 53 65 67 5b 69 5d 2e 69 53 65 67 69 64 29  >aSeg[i].iSegid)
20850 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
20860 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e  Remove the redun
20870 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72  dant segments fr
20880 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76  om the input lev
20890 65 6c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c  el */.    if( pL
208a0 76 6c 2d 3e 6e 53 65 67 21 3d 6e 49 6e 70 75 74  vl->nSeg!=nInput
208b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d   ){.      int nM
208c0 6f 76 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65  ove = (pLvl->nSe
208d0 67 20 2d 20 6e 49 6e 70 75 74 29 20 2a 20 73 69  g - nInput) * si
208e0 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
208f0 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20  reSegment);.    
20900 20 20 6d 65 6d 6d 6f 76 65 28 70 4c 76 6c 2d 3e    memmove(pLvl->
20910 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65  aSeg, &pLvl->aSe
20920 67 5b 6e 49 6e 70 75 74 5d 2c 20 6e 4d 6f 76 65  g[nInput], nMove
20930 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 74  );.    }.    pSt
20940 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 20 2d  ruct->nSegment -
20950 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c  = nInput;.    pL
20960 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20 6e 49 6e 70  vl->nSeg -= nInp
20970 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d  ut;.    pLvl->nM
20980 65 72 67 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  erge = 0;.    if
20990 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  ( pSeg->pgnoLast
209a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 76  ==0 ){.      pLv
209b0 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20  lOut->nSeg--;.  
209c0 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65      pStruct->nSe
209d0 67 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20  gment--;.    }. 
209e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
209f0 72 74 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  rt( pSeg->pgnoLa
20a00 73 74 3e 30 20 29 3b 0a 20 20 20 20 66 74 73 35  st>0 );.    fts5
20a10 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 70 2c 20  TrimSegments(p, 
20a20 70 49 74 65 72 29 3b 0a 20 20 20 20 70 4c 76 6c  pIter);.    pLvl
20a30 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e 49 6e 70 75  ->nMerge = nInpu
20a40 74 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 4d 75  t;.  }..  fts5Mu
20a50 6c 74 69 49 74 65 72 46 72 65 65 28 70 49 74 65  ltiIterFree(pIte
20a60 72 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  r);.  fts5Buffer
20a70 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 69  Free(&term);.  i
20a80 66 28 20 70 6e 52 65 6d 20 29 20 2a 70 6e 52 65  f( pnRem ) *pnRe
20a90 6d 20 2d 3d 20 77 72 69 74 65 72 2e 6e 4c 65 61  m -= writer.nLea
20aa0 66 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a 0a  fWritten;.}../*.
20ab0 2a 2a 20 44 6f 20 75 70 20 74 6f 20 6e 50 67 20  ** Do up to nPg 
20ac0 70 61 67 65 73 20 6f 66 20 61 75 74 6f 6d 65 72  pages of automer
20ad0 67 65 20 77 6f 72 6b 20 6f 6e 20 74 68 65 20 69  ge work on the i
20ae0 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ndex..**.** Retu
20af0 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20 63  rn true if any c
20b00 68 61 6e 67 65 73 20 77 65 72 65 20 61 63 74 75  hanges were actu
20b10 61 6c 6c 79 20 6d 61 64 65 2c 20 6f 72 20 66 61  ally made, or fa
20b20 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
20b30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
20b40 35 49 6e 64 65 78 4d 65 72 67 65 28 0a 20 20 46  5IndexMerge(.  F
20b50 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
20b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20b70 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
20b80 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
20b90 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
20ba0 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e  uct,       /* IN
20bb0 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74  /OUT: Current st
20bc0 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78  ructure of index
20bd0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 67 2c 20 20   */.  int nPg,  
20be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bf0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 6f        /* Pages o
20c00 66 20 77 6f 72 6b 20 74 6f 20 64 6f 20 2a 2f 0a  f work to do */.
20c10 20 20 69 6e 74 20 6e 4d 69 6e 20 20 20 20 20 20    int nMin      
20c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c30 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d    /* Minimum num
20c40 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
20c50 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20  to merge */.){. 
20c60 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 50 67 3b   int nRem = nPg;
20c70 0a 20 20 69 6e 74 20 62 52 65 74 20 3d 20 30 3b  .  int bRet = 0;
20c80 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
20c90 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53   *pStruct = *ppS
20ca0 74 72 75 63 74 3b 0a 20 20 77 68 69 6c 65 28 20  truct;.  while( 
20cb0 6e 52 65 6d 3e 30 20 26 26 20 70 2d 3e 72 63 3d  nRem>0 && p->rc=
20cc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20cd0 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20    int iLvl;     
20ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20cf0 20 54 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   To iterate thro
20d00 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20  ugh levels */.  
20d10 20 20 69 6e 74 20 69 42 65 73 74 4c 76 6c 20 3d    int iBestLvl =
20d20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
20d30 20 4c 65 76 65 6c 20 6f 66 66 65 72 69 6e 67 20   Level offering 
20d40 74 68 65 20 6d 6f 73 74 20 69 6e 70 75 74 20 73  the most input s
20d50 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69  egments */.    i
20d60 6e 74 20 6e 42 65 73 74 20 3d 20 30 3b 20 20 20  nt nBest = 0;   
20d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
20d80 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65  mber of input se
20d90 67 6d 65 6e 74 73 20 6f 6e 20 62 65 73 74 20 6c  gments on best l
20da0 65 76 65 6c 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  evel */..    /* 
20db0 53 65 74 20 69 42 65 73 74 4c 76 6c 20 74 6f 20  Set iBestLvl to 
20dc0 74 68 65 20 6c 65 76 65 6c 20 74 6f 20 72 65 61  the level to rea
20dd0 64 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73  d input segments
20de0 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20 61 73   from. */.    as
20df0 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e  sert( pStruct->n
20e00 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20 20 20 66  Level>0 );.    f
20e10 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
20e20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
20e30 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
20e40 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
20e50 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72  el *pLvl = &pStr
20e60 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
20e70 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76  ];.      if( pLv
20e80 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20  l->nMerge ){.   
20e90 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e       if( pLvl->n
20ea0 4d 65 72 67 65 3e 6e 42 65 73 74 20 29 7b 0a 20  Merge>nBest ){. 
20eb0 20 20 20 20 20 20 20 20 20 69 42 65 73 74 4c 76           iBestLv
20ec0 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20  l = iLvl;.      
20ed0 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c      nBest = pLvl
20ee0 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 20 20  ->nMerge;.      
20ef0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
20f00 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
20f10 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e   if( pLvl->nSeg>
20f20 6e 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  nBest ){.       
20f30 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e   nBest = pLvl->n
20f40 53 65 67 3b 0a 20 20 20 20 20 20 20 20 69 42 65  Seg;.        iBe
20f50 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20  stLvl = iLvl;.  
20f60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
20f70 20 2f 2a 20 49 66 20 6e 42 65 73 74 20 69 73 20   /* If nBest is 
20f80 73 74 69 6c 6c 20 30 2c 20 74 68 65 6e 20 74 68  still 0, then th
20f90 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20  e index must be 
20fa0 65 6d 70 74 79 2e 20 2a 2f 0a 23 69 66 64 65 66  empty. */.#ifdef
20fb0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
20fc0 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 6e 42    for(iLvl=0; nB
20fd0 65 73 74 3d 3d 30 20 26 26 20 69 4c 76 6c 3c 70  est==0 && iLvl<p
20fe0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
20ff0 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 61  iLvl++){.      a
21000 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e  ssert( pStruct->
21010 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
21020 67 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 23 65  g==0 );.    }.#e
21030 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 6e 42  ndif..    if( nB
21040 65 73 74 3c 6e 4d 69 6e 20 26 26 20 70 53 74 72  est<nMin && pStr
21050 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73  uct->aLevel[iBes
21060 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20  tLvl].nMerge==0 
21070 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
21080 20 20 20 20 7d 0a 20 20 20 20 62 52 65 74 20 3d      }.    bRet =
21090 20 31 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65   1;.    fts5Inde
210a0 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26  xMergeLevel(p, &
210b0 70 53 74 72 75 63 74 2c 20 69 42 65 73 74 4c 76  pStruct, iBestLv
210c0 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20 69  l, &nRem);.    i
210d0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
210e0 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d 3e  _OK && pStruct->
210f0 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d  aLevel[iBestLvl]
21100 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20  .nMerge==0 ){.  
21110 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
21120 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 42 65 73  ePromote(p, iBes
21130 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63 74 29  tLvl+1, pStruct)
21140 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
21150 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63  pStruct = pStruc
21160 74 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74  t;.  return bRet
21170 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 6f 74  ;.}../*.** A tot
21180 61 6c 20 6f 66 20 6e 4c 65 61 66 20 6c 65 61 66  al of nLeaf leaf
21190 20 70 61 67 65 73 20 6f 66 20 64 61 74 61 20 68   pages of data h
211a0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 66 6c 75  as just been flu
211b0 73 68 65 64 20 74 6f 20 61 20 6c 65 76 65 6c 2d  shed to a level-
211c0 30 0a 2a 2a 20 73 65 67 6d 65 6e 74 2e 20 54 68  0.** segment. Th
211d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 70 64 61  is function upda
211e0 74 65 73 20 74 68 65 20 77 72 69 74 65 2d 63 6f  tes the write-co
211f0 75 6e 74 65 72 20 61 63 63 6f 72 64 69 6e 67 6c  unter accordingl
21200 79 20 61 6e 64 2c 20 69 66 0a 2a 2a 20 6e 65 63  y and, if.** nec
21210 65 73 73 61 72 79 2c 20 70 65 72 66 6f 72 6d 73  essary, performs
21220 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72   incremental mer
21230 67 65 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ge work..**.** I
21240 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
21250 73 2c 20 73 65 74 20 74 68 65 20 46 74 73 35 49  s, set the Fts5I
21260 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f  ndex.rc error co
21270 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  de. If an error 
21280 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  has .** already 
21290 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
212a0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
212b0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
212c0 69 64 20 66 74 73 35 49 6e 64 65 78 41 75 74 6f  id fts5IndexAuto
212d0 6d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64  merge(.  Fts5Ind
212e0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
212f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
21300 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
21310 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
21320 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20  re **ppStruct,  
21330 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
21340 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75 72  Current structur
21350 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e of index */.  
21360 69 6e 74 20 6e 4c 65 61 66 20 20 20 20 20 20 20  int nLeaf       
21370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21380 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
21390 70 75 74 20 6c 65 61 76 65 73 20 6a 75 73 74 20  put leaves just 
213a0 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20 20  written */.){.  
213b0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
213c0 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 43 6f 6e 66  E_OK && p->pConf
213d0 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 3e 30  ig->nAutomerge>0
213e0 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75   ){.    Fts5Stru
213f0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
21400 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20   *ppStruct;.    
21410 75 36 34 20 6e 57 72 69 74 65 3b 20 20 20 20 20  u64 nWrite;     
21420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21430 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f   Initial value o
21440 66 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20  f write-counter 
21450 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 57 6f 72 6b  */.    int nWork
21460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21470 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
21480 66 20 77 6f 72 6b 2d 71 75 61 6e 74 61 20 74 6f  f work-quanta to
21490 20 70 65 72 66 6f 72 6d 20 2a 2f 0a 20 20 20 20   perform */.    
214a0 69 6e 74 20 6e 52 65 6d 3b 20 20 20 20 20 20 20  int nRem;       
214b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
214c0 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   Number of leaf 
214d0 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72  pages left to wr
214e0 69 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 55  ite */..    /* U
214f0 70 64 61 74 65 20 74 68 65 20 77 72 69 74 65 2d  pdate the write-
21500 63 6f 75 6e 74 65 72 2e 20 57 68 69 6c 65 20 64  counter. While d
21510 6f 69 6e 67 20 73 6f 2c 20 73 65 74 20 6e 57 6f  oing so, set nWo
21520 72 6b 2e 20 2a 2f 0a 20 20 20 20 6e 57 72 69 74  rk. */.    nWrit
21530 65 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57 72  e = pStruct->nWr
21540 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20  iteCounter;.    
21550 6e 57 6f 72 6b 20 3d 20 28 69 6e 74 29 28 28 28  nWork = (int)(((
21560 6e 57 72 69 74 65 20 2b 20 6e 4c 65 61 66 29 20  nWrite + nLeaf) 
21570 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 20  / p->nWorkUnit) 
21580 2d 20 28 6e 57 72 69 74 65 20 2f 20 70 2d 3e 6e  - (nWrite / p->n
21590 57 6f 72 6b 55 6e 69 74 29 29 3b 0a 20 20 20 20  WorkUnit));.    
215a0 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43  pStruct->nWriteC
215b0 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c 65 61 66 3b  ounter += nLeaf;
215c0 0a 20 20 20 20 6e 52 65 6d 20 3d 20 28 69 6e 74  .    nRem = (int
215d0 29 28 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 2a  )(p->nWorkUnit *
215e0 20 6e 57 6f 72 6b 20 2a 20 70 53 74 72 75 63 74   nWork * pStruct
215f0 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 0a 20 20 20 20  ->nLevel);..    
21600 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 70  fts5IndexMerge(p
21610 2c 20 70 70 53 74 72 75 63 74 2c 20 6e 52 65 6d  , ppStruct, nRem
21620 2c 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41  , p->pConfig->nA
21630 75 74 6f 6d 65 72 67 65 29 3b 0a 20 20 7d 0a 7d  utomerge);.  }.}
21640 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
21650 73 35 49 6e 64 65 78 43 72 69 73 69 73 6d 65 72  s5IndexCrisismer
21660 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ge(.  Fts5Index 
21670 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
21680 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
21690 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
216a0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
216b0 2a 2a 70 70 53 74 72 75 63 74 20 20 20 20 20 20  **ppStruct      
216c0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72    /* IN/OUT: Cur
216d0 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f  rent structure o
216e0 66 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  f index */.){.  
216f0 63 6f 6e 73 74 20 69 6e 74 20 6e 43 72 69 73 69  const int nCrisi
21700 73 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  s = p->pConfig->
21710 6e 43 72 69 73 69 73 4d 65 72 67 65 3b 0a 20 20  nCrisisMerge;.  
21720 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
21730 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
21740 63 74 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 20 3d  ct;.  int iLvl =
21750 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
21760 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
21770 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  || pStruct->nLev
21780 65 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  el>0 );.  while(
21790 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
217a0 4b 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c  K && pStruct->aL
217b0 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e  evel[iLvl].nSeg>
217c0 3d 6e 43 72 69 73 69 73 20 29 7b 0a 20 20 20 20  =nCrisis ){.    
217d0 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65  fts5IndexMergeLe
217e0 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74 2c  vel(p, &pStruct,
217f0 20 69 4c 76 6c 2c 20 30 29 3b 0a 20 20 20 20 61   iLvl, 0);.    a
21800 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
21810 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 72 75  LITE_OK || pStru
21820 63 74 2d 3e 6e 4c 65 76 65 6c 3e 28 69 4c 76 6c  ct->nLevel>(iLvl
21830 2b 31 29 20 29 3b 0a 20 20 20 20 66 74 73 35 53  +1) );.    fts5S
21840 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28  tructurePromote(
21850 70 2c 20 69 4c 76 6c 2b 31 2c 20 70 53 74 72 75  p, iLvl+1, pStru
21860 63 74 29 3b 0a 20 20 20 20 69 4c 76 6c 2b 2b 3b  ct);.    iLvl++;
21870 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74  .  }.  *ppStruct
21880 20 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 73   = pStruct;.}..s
21890 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
218a0 64 65 78 52 65 74 75 72 6e 28 46 74 73 35 49 6e  dexReturn(Fts5In
218b0 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dex *p){.  int r
218c0 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 70 2d 3e  c = p->rc;.  p->
218d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
218e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
218f0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
21900 74 73 35 46 6c 75 73 68 43 74 78 20 46 74 73 35  ts5FlushCtx Fts5
21910 46 6c 75 73 68 43 74 78 3b 0a 73 74 72 75 63 74  FlushCtx;.struct
21920 20 46 74 73 35 46 6c 75 73 68 43 74 78 20 7b 0a   Fts5FlushCtx {.
21930 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49 64    Fts5Index *pId
21940 78 3b 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  x;.  Fts5SegWrit
21950 65 72 20 77 72 69 74 65 72 3b 20 0a 7d 3b 0a 0a  er writer; .};..
21960 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 61 42 75  /*.** Buffer aBu
21970 66 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 61 20 6c  f[] contains a l
21980 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2c 20  ist of varints, 
21990 61 6c 6c 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68  all small enough
219a0 20 74 6f 20 66 69 74 0a 2a 2a 20 69 6e 20 61 20   to fit.** in a 
219b0 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20  32-bit integer. 
219c0 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
219d0 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 70  of the largest p
219e0 72 65 66 69 78 20 6f 66 20 74 68 69 73 20 0a 2a  refix of this .*
219f0 2a 20 6c 69 73 74 20 6e 4d 61 78 20 62 79 74 65  * list nMax byte
21a00 73 20 6f 72 20 6c 65 73 73 20 69 6e 20 73 69 7a  s or less in siz
21a10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
21a20 20 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65 66   fts5PoslistPref
21a30 69 78 28 63 6f 6e 73 74 20 75 38 20 2a 61 42 75  ix(const u8 *aBu
21a40 66 2c 20 69 6e 74 20 6e 4d 61 78 29 7b 0a 20 20  f, int nMax){.  
21a50 69 6e 74 20 72 65 74 3b 0a 20 20 75 33 32 20 64  int ret;.  u32 d
21a60 75 6d 6d 79 3b 0a 20 20 72 65 74 20 3d 20 66 74  ummy;.  ret = ft
21a70 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 61 42  s5GetVarint32(aB
21a80 75 66 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 69 66  uf, dummy);.  if
21a90 28 20 72 65 74 3c 6e 4d 61 78 20 29 7b 0a 20 20  ( ret<nMax ){.  
21aa0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
21ab0 20 20 20 20 69 6e 74 20 69 20 3d 20 66 74 73 35      int i = fts5
21ac0 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 42 75  GetVarint32(&aBu
21ad0 66 5b 72 65 74 5d 2c 20 64 75 6d 6d 79 29 3b 0a  f[ret], dummy);.
21ae0 20 20 20 20 20 20 69 66 28 20 28 72 65 74 20 2b        if( (ret +
21af0 20 69 29 20 3e 20 6e 4d 61 78 20 29 20 62 72 65   i) > nMax ) bre
21b00 61 6b 3b 0a 20 20 20 20 20 20 72 65 74 20 2b 3d  ak;.      ret +=
21b10 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   i;.    }.  }.  
21b20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
21b30 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 63  *.** Flush the c
21b40 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 2d 6d 65  ontents of in-me
21b50 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 20  mory hash table 
21b60 69 48 61 73 68 20 74 6f 20 61 20 6e 65 77 20 6c  iHash to a new l
21b70 65 76 65 6c 2d 30 20 0a 2a 2a 20 73 65 67 6d 65  evel-0 .** segme
21b80 6e 74 20 6f 6e 20 64 69 73 6b 2e 20 41 6c 73 6f  nt on disk. Also
21b90 20 75 70 64 61 74 65 20 74 68 65 20 63 6f 72 72   update the corr
21ba0 65 73 70 6f 6e 64 69 6e 67 20 73 74 72 75 63 74  esponding struct
21bb0 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  ure record..**.*
21bc0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
21bd0 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74  curs, set the Ft
21be0 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72  s5Index.rc error
21bf0 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72   code. If an err
21c00 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61  or has .** alrea
21c10 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
21c20 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
21c30 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
21c40 20 76 6f 69 64 20 66 74 73 35 46 6c 75 73 68 4f   void fts5FlushO
21c50 6e 65 48 61 73 68 28 46 74 73 35 49 6e 64 65 78  neHash(Fts5Index
21c60 20 2a 70 29 7b 0a 20 20 46 74 73 35 48 61 73 68   *p){.  Fts5Hash
21c70 20 2a 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61   *pHash = p->pHa
21c80 73 68 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  sh;.  Fts5Struct
21c90 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20  ure *pStruct;.  
21ca0 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 69 6e  int iSegid;.  in
21cb0 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 20  t pgnoLast = 0; 
21cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cd0 2f 2a 20 4c 61 73 74 20 6c 65 61 66 20 70 61 67  /* Last leaf pag
21ce0 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d  e number in segm
21cf0 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74  ent */..  /* Obt
21d00 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20  ain a reference 
21d10 74 6f 20 74 68 65 20 69 6e 64 65 78 20 73 74 72  to the index str
21d20 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 6f 63  ucture and alloc
21d30 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e  ate a new segmen
21d40 74 2d 69 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68  t-id.  ** for th
21d50 65 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 73 65  e new level-0 se
21d60 67 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20 70 53 74  gment.  */.  pSt
21d70 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
21d80 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 69  tureRead(p);.  i
21d90 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f  Segid = fts5Allo
21da0 63 61 74 65 53 65 67 69 64 28 70 2c 20 70 53 74  cateSegid(p, pSt
21db0 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72  ruct);.  fts5Str
21dc0 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65  uctureInvalidate
21dd0 28 70 29 3b 0a 0a 20 20 69 66 28 20 69 53 65 67  (p);..  if( iSeg
21de0 69 64 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  id ){.    const 
21df0 69 6e 74 20 70 67 73 7a 20 3d 20 70 2d 3e 70 43  int pgsz = p->pC
21e00 6f 6e 66 69 67 2d 3e 70 67 73 7a 3b 0a 20 20 20  onfig->pgsz;.   
21e10 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70   int eDetail = p
21e20 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
21e30 69 6c 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75  il;.    Fts5Stru
21e40 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
21e50 65 67 3b 20 20 20 2f 2a 20 4e 65 77 20 73 65 67  eg;   /* New seg
21e60 6d 65 6e 74 20 77 69 74 68 69 6e 20 70 53 74 72  ment within pStr
21e70 75 63 74 20 2a 2f 0a 20 20 20 20 46 74 73 35 42  uct */.    Fts5B
21e80 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20 20  uffer *pBuf;    
21e90 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
21ea0 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 61  er in which to a
21eb0 73 73 65 6d 62 6c 65 20 6c 65 61 66 20 70 61 67  ssemble leaf pag
21ec0 65 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75 66  e */.    Fts5Buf
21ed0 66 65 72 20 2a 70 50 67 69 64 78 3b 20 20 20 20  fer *pPgidx;    
21ee0 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
21ef0 20 69 6e 20 77 68 69 63 68 20 74 6f 20 61 73 73   in which to ass
21f00 65 6d 62 6c 65 20 70 67 69 64 78 20 2a 2f 0a 0a  emble pgidx */..
21f10 20 20 20 20 46 74 73 35 53 65 67 57 72 69 74 65      Fts5SegWrite
21f20 72 20 77 72 69 74 65 72 3b 0a 20 20 20 20 66 74  r writer;.    ft
21f30 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26  s5WriteInit(p, &
21f40 77 72 69 74 65 72 2c 20 69 53 65 67 69 64 29 3b  writer, iSegid);
21f50 0a 0a 20 20 20 20 70 42 75 66 20 3d 20 26 77 72  ..    pBuf = &wr
21f60 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66 3b  iter.writer.buf;
21f70 0a 20 20 20 20 70 50 67 69 64 78 20 3d 20 26 77  .    pPgidx = &w
21f80 72 69 74 65 72 2e 77 72 69 74 65 72 2e 70 67 69  riter.writer.pgi
21f90 64 78 3b 0a 0a 20 20 20 20 2f 2a 20 66 74 73 35  dx;..    /* fts5
21fa0 57 72 69 74 65 49 6e 69 74 28 29 20 73 68 6f 75  WriteInit() shou
21fb0 6c 64 20 68 61 76 65 20 69 6e 69 74 69 61 6c 69  ld have initiali
21fc0 7a 65 64 20 74 68 65 20 62 75 66 66 65 72 73 20  zed the buffers 
21fd0 74 6f 20 28 6d 6f 73 74 20 6c 69 6b 65 6c 79 29  to (most likely)
21fe0 0a 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69  .    ** the maxi
21ff0 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72  mum space requir
22000 65 64 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ed. */.    asser
22010 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70 42 75 66  t( p->rc || pBuf
22020 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 67 73 7a 20  ->nSpace>=(pgsz 
22030 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44  + FTS5_DATA_PADD
22040 49 4e 47 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ING) );.    asse
22050 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70 50 67  rt( p->rc || pPg
22060 69 64 78 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 67  idx->nSpace>=(pg
22070 73 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50  sz + FTS5_DATA_P
22080 41 44 44 49 4e 47 29 20 29 3b 0a 0a 20 20 20 20  ADDING) );..    
22090 2f 2a 20 42 65 67 69 6e 20 73 63 61 6e 6e 69 6e  /* Begin scannin
220a0 67 20 74 68 72 6f 75 67 68 20 68 61 73 68 20 74  g through hash t
220b0 61 62 6c 65 20 65 6e 74 72 69 65 73 2e 20 54 68  able entries. Th
220c0 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63  is loop runs onc
220d0 65 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20 2a  e for each.    *
220e0 2a 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20 63  * term/doclist c
220f0 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
22100 77 69 74 68 69 6e 20 74 68 65 20 68 61 73 68 20  within the hash 
22110 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66  table. */.    if
22120 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
22130 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  OK ){.      p->r
22140 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48  c = sqlite3Fts5H
22150 61 73 68 53 63 61 6e 49 6e 69 74 28 70 48 61 73  ashScanInit(pHas
22160 68 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  h, 0, 0);.    }.
22170 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63      while( p->rc
22180 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
22190 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  ==sqlite3Fts5Has
221a0 68 53 63 61 6e 45 6f 66 28 70 48 61 73 68 29 20  hScanEof(pHash) 
221b0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
221c0 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20  har *zTerm;     
221d0 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
221e0 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20 2a  ontaining term *
221f0 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  /.      const u8
22200 20 2a 70 44 6f 63 6c 69 73 74 3b 20 20 20 20 20   *pDoclist;     
22210 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
22220 6f 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68  o doclist for th
22230 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20  is term */.     
22240 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20 20   int nDoclist;  
22250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22260 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20  Size of doclist 
22270 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 20  in bytes */..   
22280 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
22290 74 65 72 6d 20 66 6f 72 20 74 68 69 73 20 65 6e  term for this en
222a0 74 72 79 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a  try to disk. */.
222b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
222c0 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70  5HashScanEntry(p
222d0 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70  Hash, &zTerm, &p
222e0 44 6f 63 6c 69 73 74 2c 20 26 6e 44 6f 63 6c 69  Doclist, &nDocli
222f0 73 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57  st);.      fts5W
22300 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 70  riteAppendTerm(p
22310 2c 20 26 77 72 69 74 65 72 2c 20 28 69 6e 74 29  , &writer, (int)
22320 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 20 28  strlen(zTerm), (
22330 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d 29  const u8*)zTerm)
22340 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
22350 20 77 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f   writer.bFirstRo
22360 77 69 64 49 6e 50 61 67 65 3d 3d 30 20 29 3b 0a  widInPage==0 );.
22370 20 20 20 20 20 20 69 66 28 20 70 67 73 7a 3e 3d        if( pgsz>=
22380 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64  (pBuf->n + pPgid
22390 78 2d 3e 6e 20 2b 20 6e 44 6f 63 6c 69 73 74 20  x->n + nDoclist 
223a0 2b 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  + 1) ){.        
223b0 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 64 6f  /* The entire do
223c0 63 6c 69 73 74 20 77 69 6c 6c 20 66 69 74 20 6f  clist will fit o
223d0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  n the current le
223e0 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  af. */.        f
223f0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
22400 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70 44  endBlob(pBuf, pD
22410 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74  oclist, nDoclist
22420 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
22430 20 20 20 20 20 20 20 20 69 36 34 20 69 52 6f 77          i64 iRow
22440 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  id = 0;.        
22450 69 36 34 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a  i64 iDelta = 0;.
22460 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
22470 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f   = 0;..        /
22480 2a 20 54 68 65 20 65 6e 74 69 72 65 20 64 6f 63  * The entire doc
22490 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69  list will not fi
224a0 74 20 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e 20  t on this leaf. 
224b0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20  The following . 
224c0 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 20 69         ** loop i
224d0 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68 20  terates through 
224e0 74 68 65 20 70 6f 73 6c 69 73 74 73 20 74 68 61  the poslists tha
224f0 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63 75  t make up the cu
22500 72 72 65 6e 74 20 0a 20 20 20 20 20 20 20 20 2a  rrent .        *
22510 2a 20 64 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20  * doclist.  */. 
22520 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d         while( p-
22530 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
22540 26 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20  & iOff<nDoclist 
22550 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66  ){.          iOf
22560 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
22570 6e 74 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66  nt(&pDoclist[iOf
22580 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74  f], (u64*)&iDelt
22590 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 52  a);.          iR
225a0 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a  owid += iDelta;.
225b0 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
225c0 20 20 20 20 20 69 66 28 20 77 72 69 74 65 72 2e       if( writer.
225d0 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
225e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
225f0 20 66 74 73 35 50 75 74 55 31 36 28 26 70 42 75   fts5PutU16(&pBu
22600 66 2d 3e 70 5b 30 5d 2c 20 28 75 31 36 29 70 42  f->p[0], (u16)pB
22610 75 66 2d 3e 6e 29 3b 20 20 20 2f 2a 20 66 69 72  uf->n);   /* fir
22620 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65  st rowid on page
22630 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
22640 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  pBuf->n += sqlit
22650 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28  e3Fts5PutVarint(
22660 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e  &pBuf->p[pBuf->n
22670 5d 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  ], iRowid);.    
22680 20 20 20 20 20 20 20 20 77 72 69 74 65 72 2e 62          writer.b
22690 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
226a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
226b0 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78    fts5WriteDlidx
226c0 41 70 70 65 6e 64 28 70 2c 20 26 77 72 69 74 65  Append(p, &write
226d0 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r, iRowid);.    
226e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
226f0 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e           pBuf->n
22700 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50   += sqlite3Fts5P
22710 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e  utVarint(&pBuf->
22720 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 44 65 6c  p[pBuf->n], iDel
22730 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ta);.          }
22740 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
22750 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66  t( pBuf->n<=pBuf
22760 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 0a 20 20 20  ->nSpace );..   
22770 20 20 20 20 20 20 20 69 66 28 20 65 44 65 74 61         if( eDeta
22780 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
22790 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  NONE ){.        
227a0 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 44 6f      if( iOff<nDo
227b0 63 6c 69 73 74 20 26 26 20 70 44 6f 63 6c 69 73  clist && pDoclis
227c0 74 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20  t[iOff]==0 ){.  
227d0 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66              pBuf
227e0 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d  ->p[pBuf->n++] =
227f0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
22800 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20    iOff++;.      
22810 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66          if( iOff
22820 3c 6e 44 6f 63 6c 69 73 74 20 26 26 20 70 44 6f  <nDoclist && pDo
22830 63 6c 69 73 74 5b 69 4f 66 66 5d 3d 3d 30 20 29  clist[iOff]==0 )
22840 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
22850 20 20 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e    pBuf->p[pBuf->
22860 6e 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  n++] = 0;.      
22870 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b            iOff++
22880 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22890 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
228a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
228b0 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64  (pBuf->n + pPgid
228c0 78 2d 3e 6e 29 3e 3d 70 67 73 7a 20 29 7b 0a 20  x->n)>=pgsz ){. 
228d0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73               fts
228e0 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
228f0 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20  p, &writer);.   
22900 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22910 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22920 20 20 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d          int bDum
22930 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  my;.            
22940 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20  int nPos;.      
22950 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
22960 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74  = fts5GetPoslist
22970 53 69 7a 65 28 26 70 44 6f 63 6c 69 73 74 5b 69  Size(&pDoclist[i
22980 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44  Off], &nPos, &bD
22990 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 20  ummy);.         
229a0 20 20 20 6e 43 6f 70 79 20 2b 3d 20 6e 50 6f 73     nCopy += nPos
229b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
229c0 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67  ( (pBuf->n + pPg
229d0 69 64 78 2d 3e 6e 20 2b 20 6e 43 6f 70 79 29 20  idx->n + nCopy) 
229e0 3c 3d 20 70 67 73 7a 20 29 7b 0a 20 20 20 20 20  <= pgsz ){.     
229f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22a00 65 6e 74 69 72 65 20 70 6f 73 6c 69 73 74 20 77  entire poslist w
22a10 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63  ill fit on the c
22a20 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 53 6f 20  urrent leaf. So 
22a30 63 6f 70 79 0a 20 20 20 20 20 20 20 20 20 20 20  copy.           
22a40 20 20 20 2a 2a 20 69 74 20 69 6e 20 6f 6e 65 20     ** it in one 
22a50 67 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  go. */.         
22a60 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
22a70 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42  afeAppendBlob(pB
22a80 75 66 2c 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f  uf, &pDoclist[iO
22a90 66 66 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  ff], nCopy);.   
22aa0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
22ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22ac0 20 54 68 65 20 65 6e 74 69 72 65 20 70 6f 73 6c   The entire posl
22ad0 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  ist will not fit
22ae0 20 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e 20 53   on this leaf. S
22af0 6f 20 69 74 20 6e 65 65 64 73 0a 20 20 20 20 20  o it needs.     
22b00 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62           ** to b
22b10 65 20 62 72 6f 6b 65 6e 20 69 6e 74 6f 20 73 65  e broken into se
22b20 63 74 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79  ctions. The only
22b30 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 20 62   qualification b
22b40 65 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20  eing.           
22b50 20 20 20 2a 2a 20 74 68 61 74 20 65 61 63 68 20     ** that each 
22b60 76 61 72 69 6e 74 20 6d 75 73 74 20 62 65 20 73  varint must be s
22b70 74 6f 72 65 64 20 63 6f 6e 74 69 67 75 6f 75 73  tored contiguous
22b80 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ly.  */.        
22b90 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a        const u8 *
22ba0 70 50 6f 73 6c 69 73 74 20 3d 20 26 70 44 6f 63  pPoslist = &pDoc
22bb0 6c 69 73 74 5b 69 4f 66 66 5d 3b 0a 20 20 20 20  list[iOff];.    
22bc0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50            int iP
22bd0 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  os = 0;.        
22be0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e        while( p->
22bf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22c10 20 69 6e 74 20 6e 53 70 61 63 65 20 3d 20 70 67   int nSpace = pg
22c20 73 7a 20 2d 20 70 42 75 66 2d 3e 6e 20 2d 20 70  sz - pBuf->n - p
22c30 50 67 69 64 78 2d 3e 6e 3b 0a 20 20 20 20 20 20  Pgidx->n;.      
22c40 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20            int n 
22c50 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
22c60 20 20 20 20 20 69 66 28 20 28 6e 43 6f 70 79 20       if( (nCopy 
22c70 2d 20 69 50 6f 73 29 3c 3d 6e 53 70 61 63 65 20  - iPos)<=nSpace 
22c80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
22c90 20 20 20 20 20 6e 20 3d 20 6e 43 6f 70 79 20 2d       n = nCopy -
22ca0 20 69 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20   iPos;.         
22cb0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cd0 6e 20 3d 20 66 74 73 35 50 6f 73 6c 69 73 74 50  n = fts5PoslistP
22ce0 72 65 66 69 78 28 26 70 50 6f 73 6c 69 73 74 5b  refix(&pPoslist[
22cf0 69 50 6f 73 5d 2c 20 6e 53 70 61 63 65 29 3b 0a  iPos], nSpace);.
22d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d10 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
22d20 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b    assert( n>0 );
22d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22d40 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
22d50 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20  ppendBlob(pBuf, 
22d60 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c  &pPoslist[iPos],
22d70 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   n);.           
22d80 20 20 20 20 20 69 50 6f 73 20 2b 3d 20 6e 3b 0a       iPos += n;.
22d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22da0 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70  if( (pBuf->n + p
22db0 50 67 69 64 78 2d 3e 6e 29 3e 3d 70 67 73 7a 20  Pgidx->n)>=pgsz 
22dc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
22dd0 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c       fts5WriteFl
22de0 75 73 68 4c 65 61 66 28 70 2c 20 26 77 72 69 74  ushLeaf(p, &writ
22df0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
22e00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22e10 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 3e         if( iPos>
22e20 3d 6e 43 6f 70 79 20 29 20 62 72 65 61 6b 3b 0a  =nCopy ) break;.
22e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
22e40 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
22e50 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b            iOff +
22e60 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 20  = nCopy;.       
22e70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
22e80 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
22e90 20 54 4f 44 4f 32 3a 20 44 6f 63 6c 69 73 74 20   TODO2: Doclist 
22ea0 74 65 72 6d 69 6e 61 74 6f 72 20 77 72 69 74 74  terminator writt
22eb0 65 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20  en here. */.    
22ec0 20 20 2f 2a 20 70 42 75 66 2d 3e 70 5b 70 42 75    /* pBuf->p[pBu
22ed0 66 2d 3e 6e 2b 2b 5d 20 3d 20 27 5c 30 27 3b 20  f->n++] = '\0'; 
22ee0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
22ef0 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e   pBuf->n<=pBuf->
22f00 6e 53 70 61 63 65 20 29 3b 0a 20 20 20 20 20 20  nSpace );.      
22f10 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
22f20 63 61 6e 4e 65 78 74 28 70 48 61 73 68 29 3b 0a  canNext(pHash);.
22f30 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
22f40 33 46 74 73 35 48 61 73 68 43 6c 65 61 72 28 70  3Fts5HashClear(p
22f50 48 61 73 68 29 3b 0a 20 20 20 20 66 74 73 35 57  Hash);.    fts5W
22f60 72 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77  riteFinish(p, &w
22f70 72 69 74 65 72 2c 20 26 70 67 6e 6f 4c 61 73 74  riter, &pgnoLast
22f80 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  );..    /* Updat
22f90 65 20 74 68 65 20 46 74 73 35 53 74 72 75 63 74  e the Fts5Struct
22fa0 75 72 65 2e 20 49 74 20 69 73 20 77 72 69 74 74  ure. It is writt
22fb0 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  en back to the d
22fc0 61 74 61 62 61 73 65 20 62 79 20 74 68 65 0a 20  atabase by the. 
22fd0 20 20 20 2a 2a 20 66 74 73 35 53 74 72 75 63 74     ** fts5Struct
22fe0 75 72 65 52 65 6c 65 61 73 65 28 29 20 63 61 6c  ureRelease() cal
22ff0 6c 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20  l below.  */.   
23000 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c   if( pStruct->nL
23010 65 76 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  evel==0 ){.     
23020 20 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64   fts5StructureAd
23030 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 26  dLevel(&p->rc, &
23040 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a  pStruct);.    }.
23050 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
23060 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d  eExtendLevel(&p-
23070 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20 30 2c  >rc, pStruct, 0,
23080 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
23090 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
230a0 20 29 7b 0a 20 20 20 20 20 20 70 53 65 67 20 3d   ){.      pSeg =
230b0 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
230c0 6c 5b 30 5d 2e 61 53 65 67 5b 20 70 53 74 72 75  l[0].aSeg[ pStru
230d0 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53  ct->aLevel[0].nS
230e0 65 67 2b 2b 20 5d 3b 0a 20 20 20 20 20 20 70 53  eg++ ];.      pS
230f0 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65  eg->iSegid = iSe
23100 67 69 64 3b 0a 20 20 20 20 20 20 70 53 65 67 2d  gid;.      pSeg-
23110 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a  >pgnoFirst = 1;.
23120 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f        pSeg->pgno
23130 4c 61 73 74 20 3d 20 70 67 6e 6f 4c 61 73 74 3b  Last = pgnoLast;
23140 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e  .      pStruct->
23150 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20 20  nSegment++;.    
23160 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  }.    fts5Struct
23170 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 30 2c  urePromote(p, 0,
23180 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 0a   pStruct);.  }..
23190 20 20 66 74 73 35 49 6e 64 65 78 41 75 74 6f 6d    fts5IndexAutom
231a0 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63 74  erge(p, &pStruct
231b0 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 66  , pgnoLast);.  f
231c0 74 73 35 49 6e 64 65 78 43 72 69 73 69 73 6d 65  ts5IndexCrisisme
231d0 72 67 65 28 70 2c 20 26 70 53 74 72 75 63 74 29  rge(p, &pStruct)
231e0 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
231f0 65 57 72 69 74 65 28 70 2c 20 70 53 74 72 75 63  eWrite(p, pStruc
23200 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  t);.  fts5Struct
23210 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
23220 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c  ct);.}../*.** Fl
23230 75 73 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f  ush any data sto
23240 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  red in the in-me
23250 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73  mory hash tables
23260 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
23270 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
23280 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28   fts5IndexFlush(
23290 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
232a0 20 2f 2a 20 55 6e 6c 65 73 73 20 69 74 20 69 73   /* Unless it is
232b0 20 65 6d 70 74 79 2c 20 66 6c 75 73 68 20 74 68   empty, flush th
232c0 65 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20  e hash table to 
232d0 64 69 73 6b 20 2a 2f 0a 20 20 69 66 28 20 70 2d  disk */.  if( p-
232e0 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 29 7b  >nPendingData ){
232f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
23300 70 48 61 73 68 20 29 3b 0a 20 20 20 20 70 2d 3e  pHash );.    p->
23310 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30  nPendingData = 0
23320 3b 0a 20 20 20 20 66 74 73 35 46 6c 75 73 68 4f  ;.    fts5FlushO
23330 6e 65 48 61 73 68 28 70 29 3b 0a 20 20 7d 0a 7d  neHash(p);.  }.}
23340 0a 0a 73 74 61 74 69 63 20 46 74 73 35 53 74 72  ..static Fts5Str
23350 75 63 74 75 72 65 20 2a 66 74 73 35 49 6e 64 65  ucture *fts5Inde
23360 78 4f 70 74 69 6d 69 7a 65 53 74 72 75 63 74 28  xOptimizeStruct(
23370 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
23380 20 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72   .  Fts5Structur
23390 65 20 2a 70 53 74 72 75 63 74 0a 29 7b 0a 20 20  e *pStruct.){.  
233a0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
233b0 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  New = 0;.  int n
233c0 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
233d0 73 35 53 74 72 75 63 74 75 72 65 29 3b 0a 20 20  s5Structure);.  
233e0 69 6e 74 20 6e 53 65 67 20 3d 20 70 53 74 72 75  int nSeg = pStru
233f0 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20  ct->nSegment;.  
23400 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46 69 67  int i;..  /* Fig
23410 75 72 65 20 6f 75 74 20 69 66 20 74 68 69 73 20  ure out if this 
23420 73 74 72 75 63 74 75 72 65 20 72 65 71 75 69 72  structure requir
23430 65 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  es optimization.
23440 20 41 20 73 74 72 75 63 74 75 72 65 20 64 6f 65   A structure doe
23450 73 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 71 75 69  s.  ** not requi
23460 72 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  re optimization 
23470 69 66 20 65 69 74 68 65 72 3a 0a 20 20 2a 2a 0a  if either:.  **.
23480 20 20 2a 2a 20 20 2b 20 69 74 20 63 6f 6e 73 69    **  + it consi
23490 73 74 73 20 6f 66 20 66 65 77 65 72 20 74 68 61  sts of fewer tha
234a0 6e 20 74 77 6f 20 73 65 67 6d 65 6e 74 73 2c 20  n two segments, 
234b0 6f 72 20 0a 20 20 2a 2a 20 20 2b 20 61 6c 6c 20  or .  **  + all 
234c0 73 65 67 6d 65 6e 74 73 20 61 72 65 20 6f 6e 20  segments are on 
234d0 74 68 65 20 73 61 6d 65 20 6c 65 76 65 6c 2c 20  the same level, 
234e0 6f 72 0a 20 20 2a 2a 20 20 2b 20 61 6c 6c 20 73  or.  **  + all s
234f0 65 67 6d 65 6e 74 73 20 65 78 63 65 70 74 20 6f  egments except o
23500 6e 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  ne are currently
23510 20 69 6e 70 75 74 73 20 74 6f 20 61 20 6d 65 72   inputs to a mer
23520 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20  ge operation..  
23530 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20 66  **.  ** In the f
23540 69 72 73 74 20 63 61 73 65 2c 20 72 65 74 75 72  irst case, retur
23550 6e 20 4e 55 4c 4c 2e 20 49 6e 20 74 68 65 20 73  n NULL. In the s
23560 65 63 6f 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74  econd, increment
23570 20 74 68 65 20 72 65 66 2d 63 6f 75 6e 74 0a 20   the ref-count. 
23580 20 2a 2a 20 6f 6e 20 2a 70 53 74 72 75 63 74 20   ** on *pStruct 
23590 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 6f 70  and return a cop
235a0 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
235b0 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69   to it..  */.  i
235c0 66 28 20 6e 53 65 67 3c 32 20 29 20 72 65 74 75  f( nSeg<2 ) retu
235d0 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rn 0;.  for(i=0;
235e0 20 69 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76   i<pStruct->nLev
235f0 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  el; i++){.    in
23600 74 20 6e 54 68 69 73 20 3d 20 70 53 74 72 75 63  t nThis = pStruc
23610 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65  t->aLevel[i].nSe
23620 67 3b 0a 20 20 20 20 69 66 28 20 6e 54 68 69 73  g;.    if( nThis
23630 3d 3d 6e 53 65 67 20 7c 7c 20 28 6e 54 68 69 73  ==nSeg || (nThis
23640 3d 3d 6e 53 65 67 2d 31 20 26 26 20 70 53 74 72  ==nSeg-1 && pStr
23650 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e  uct->aLevel[i].n
23660 4d 65 72 67 65 3d 3d 6e 54 68 69 73 29 20 29 7b  Merge==nThis) ){
23670 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
23680 74 75 72 65 52 65 66 28 70 53 74 72 75 63 74 29  tureRef(pStruct)
23690 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
236a0 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 0a 20 20  Struct;.    }.  
236b0 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
236c0 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65  t->aLevel[i].nMe
236d0 72 67 65 3c 3d 6e 54 68 69 73 20 29 3b 0a 20 20  rge<=nThis );.  
236e0 7d 0a 0a 20 20 6e 42 79 74 65 20 2b 3d 20 28 70  }..  nByte += (p
236f0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31  Struct->nLevel+1
23700 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53  ) * sizeof(Fts5S
23710 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 3b 0a  tructureLevel);.
23720 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35 53 74    pNew = (Fts5St
23730 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65 33  ructure*)sqlite3
23740 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
23750 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 0a  p->rc, nByte);..
23760 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
23770 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
23780 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20 20  evel *pLvl;.    
23790 6e 42 79 74 65 20 3d 20 6e 53 65 67 20 2a 20 73  nByte = nSeg * s
237a0 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
237b0 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ureSegment);.   
237c0 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 20 3d 20   pNew->nLevel = 
237d0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b  pStruct->nLevel+
237e0 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 52 65  1;.    pNew->nRe
237f0 66 20 3d 20 31 3b 0a 20 20 20 20 70 4e 65 77 2d  f = 1;.    pNew-
23800 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20 3d  >nWriteCounter =
23810 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65   pStruct->nWrite
23820 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20 70 4c 76  Counter;.    pLv
23830 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 65 76 65  l = &pNew->aLeve
23840 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l[pStruct->nLeve
23850 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 61 53  l];.    pLvl->aS
23860 65 67 20 3d 20 28 46 74 73 35 53 74 72 75 63 74  eg = (Fts5Struct
23870 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69  ureSegment*)sqli
23880 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
23890 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29  o(&p->rc, nByte)
238a0 3b 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e  ;.    if( pLvl->
238b0 61 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69 6e  aSeg ){.      in
238c0 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20  t iLvl, iSeg;.  
238d0 20 20 20 20 69 6e 74 20 69 53 65 67 4f 75 74 20      int iSegOut 
238e0 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 49 74  = 0;.      /* It
238f0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c  erate through al
23900 6c 20 73 65 67 6d 65 6e 74 73 2c 20 66 72 6f 6d  l segments, from
23910 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77 65 73   oldest to newes
23920 74 2e 20 41 64 64 20 74 68 65 6d 20 74 6f 0a 20  t. Add them to. 
23930 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20       ** the new 
23940 46 74 73 35 4c 65 76 65 6c 20 6f 62 6a 65 63 74  Fts5Level object
23950 20 73 6f 20 74 68 61 74 20 70 4c 76 6c 2d 3e 61   so that pLvl->a
23960 53 65 67 5b 30 5d 20 69 73 20 74 68 65 20 6f 6c  Seg[0] is the ol
23970 64 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  dest.      ** se
23980 67 6d 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  gment in the dat
23990 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 2a 2f  a structure.  */
239a0 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  .      for(iLvl=
239b0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d  pStruct->nLevel-
239c0 31 3b 20 69 4c 76 6c 3e 3d 30 3b 20 69 4c 76 6c  1; iLvl>=0; iLvl
239d0 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  --){.        for
239e0 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53  (iSeg=0; iSeg<pS
239f0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
23a00 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl].nSeg; iSeg++
23a10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76  ){.          pLv
23a20 6c 2d 3e 61 53 65 67 5b 69 53 65 67 4f 75 74 5d  l->aSeg[iSegOut]
23a30 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76   = pStruct->aLev
23a40 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53  el[iLvl].aSeg[iS
23a50 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eg];.          i
23a60 53 65 67 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20  SegOut++;.      
23a70 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
23a80 20 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e 74    pNew->nSegment
23a90 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20   = pLvl->nSeg = 
23aa0 6e 53 65 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nSeg;.    }else{
23ab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
23ac0 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ree(pNew);.     
23ad0 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 7d   pNew = 0;.    }
23ae0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
23af0 4e 65 77 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69  New;.}..int sqli
23b00 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 74 69  te3Fts5IndexOpti
23b10 6d 69 7a 65 28 46 74 73 35 49 6e 64 65 78 20 2a  mize(Fts5Index *
23b20 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  p){.  Fts5Struct
23b30 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20  ure *pStruct;.  
23b40 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
23b50 4e 65 77 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  New = 0;..  asse
23b60 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
23b70 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e  E_OK );.  fts5In
23b80 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 70  dexFlush(p);.  p
23b90 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
23ba0 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20  uctureRead(p);. 
23bb0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e   fts5StructureIn
23bc0 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 0a 20 20  validate(p);..  
23bd0 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20  if( pStruct ){. 
23be0 20 20 20 70 4e 65 77 20 3d 20 66 74 73 35 49 6e     pNew = fts5In
23bf0 64 65 78 4f 70 74 69 6d 69 7a 65 53 74 72 75 63  dexOptimizeStruc
23c00 74 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  t(p, pStruct);. 
23c10 20 7d 0a 20 20 66 74 73 35 53 74 72 75 63 74 75   }.  fts5Structu
23c20 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
23c30 74 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  t);..  assert( p
23c40 4e 65 77 3d 3d 30 20 7c 7c 20 70 4e 65 77 2d 3e  New==0 || pNew->
23c50 6e 53 65 67 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  nSegment>0 );.  
23c60 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
23c70 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 20 20 66 6f  int iLvl;.    fo
23c80 72 28 69 4c 76 6c 3d 30 3b 20 70 4e 65 77 2d 3e  r(iLvl=0; pNew->
23c90 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
23ca0 67 3d 3d 30 3b 20 69 4c 76 6c 2b 2b 29 7b 7d 0a  g==0; iLvl++){}.
23cb0 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63      while( p->rc
23cc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
23cd0 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  New->aLevel[iLvl
23ce0 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a 20 20 20 20  ].nSeg>0 ){.    
23cf0 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 46 54 53    int nRem = FTS
23d00 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e 49 54 3b  5_OPT_WORK_UNIT;
23d10 0a 20 20 20 20 20 20 66 74 73 35 49 6e 64 65 78  .      fts5Index
23d20 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26 70  MergeLevel(p, &p
23d30 4e 65 77 2c 20 69 4c 76 6c 2c 20 26 6e 52 65 6d  New, iLvl, &nRem
23d40 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74  );.    }..    ft
23d50 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65  s5StructureWrite
23d60 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 66  (p, pNew);.    f
23d70 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
23d80 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a  ase(pNew);.  }..
23d90 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
23da0 65 78 52 65 74 75 72 6e 28 70 29 3b 20 0a 7d 0a  exReturn(p); .}.
23db0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
23dc0 61 6c 6c 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65  alled to impleme
23dd0 6e 74 20 74 68 65 20 73 70 65 63 69 61 6c 20 22  nt the special "
23de0 56 41 4c 55 45 53 28 27 6d 65 72 67 65 27 2c 20  VALUES('merge', 
23df0 24 6e 4d 65 72 67 65 29 22 0a 2a 2a 20 49 4e 53  $nMerge)".** INS
23e00 45 52 54 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  ERT command..*/.
23e10 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
23e20 6e 64 65 78 4d 65 72 67 65 28 46 74 73 35 49 6e  ndexMerge(Fts5In
23e30 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 65 72  dex *p, int nMer
23e40 67 65 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  ge){.  Fts5Struc
23e50 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
23e60 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
23e70 64 28 70 29 3b 0a 20 20 69 66 28 20 70 53 74 72  d(p);.  if( pStr
23e80 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  uct ){.    int n
23e90 4d 69 6e 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  Min = p->pConfig
23ea0 2d 3e 6e 55 73 65 72 6d 65 72 67 65 3b 0a 20 20  ->nUsermerge;.  
23eb0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49    fts5StructureI
23ec0 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20 20  nvalidate(p);.  
23ed0 20 20 69 66 28 20 6e 4d 65 72 67 65 3c 30 20 29    if( nMerge<0 )
23ee0 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  {.      Fts5Stru
23ef0 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 66 74  cture *pNew = ft
23f00 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65 53  s5IndexOptimizeS
23f10 74 72 75 63 74 28 70 2c 20 70 53 74 72 75 63 74  truct(p, pStruct
23f20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72  );.      fts5Str
23f30 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
23f40 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70 53  truct);.      pS
23f50 74 72 75 63 74 20 3d 20 70 4e 65 77 3b 0a 20 20  truct = pNew;.  
23f60 20 20 20 20 6e 4d 69 6e 20 3d 20 32 3b 0a 20 20      nMin = 2;.  
23f70 20 20 20 20 6e 4d 65 72 67 65 20 3d 20 6e 4d 65      nMerge = nMe
23f80 72 67 65 2a 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  rge*-1;.    }.  
23f90 20 20 69 66 28 20 70 53 74 72 75 63 74 20 26 26    if( pStruct &&
23fa0 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
23fb0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 74   ){.      if( ft
23fc0 73 35 49 6e 64 65 78 4d 65 72 67 65 28 70 2c 20  s5IndexMerge(p, 
23fd0 26 70 53 74 72 75 63 74 2c 20 6e 4d 65 72 67 65  &pStruct, nMerge
23fe0 2c 20 6e 4d 69 6e 29 20 29 7b 0a 20 20 20 20 20  , nMin) ){.     
23ff0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
24000 57 72 69 74 65 28 70 2c 20 70 53 74 72 75 63 74  Write(p, pStruct
24010 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
24020 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
24030 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
24040 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
24050 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
24060 28 70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  (p);.}..static v
24070 6f 69 64 20 66 74 73 35 41 70 70 65 6e 64 52 6f  oid fts5AppendRo
24080 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78  wid(.  Fts5Index
24090 20 2a 70 2c 0a 20 20 69 36 34 20 69 44 65 6c 74   *p,.  i64 iDelt
240a0 61 2c 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  a,.  Fts5Iter *p
240b0 55 6e 75 73 65 64 2c 0a 20 20 46 74 73 35 42 75  Unused,.  Fts5Bu
240c0 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20  ffer *pBuf.){.  
240d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 55 6e  UNUSED_PARAM(pUn
240e0 75 73 65 64 29 3b 0a 20 20 66 74 73 35 42 75 66  used);.  fts5Buf
240f0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
24100 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 69 44  &p->rc, pBuf, iD
24110 65 6c 74 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  elta);.}..static
24120 20 76 6f 69 64 20 66 74 73 35 41 70 70 65 6e 64   void fts5Append
24130 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49  Poslist(.  Fts5I
24140 6e 64 65 78 20 2a 70 2c 0a 20 20 69 36 34 20 69  ndex *p,.  i64 i
24150 44 65 6c 74 61 2c 0a 20 20 46 74 73 35 49 74 65  Delta,.  Fts5Ite
24160 72 20 2a 70 4d 75 6c 74 69 2c 0a 20 20 46 74 73  r *pMulti,.  Fts
24170 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b  5Buffer *pBuf.){
24180 0a 20 20 69 6e 74 20 6e 44 61 74 61 20 3d 20 70  .  int nData = p
24190 4d 75 6c 74 69 2d 3e 62 61 73 65 2e 6e 44 61 74  Multi->base.nDat
241a0 61 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44 61  a;.  assert( nDa
241b0 74 61 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  ta>0 );.  if( p-
241c0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
241d0 26 20 30 3d 3d 66 74 73 35 42 75 66 66 65 72 47  & 0==fts5BufferG
241e0 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42 75 66  row(&p->rc, pBuf
241f0 2c 20 6e 44 61 74 61 2b 39 2b 39 29 20 29 7b 0a  , nData+9+9) ){.
24200 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
24210 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70  feAppendVarint(p
24220 42 75 66 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20  Buf, iDelta);.  
24230 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
24240 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75  AppendVarint(pBu
24250 66 2c 20 6e 44 61 74 61 2a 32 29 3b 0a 20 20 20  f, nData*2);.   
24260 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
24270 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20  ppendBlob(pBuf, 
24280 70 4d 75 6c 74 69 2d 3e 62 61 73 65 2e 70 44 61  pMulti->base.pDa
24290 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a  ta, nData);.  }.
242a0 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }...static void 
242b0 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
242c0 65 78 74 28 46 74 73 35 44 6f 63 6c 69 73 74 49  ext(Fts5DoclistI
242d0 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 75  ter *pIter){.  u
242e0 38 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 61 50  8 *p = pIter->aP
242f0 6f 73 6c 69 73 74 20 2b 20 70 49 74 65 72 2d 3e  oslist + pIter->
24300 6e 53 69 7a 65 20 2b 20 70 49 74 65 72 2d 3e 6e  nSize + pIter->n
24310 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 61 73 73 65  Poslist;..  asse
24320 72 74 28 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c  rt( pIter->aPosl
24330 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70 3e 3d  ist );.  if( p>=
24340 70 49 74 65 72 2d 3e 61 45 6f 66 20 29 7b 0a 20  pIter->aEof ){. 
24350 20 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69     pIter->aPosli
24360 73 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  st = 0;.  }else{
24370 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b  .    i64 iDelta;
24380 0a 0a 20 20 20 20 70 20 2b 3d 20 66 74 73 35 47  ..    p += fts5G
24390 65 74 56 61 72 69 6e 74 28 70 2c 20 28 75 36 34  etVarint(p, (u64
243a0 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
243b0 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d  pIter->iRowid +=
243c0 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 2f 2a   iDelta;..    /*
243d0 20 52 65 61 64 20 70 6f 73 69 74 69 6f 6e 20 6c   Read position l
243e0 69 73 74 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ist size */.    
243f0 69 66 28 20 70 5b 30 5d 20 26 20 30 78 38 30 20  if( p[0] & 0x80 
24400 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 6f  ){.      int nPo
24410 73 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  s;.      pIter->
24420 6e 53 69 7a 65 20 3d 20 66 74 73 35 47 65 74 56  nSize = fts5GetV
24430 61 72 69 6e 74 33 32 28 70 2c 20 6e 50 6f 73 29  arint32(p, nPos)
24440 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  ;.      pIter->n
24450 50 6f 73 6c 69 73 74 20 3d 20 28 6e 50 6f 73 3e  Poslist = (nPos>
24460 3e 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >1);.    }else{.
24470 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f        pIter->nPo
24480 73 6c 69 73 74 20 3d 20 28 28 69 6e 74 29 28 70  slist = ((int)(p
24490 5b 30 5d 29 29 20 3e 3e 20 31 3b 0a 20 20 20 20  [0])) >> 1;.    
244a0 20 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d    pIter->nSize =
244b0 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70   1;.    }..    p
244c0 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d  Iter->aPoslist =
244d0 20 70 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   p;.  }.}..stati
244e0 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69  c void fts5Docli
244f0 73 74 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74  stIterInit(.  Ft
24500 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
24510 0a 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74  .  Fts5DoclistIt
24520 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 6d  er *pIter.){.  m
24530 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
24540 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b  sizeof(*pIter));
24550 0a 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69  .  pIter->aPosli
24560 73 74 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20  st = pBuf->p;.  
24570 70 49 74 65 72 2d 3e 61 45 6f 66 20 3d 20 26 70  pIter->aEof = &p
24580 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 3b  Buf->p[pBuf->n];
24590 0a 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74  .  fts5DoclistIt
245a0 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a 7d  erNext(pIter);.}
245b0 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 41 70  ..#if 0./*.** Ap
245c0 70 65 6e 64 20 61 20 64 6f 63 6c 69 73 74 20 74  pend a doclist t
245d0 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  o buffer pBuf..*
245e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
245f0 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
24600 73 70 61 63 65 20 77 69 74 68 69 6e 20 74 68 65  space within the
24610 20 62 75 66 66 65 72 20 68 61 73 20 61 6c 72 65   buffer has alre
24620 61 64 79 20 62 65 65 6e 0a 2a 2a 20 61 6c 6c 6f  ady been.** allo
24630 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  cated..*/.static
24640 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 41   void fts5MergeA
24650 70 70 65 6e 64 44 6f 63 69 64 28 0a 20 20 46 74  ppendDocid(.  Ft
24660 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
24670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24680 20 42 75 66 66 65 72 20 74 6f 20 77 72 69 74 65   Buffer to write
24690 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69   to */.  i64 *pi
246a0 4c 61 73 74 52 6f 77 69 64 2c 20 20 20 20 20 20  LastRowid,      
246b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
246c0 55 54 3a 20 50 72 65 76 69 6f 75 73 20 72 6f 77  UT: Previous row
246d0 69 64 20 77 72 69 74 74 65 6e 20 28 69 66 20 61  id written (if a
246e0 6e 79 29 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  ny) */.  i64 iRo
246f0 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  wid             
24700 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
24710 64 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 29  d to append */.)
24720 7b 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 66  {.  assert( pBuf
24730 2d 3e 6e 21 3d 30 20 7c 7c 20 28 2a 70 69 4c 61  ->n!=0 || (*piLa
24740 73 74 52 6f 77 69 64 29 3d 3d 30 20 29 3b 0a 20  stRowid)==0 );. 
24750 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
24760 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66  ppendVarint(pBuf
24770 2c 20 69 52 6f 77 69 64 20 2d 20 2a 70 69 4c 61  , iRowid - *piLa
24780 73 74 52 6f 77 69 64 29 3b 0a 20 20 2a 70 69 4c  stRowid);.  *piL
24790 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69  astRowid = iRowi
247a0 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65  d;.}.#endif..#de
247b0 66 69 6e 65 20 66 74 73 35 4d 65 72 67 65 41 70  fine fts5MergeAp
247c0 70 65 6e 64 44 6f 63 69 64 28 70 42 75 66 2c 20  pendDocid(pBuf, 
247d0 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 52 6f 77  iLastRowid, iRow
247e0 69 64 29 20 7b 20 20 20 20 20 20 20 5c 0a 20 20  id) {       \.  
247f0 61 73 73 65 72 74 28 20 28 70 42 75 66 29 2d 3e  assert( (pBuf)->
24800 6e 21 3d 30 20 7c 7c 20 28 69 4c 61 73 74 52 6f  n!=0 || (iLastRo
24810 77 69 64 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  wid)==0 );      
24820 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
24830 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
24840 70 70 65 6e 64 56 61 72 69 6e 74 28 28 70 42 75  ppendVarint((pBu
24850 66 29 2c 20 28 69 52 6f 77 69 64 29 20 2d 20 28  f), (iRowid) - (
24860 69 4c 61 73 74 52 6f 77 69 64 29 29 3b 20 5c 0a  iLastRowid)); \.
24870 20 20 28 69 4c 61 73 74 52 6f 77 69 64 29 20 3d    (iLastRowid) =
24880 20 28 69 52 6f 77 69 64 29 3b 20 20 20 20 20 20   (iRowid);      
24890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
248b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74  .}../*.** Swap t
248c0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 62  he contents of b
248d0 75 66 66 65 72 20 2a 70 31 20 77 69 74 68 20 74  uffer *p1 with t
248e0 68 61 74 20 6f 66 20 2a 70 32 2e 0a 2a 2f 0a 73  hat of *p2..*/.s
248f0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 42  tatic void fts5B
24900 75 66 66 65 72 53 77 61 70 28 46 74 73 35 42 75  ufferSwap(Fts5Bu
24910 66 66 65 72 20 2a 70 31 2c 20 46 74 73 35 42 75  ffer *p1, Fts5Bu
24920 66 66 65 72 20 2a 70 32 29 7b 0a 20 20 46 74 73  ffer *p2){.  Fts
24930 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20 2a 70  5Buffer tmp = *p
24940 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32 3b 0a  1;.  *p1 = *p2;.
24950 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a    *p2 = tmp;.}..
24960 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
24970 4e 65 78 74 52 6f 77 69 64 28 46 74 73 35 42 75  NextRowid(Fts5Bu
24980 66 66 65 72 20 2a 70 42 75 66 2c 20 69 6e 74 20  ffer *pBuf, int 
24990 2a 70 69 4f 66 66 2c 20 69 36 34 20 2a 70 69 52  *piOff, i64 *piR
249a0 6f 77 69 64 29 7b 0a 20 20 69 6e 74 20 69 20 3d  owid){.  int i =
249b0 20 2a 70 69 4f 66 66 3b 0a 20 20 69 66 28 20 69   *piOff;.  if( i
249c0 3e 3d 70 42 75 66 2d 3e 6e 20 29 7b 0a 20 20 20  >=pBuf->n ){.   
249d0 20 2a 70 69 4f 66 66 20 3d 20 2d 31 3b 0a 20 20   *piOff = -1;.  
249e0 7d 65 6c 73 65 7b 0a 20 20 20 20 75 36 34 20 69  }else{.    u64 i
249f0 56 61 6c 3b 0a 20 20 20 20 2a 70 69 4f 66 66 20  Val;.    *piOff 
24a00 3d 20 69 20 2b 20 73 71 6c 69 74 65 33 46 74 73  = i + sqlite3Fts
24a10 35 47 65 74 56 61 72 69 6e 74 28 26 70 42 75 66  5GetVarint(&pBuf
24a20 2d 3e 70 5b 69 5d 2c 20 26 69 56 61 6c 29 3b 0a  ->p[i], &iVal);.
24a30 20 20 20 20 2a 70 69 52 6f 77 69 64 20 2b 3d 20      *piRowid += 
24a40 69 56 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iVal;.  }.}../*.
24a50 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 65  ** This is the e
24a60 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 66 74 73  quivalent of fts
24a70 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74  5MergePrefixList
24a80 73 28 29 20 66 6f 72 20 64 65 74 61 69 6c 3d 6e  s() for detail=n
24a90 6f 6e 65 20 6d 6f 64 65 2e 0a 2a 2a 20 49 6e 20  one mode..** In 
24aa0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 62 75  this case the bu
24ab0 66 66 65 72 73 20 63 6f 6e 73 69 73 74 20 6f 66  ffers consist of
24ac0 20 61 20 64 65 6c 74 61 2d 65 6e 63 6f 64 65 64   a delta-encoded
24ad0 20 6c 69 73 74 20 6f 66 20 72 6f 77 69 64 73 20   list of rowids 
24ae0 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
24af0 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 52 6f  void fts5MergeRo
24b00 77 69 64 4c 69 73 74 73 28 0a 20 20 46 74 73 35  widLists(.  Fts5
24b10 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
24b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
24b30 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
24b40 63 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  ct */.  Fts5Buff
24b50 65 72 20 2a 70 31 2c 20 20 20 20 20 20 20 20 20  er *p1,         
24b60 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
24b70 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a   list to merge *
24b80 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
24b90 70 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p2              
24ba0 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c 69      /* Second li
24bb0 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29  st to merge */.)
24bc0 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 30 3b 0a  {.  int i1 = 0;.
24bd0 20 20 69 6e 74 20 69 32 20 3d 20 30 3b 0a 20 20    int i2 = 0;.  
24be0 69 36 34 20 69 52 6f 77 69 64 31 20 3d 20 30 3b  i64 iRowid1 = 0;
24bf0 0a 20 20 69 36 34 20 69 52 6f 77 69 64 32 20 3d  .  i64 iRowid2 =
24c00 20 30 3b 0a 20 20 69 36 34 20 69 4f 75 74 20 3d   0;.  i64 iOut =
24c10 20 30 3b 0a 0a 20 20 46 74 73 35 42 75 66 66 65   0;..  Fts5Buffe
24c20 72 20 6f 75 74 3b 0a 20 20 6d 65 6d 73 65 74 28  r out;.  memset(
24c30 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &out, 0, sizeof(
24c40 6f 75 74 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  out));.  sqlite3
24c50 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26  Fts5BufferSize(&
24c60 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 70 31 2d  p->rc, &out, p1-
24c70 3e 6e 20 2b 20 70 32 2d 3e 6e 29 3b 0a 20 20 69  >n + p2->n);.  i
24c80 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  f( p->rc ) retur
24c90 6e 3b 0a 0a 20 20 66 74 73 35 4e 65 78 74 52 6f  n;..  fts5NextRo
24ca0 77 69 64 28 70 31 2c 20 26 69 31 2c 20 26 69 52  wid(p1, &i1, &iR
24cb0 6f 77 69 64 31 29 3b 0a 20 20 66 74 73 35 4e 65  owid1);.  fts5Ne
24cc0 78 74 52 6f 77 69 64 28 70 32 2c 20 26 69 32 2c  xtRowid(p2, &i2,
24cd0 20 26 69 52 6f 77 69 64 32 29 3b 0a 20 20 77 68   &iRowid2);.  wh
24ce0 69 6c 65 28 20 69 31 3e 3d 30 20 7c 7c 20 69 32  ile( i1>=0 || i2
24cf0 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  >=0 ){.    if( i
24d00 31 3e 3d 30 20 26 26 20 28 69 32 3c 30 20 7c 7c  1>=0 && (i2<0 ||
24d10 20 69 52 6f 77 69 64 31 3c 69 52 6f 77 69 64 32   iRowid1<iRowid2
24d20 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
24d30 74 28 20 69 4f 75 74 3d 3d 30 20 7c 7c 20 69 52  t( iOut==0 || iR
24d40 6f 77 69 64 31 3e 69 4f 75 74 20 29 3b 0a 20 20  owid1>iOut );.  
24d50 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
24d60 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  feAppendVarint(&
24d70 6f 75 74 2c 20 69 52 6f 77 69 64 31 20 2d 20 69  out, iRowid1 - i
24d80 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 4f 75 74  Out);.      iOut
24d90 20 3d 20 69 52 6f 77 69 64 31 3b 0a 20 20 20 20   = iRowid1;.    
24da0 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28    fts5NextRowid(
24db0 70 31 2c 20 26 69 31 2c 20 26 69 52 6f 77 69 64  p1, &i1, &iRowid
24dc0 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
24dd0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f 75       assert( iOu
24de0 74 3d 3d 30 20 7c 7c 20 69 52 6f 77 69 64 32 3e  t==0 || iRowid2>
24df0 69 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 66 74  iOut );.      ft
24e00 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
24e10 6e 64 56 61 72 69 6e 74 28 26 6f 75 74 2c 20 69  ndVarint(&out, i
24e20 52 6f 77 69 64 32 20 2d 20 69 4f 75 74 29 3b 0a  Rowid2 - iOut);.
24e30 20 20 20 20 20 20 69 4f 75 74 20 3d 20 69 52 6f        iOut = iRo
24e40 77 69 64 32 3b 0a 20 20 20 20 20 20 69 66 28 20  wid2;.      if( 
24e50 69 31 3e 3d 30 20 26 26 20 69 52 6f 77 69 64 31  i1>=0 && iRowid1
24e60 3d 3d 69 52 6f 77 69 64 32 20 29 7b 0a 20 20 20  ==iRowid2 ){.   
24e70 20 20 20 20 20 66 74 73 35 4e 65 78 74 52 6f 77       fts5NextRow
24e80 69 64 28 70 31 2c 20 26 69 31 2c 20 26 69 52 6f  id(p1, &i1, &iRo
24e90 77 69 64 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  wid1);.      }. 
24ea0 20 20 20 20 20 66 74 73 35 4e 65 78 74 52 6f 77       fts5NextRow
24eb0 69 64 28 70 32 2c 20 26 69 32 2c 20 26 69 52 6f  id(p2, &i2, &iRo
24ec0 77 69 64 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  wid2);.    }.  }
24ed0 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 77  ..  fts5BufferSw
24ee0 61 70 28 26 6f 75 74 2c 20 70 31 29 3b 0a 20 20  ap(&out, p1);.  
24ef0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
24f00 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  out);.}../*.** B
24f10 75 66 66 65 72 73 20 70 31 20 61 6e 64 20 70 32  uffers p1 and p2
24f20 20 63 6f 6e 74 61 69 6e 20 64 6f 63 6c 69 73 74   contain doclist
24f30 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
24f40 20 6d 65 72 67 65 73 20 74 68 65 20 63 6f 6e 74   merges the cont
24f50 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 74 77  ent.** of the tw
24f60 6f 20 64 6f 63 6c 69 73 74 73 20 74 6f 67 65 74  o doclists toget
24f70 68 65 72 20 61 6e 64 20 73 65 74 73 20 62 75 66  her and sets buf
24f80 66 65 72 20 70 31 20 74 6f 20 74 68 65 20 72 65  fer p1 to the re
24f90 73 75 6c 74 20 62 65 66 6f 72 65 0a 2a 2a 20 72  sult before.** r
24fa0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
24fb0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
24fc0 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
24fd0 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e  e is left in p->
24fe0 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rc. If an error 
24ff0 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  has.** already o
25000 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75  ccurred, this fu
25010 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
25020 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
25030 64 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69  d fts5MergePrefi
25040 78 4c 69 73 74 73 28 0a 20 20 46 74 73 35 49 6e  xLists(.  Fts5In
25050 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
25060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
25070 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
25080 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
25090 20 2a 70 31 2c 20 20 20 20 20 20 20 20 20 20 20   *p1,           
250a0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c        /* First l
250b0 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a  ist to merge */.
250c0 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 32    Fts5Buffer *p2
250d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250e0 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c 69 73 74    /* Second list
250f0 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a   to merge */.){.
25100 20 20 69 66 28 20 70 32 2d 3e 6e 20 29 7b 0a 20    if( p2->n ){. 
25110 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f 77 69     i64 iLastRowi
25120 64 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 44  d = 0;.    Fts5D
25130 6f 63 6c 69 73 74 49 74 65 72 20 69 31 3b 0a 20  oclistIter i1;. 
25140 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74     Fts5DoclistIt
25150 65 72 20 69 32 3b 0a 20 20 20 20 46 74 73 35 42  er i2;.    Fts5B
25160 75 66 66 65 72 20 6f 75 74 20 3d 20 7b 30 2c 20  uffer out = {0, 
25170 30 2c 20 30 7d 3b 0a 20 20 20 20 46 74 73 35 42  0, 0};.    Fts5B
25180 75 66 66 65 72 20 74 6d 70 20 3d 20 7b 30 2c 20  uffer tmp = {0, 
25190 30 2c 20 30 7d 3b 0a 0a 20 20 20 20 69 66 28 20  0, 0};..    if( 
251a0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
251b0 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 6f  rSize(&p->rc, &o
251c0 75 74 2c 20 70 31 2d 3e 6e 20 2b 20 70 32 2d 3e  ut, p1->n + p2->
251d0 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  n) ) return;.   
251e0 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
251f0 49 6e 69 74 28 70 31 2c 20 26 69 31 29 3b 0a 20  Init(p1, &i1);. 
25200 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
25210 65 72 49 6e 69 74 28 70 32 2c 20 26 69 32 29 3b  erInit(p2, &i2);
25220 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29  ..    while( 1 )
25230 7b 0a 20 20 20 20 20 20 69 66 28 20 69 31 2e 69  {.      if( i1.i
25240 52 6f 77 69 64 3c 69 32 2e 69 52 6f 77 69 64 20  Rowid<i2.iRowid 
25250 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ){.        /* Co
25260 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20 69 31  py entry from i1
25270 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35   */.        fts5
25280 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64  MergeAppendDocid
25290 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69  (&out, iLastRowi
252a0 64 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20  d, i1.iRowid);. 
252b0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
252c0 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
252d0 26 6f 75 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73  &out, i1.aPoslis
252e0 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2b 69  t, i1.nPoslist+i
252f0 31 2e 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  1.nSize);.      
25300 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
25310 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20  rNext(&i1);.    
25320 20 20 20 20 69 66 28 20 69 31 2e 61 50 6f 73 6c      if( i1.aPosl
25330 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ist==0 ) break;.
25340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c        }.      el
25350 73 65 20 69 66 28 20 69 32 2e 69 52 6f 77 69 64  se if( i2.iRowid
25360 21 3d 69 31 2e 69 52 6f 77 69 64 20 29 7b 0a 20  !=i1.iRowid ){. 
25370 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65         /* Copy e
25380 6e 74 72 79 20 66 72 6f 6d 20 69 32 20 2a 2f 0a  ntry from i2 */.
25390 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67          fts5Merg
253a0 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75  eAppendDocid(&ou
253b0 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69  t, iLastRowid, i
253c0 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  2.iRowid);.     
253d0 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
253e0 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74  eAppendBlob(&out
253f0 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20 69  , i2.aPoslist, i
25400 32 2e 6e 50 6f 73 6c 69 73 74 2b 69 32 2e 6e 53  2.nPoslist+i2.nS
25410 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 66 74  ize);.        ft
25420 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
25430 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 20 20  t(&i2);.        
25440 69 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 3d  if( i2.aPoslist=
25450 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
25460 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 7b 0a    }.      else{.
25470 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65          /* Merge
25480 20 74 68 65 20 74 77 6f 20 70 6f 73 69 74 69 6f   the two positio
25490 6e 20 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20 20  n lists. */ .   
254a0 20 20 20 20 20 69 36 34 20 69 50 6f 73 31 20 3d       i64 iPos1 =
254b0 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20   0;.        i64 
254c0 69 50 6f 73 32 20 3d 20 30 3b 0a 20 20 20 20 20  iPos2 = 0;.     
254d0 20 20 20 69 6e 74 20 69 4f 66 66 31 20 3d 20 30     int iOff1 = 0
254e0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  ;.        int iO
254f0 66 66 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ff2 = 0;.       
25500 20 75 38 20 2a 61 31 20 3d 20 26 69 31 2e 61 50   u8 *a1 = &i1.aP
25510 6f 73 6c 69 73 74 5b 69 31 2e 6e 53 69 7a 65 5d  oslist[i1.nSize]
25520 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 32  ;.        u8 *a2
25530 20 3d 20 26 69 32 2e 61 50 6f 73 6c 69 73 74 5b   = &i2.aPoslist[
25540 69 32 2e 6e 53 69 7a 65 5d 3b 0a 0a 20 20 20 20  i2.nSize];..    
25550 20 20 20 20 69 36 34 20 69 50 72 65 76 20 3d 20      i64 iPrev = 
25560 30 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35 50  0;.        Fts5P
25570 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77 72 69  oslistWriter wri
25580 74 65 72 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ter;.        mem
25590 73 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20  set(&writer, 0, 
255a0 73 69 7a 65 6f 66 28 77 72 69 74 65 72 29 29 3b  sizeof(writer));
255b0 0a 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65  ..        fts5Me
255c0 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26  rgeAppendDocid(&
255d0 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c  out, iLastRowid,
255e0 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20   i2.iRowid);.   
255f0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a       fts5BufferZ
25600 65 72 6f 28 26 74 6d 70 29 3b 0a 20 20 20 20 20  ero(&tmp);.     
25610 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
25620 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c  fferSize(&p->rc,
25630 20 26 74 6d 70 2c 20 69 31 2e 6e 50 6f 73 6c 69   &tmp, i1.nPosli
25640 73 74 20 2b 20 69 32 2e 6e 50 6f 73 6c 69 73 74  st + i2.nPoslist
25650 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
25660 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20  ->rc ) break;.. 
25670 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
25680 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28  s5PoslistNext64(
25690 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c  a1, i1.nPoslist,
256a0 20 26 69 4f 66 66 31 2c 20 26 69 50 6f 73 31 29   &iOff1, &iPos1)
256b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
256c0 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74  3Fts5PoslistNext
256d0 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69  64(a2, i2.nPosli
256e0 73 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f  st, &iOff2, &iPo
256f0 73 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  s2);.        ass
25700 65 72 74 28 20 69 50 6f 73 31 3e 3d 30 20 26 26  ert( iPos1>=0 &&
25710 20 69 50 6f 73 32 3e 3d 30 20 29 3b 0a 0a 20 20   iPos2>=0 );..  
25720 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 3c        if( iPos1<
25730 69 50 6f 73 32 20 29 7b 0a 20 20 20 20 20 20 20  iPos2 ){.       
25740 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
25750 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28  slistSafeAppend(
25760 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50  &tmp, &iPrev, iP
25770 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  os1);.          
25780 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
25790 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31 2e  stNext64(a1, i1.
257a0 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31  nPoslist, &iOff1
257b0 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20  , &iPos1);.     
257c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
257d0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
257e0 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64  oslistSafeAppend
257f0 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69  (&tmp, &iPrev, i
25800 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20  Pos2);.         
25810 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
25820 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69 32  istNext64(a2, i2
25830 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66  .nPoslist, &iOff
25840 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20 20 20  2, &iPos2);.    
25850 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
25860 66 28 20 69 50 6f 73 31 3e 3d 30 20 26 26 20 69  f( iPos1>=0 && i
25870 50 6f 73 32 3e 3d 30 20 29 7b 0a 20 20 20 20 20  Pos2>=0 ){.     
25880 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b       while( 1 ){
25890 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
258a0 20 69 50 6f 73 31 3c 69 50 6f 73 32 20 29 7b 0a   iPos1<iPos2 ){.
258b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
258c0 28 20 69 50 6f 73 31 21 3d 69 50 72 65 76 20 29  ( iPos1!=iPrev )
258d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
258e0 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
258f0 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28 26  listSafeAppend(&
25900 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f  tmp, &iPrev, iPo
25910 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  s1);.           
25920 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
25930 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
25940 73 6c 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20  slistNext64(a1, 
25950 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f  i1.nPoslist, &iO
25960 66 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20  ff1, &iPos1);.  
25970 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
25980 69 50 6f 73 31 3c 30 20 29 20 62 72 65 61 6b 3b  iPos1<0 ) break;
25990 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
259a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
259b0 20 20 61 73 73 65 72 74 28 20 69 50 6f 73 32 21    assert( iPos2!
259c0 3d 69 50 72 65 76 20 29 3b 0a 20 20 20 20 20 20  =iPrev );.      
259d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
259e0 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70  ts5PoslistSafeAp
259f0 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65  pend(&tmp, &iPre
25a00 76 2c 20 69 50 6f 73 32 29 3b 0a 20 20 20 20 20  v, iPos2);.     
25a10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25a20 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
25a30 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73  4(a2, i2.nPoslis
25a40 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73  t, &iOff2, &iPos
25a50 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
25a60 20 20 69 66 28 20 69 50 6f 73 32 3c 30 20 29 20    if( iPos2<0 ) 
25a70 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
25a80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
25a90 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
25aa0 20 20 20 20 69 66 28 20 69 50 6f 73 31 3e 3d 30      if( iPos1>=0
25ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
25ac0 28 20 69 50 6f 73 31 21 3d 69 50 72 65 76 20 29  ( iPos1!=iPrev )
25ad0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
25ae0 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
25af0 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c  SafeAppend(&tmp,
25b00 20 26 69 50 72 65 76 2c 20 69 50 6f 73 31 29 3b   &iPrev, iPos1);
25b10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
25b20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
25b30 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
25b40 26 74 6d 70 2c 20 26 61 31 5b 69 4f 66 66 31 5d  &tmp, &a1[iOff1]
25b50 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2d 69 4f  , i1.nPoslist-iO
25b60 66 66 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ff1);.        }e
25b70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
25b80 73 73 65 72 74 28 20 69 50 6f 73 32 3e 3d 30 20  ssert( iPos2>=0 
25b90 26 26 20 69 50 6f 73 32 21 3d 69 50 72 65 76 20  && iPos2!=iPrev 
25ba0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
25bb0 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53  ite3Fts5PoslistS
25bc0 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20  afeAppend(&tmp, 
25bd0 26 69 50 72 65 76 2c 20 69 50 6f 73 32 29 3b 0a  &iPrev, iPos2);.
25be0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
25bf0 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
25c00 6f 62 28 26 74 6d 70 2c 20 26 61 32 5b 69 4f 66  ob(&tmp, &a2[iOf
25c10 66 32 5d 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74  f2], i2.nPoslist
25c20 2d 69 4f 66 66 32 29 3b 0a 20 20 20 20 20 20 20  -iOff2);.       
25c30 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   }..        /* W
25c40 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20  RITEPOSLISTSIZE 
25c50 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  */.        fts5B
25c60 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
25c70 61 72 69 6e 74 28 26 6f 75 74 2c 20 74 6d 70 2e  arint(&out, tmp.
25c80 6e 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 20 20  n * 2);.        
25c90 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
25ca0 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 74  pendBlob(&out, t
25cb0 6d 70 2e 70 2c 20 74 6d 70 2e 6e 29 3b 0a 20 20  mp.p, tmp.n);.  
25cc0 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73        fts5Doclis
25cd0 74 49 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a  tIterNext(&i1);.
25ce0 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c          fts5Docl
25cf0 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 32 29  istIterNext(&i2)
25d00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 31  ;.        if( i1
25d10 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20  .aPoslist==0 || 
25d20 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 29  i2.aPoslist==0 )
25d30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
25d40 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
25d50 31 2e 61 50 6f 73 6c 69 73 74 20 29 7b 0a 20 20  1.aPoslist ){.  
25d60 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70      fts5MergeApp
25d70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69  endDocid(&out, i
25d80 4c 61 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52  LastRowid, i1.iR
25d90 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 66 74 73  owid);.      fts
25da0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
25db0 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 31 2e 61  dBlob(&out, i1.a
25dc0 50 6f 73 6c 69 73 74 2c 20 69 31 2e 61 45 6f 66  Poslist, i1.aEof
25dd0 20 2d 20 69 31 2e 61 50 6f 73 6c 69 73 74 29 3b   - i1.aPoslist);
25de0 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
25df0 69 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 20  if( i2.aPoslist 
25e00 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 65 72  ){.      fts5Mer
25e10 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f  geAppendDocid(&o
25e20 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20  ut, iLastRowid, 
25e30 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  i2.iRowid);.    
25e40 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
25e50 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c  AppendBlob(&out,
25e60 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20 69 32   i2.aPoslist, i2
25e70 2e 61 45 6f 66 20 2d 20 69 32 2e 61 50 6f 73 6c  .aEof - i2.aPosl
25e80 69 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ist);.    }..   
25e90 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
25ea0 70 2d 3e 72 63 2c 20 70 31 2c 20 6f 75 74 2e 6e  p->rc, p1, out.n
25eb0 2c 20 6f 75 74 2e 70 29 3b 0a 20 20 20 20 66 74  , out.p);.    ft
25ec0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74 6d  s5BufferFree(&tm
25ed0 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  p);.    fts5Buff
25ee0 65 72 46 72 65 65 28 26 6f 75 74 29 3b 0a 20 20  erFree(&out);.  
25ef0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
25f00 20 66 74 73 35 53 65 74 75 70 50 72 65 66 69 78   fts5SetupPrefix
25f10 49 74 65 72 28 0a 20 20 46 74 73 35 49 6e 64 65  Iter(.  Fts5Inde
25f20 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
25f30 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
25f40 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
25f50 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 20 20 20  .  int bDesc,   
25f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f70 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 22     /* True for "
25f80 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44  ORDER BY rowid D
25f90 45 53 43 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ESC" */.  const 
25fa0 75 38 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20  u8 *pToken,     
25fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
25fc0 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  fer containing p
25fd0 72 65 66 69 78 20 74 6f 20 6d 61 74 63 68 20 2a  refix to match *
25fe0 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20  /.  int nToken, 
25ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26000 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
26010 75 66 66 65 72 20 70 54 6f 6b 65 6e 20 69 6e 20  uffer pToken in 
26020 62 79 74 65 73 20 2a 2f 0a 20 20 46 74 73 35 43  bytes */.  Fts5C
26030 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20  olset *pColset, 
26040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
26050 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74  strict matches t
26060 6f 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20  o these columns 
26070 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a 2a  */.  Fts5Iter **
26080 70 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  ppIter          
26090 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65 72  /* OUT: New iter
260a0 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ator */.){.  Fts
260b0 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
260c0 75 63 74 3b 0a 20 20 46 74 73 35 42 75 66 66 65  uct;.  Fts5Buffe
260d0 72 20 2a 61 42 75 66 3b 0a 20 20 63 6f 6e 73 74  r *aBuf;.  const
260e0 20 69 6e 74 20 6e 42 75 66 20 3d 20 33 32 3b 0a   int nBuf = 32;.
260f0 0a 20 20 76 6f 69 64 20 28 2a 78 4d 65 72 67 65  .  void (*xMerge
26100 29 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74  )(Fts5Index*, Ft
26110 73 35 42 75 66 66 65 72 2a 2c 20 46 74 73 35 42  s5Buffer*, Fts5B
26120 75 66 66 65 72 2a 29 3b 0a 20 20 76 6f 69 64 20  uffer*);.  void 
26130 28 2a 78 41 70 70 65 6e 64 29 28 46 74 73 35 49  (*xAppend)(Fts5I
26140 6e 64 65 78 2a 2c 20 69 36 34 2c 20 46 74 73 35  ndex*, i64, Fts5
26150 49 74 65 72 2a 2c 20 46 74 73 35 42 75 66 66 65  Iter*, Fts5Buffe
26160 72 2a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 43  r*);.  if( p->pC
26170 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
26180 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
26190 20 29 7b 0a 20 20 20 20 78 4d 65 72 67 65 20 3d   ){.    xMerge =
261a0 20 66 74 73 35 4d 65 72 67 65 52 6f 77 69 64 4c   fts5MergeRowidL
261b0 69 73 74 73 3b 0a 20 20 20 20 78 41 70 70 65 6e  ists;.    xAppen
261c0 64 20 3d 20 66 74 73 35 41 70 70 65 6e 64 52 6f  d = fts5AppendRo
261d0 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  wid;.  }else{.  
261e0 20 20 78 4d 65 72 67 65 20 3d 20 66 74 73 35 4d    xMerge = fts5M
261f0 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 3b  ergePrefixLists;
26200 0a 20 20 20 20 78 41 70 70 65 6e 64 20 3d 20 66  .    xAppend = f
26210 74 73 35 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  ts5AppendPoslist
26220 3b 0a 20 20 7d 0a 0a 20 20 61 42 75 66 20 3d 20  ;.  }..  aBuf = 
26230 28 46 74 73 35 42 75 66 66 65 72 2a 29 66 74 73  (Fts5Buffer*)fts
26240 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69  5IdxMalloc(p, si
26250 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
26260 2a 6e 42 75 66 29 3b 0a 20 20 70 53 74 72 75 63  *nBuf);.  pStruc
26270 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
26280 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 69 66 28  eRead(p);..  if(
26290 20 61 42 75 66 20 26 26 20 70 53 74 72 75 63 74   aBuf && pStruct
262a0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
262b0 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35 49 4e  t flags = FTS5IN
262c0 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20 0a  DEX_QUERY_SCAN .
262d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262e0 20 20 20 20 7c 20 46 54 53 35 49 4e 44 45 58 5f      | FTS5INDEX_
262f0 51 55 45 52 59 5f 53 4b 49 50 45 4d 50 54 59 20  QUERY_SKIPEMPTY 
26300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26310 20 20 20 20 20 7c 20 46 54 53 35 49 4e 44 45 58       | FTS5INDEX
26320 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54 3b  _QUERY_NOOUTPUT;
26330 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
26340 69 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20 3d  i64 iLastRowid =
26350 20 30 3b 0a 20 20 20 20 46 74 73 35 49 74 65 72   0;.    Fts5Iter
26360 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 2f 2a   *p1 = 0;     /*
26370 20 49 74 65 72 61 74 6f 72 20 75 73 65 64 20 74   Iterator used t
26380 6f 20 67 61 74 68 65 72 20 64 61 74 61 20 66 72  o gather data fr
26390 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  om index */.    
263a0 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b  Fts5Data *pData;
263b0 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
263c0 64 6f 63 6c 69 73 74 3b 0a 20 20 20 20 69 6e 74  doclist;.    int
263d0 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 0a   bNewTerm = 1;..
263e0 20 20 20 20 6d 65 6d 73 65 74 28 26 64 6f 63 6c      memset(&docl
263f0 69 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ist, 0, sizeof(d
26400 6f 63 6c 69 73 74 29 29 3b 0a 20 20 20 20 66 74  oclist));.    ft
26410 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
26420 2c 20 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73  , pStruct, flags
26430 2c 20 70 43 6f 6c 73 65 74 2c 20 70 54 6f 6b 65  , pColset, pToke
26440 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20 30  n, nToken, -1, 0
26450 2c 20 26 70 31 29 3b 0a 20 20 20 20 66 74 73 35  , &p1);.    fts5
26460 49 74 65 72 53 65 74 4f 75 74 70 75 74 43 62 28  IterSetOutputCb(
26470 26 70 2d 3e 72 63 2c 20 70 31 29 3b 0a 20 20 20  &p->rc, p1);.   
26480 20 66 6f 72 28 20 2f 2a 20 6e 6f 2d 6f 70 20 2a   for( /* no-op *
26490 2f 20 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  / ;.        fts5
264a0 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
264b0 70 31 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  p1)==0;.        
264c0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
264d0 74 32 28 70 2c 20 70 31 2c 20 26 62 4e 65 77 54  t2(p, p1, &bNewT
264e0 65 72 6d 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  erm).    ){.    
264f0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
26500 53 65 67 20 3d 20 26 70 31 2d 3e 61 53 65 67 5b  Seg = &p1->aSeg[
26510 20 70 31 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69   p1->aFirst[1].i
26520 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 69  First ];.      i
26530 6e 74 20 6e 54 65 72 6d 20 3d 20 70 53 65 67 2d  nt nTerm = pSeg-
26540 3e 74 65 72 6d 2e 6e 3b 0a 20 20 20 20 20 20 63  >term.n;.      c
26550 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20 3d  onst u8 *pTerm =
26560 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 3b 0a 20   pSeg->term.p;. 
26570 20 20 20 20 20 70 31 2d 3e 78 53 65 74 4f 75 74       p1->xSetOut
26580 70 75 74 73 28 70 31 2c 20 70 53 65 67 29 3b 0a  puts(p1, pSeg);.
26590 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63  .      assert_nc
265a0 28 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c  ( memcmp(pToken,
265b0 20 70 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 6f 6b   pTerm, MIN(nTok
265c0 65 6e 2c 20 6e 54 65 72 6d 29 29 3c 3d 30 20 29  en, nTerm))<=0 )
265d0 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4e 65 77  ;.      if( bNew
265e0 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Term ){.        
265f0 69 66 28 20 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e  if( nTerm<nToken
26600 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65   || memcmp(pToke
26610 6e 2c 20 70 54 65 72 6d 2c 20 6e 54 6f 6b 65 6e  n, pTerm, nToken
26620 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
26630 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 31   }..      if( p1
26640 2d 3e 62 61 73 65 2e 6e 44 61 74 61 3d 3d 30 20  ->base.nData==0 
26650 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
26660 20 20 20 69 66 28 20 70 31 2d 3e 62 61 73 65 2e     if( p1->base.
26670 69 52 6f 77 69 64 3c 3d 69 4c 61 73 74 52 6f 77  iRowid<=iLastRow
26680 69 64 20 26 26 20 64 6f 63 6c 69 73 74 2e 6e 3e  id && doclist.n>
26690 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
266a0 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c  (i=0; p->rc==SQL
266b0 49 54 45 5f 4f 4b 20 26 26 20 64 6f 63 6c 69 73  ITE_OK && doclis
266c0 74 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  t.n; i++){.     
266d0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e       assert( i<n
266e0 42 75 66 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Buf );.         
266f0 20 69 66 28 20 61 42 75 66 5b 69 5d 2e 6e 3d 3d   if( aBuf[i].n==
26700 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
26710 20 66 74 73 35 42 75 66 66 65 72 53 77 61 70 28   fts5BufferSwap(
26720 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b  &doclist, &aBuf[
26730 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
26740 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
26750 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20  &doclist);.     
26760 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26770 20 20 20 20 20 20 20 20 78 4d 65 72 67 65 28 70          xMerge(p
26780 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75  , &doclist, &aBu
26790 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  f[i]);.         
267a0 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
267b0 6f 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  o(&aBuf[i]);.   
267c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
267d0 20 7d 0a 20 20 20 20 20 20 20 20 69 4c 61 73 74   }.        iLast
267e0 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 20  Rowid = 0;.     
267f0 20 7d 0a 0a 20 20 20 20 20 20 78 41 70 70 65 6e   }..      xAppen
26800 64 28 70 2c 20 70 31 2d 3e 62 61 73 65 2e 69 52  d(p, p1->base.iR
26810 6f 77 69 64 2d 69 4c 61 73 74 52 6f 77 69 64 2c  owid-iLastRowid,
26820 20 70 31 2c 20 26 64 6f 63 6c 69 73 74 29 3b 0a   p1, &doclist);.
26830 20 20 20 20 20 20 69 4c 61 73 74 52 6f 77 69 64        iLastRowid
26840 20 3d 20 70 31 2d 3e 62 61 73 65 2e 69 52 6f 77   = p1->base.iRow
26850 69 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  id;.    }..    f
26860 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 75 66 3b 20  or(i=0; i<nBuf; 
26870 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
26880 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
26890 20 29 7b 0a 20 20 20 20 20 20 20 20 78 4d 65 72   ){.        xMer
268a0 67 65 28 70 2c 20 26 64 6f 63 6c 69 73 74 2c 20  ge(p, &doclist, 
268b0 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20  &aBuf[i]);.     
268c0 20 7d 0a 20 20 20 20 20 20 66 74 73 35 42 75 66   }.      fts5Buf
268d0 66 65 72 46 72 65 65 28 26 61 42 75 66 5b 69 5d  ferFree(&aBuf[i]
268e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
268f0 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70  5MultiIterFree(p
26900 31 29 3b 0a 0a 20 20 20 20 70 44 61 74 61 20 3d  1);..    pData =
26910 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70   fts5IdxMalloc(p
26920 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74  , sizeof(Fts5Dat
26930 61 29 20 2b 20 64 6f 63 6c 69 73 74 2e 6e 29 3b  a) + doclist.n);
26940 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 20 29  .    if( pData )
26950 7b 0a 20 20 20 20 20 20 70 44 61 74 61 2d 3e 70  {.      pData->p
26960 20 3d 20 28 75 38 2a 29 26 70 44 61 74 61 5b 31   = (u8*)&pData[1
26970 5d 3b 0a 20 20 20 20 20 20 70 44 61 74 61 2d 3e  ];.      pData->
26980 6e 6e 20 3d 20 70 44 61 74 61 2d 3e 73 7a 4c 65  nn = pData->szLe
26990 61 66 20 3d 20 64 6f 63 6c 69 73 74 2e 6e 3b 0a  af = doclist.n;.
269a0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61        memcpy(pDa
269b0 74 61 2d 3e 70 2c 20 64 6f 63 6c 69 73 74 2e 70  ta->p, doclist.p
269c0 2c 20 64 6f 63 6c 69 73 74 2e 6e 29 3b 0a 20 20  , doclist.n);.  
269d0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
269e0 72 4e 65 77 32 28 70 2c 20 70 44 61 74 61 2c 20  rNew2(p, pData, 
269f0 62 44 65 73 63 2c 20 70 70 49 74 65 72 29 3b 0a  bDesc, ppIter);.
26a00 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75      }.    fts5Bu
26a10 66 66 65 72 46 72 65 65 28 26 64 6f 63 6c 69 73  fferFree(&doclis
26a20 74 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53  t);.  }..  fts5S
26a30 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
26a40 70 53 74 72 75 63 74 29 3b 0a 20 20 73 71 6c 69  pStruct);.  sqli
26a50 74 65 33 5f 66 72 65 65 28 61 42 75 66 29 3b 0a  te3_free(aBuf);.
26a60 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  }.../*.** Indica
26a70 74 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73  te that all subs
26a80 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
26a90 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
26aa0 57 72 69 74 65 28 29 20 70 65 72 74 61 69 6e 0a  Write() pertain.
26ab0 2a 2a 20 74 6f 20 74 68 65 20 64 6f 63 75 6d 65  ** to the docume
26ac0 6e 74 20 77 69 74 68 20 72 6f 77 69 64 20 69 52  nt with rowid iR
26ad0 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  owid..*/.int sql
26ae0 69 74 65 33 46 74 73 35 49 6e 64 65 78 42 65 67  ite3Fts5IndexBeg
26af0 69 6e 57 72 69 74 65 28 46 74 73 35 49 6e 64 65  inWrite(Fts5Inde
26b00 78 20 2a 70 2c 20 69 6e 74 20 62 44 65 6c 65 74  x *p, int bDelet
26b10 65 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  e, i64 iRowid){.
26b20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
26b30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
26b40 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
26b50 20 68 61 73 68 20 74 61 62 6c 65 20 69 66 20 69   hash table if i
26b60 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  t has not alread
26b70 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
26b80 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 48 61   */.  if( p->pHa
26b90 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  sh==0 ){.    p->
26ba0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
26bb0 48 61 73 68 4e 65 77 28 70 2d 3e 70 43 6f 6e 66  HashNew(p->pConf
26bc0 69 67 2c 20 26 70 2d 3e 70 48 61 73 68 2c 20 26  ig, &p->pHash, &
26bd0 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 29  p->nPendingData)
26be0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73  ;.  }..  /* Flus
26bf0 68 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  h the hash table
26c00 20 74 6f 20 64 69 73 6b 20 69 66 20 72 65 71 75   to disk if requ
26c10 69 72 65 64 20 2a 2f 0a 20 20 69 66 28 20 69 52  ired */.  if( iR
26c20 6f 77 69 64 3c 70 2d 3e 69 57 72 69 74 65 52 6f  owid<p->iWriteRo
26c30 77 69 64 20 0a 20 20 20 7c 7c 20 28 69 52 6f 77  wid .   || (iRow
26c40 69 64 3d 3d 70 2d 3e 69 57 72 69 74 65 52 6f 77  id==p->iWriteRow
26c50 69 64 20 26 26 20 70 2d 3e 62 44 65 6c 65 74 65  id && p->bDelete
26c60 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 70 2d 3e 6e  ==0).   || (p->n
26c70 50 65 6e 64 69 6e 67 44 61 74 61 20 3e 20 70 2d  PendingData > p-
26c80 3e 70 43 6f 6e 66 69 67 2d 3e 6e 48 61 73 68 53  >pConfig->nHashS
26c90 69 7a 65 29 20 0a 20 20 29 7b 0a 20 20 20 20 66  ize) .  ){.    f
26ca0 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29  ts5IndexFlush(p)
26cb0 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 57 72 69  ;.  }..  p->iWri
26cc0 74 65 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  teRowid = iRowid
26cd0 3b 0a 20 20 70 2d 3e 62 44 65 6c 65 74 65 20 3d  ;.  p->bDelete =
26ce0 20 62 44 65 6c 65 74 65 3b 0a 20 20 72 65 74 75   bDelete;.  retu
26cf0 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
26d00 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn(p);.}../*.** 
26d10 43 6f 6d 6d 69 74 20 64 61 74 61 20 74 6f 20 64  Commit data to d
26d20 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  isk..*/.int sqli
26d30 74 65 33 46 74 73 35 49 6e 64 65 78 53 79 6e 63  te3Fts5IndexSync
26d40 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
26d50 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 61  nt bCommit){.  a
26d60 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
26d70 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73  LITE_OK );.  fts
26d80 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a  5IndexFlush(p);.
26d90 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 20 29 20    if( bCommit ) 
26da0 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
26db0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  p);.  return fts
26dc0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
26dd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
26de0 64 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65  d any data store
26df0 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  d in the in-memo
26e00 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20  ry hash tables. 
26e10 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 0a  Do not write it.
26e20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
26e30 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  se. Additionally
26e40 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
26e50 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
26e60 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c  e %_data.** tabl
26e70 65 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67  e may have chang
26e80 65 64 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 61  ed on disk. So a
26e90 6e 79 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  ny in-memory cac
26ea0 68 65 73 20 6f 66 20 25 5f 64 61 74 61 20 0a 2a  hes of %_data .*
26eb0 2a 20 72 65 63 6f 72 64 73 20 6d 75 73 74 20 62  * records must b
26ec0 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  e invalidated..*
26ed0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
26ee0 35 49 6e 64 65 78 52 6f 6c 6c 62 61 63 6b 28 46  5IndexRollback(F
26ef0 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
26f00 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
26f10 70 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 44  p);.  fts5IndexD
26f20 69 73 63 61 72 64 44 61 74 61 28 70 29 3b 0a 20  iscardData(p);. 
26f30 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e   fts5StructureIn
26f40 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20 20 2f  validate(p);.  /
26f50 2a 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d  * assert( p->rc=
26f60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 2a 2f  =SQLITE_OK ); */
26f70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
26f80 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
26f90 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 69  e %_data table i
26fa0 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  s completely emp
26fb0 74 79 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ty when this fun
26fc0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
26fd0 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
26fe0 6e 20 70 6f 70 75 6c 61 74 65 73 20 69 74 20 77  n populates it w
26ff0 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ith the initial 
27000 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  structure object
27010 73 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78  s for each index
27020 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 69  ,.** and the ini
27030 74 69 61 6c 20 76 65 72 73 69 6f 6e 20 6f 66 20  tial version of 
27040 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72  the "averages" r
27050 65 63 6f 72 64 20 28 61 20 7a 65 72 6f 2d 62 79  ecord (a zero-by
27060 74 65 20 62 6c 6f 62 29 2e 0a 2a 2f 0a 69 6e 74  te blob)..*/.int
27070 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
27080 78 52 65 69 6e 69 74 28 46 74 73 35 49 6e 64 65  xReinit(Fts5Inde
27090 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72  x *p){.  Fts5Str
270a0 75 63 74 75 72 65 20 73 3b 0a 20 20 66 74 73 35  ucture s;.  fts5
270b0 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64  StructureInvalid
270c0 61 74 65 28 70 29 3b 0a 20 20 6d 65 6d 73 65 74  ate(p);.  memset
270d0 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  (&s, 0, sizeof(F
270e0 74 73 35 53 74 72 75 63 74 75 72 65 29 29 3b 0a  ts5Structure));.
270f0 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
27100 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45 53  p, FTS5_AVERAGES
27110 5f 52 4f 57 49 44 2c 20 28 63 6f 6e 73 74 20 75  _ROWID, (const u
27120 38 2a 29 22 22 2c 20 30 29 3b 0a 20 20 66 74 73  8*)"", 0);.  fts
27130 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28  5StructureWrite(
27140 70 2c 20 26 73 29 3b 0a 20 20 72 65 74 75 72 6e  p, &s);.  return
27150 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
27160 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  (p);.}../*.** Op
27170 65 6e 20 61 20 6e 65 77 20 46 74 73 35 49 6e 64  en a new Fts5Ind
27180 65 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 74 68  ex handle. If th
27190 65 20 62 43 72 65 61 74 65 20 61 72 67 75 6d 65  e bCreate argume
271a0 6e 74 20 69 73 20 74 72 75 65 2c 20 63 72 65 61  nt is true, crea
271b0 74 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  te.** and initia
271c0 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lize the underly
271d0 69 6e 67 20 25 5f 64 61 74 61 20 74 61 62 6c 65  ing %_data table
271e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
271f0 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 20 74  ssful, set *pp t
27200 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
27210 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65  ew object and re
27220 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
27230 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  ** Otherwise, se
27240 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 20 61 6e  t *pp to NULL an
27250 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  d return an SQLi
27260 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
27270 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
27280 35 49 6e 64 65 78 4f 70 65 6e 28 0a 20 20 46 74  5IndexOpen(.  Ft
27290 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
272a0 67 2c 20 0a 20 20 69 6e 74 20 62 43 72 65 61 74  g, .  int bCreat
272b0 65 2c 20 0a 20 20 46 74 73 35 49 6e 64 65 78 20  e, .  Fts5Index 
272c0 2a 2a 70 70 2c 0a 20 20 63 68 61 72 20 2a 2a 70  **pp,.  char **p
272d0 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63  zErr.){.  int rc
272e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
272f0 46 74 73 35 49 6e 64 65 78 20 2a 70 3b 20 20 20  Fts5Index *p;   
27300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27310 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f  /* New object */
27320 0a 0a 20 20 2a 70 70 20 3d 20 70 20 3d 20 28 46  ..  *pp = p = (F
27330 74 73 35 49 6e 64 65 78 2a 29 73 71 6c 69 74 65  ts5Index*)sqlite
27340 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
27350 26 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  &rc, sizeof(Fts5
27360 49 6e 64 65 78 29 29 3b 0a 20 20 69 66 28 20 72  Index));.  if( r
27370 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27380 20 20 20 20 70 2d 3e 70 43 6f 6e 66 69 67 20 3d      p->pConfig =
27390 20 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 70 2d   pConfig;.    p-
273a0 3e 6e 57 6f 72 6b 55 6e 69 74 20 3d 20 46 54 53  >nWorkUnit = FTS
273b0 35 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20  5_WORK_UNIT;.   
273c0 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20 73   p->zDataTbl = s
273d0 71 6c 69 74 65 33 46 74 73 35 4d 70 72 69 6e 74  qlite3Fts5Mprint
273e0 66 28 26 72 63 2c 20 22 25 73 5f 64 61 74 61 22  f(&rc, "%s_data"
273f0 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65  , pConfig->zName
27400 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 44  );.    if( p->zD
27410 61 74 61 54 62 6c 20 26 26 20 62 43 72 65 61 74  ataTbl && bCreat
27420 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
27430 73 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74  sqlite3Fts5Creat
27440 65 54 61 62 6c 65 28 0a 20 20 20 20 20 20 20 20  eTable(.        
27450 20 20 70 43 6f 6e 66 69 67 2c 20 22 64 61 74 61    pConfig, "data
27460 22 2c 20 22 69 64 20 49 4e 54 45 47 45 52 20 50  ", "id INTEGER P
27470 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63  RIMARY KEY, bloc
27480 6b 20 42 4c 4f 42 22 2c 20 30 2c 20 70 7a 45 72  k BLOB", 0, pzEr
27490 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  r.      );.     
274a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
274b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
274c0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43 72   = sqlite3Fts5Cr
274d0 65 61 74 65 54 61 62 6c 65 28 70 43 6f 6e 66 69  eateTable(pConfi
274e0 67 2c 20 22 69 64 78 22 2c 20 0a 20 20 20 20 20  g, "idx", .     
274f0 20 20 20 20 20 20 20 22 73 65 67 69 64 2c 20 74         "segid, t
27500 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d 41  erm, pgno, PRIMA
27510 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 65  RY KEY(segid, te
27520 72 6d 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20  rm)", .         
27530 20 20 20 31 2c 20 70 7a 45 72 72 0a 20 20 20 20     1, pzErr.    
27540 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
27550 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
27560 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27570 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
27580 73 35 49 6e 64 65 78 52 65 69 6e 69 74 28 70 29  s5IndexReinit(p)
27590 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
275a0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 72    }..  assert( r
275b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
275c0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
275d0 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
275e0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49      sqlite3Fts5I
275f0 6e 64 65 78 43 6c 6f 73 65 28 70 29 3b 0a 20 20  ndexClose(p);.  
27600 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20    *pp = 0;.  }. 
27610 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27620 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 68 61 6e  *.** Close a han
27630 64 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 61 6e  dle opened by an
27640 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
27650 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
27660 78 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20  xOpen()..*/.int 
27670 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
27680 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 20  Close(Fts5Index 
27690 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
276a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
276b0 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74   p ){.    assert
276c0 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20  ( p->pReader==0 
276d0 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  );.    fts5Struc
276e0 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70  tureInvalidate(p
276f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
27700 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 57 72 69 74  inalize(p->pWrit
27710 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
27720 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 65  _finalize(p->pDe
27730 6c 65 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69  leter);.    sqli
27740 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e  te3_finalize(p->
27750 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20 20  pIdxWriter);.   
27760 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
27770 65 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72  e(p->pIdxDeleter
27780 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
27790 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78 53  inalize(p->pIdxS
277a0 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69  elect);.    sqli
277b0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e  te3_finalize(p->
277c0 70 44 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20  pDataVersion);. 
277d0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
277e0 73 68 46 72 65 65 28 70 2d 3e 70 48 61 73 68 29  shFree(p->pHash)
277f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
27800 65 65 28 70 2d 3e 7a 44 61 74 61 54 62 6c 29 3b  ee(p->zDataTbl);
27810 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
27820 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
27830 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27840 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74  Argument p point
27850 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
27860 6e 74 61 69 6e 69 6e 67 20 75 74 66 2d 38 20 74  ntaining utf-8 t
27870 65 78 74 20 74 68 61 74 20 69 73 20 6e 20 62 79  ext that is n by
27880 74 65 73 20 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e  tes in .** size.
27890 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
278a0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
278b0 68 65 20 6e 43 68 61 72 20 63 68 61 72 61 63 74  he nChar charact
278c0 65 72 20 70 72 65 66 69 78 20 6f 66 20 74 68 65  er prefix of the
278d0 0a 2a 2a 20 62 75 66 66 65 72 2c 20 6f 72 20 30  .** buffer, or 0
278e0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6c 65   if there are le
278f0 73 73 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68  ss than nChar ch
27900 61 72 61 63 74 65 72 73 20 69 6e 20 74 6f 74 61  aracters in tota
27910 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
27920 33 46 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65  3Fts5IndexCharle
27930 6e 54 6f 42 79 74 65 6c 65 6e 28 0a 20 20 63 6f  nToBytelen(.  co
27940 6e 73 74 20 63 68 61 72 20 2a 70 2c 20 0a 20 20  nst char *p, .  
27950 69 6e 74 20 6e 42 79 74 65 2c 20 0a 20 20 69 6e  int nByte, .  in
27960 74 20 6e 43 68 61 72 0a 29 7b 0a 20 20 69 6e 74  t nChar.){.  int
27970 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b   n = 0;.  int i;
27980 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
27990 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  har; i++){.    i
279a0 66 28 20 6e 3e 3d 6e 42 79 74 65 20 29 20 72 65  f( n>=nByte ) re
279b0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 2f 2a 20  turn 0;      /* 
279c0 49 6e 70 75 74 20 63 6f 6e 74 61 69 6e 73 20 66  Input contains f
279d0 65 77 65 72 20 74 68 61 6e 20 6e 43 68 61 72 20  ewer than nChar 
279e0 63 68 61 72 73 20 2a 2f 0a 20 20 20 20 69 66 28  chars */.    if(
279f0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
27a00 70 5b 6e 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a  p[n++]>=0xc0 ){.
27a10 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 70 5b        while( (p[
27a20 6e 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30  n] & 0xc0)==0x80
27a30 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   ) n++;.    }.  
27a40 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
27a50 0a 2f 2a 0a 2a 2a 20 70 49 6e 20 69 73 20 61 20  ./*.** pIn is a 
27a60 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 73 74  UTF-8 encoded st
27a70 72 69 6e 67 2c 20 6e 49 6e 20 62 79 74 65 73 20  ring, nIn bytes 
27a80 69 6e 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20  in size. Return 
27a90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
27aa0 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74   unicode charact
27ab0 65 72 73 20 69 6e 20 74 68 65 20 73 74 72 69 6e  ers in the strin
27ac0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
27ad0 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65   fts5IndexCharle
27ae0 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 49  n(const char *pI
27af0 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20 20 69  n, int nIn){.  i
27b00 6e 74 20 6e 43 68 61 72 20 3d 20 30 3b 20 20 20  nt nChar = 0;   
27b10 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20           .  int 
27b20 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  i = 0;.  while( 
27b30 69 3c 6e 49 6e 20 29 7b 0a 20 20 20 20 69 66 28  i<nIn ){.    if(
27b40 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
27b50 70 49 6e 5b 69 2b 2b 5d 3e 3d 30 78 63 30 20 29  pIn[i++]>=0xc0 )
27b60 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  {.      while( i
27b70 3c 6e 49 6e 20 26 26 20 28 70 49 6e 5b 69 5d 20  <nIn && (pIn[i] 
27b80 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20  & 0xc0)==0x80 ) 
27b90 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  i++;.    }.    n
27ba0 43 68 61 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  Char++;.  }.  re
27bb0 74 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a 2f  turn nChar;.}../
27bc0 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72  *.** Insert or r
27bd0 65 6d 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72  emove data to or
27be0 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e   from the index.
27bf0 20 45 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63   Each time a doc
27c00 75 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64  ument is .** add
27c10 65 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64  ed to or removed
27c20 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c   from the index,
27c30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
27c40 73 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20  s called one or 
27c50 6d 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a  more.** times..*
27c60 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65  *.** For an inse
27c70 72 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63  rt, it must be c
27c80 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  alled once for e
27c90 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  ach token in the
27ca0 20 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a   new document..*
27cb0 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
27cc0 6f 6e 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20  on is a delete, 
27cd0 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  it must be calle
27ce0 64 20 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63  d (at least) onc
27cf0 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e  e for each.** un
27d00 69 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68  ique token in th
27d10 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20  e document with 
27d20 61 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65  an iCol value le
27d30 73 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68  ss than zero. Th
27d40 65 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65  e iPos.** argume
27d50 6e 74 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f  nt is ignored fo
27d60 72 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69  r a delete..*/.i
27d70 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
27d80 64 65 78 57 72 69 74 65 28 0a 20 20 46 74 73 35  dexWrite(.  Fts5
27d90 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
27da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
27db0 6e 64 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f  ndex to write to
27dc0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
27dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27de0 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
27df0 74 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e  token appears in
27e00 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29   (-ve -> delete)
27e10 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20   */.  int iPos, 
27e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e30 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
27e40 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69  n of token withi
27e50 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f  n column */.  co
27e60 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e  nst char *pToken
27e70 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a  , int nToken  /*
27e80 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72   Token to add or
27e90 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72   remove to or fr
27ea0 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20  om index */.){. 
27eb0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
27ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ed0 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
27ee0 61 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65  ate through inde
27ef0 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  xes */.  int rc 
27f00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
27f10 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
27f20 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn code */.  Fts
27f30 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
27f40 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a   = p->pConfig;..
27f50 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
27f60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
27f70 61 73 73 65 72 74 28 20 28 69 43 6f 6c 3c 30 29  assert( (iCol<0)
27f80 3d 3d 70 2d 3e 62 44 65 6c 65 74 65 20 29 3b 0a  ==p->bDelete );.
27f90 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 6e  .  /* Add the en
27fa0 74 72 79 20 74 6f 20 74 68 65 20 6d 61 69 6e 20  try to the main 
27fb0 74 65 72 6d 73 20 69 6e 64 65 78 2e 20 2a 2f 0a  terms index. */.
27fc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
27fd0 73 35 48 61 73 68 57 72 69 74 65 28 0a 20 20 20  s5HashWrite(.   
27fe0 20 20 20 70 2d 3e 70 48 61 73 68 2c 20 70 2d 3e     p->pHash, p->
27ff0 69 57 72 69 74 65 52 6f 77 69 64 2c 20 69 43 6f  iWriteRowid, iCo
28000 6c 2c 20 69 50 6f 73 2c 20 46 54 53 35 5f 4d 41  l, iPos, FTS5_MA
28010 49 4e 5f 50 52 45 46 49 58 2c 20 70 54 6f 6b 65  IN_PREFIX, pToke
28020 6e 2c 20 6e 54 6f 6b 65 6e 0a 20 20 29 3b 0a 0a  n, nToken.  );..
28030 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
28040 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 26 26  nfig->nPrefix &&
28050 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
28060 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
28070 69 6e 74 20 6e 43 68 61 72 20 3d 20 70 43 6f 6e  int nChar = pCon
28080 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 5d 3b  fig->aPrefix[i];
28090 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
280a0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
280b0 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65  xCharlenToBytele
280c0 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  n(pToken, nToken
280d0 2c 20 6e 43 68 61 72 29 3b 0a 20 20 20 20 69 66  , nChar);.    if
280e0 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  ( nByte ){.     
280f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
28100 35 48 61 73 68 57 72 69 74 65 28 70 2d 3e 70 48  5HashWrite(p->pH
28110 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ash, .          
28120 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 2c 20  p->iWriteRowid, 
28130 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 28 63 68 61  iCol, iPos, (cha
28140 72 29 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45  r)(FTS5_MAIN_PRE
28150 46 49 58 2b 69 2b 31 29 2c 20 70 54 6f 6b 65 6e  FIX+i+1), pToken
28160 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 42 79 74  ,.          nByt
28170 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
28180 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
28190 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
281a0 20 61 20 6e 65 77 20 69 74 65 72 61 74 6f 72 20   a new iterator 
281b0 74 6f 20 69 74 65 72 61 74 65 20 74 68 6f 75 67  to iterate thoug
281c0 68 20 61 6c 6c 20 72 6f 77 69 64 20 74 68 61 74  h all rowid that
281d0 20 6d 61 74 63 68 20 74 68 65 20 0a 2a 2a 20 73   match the .** s
281e0 70 65 63 69 66 69 65 64 20 74 6f 6b 65 6e 20 6f  pecified token o
281f0 72 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0a  r token prefix..
28200 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
28210 73 35 49 6e 64 65 78 51 75 65 72 79 28 0a 20 20  s5IndexQuery(.  
28220 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
28230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28240 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 74 6f 20  /* FTS index to 
28250 71 75 65 72 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  query */.  const
28260 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69   char *pToken, i
28270 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 54 6f  nt nToken, /* To
28280 6b 65 6e 20 28 6f 72 20 70 72 65 66 69 78 29 20  ken (or prefix) 
28290 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a  to query for */.
282a0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
282b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282c0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53    /* Mask of FTS
282d0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 20 66  5INDEX_QUERY_X f
282e0 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f  lags */.  Fts5Co
282f0 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20  lset *pColset,  
28300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74            /* Mat
28310 63 68 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73  ch these columns
28320 20 6f 6e 6c 79 20 2a 2f 0a 20 20 46 74 73 35 49   only */.  Fts5I
28330 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 49 74 65  ndexIter **ppIte
28340 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  r          /* OU
28350 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72 20  T: New iterator 
28360 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46  object */.){.  F
28370 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
28380 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
28390 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 52 65  .  Fts5Iter *pRe
283a0 74 20 3d 20 30 3b 0a 20 20 46 74 73 35 42 75 66  t = 0;.  Fts5Buf
283b0 66 65 72 20 62 75 66 20 3d 20 7b 30 2c 20 30 2c  fer buf = {0, 0,
283c0 20 30 7d 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68   0};..  /* If th
283d0 65 20 51 55 45 52 59 5f 53 43 41 4e 20 66 6c 61  e QUERY_SCAN fla
283e0 67 20 69 73 20 73 65 74 2c 20 61 6c 6c 20 6f 74  g is set, all ot
283f0 68 65 72 20 66 6c 61 67 73 20 6d 75 73 74 20 62  her flags must b
28400 65 20 63 6c 65 61 72 2e 20 2a 2f 0a 20 20 61 73  e clear. */.  as
28410 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 46  sert( (flags & F
28420 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
28430 43 41 4e 29 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  CAN)==0 || flags
28440 3d 3d 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  ==FTS5INDEX_QUER
28450 59 5f 53 43 41 4e 20 29 3b 0a 0a 20 20 69 66 28  Y_SCAN );..  if(
28460 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
28470 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26  erSize(&p->rc, &
28480 62 75 66 2c 20 6e 54 6f 6b 65 6e 2b 31 29 3d 3d  buf, nToken+1)==
28490 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 64  0 ){.    int iId
284a0 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  x = 0;          
284b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
284c0 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 20  to search */.   
284d0 20 6d 65 6d 63 70 79 28 26 62 75 66 2e 70 5b 31   memcpy(&buf.p[1
284e0 5d 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  ], pToken, nToke
284f0 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75  n);..    /* Figu
28500 72 65 20 6f 75 74 20 77 68 69 63 68 20 69 6e 64  re out which ind
28510 65 78 20 74 6f 20 73 65 61 72 63 68 20 61 6e 64  ex to search and
28520 20 73 65 74 20 69 49 64 78 20 61 63 63 6f 72 64   set iIdx accord
28530 69 6e 67 6c 79 2e 20 49 66 20 74 68 69 73 0a 20  ingly. If this. 
28540 20 20 20 2a 2a 20 69 73 20 61 20 70 72 65 66 69     ** is a prefi
28550 78 20 71 75 65 72 79 20 66 6f 72 20 77 68 69 63  x query for whic
28560 68 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 72  h there is no pr
28570 65 66 69 78 20 69 6e 64 65 78 2c 20 73 65 74 20  efix index, set 
28580 69 49 64 78 20 74 6f 0a 20 20 20 20 2a 2a 20 67  iIdx to.    ** g
28590 72 65 61 74 65 72 20 74 68 61 6e 20 70 43 6f 6e  reater than pCon
285a0 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 74 6f 20  fig->nPrefix to 
285b0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
285c0 65 20 71 75 65 72 79 20 77 69 6c 6c 20 62 65 0a  e query will be.
285d0 20 20 20 20 2a 2a 20 73 61 74 69 73 66 69 65 64      ** satisfied
285e0 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 6d 75 6c   by scanning mul
285f0 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74  tiple terms in t
28600 68 65 20 6d 61 69 6e 20 69 6e 64 65 78 2e 0a 20  he main index.. 
28610 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
28620 74 68 65 20 51 55 45 52 59 5f 54 45 53 54 5f 4e  the QUERY_TEST_N
28630 4f 49 44 58 20 66 6c 61 67 20 77 61 73 20 73 70  OIDX flag was sp
28640 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20 74 68  ecified, then th
28650 69 73 20 6d 75 73 74 20 62 65 20 61 0a 20 20 20  is must be a.   
28660 20 2a 2a 20 70 72 65 66 69 78 2d 71 75 65 72 79   ** prefix-query
28670 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 75 73 69  . Instead of usi
28680 6e 67 20 61 20 70 72 65 66 69 78 2d 69 6e 64 65  ng a prefix-inde
28690 78 20 28 69 66 20 6f 6e 65 20 65 78 69 73 74 73  x (if one exists
286a0 29 2c 20 0a 20 20 20 20 2a 2a 20 65 76 61 6c 75  ), .    ** evalu
286b0 61 74 65 20 74 68 65 20 70 72 65 66 69 78 20 71  ate the prefix q
286c0 75 65 72 79 20 75 73 69 6e 67 20 74 68 65 20 6d  uery using the m
286d0 61 69 6e 20 46 54 53 20 69 6e 64 65 78 2e 20 54  ain FTS index. T
286e0 68 69 73 20 69 73 20 75 73 65 64 0a 20 20 20 20  his is used.    
286f0 2a 2a 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ** for internal 
28700 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
28710 62 79 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  by the integrity
28720 2d 63 68 65 63 6b 20 69 6e 20 64 65 62 75 67 20  -check in debug 
28730 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 6f 6e 6c  .    ** mode onl
28740 79 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  y.  */.#ifdef SQ
28750 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69  LITE_DEBUG.    i
28760 66 28 20 70 43 6f 6e 66 69 67 2d 3e 62 50 72 65  f( pConfig->bPre
28770 66 69 78 49 6e 64 65 78 3d 3d 30 20 7c 7c 20 28  fixIndex==0 || (
28780 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
28790 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49  X_QUERY_TEST_NOI
287a0 44 58 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  DX) ){.      ass
287b0 65 72 74 28 20 66 6c 61 67 73 20 26 20 46 54 53  ert( flags & FTS
287c0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45  5INDEX_QUERY_PRE
287d0 46 49 58 20 29 3b 0a 20 20 20 20 20 20 69 49 64  FIX );.      iId
287e0 78 20 3d 20 31 2b 70 43 6f 6e 66 69 67 2d 3e 6e  x = 1+pConfig->n
287f0 50 72 65 66 69 78 3b 0a 20 20 20 20 7d 65 6c 73  Prefix;.    }els
28800 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
28810 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
28820 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20  EX_QUERY_PREFIX 
28830 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 68  ){.      int nCh
28840 61 72 20 3d 20 66 74 73 35 49 6e 64 65 78 43 68  ar = fts5IndexCh
28850 61 72 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54  arlen(pToken, nT
28860 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 66 6f 72  oken);.      for
28870 28 69 49 64 78 3d 31 3b 20 69 49 64 78 3c 3d 70  (iIdx=1; iIdx<=p
28880 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b  Config->nPrefix;
28890 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20   iIdx++){.      
288a0 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61    if( pConfig->a
288b0 50 72 65 66 69 78 5b 69 49 64 78 2d 31 5d 3d 3d  Prefix[iIdx-1]==
288c0 6e 43 68 61 72 20 29 20 62 72 65 61 6b 3b 0a 20  nChar ) break;. 
288d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
288e0 20 20 69 66 28 20 69 49 64 78 3c 3d 70 43 6f 6e    if( iIdx<=pCon
288f0 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 29 7b 0a  fig->nPrefix ){.
28900 20 20 20 20 20 20 2f 2a 20 53 74 72 61 69 67 68        /* Straigh
28910 74 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 2a  t index lookup *
28920 2f 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  /.      Fts5Stru
28930 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
28940 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
28950 61 64 28 70 29 3b 0a 20 20 20 20 20 20 62 75 66  ad(p);.      buf
28960 2e 70 5b 30 5d 20 3d 20 28 75 38 29 28 46 54 53  .p[0] = (u8)(FTS
28970 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20  5_MAIN_PREFIX + 
28980 69 49 64 78 29 3b 0a 20 20 20 20 20 20 69 66 28  iIdx);.      if(
28990 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
289a0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
289b0 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c  rNew(p, pStruct,
289c0 20 66 6c 61 67 73 20 7c 20 46 54 53 35 49 4e 44   flags | FTS5IND
289d0 45 58 5f 51 55 45 52 59 5f 53 4b 49 50 45 4d 50  EX_QUERY_SKIPEMP
289e0 54 59 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  TY, .           
289f0 20 70 43 6f 6c 73 65 74 2c 20 62 75 66 2e 70 2c   pColset, buf.p,
28a00 20 6e 54 6f 6b 65 6e 2b 31 2c 20 2d 31 2c 20 30   nToken+1, -1, 0
28a10 2c 20 26 70 52 65 74 0a 20 20 20 20 20 20 20 20  , &pRet.        
28a20 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  );.        fts5S
28a30 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
28a40 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20  pStruct);.      
28a50 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
28a60 20 20 20 2f 2a 20 53 63 61 6e 20 6d 75 6c 74 69     /* Scan multi
28a70 70 6c 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ple terms in the
28a80 20 6d 61 69 6e 20 69 6e 64 65 78 20 2a 2f 0a 20   main index */. 
28a90 20 20 20 20 20 69 6e 74 20 62 44 65 73 63 20 3d       int bDesc =
28aa0 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e   (flags & FTS5IN
28ab0 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 29 21  DEX_QUERY_DESC)!
28ac0 3d 30 3b 0a 20 20 20 20 20 20 62 75 66 2e 70 5b  =0;.      buf.p[
28ad0 30 5d 20 3d 20 46 54 53 35 5f 4d 41 49 4e 5f 50  0] = FTS5_MAIN_P
28ae0 52 45 46 49 58 3b 0a 20 20 20 20 20 20 66 74 73  REFIX;.      fts
28af0 35 53 65 74 75 70 50 72 65 66 69 78 49 74 65 72  5SetupPrefixIter
28b00 28 70 2c 20 62 44 65 73 63 2c 20 62 75 66 2e 70  (p, bDesc, buf.p
28b10 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20 70 43 6f 6c  , nToken+1, pCol
28b20 73 65 74 2c 20 26 70 52 65 74 29 3b 0a 20 20 20  set, &pRet);.   
28b30 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
28b40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
28b50 52 65 74 2d 3e 70 43 6f 6c 73 65 74 3d 3d 30 20  Ret->pColset==0 
28b60 29 3b 0a 20 20 20 20 20 20 66 74 73 35 49 74 65  );.      fts5Ite
28b70 72 53 65 74 4f 75 74 70 75 74 43 62 28 26 70 2d  rSetOutputCb(&p-
28b80 3e 72 63 2c 20 70 52 65 74 29 3b 0a 20 20 20 20  >rc, pRet);.    
28b90 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
28ba0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28bb0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
28bc0 53 65 67 20 3d 20 26 70 52 65 74 2d 3e 61 53 65  Seg = &pRet->aSe
28bd0 67 5b 70 52 65 74 2d 3e 61 46 69 72 73 74 5b 31  g[pRet->aFirst[1
28be0 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20  ].iFirst];.     
28bf0 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65     if( pSeg->pLe
28c00 61 66 20 29 20 70 52 65 74 2d 3e 78 53 65 74 4f  af ) pRet->xSetO
28c10 75 74 70 75 74 73 28 70 52 65 74 2c 20 70 53 65  utputs(pRet, pSe
28c20 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
28c30 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  }..    if( p->rc
28c40 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
28c50 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 26  3Fts5IterClose(&
28c60 70 52 65 74 2d 3e 62 61 73 65 29 3b 0a 20 20 20  pRet->base);.   
28c70 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
28c80 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64     fts5CloseRead
28c90 65 72 28 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  er(p);.    }..  
28ca0 20 20 2a 70 70 49 74 65 72 20 3d 20 26 70 52 65    *ppIter = &pRe
28cb0 74 2d 3e 62 61 73 65 3b 0a 20 20 20 20 73 71 6c  t->base;.    sql
28cc0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46 72  ite3Fts5BufferFr
28cd0 65 65 28 26 62 75 66 29 3b 0a 20 20 7d 0a 20 20  ee(&buf);.  }.  
28ce0 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
28cf0 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
28d00 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
28d10 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
28d20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
28d30 6c 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  ly argument is a
28d40 74 20 45 4f 46 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20  t EOF..*/./*.** 
28d50 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74  Move to the next
28d60 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64 2e   matching rowid.
28d70 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
28d80 46 74 73 35 49 74 65 72 4e 65 78 74 28 46 74 73  Fts5IterNext(Fts
28d90 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64  5IndexIter *pInd
28da0 65 78 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49  exIter){.  Fts5I
28db0 74 65 72 20 2a 70 49 74 65 72 20 3d 20 28 46 74  ter *pIter = (Ft
28dc0 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74  s5Iter*)pIndexIt
28dd0 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  er;.  assert( pI
28de0 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d  ter->pIndex->rc=
28df0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
28e00 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
28e10 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c  t(pIter->pIndex,
28e20 20 70 49 74 65 72 2c 20 30 2c 20 30 29 3b 0a 20   pIter, 0, 0);. 
28e30 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
28e40 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70  xReturn(pIter->p
28e50 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Index);.}../*.**
28e60 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78   Move to the nex
28e70 74 20 6d 61 74 63 68 69 6e 67 20 74 65 72 6d 2f  t matching term/
28e80 72 6f 77 69 64 2e 20 55 73 65 64 20 62 79 20 74  rowid. Used by t
28e90 68 65 20 66 74 73 35 76 6f 63 61 62 20 6d 6f 64  he fts5vocab mod
28ea0 75 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ule..*/.int sqli
28eb0 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 53  te3Fts5IterNextS
28ec0 63 61 6e 28 46 74 73 35 49 6e 64 65 78 49 74 65  can(Fts5IndexIte
28ed0 72 20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b 0a  r *pIndexIter){.
28ee0 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65    Fts5Iter *pIte
28ef0 72 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29 70  r = (Fts5Iter*)p
28f00 49 6e 64 65 78 49 74 65 72 3b 0a 20 20 46 74 73  IndexIter;.  Fts
28f10 35 49 6e 64 65 78 20 2a 70 20 3d 20 70 49 74 65  5Index *p = pIte
28f20 72 2d 3e 70 49 6e 64 65 78 3b 0a 0a 20 20 61 73  r->pIndex;..  as
28f30 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e  sert( pIter->pIn
28f40 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  dex->rc==SQLITE_
28f50 4f 4b 20 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c  OK );..  fts5Mul
28f60 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  tiIterNext(p, pI
28f70 74 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  ter, 0, 0);.  if
28f80 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
28f90 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65  OK ){.    Fts5Se
28fa0 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
28fb0 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
28fc0 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
28fd0 72 73 74 20 5d 3b 0a 20 20 20 20 69 66 28 20 70  rst ];.    if( p
28fe0 53 65 67 2d 3e 70 4c 65 61 66 20 26 26 20 70 53  Seg->pLeaf && pS
28ff0 65 67 2d 3e 74 65 72 6d 2e 70 5b 30 5d 21 3d 46  eg->term.p[0]!=F
29000 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20  TS5_MAIN_PREFIX 
29010 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  ){.      fts5Dat
29020 61 52 65 6c 65 61 73 65 28 70 53 65 67 2d 3e 70  aRelease(pSeg->p
29030 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70 53 65  Leaf);.      pSe
29040 67 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  g->pLeaf = 0;.  
29050 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e      pIter->base.
29060 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  bEof = 1;.    }.
29070 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 66 74    }..  return ft
29080 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49  s5IndexReturn(pI
29090 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a  ter->pIndex);.}.
290a0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74  ./*.** Move to t
290b0 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67  he next matching
290c0 20 72 6f 77 69 64 20 74 68 61 74 20 6f 63 63 75   rowid that occu
290d0 72 73 20 61 74 20 6f 72 20 61 66 74 65 72 20 69  rs at or after i
290e0 4d 61 74 63 68 2e 20 54 68 65 0a 2a 2a 20 64 65  Match. The.** de
290f0 66 69 6e 69 74 69 6f 6e 20 6f 66 20 22 61 74 20  finition of "at 
29100 6f 72 20 61 66 74 65 72 22 20 64 65 70 65 6e 64  or after" depend
29110 73 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 69  s on whether thi
29120 73 20 69 74 65 72 61 74 6f 72 20 69 74 65 72 61  s iterator itera
29130 74 65 73 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64  tes.** in ascend
29140 69 6e 67 20 6f 72 20 64 65 73 63 65 6e 64 69 6e  ing or descendin
29150 67 20 72 6f 77 69 64 20 6f 72 64 65 72 2e 0a 2a  g rowid order..*
29160 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
29170 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 46 74  5IterNextFrom(Ft
29180 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e  s5IndexIter *pIn
29190 64 65 78 49 74 65 72 2c 20 69 36 34 20 69 4d 61  dexIter, i64 iMa
291a0 74 63 68 29 7b 0a 20 20 46 74 73 35 49 74 65 72  tch){.  Fts5Iter
291b0 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73 35 49   *pIter = (Fts5I
291c0 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72 3b  ter*)pIndexIter;
291d0 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  .  fts5MultiIter
291e0 4e 65 78 74 46 72 6f 6d 28 70 49 74 65 72 2d 3e  NextFrom(pIter->
291f0 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2c 20 69  pIndex, pIter, i
29200 4d 61 74 63 68 29 3b 0a 20 20 72 65 74 75 72 6e  Match);.  return
29210 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
29220 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b  (pIter->pIndex);
29230 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
29240 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
29250 6d 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  m..*/.const char
29260 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49 74 65   *sqlite3Fts5Ite
29270 72 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78 49  rTerm(Fts5IndexI
29280 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72 2c  ter *pIndexIter,
29290 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 69 6e 74   int *pn){.  int
292a0 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   n;.  const char
292b0 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61   *z = (const cha
292c0 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72  r*)fts5MultiIter
292d0 54 65 72 6d 28 28 46 74 73 35 49 74 65 72 2a 29  Term((Fts5Iter*)
292e0 70 49 6e 64 65 78 49 74 65 72 2c 20 26 6e 29 3b  pIndexIter, &n);
292f0 0a 20 20 2a 70 6e 20 3d 20 6e 2d 31 3b 0a 20 20  .  *pn = n-1;.  
29300 72 65 74 75 72 6e 20 26 7a 5b 31 5d 3b 0a 7d 0a  return &z[1];.}.
29310 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
29320 69 74 65 72 61 74 6f 72 20 6f 70 65 6e 65 64 20  iterator opened 
29330 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
29340 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73  ll to sqlite3Fts
29350 35 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a  5IndexQuery()..*
29360 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
29370 73 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73 35  s5IterClose(Fts5
29380 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65  IndexIter *pInde
29390 78 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  xIter){.  if( pI
293a0 6e 64 65 78 49 74 65 72 20 29 7b 0a 20 20 20 20  ndexIter ){.    
293b0 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 20  Fts5Iter *pIter 
293c0 3d 20 28 46 74 73 35 49 74 65 72 2a 29 70 49 6e  = (Fts5Iter*)pIn
293d0 64 65 78 49 74 65 72 3b 0a 20 20 20 20 46 74 73  dexIter;.    Fts
293e0 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d  5Index *pIndex =
293f0 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a   pIter->pIndex;.
29400 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
29410 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  rFree(pIter);.  
29420 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65    fts5CloseReade
29430 72 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 7d  r(pIndex);.  }.}
29440 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64  ../*.** Read and
29450 20 64 65 63 6f 64 65 20 74 68 65 20 22 61 76 65   decode the "ave
29460 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 66 72  rages" record fr
29470 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
29480 20 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65   .**.** Paramete
29490 72 20 61 6e 53 69 7a 65 20 6d 75 73 74 20 70 6f  r anSize must po
294a0 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20  int to an array 
294b0 6f 66 20 73 69 7a 65 20 6e 43 6f 6c 2c 20 77 68  of size nCol, wh
294c0 65 72 65 20 6e 43 6f 6c 20 69 73 0a 2a 2a 20 74  ere nCol is.** t
294d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65  he number of use
294e0 72 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e  r defined column
294f0 73 20 69 6e 20 74 68 65 20 46 54 53 20 74 61 62  s in the FTS tab
29500 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
29510 65 33 46 74 73 35 49 6e 64 65 78 47 65 74 41 76  e3Fts5IndexGetAv
29520 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65 78  erages(Fts5Index
29530 20 2a 70 2c 20 69 36 34 20 2a 70 6e 52 6f 77 2c   *p, i64 *pnRow,
29540 20 69 36 34 20 2a 61 6e 53 69 7a 65 29 7b 0a 20   i64 *anSize){. 
29550 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70   int nCol = p->p
29560 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 0a 20 20  Config->nCol;.  
29570 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b  Fts5Data *pData;
29580 0a 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 30 3b 0a  ..  *pnRow = 0;.
29590 20 20 6d 65 6d 73 65 74 28 61 6e 53 69 7a 65 2c    memset(anSize,
295a0 20 30 2c 20 73 69 7a 65 6f 66 28 69 36 34 29 20   0, sizeof(i64) 
295b0 2a 20 6e 43 6f 6c 29 3b 0a 20 20 70 44 61 74 61  * nCol);.  pData
295c0 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
295d0 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45 53  p, FTS5_AVERAGES
295e0 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66 28 20 70  _ROWID);.  if( p
295f0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
29600 26 26 20 70 44 61 74 61 2d 3e 6e 6e 20 29 7b 0a  && pData->nn ){.
29610 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20      int i = 0;. 
29620 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20     int iCol;.   
29630 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
29640 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d  int(&pData->p[i]
29650 2c 20 28 75 36 34 2a 29 70 6e 52 6f 77 29 3b 0a  , (u64*)pnRow);.
29660 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
29670 69 3c 70 44 61 74 61 2d 3e 6e 6e 20 26 26 20 69  i<pData->nn && i
29680 43 6f 6c 3c 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  Col<nCol; iCol++
29690 29 7b 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74  ){.      i += ft
296a0 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61  s5GetVarint(&pDa
296b0 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29  ta->p[i], (u64*)
296c0 26 61 6e 53 69 7a 65 5b 69 43 6f 6c 5d 29 3b 0a  &anSize[iCol]);.
296d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73      }.  }..  fts
296e0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61  5DataRelease(pDa
296f0 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  ta);.  return ft
29700 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
29710 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61  ;.}../*.** Repla
29720 63 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 22  ce the current "
29730 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64  averages" record
29740 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e   with the conten
29750 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ts of the buffer
29760 20 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 61 73   .** supplied as
29770 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
29780 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
29790 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74  ite3Fts5IndexSet
297a0 41 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64  Averages(Fts5Ind
297b0 65 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 20  ex *p, const u8 
297c0 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74  *pData, int nDat
297d0 61 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  a){.  assert( p-
297e0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
297f0 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72 69 74  ;.  fts5DataWrit
29800 65 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47  e(p, FTS5_AVERAG
29810 45 53 5f 52 4f 57 49 44 2c 20 70 44 61 74 61 2c  ES_ROWID, pData,
29820 20 6e 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72   nData);.  retur
29830 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
29840 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n(p);.}../*.** R
29850 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
29860 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73  number of blocks
29870 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 68 61 73   this module has
29880 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25   read from the %
29890 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 73  _data.** table s
298a0 69 6e 63 65 20 69 74 20 77 61 73 20 63 72 65 61  ince it was crea
298b0 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
298c0 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 61 64  te3Fts5IndexRead
298d0 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  s(Fts5Index *p){
298e0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65  .  return p->nRe
298f0 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ad;.}../*.** Set
29900 20 74 68 65 20 33 32 2d 62 69 74 20 63 6f 6f 6b   the 32-bit cook
29910 69 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ie value stored 
29920 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
29930 61 6c 6c 20 73 74 72 75 63 74 75 72 65 20 0a 2a  all structure .*
29940 2a 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65  * records to the
29950 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
29960 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
29970 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ment..**.** Retu
29980 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
29990 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
299a0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
299b0 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a  ode if an error.
299c0 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e  ** occurs..*/.in
299d0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
299e0 65 78 53 65 74 43 6f 6f 6b 69 65 28 46 74 73 35  exSetCookie(Fts5
299f0 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 4e  Index *p, int iN
29a00 65 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  ew){.  int rc;  
29a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
29a30 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
29a40 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
29a50 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
29a60 3b 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72  ;    /* Configur
29a70 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a  ation object */.
29a80 20 20 75 38 20 61 43 6f 6f 6b 69 65 5b 34 5d 3b    u8 aCookie[4];
29a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29aa0 20 20 20 20 20 20 20 2f 2a 20 42 69 6e 61 72 79         /* Binary
29ab0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
29ac0 6f 66 20 69 4e 65 77 20 2a 2f 0a 20 20 73 71 6c  of iNew */.  sql
29ad0 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62  ite3_blob *pBlob
29ae0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
29af0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
29b00 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74  K );.  sqlite3Ft
29b10 73 35 50 75 74 33 32 28 61 43 6f 6f 6b 69 65 2c  s5Put32(aCookie,
29b20 20 69 4e 65 77 29 3b 0a 0a 20 20 72 63 20 3d 20   iNew);..  rc = 
29b30 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65  sqlite3_blob_ope
29b40 6e 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 70  n(pConfig->db, p
29b50 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e  Config->zDb, p->
29b60 7a 44 61 74 61 54 62 6c 2c 20 0a 20 20 20 20 20  zDataTbl, .     
29b70 20 22 62 6c 6f 63 6b 22 2c 20 46 54 53 35 5f 53   "block", FTS5_S
29b80 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 2c 20  TRUCTURE_ROWID, 
29b90 31 2c 20 26 70 42 6c 6f 62 0a 20 20 29 3b 0a 20  1, &pBlob.  );. 
29ba0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29bb0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
29bc0 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70 42 6c  3_blob_write(pBl
29bd0 6f 62 2c 20 61 43 6f 6f 6b 69 65 2c 20 34 2c 20  ob, aCookie, 4, 
29be0 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0);.    rc = sql
29bf0 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28  ite3_blob_close(
29c00 70 42 6c 6f 62 29 3b 0a 20 20 7d 0a 0a 20 20 72  pBlob);.  }..  r
29c10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74  eturn rc;.}..int
29c20 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
29c30 78 4c 6f 61 64 43 6f 6e 66 69 67 28 46 74 73 35  xLoadConfig(Fts5
29c40 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73  Index *p){.  Fts
29c50 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
29c60 75 63 74 3b 0a 20 20 70 53 74 72 75 63 74 20 3d  uct;.  pStruct =
29c70 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
29c80 61 64 28 70 29 3b 0a 20 20 66 74 73 35 53 74 72  ad(p);.  fts5Str
29c90 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
29ca0 74 72 75 63 74 29 3b 0a 20 20 72 65 74 75 72 6e  truct);.  return
29cb0 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
29cc0 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  (p);.}.../******
29cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29d10 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
29d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
29d60 2a 20 42 65 6c 6f 77 20 74 68 69 73 20 70 6f 69  * Below this poi
29d70 6e 74 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d  nt is the implem
29d80 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
29d90 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20  integrity-check 
29da0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  .** functionalit
29db0 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  y..*/../*.** Ret
29dc0 75 72 6e 20 61 20 73 69 6d 70 6c 65 20 63 68 65  urn a simple che
29dd0 63 6b 73 75 6d 20 76 61 6c 75 65 20 62 61 73 65  cksum value base
29de0 64 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  d on the argumen
29df0 74 73 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74  ts..*/.u64 sqlit
29e00 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79  e3Fts5IndexEntry
29e10 43 6b 73 75 6d 28 0a 20 20 69 36 34 20 69 52 6f  Cksum(.  i64 iRo
29e20 77 69 64 2c 20 0a 20 20 69 6e 74 20 69 43 6f 6c  wid, .  int iCol
29e30 2c 20 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 0a  , .  int iPos, .
29e40 20 20 69 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f    int iIdx,.  co
29e50 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d 2c  nst char *pTerm,
29e60 0a 20 20 69 6e 74 20 6e 54 65 72 6d 0a 29 7b 0a  .  int nTerm.){.
29e70 20 20 69 6e 74 20 69 3b 0a 20 20 75 36 34 20 72    int i;.  u64 r
29e80 65 74 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 72  et = iRowid;.  r
29e90 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b  et += (ret<<3) +
29ea0 20 69 43 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d 20   iCol;.  ret += 
29eb0 28 72 65 74 3c 3c 33 29 20 2b 20 69 50 6f 73 3b  (ret<<3) + iPos;
29ec0 0a 20 20 69 66 28 20 69 49 64 78 3e 3d 30 20 29  .  if( iIdx>=0 )
29ed0 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29   ret += (ret<<3)
29ee0 20 2b 20 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52   + (FTS5_MAIN_PR
29ef0 45 46 49 58 20 2b 20 69 49 64 78 29 3b 0a 20 20  EFIX + iIdx);.  
29f00 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d  for(i=0; i<nTerm
29f10 3b 20 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72  ; i++) ret += (r
29f20 65 74 3c 3c 33 29 20 2b 20 70 54 65 72 6d 5b 69  et<<3) + pTerm[i
29f30 5d 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b  ];.  return ret;
29f40 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
29f50 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68  E_DEBUG./*.** Th
29f60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70  is function is p
29f70 75 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61  urely an interna
29f80 6c 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73 20  l test. It does 
29f90 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 74  not contribute t
29fa0 6f 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74 69  o .** FTS functi
29fb0 6f 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e  onality, or even
29fc0 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63   the integrity-c
29fd0 68 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79  heck, in any way
29fe0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 2c  ..**.** Instead,
29ff0 20 69 74 20 74 65 73 74 73 20 74 68 61 74 20 74   it tests that t
2a000 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 70  he same set of p
2a010 67 6e 6f 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e  gno/rowid combin
2a020 61 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 76  ations are .** v
2a030 69 73 69 74 65 64 20 72 65 67 61 72 64 6c 65 73  isited regardles
2a040 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65  s of whether the
2a050 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69   doclist-index i
2a060 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72  dentified by par
2a070 61 6d 65 74 65 72 73 0a 2a 2a 20 69 53 65 67 69  ameters.** iSegi
2a080 64 2f 69 4c 65 61 66 20 69 73 20 69 74 65 72 61  d/iLeaf is itera
2a090 74 65 64 20 69 6e 20 66 6f 72 77 61 72 64 73 20  ted in forwards 
2a0a0 6f 72 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  or reverse order
2a0b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2a0c0 20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52 65   fts5TestDlidxRe
2a0d0 76 65 72 73 65 28 0a 20 20 46 74 73 35 49 6e 64  verse(.  Fts5Ind
2a0e0 65 78 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 53  ex *p, .  int iS
2a0f0 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  egid,           
2a100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
2a110 6d 65 6e 74 20 69 64 20 74 6f 20 6c 6f 61 64 20  ment id to load 
2a120 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  from */.  int iL
2a130 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20  eaf             
2a140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61            /* Loa
2a150 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  d doclist-index 
2a160 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f  for this leaf */
2a170 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49  .){.  Fts5DlidxI
2a180 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b  ter *pDlidx = 0;
2a190 0a 20 20 75 36 34 20 63 6b 73 75 6d 31 20 3d 20  .  u64 cksum1 = 
2a1a0 31 33 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32  13;.  u64 cksum2
2a1b0 20 3d 20 31 33 3b 0a 0a 20 20 66 6f 72 28 70 44   = 13;..  for(pD
2a1c0 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74  lidx=fts5DlidxIt
2a1d0 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 53 65  erInit(p, 0, iSe
2a1e0 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20  gid, iLeaf);.   
2a1f0 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
2a200 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d  Eof(p, pDlidx)==
2a210 30 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  0;.      fts5Dli
2a220 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44  dxIterNext(p, pD
2a230 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20 20 20 69  lidx).  ){.    i
2a240 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35  64 iRowid = fts5
2a250 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70  DlidxIterRowid(p
2a260 44 6c 69 64 78 29 3b 0a 20 20 20 20 69 6e 74 20  Dlidx);.    int 
2a270 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78  pgno = fts5Dlidx
2a280 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
2a290 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
2a2a0 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20  no>iLeaf );.    
2a2b0 63 6b 73 75 6d 31 20 2b 3d 20 69 52 6f 77 69 64  cksum1 += iRowid
2a2c0 20 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c 33   + ((i64)pgno<<3
2a2d0 32 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c  2);.  }.  fts5Dl
2a2e0 69 64 78 49 74 65 72 46 72 65 65 28 70 44 6c 69  idxIterFree(pDli
2a2f0 64 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20  dx);.  pDlidx = 
2a300 30 3b 0a 0a 20 20 66 6f 72 28 70 44 6c 69 64 78  0;..  for(pDlidx
2a310 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e  =fts5DlidxIterIn
2a320 69 74 28 70 2c 20 31 2c 20 69 53 65 67 69 64 2c  it(p, 1, iSegid,
2a330 20 69 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 66   iLeaf);.      f
2a340 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
2a350 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20  p, pDlidx)==0;. 
2a360 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
2a370 65 72 50 72 65 76 28 70 2c 20 70 44 6c 69 64 78  erPrev(p, pDlidx
2a380 29 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 69  ).  ){.    i64 i
2a390 52 6f 77 69 64 20 3d 20 66 74 73 35 44 6c 69 64  Rowid = fts5Dlid
2a3a0 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64  xIterRowid(pDlid
2a3b0 78 29 3b 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f  x);.    int pgno
2a3c0 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
2a3d0 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20  Pgno(pDlidx);.  
2a3e0 20 20 61 73 73 65 72 74 28 20 66 74 73 35 44 6c    assert( fts5Dl
2a3f0 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69  idxIterPgno(pDli
2a400 64 78 29 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20  dx)>iLeaf );.   
2a410 20 63 6b 73 75 6d 32 20 2b 3d 20 69 52 6f 77 69   cksum2 += iRowi
2a420 64 20 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c  d + ((i64)pgno<<
2a430 33 32 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44  32);.  }.  fts5D
2a440 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 44 6c  lidxIterFree(pDl
2a450 69 64 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d  idx);.  pDlidx =
2a460 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
2a470 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
2a480 6b 73 75 6d 31 21 3d 63 6b 73 75 6d 32 20 29 20  ksum1!=cksum2 ) 
2a490 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2a4a0 52 55 50 54 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  RUPT;.}..static 
2a4b0 69 6e 74 20 66 74 73 35 51 75 65 72 79 43 6b 73  int fts5QueryCks
2a4c0 75 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  um(.  Fts5Index 
2a4d0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
2a4e0 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20 69 6e        /* Fts5 in
2a4f0 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dex object */.  
2a500 69 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e 73  int iIdx,.  cons
2a510 74 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20  t char *z,      
2a520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2a530 6e 64 65 78 20 6b 65 79 20 74 6f 20 71 75 65 72  ndex key to quer
2a540 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  y for */.  int n
2a550 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2a570 7a 65 20 6f 66 20 69 6e 64 65 78 20 6b 65 79 20  ze of index key 
2a580 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
2a590 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2a5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a5b0 20 46 6c 61 67 73 20 66 6f 72 20 46 74 73 35 49   Flags for Fts5I
2a5c0 6e 64 65 78 51 75 65 72 79 20 2a 2f 0a 20 20 75  ndexQuery */.  u
2a5d0 36 34 20 2a 70 43 6b 73 75 6d 20 20 20 20 20 20  64 *pCksum      
2a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a5f0 2a 20 49 4e 2f 4f 55 54 3a 20 43 68 65 63 6b 73  * IN/OUT: Checks
2a600 75 6d 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20  um value */.){. 
2a610 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70   int eDetail = p
2a620 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
2a630 69 6c 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 20  il;.  u64 cksum 
2a640 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 46 74 73  = *pCksum;.  Fts
2a650 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
2a660 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  r = 0;.  int rc 
2a670 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
2a680 65 78 51 75 65 72 79 28 70 2c 20 7a 2c 20 6e 2c  exQuery(p, z, n,
2a690 20 66 6c 61 67 73 2c 20 30 2c 20 26 70 49 74 65   flags, 0, &pIte
2a6a0 72 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 72 63  r);..  while( rc
2a6b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
2a6c0 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  ==sqlite3Fts5Ite
2a6d0 72 45 6f 66 28 70 49 74 65 72 29 20 29 7b 0a 20  rEof(pIter) ){. 
2a6e0 20 20 20 69 36 34 20 72 6f 77 69 64 20 3d 20 70     i64 rowid = p
2a6f0 49 74 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20  Iter->iRowid;.. 
2a700 20 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d     if( eDetail==
2a710 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
2a720 20 29 7b 0a 20 20 20 20 20 20 63 6b 73 75 6d 20   ){.      cksum 
2a730 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  ^= sqlite3Fts5In
2a740 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f  dexEntryCksum(ro
2a750 77 69 64 2c 20 30 2c 20 30 2c 20 69 49 64 78 2c  wid, 0, 0, iIdx,
2a760 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73   z, n);.    }els
2a770 65 7b 0a 20 20 20 20 20 20 46 74 73 35 50 6f 73  e{.      Fts5Pos
2a780 6c 69 73 74 52 65 61 64 65 72 20 73 52 65 61 64  listReader sRead
2a790 65 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 73 71  er;.      for(sq
2a7a0 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
2a7b0 52 65 61 64 65 72 49 6e 69 74 28 70 49 74 65 72  ReaderInit(pIter
2a7c0 2d 3e 70 44 61 74 61 2c 20 70 49 74 65 72 2d 3e  ->pData, pIter->
2a7d0 6e 44 61 74 61 2c 20 26 73 52 65 61 64 65 72 29  nData, &sReader)
2a7e0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 52 65 61  ;.          sRea
2a7f0 64 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20 20  der.bEof==0;.   
2a800 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
2a810 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e  s5PoslistReaderN
2a820 65 78 74 28 26 73 52 65 61 64 65 72 29 0a 20 20  ext(&sReader).  
2a830 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
2a840 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50  nt iCol = FTS5_P
2a850 4f 53 32 43 4f 4c 55 4d 4e 28 73 52 65 61 64 65  OS2COLUMN(sReade
2a860 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20  r.iPos);.       
2a870 20 69 6e 74 20 69 4f 66 66 20 3d 20 46 54 53 35   int iOff = FTS5
2a880 5f 50 4f 53 32 4f 46 46 53 45 54 28 73 52 65 61  _POS2OFFSET(sRea
2a890 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20  der.iPos);.     
2a8a0 20 20 20 63 6b 73 75 6d 20 5e 3d 20 73 71 6c 69     cksum ^= sqli
2a8b0 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72  te3Fts5IndexEntr
2a8c0 79 43 6b 73 75 6d 28 72 6f 77 69 64 2c 20 69 43  yCksum(rowid, iC
2a8d0 6f 6c 2c 20 69 4f 66 66 2c 20 69 49 64 78 2c 20  ol, iOff, iIdx, 
2a8e0 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, n);.      }. 
2a8f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2a900 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a910 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a920 46 74 73 35 49 74 65 72 4e 65 78 74 28 70 49 74  Fts5IterNext(pIt
2a930 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
2a940 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
2a950 43 6c 6f 73 65 28 70 49 74 65 72 29 3b 0a 0a 20  Close(pIter);.. 
2a960 20 2a 70 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d   *pCksum = cksum
2a970 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2a980 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
2a990 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 70  nction is also p
2a9a0 75 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61  urely an interna
2a9b0 6c 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73 20  l test. It does 
2a9c0 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 74  not contribute t
2a9d0 6f 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74 69  o .** FTS functi
2a9e0 6f 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e  onality, or even
2a9f0 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63   the integrity-c
2aa00 68 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79  heck, in any way
2aa10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2aa20 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 0a 20   fts5TestTerm(. 
2aa30 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
2aa40 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 50    Fts5Buffer *pP
2aa50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  rev,            
2aa60 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65    /* Previous te
2aa70 72 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  rm */.  const ch
2aa80 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 20 20  ar *z, int n,   
2aa90 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69          /* Possi
2aaa0 62 6c 79 20 6e 65 77 20 74 65 72 6d 20 74 6f 20  bly new term to 
2aab0 74 65 73 74 20 2a 2f 0a 20 20 75 36 34 20 65 78  test */.  u64 ex
2aac0 70 65 63 74 65 64 2c 0a 20 20 75 36 34 20 2a 70  pected,.  u64 *p
2aad0 43 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72  Cksum.){.  int r
2aae0 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28  c = p->rc;.  if(
2aaf0 20 70 50 72 65 76 2d 3e 6e 3d 3d 30 20 29 7b 0a   pPrev->n==0 ){.
2ab00 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
2ab10 74 28 26 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c  t(&rc, pPrev, n,
2ab20 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a   (const u8*)z);.
2ab30 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 72 63    }else.  if( rc
2ab40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
2ab50 70 50 72 65 76 2d 3e 6e 21 3d 6e 20 7c 7c 20 6d  pPrev->n!=n || m
2ab60 65 6d 63 6d 70 28 70 50 72 65 76 2d 3e 70 2c 20  emcmp(pPrev->p, 
2ab70 7a 2c 20 6e 29 29 20 29 7b 0a 20 20 20 20 75 36  z, n)) ){.    u6
2ab80 34 20 63 6b 73 75 6d 33 20 3d 20 2a 70 43 6b 73  4 cksum3 = *pCks
2ab90 75 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  um;.    const ch
2aba0 61 72 20 2a 7a 54 65 72 6d 20 3d 20 28 63 6f 6e  ar *zTerm = (con
2abb0 73 74 20 63 68 61 72 2a 29 26 70 50 72 65 76 2d  st char*)&pPrev-
2abc0 3e 70 5b 31 5d 3b 20 20 2f 2a 20 74 65 72 6d 20  >p[1];  /* term 
2abd0 73 61 6e 73 20 70 72 65 66 69 78 2d 62 79 74 65  sans prefix-byte
2abe0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 72   */.    int nTer
2abf0 6d 20 3d 20 70 50 72 65 76 2d 3e 6e 2d 31 3b 20  m = pPrev->n-1; 
2ac00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2ac10 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62  ze of zTerm in b
2ac20 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ytes */.    int 
2ac30 69 49 64 78 20 3d 20 28 70 50 72 65 76 2d 3e 70  iIdx = (pPrev->p
2ac40 5b 30 5d 20 2d 20 46 54 53 35 5f 4d 41 49 4e 5f  [0] - FTS5_MAIN_
2ac50 50 52 45 46 49 58 29 3b 0a 20 20 20 20 69 6e 74  PREFIX);.    int
2ac60 20 66 6c 61 67 73 20 3d 20 28 69 49 64 78 3d 3d   flags = (iIdx==
2ac70 30 20 3f 20 30 20 3a 20 46 54 53 35 49 4e 44 45  0 ? 0 : FTS5INDE
2ac80 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 29 3b  X_QUERY_PREFIX);
2ac90 0a 20 20 20 20 75 36 34 20 63 6b 31 20 3d 20 30  .    u64 ck1 = 0
2aca0 3b 0a 20 20 20 20 75 36 34 20 63 6b 32 20 3d 20  ;.    u64 ck2 = 
2acb0 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  0;..    /* Check
2acc0 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   that the result
2acd0 73 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 41  s returned for A
2ace0 53 43 20 61 6e 64 20 44 45 53 43 20 71 75 65 72  SC and DESC quer
2acf0 69 65 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ies are.    ** t
2ad00 68 65 20 73 61 6d 65 2e 20 49 66 20 6e 6f 74 2c  he same. If not,
2ad10 20 63 61 6c 6c 20 74 68 69 73 20 63 6f 72 72 75   call this corru
2ad20 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 72  ption.  */.    r
2ad30 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73  c = fts5QueryCks
2ad40 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72  um(p, iIdx, zTer
2ad50 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c  m, nTerm, flags,
2ad60 20 26 63 6b 31 29 3b 0a 20 20 20 20 69 66 28 20   &ck1);.    if( 
2ad70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ad80 0a 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66  .      int f = f
2ad90 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51  lags|FTS5INDEX_Q
2ada0 55 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20 20  UERY_DESC;.     
2adb0 20 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43   rc = fts5QueryC
2adc0 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54  ksum(p, iIdx, zT
2add0 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26  erm, nTerm, f, &
2ade0 63 6b 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ck2);.    }.    
2adf0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ae00 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20  K && ck1!=ck2 ) 
2ae10 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2ae20 54 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  T;..    /* If th
2ae30 69 73 20 69 73 20 61 20 70 72 65 66 69 78 20 71  is is a prefix q
2ae40 75 65 72 79 2c 20 63 68 65 63 6b 20 74 68 61 74  uery, check that
2ae50 20 74 68 65 20 72 65 73 75 6c 74 73 20 72 65 74   the results ret
2ae60 75 72 6e 65 64 20 69 66 20 74 68 65 0a 20 20 20  urned if the.   
2ae70 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73   ** the index is
2ae80 20 64 69 73 61 62 6c 65 64 20 61 72 65 20 74 68   disabled are th
2ae90 65 20 73 61 6d 65 2e 20 49 6e 20 62 6f 74 68 20  e same. In both 
2aea0 41 53 43 20 61 6e 64 20 44 45 53 43 20 6f 72 64  ASC and DESC ord
2aeb0 65 72 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  er. .    **.    
2aec0 2a 2a 20 54 68 69 73 20 63 68 65 63 6b 20 6d 61  ** This check ma
2aed0 79 20 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72  y only be perfor
2aee0 6d 65 64 20 69 66 20 74 68 65 20 68 61 73 68 20  med if the hash 
2aef0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 20  table is empty. 
2af00 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 62  This.    ** is b
2af10 65 63 61 75 73 65 20 74 68 65 20 68 61 73 68 20  ecause the hash 
2af20 74 61 62 6c 65 20 6f 6e 6c 79 20 73 75 70 70 6f  table only suppo
2af30 72 74 73 20 61 20 73 69 6e 67 6c 65 20 73 63 61  rts a single sca
2af40 6e 20 71 75 65 72 79 20 61 74 0a 20 20 20 20 2a  n query at.    *
2af50 2a 20 61 20 74 69 6d 65 2c 20 61 6e 64 20 74 68  * a time, and th
2af60 65 20 6d 75 6c 74 69 2d 69 74 65 72 20 6c 6f 6f  e multi-iter loo
2af70 70 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68 69  p from which thi
2af80 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2af90 6c 6c 65 64 0a 20 20 20 20 2a 2a 20 69 73 20 61  lled.    ** is a
2afa0 6c 72 65 61 64 79 20 70 65 72 66 6f 72 6d 69 6e  lready performin
2afb0 67 20 73 75 63 68 20 61 20 73 63 61 6e 2e 20 2a  g such a scan. *
2afc0 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 50 65  /.    if( p->nPe
2afd0 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 7b 0a  ndingData==0 ){.
2afe0 20 20 20 20 20 20 69 66 28 20 69 49 64 78 3e 30        if( iIdx>0
2aff0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2b000 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  K ){.        int
2b010 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49   f = flags|FTS5I
2b020 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f  NDEX_QUERY_TEST_
2b030 4e 4f 49 44 58 3b 0a 20 20 20 20 20 20 20 20 63  NOIDX;.        c
2b040 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  k2 = 0;.        
2b050 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b  rc = fts5QueryCk
2b060 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65  sum(p, iIdx, zTe
2b070 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63  rm, nTerm, f, &c
2b080 6b 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  k2);.        if(
2b090 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2b0a0 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20  & ck1!=ck2 ) rc 
2b0b0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2b0c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2b0d0 28 20 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d  ( iIdx>0 && rc==
2b0e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b0f0 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61       int f = fla
2b100 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45  gs|FTS5INDEX_QUE
2b110 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 7c 46 54  RY_TEST_NOIDX|FT
2b120 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
2b130 53 43 3b 0a 20 20 20 20 20 20 20 20 63 6b 32 20  SC;.        ck2 
2b140 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
2b150 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d  = fts5QueryCksum
2b160 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c  (p, iIdx, zTerm,
2b170 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29   nTerm, f, &ck2)
2b180 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2b190 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
2b1a0 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46  k1!=ck2 ) rc = F
2b1b0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2b1c0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2b1d0 63 6b 73 75 6d 33 20 5e 3d 20 63 6b 31 3b 0a 20  cksum3 ^= ck1;. 
2b1e0 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
2b1f0 28 26 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20  (&rc, pPrev, n, 
2b200 28 63 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 0a  (const u8*)z);..
2b210 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b220 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 33 21  TE_OK && cksum3!
2b230 3d 65 78 70 65 63 74 65 64 20 29 7b 0a 20 20 20  =expected ){.   
2b240 20 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52     rc = FTS5_COR
2b250 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RUPT;.    }.    
2b260 2a 70 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 33  *pCksum = cksum3
2b270 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20  ;.  }.  p->rc = 
2b280 72 63 3b 0a 7d 0a 20 0a 23 65 6c 73 65 0a 23 20  rc;.}. .#else.# 
2b290 64 65 66 69 6e 65 20 66 74 73 35 54 65 73 74 44  define fts5TestD
2b2a0 6c 69 64 78 52 65 76 65 72 73 65 28 78 2c 79 2c  lidxReverse(x,y,
2b2b0 7a 29 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35  z).# define fts5
2b2c0 54 65 73 74 54 65 72 6d 28 75 2c 76 2c 77 2c 78  TestTerm(u,v,w,x
2b2d0 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,y,z).#endif../*
2b2e0 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 3a 0a  .** Check that:.
2b2f0 2a 2a 0a 2a 2a 20 20 20 31 29 20 41 6c 6c 20 6c  **.**   1) All l
2b300 65 61 76 65 73 20 6f 66 20 70 53 65 67 20 62 65  eaves of pSeg be
2b310 74 77 65 65 6e 20 69 46 69 72 73 74 20 61 6e 64  tween iFirst and
2b320 20 69 4c 61 73 74 20 28 69 6e 63 6c 75 73 69 76   iLast (inclusiv
2b330 65 29 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20  e) exist and.** 
2b340 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72       contain zer
2b350 6f 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 32 29  o terms..**   2)
2b360 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f 66 20 70   All leaves of p
2b370 53 65 67 20 62 65 74 77 65 65 6e 20 69 4e 6f 52  Seg between iNoR
2b380 6f 77 69 64 20 61 6e 64 20 69 4c 61 73 74 20 28  owid and iLast (
2b390 69 6e 63 6c 75 73 69 76 65 29 20 65 78 69 73 74  inclusive) exist
2b3a0 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e   and.**      con
2b3b0 74 61 69 6e 20 7a 65 72 6f 20 72 6f 77 69 64 73  tain zero rowids
2b3c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2b3d0 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72   fts5IndexIntegr
2b3e0 69 74 79 43 68 65 63 6b 45 6d 70 74 79 28 0a 20  ityCheckEmpty(. 
2b3f0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20   Fts5Index *p,. 
2b400 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
2b410 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20  gment *pSeg,    
2b420 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 63   /* Segment to c
2b430 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f  heck internal co
2b440 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 20 20 69  nsistency */.  i
2b450 6e 74 20 69 46 69 72 73 74 2c 0a 20 20 69 6e 74  nt iFirst,.  int
2b460 20 69 4e 6f 52 6f 77 69 64 2c 0a 20 20 69 6e 74   iNoRowid,.  int
2b470 20 69 4c 61 73 74 0a 29 7b 0a 20 20 69 6e 74 20   iLast.){.  int 
2b480 69 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63 68 65  i;..  /* Now che
2b490 63 6b 20 74 68 61 74 20 74 68 65 20 69 74 65 72  ck that the iter
2b4a0 2e 6e 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66  .nEmpty leaves f
2b4b0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72  ollowing the cur
2b4c0 72 65 6e 74 20 6c 65 61 66 0a 20 20 2a 2a 20 28  rent leaf.  ** (
2b4d0 61 29 20 65 78 69 73 74 20 61 6e 64 20 28 62 29  a) exist and (b)
2b4e0 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d   contain no term
2b4f0 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 69 46  s. */.  for(i=iF
2b500 69 72 73 74 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c  irst; p->rc==SQL
2b510 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 69 4c 61  ITE_OK && i<=iLa
2b520 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74  st; i++){.    Ft
2b530 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20  s5Data *pLeaf = 
2b540 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
2b550 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
2b560 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  ID(pSeg->iSegid,
2b570 20 69 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c   i));.    if( pL
2b580 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 66 28  eaf ){.      if(
2b590 20 21 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d   !fts5LeafIsTerm
2b5a0 6c 65 73 73 28 70 4c 65 61 66 29 20 29 20 70 2d  less(pLeaf) ) p-
2b5b0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2b5c0 50 54 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3e  PT;.      if( i>
2b5d0 3d 69 4e 6f 52 6f 77 69 64 20 26 26 20 30 21 3d  =iNoRowid && 0!=
2b5e0 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77  fts5LeafFirstRow
2b5f0 69 64 4f 66 66 28 70 4c 65 61 66 29 20 29 20 70  idOff(pLeaf) ) p
2b600 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2b610 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  UPT;.    }.    f
2b620 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
2b630 4c 65 61 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  Leaf);.  }.}..st
2b640 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
2b650 74 65 67 72 69 74 79 43 68 65 63 6b 50 67 69 64  tegrityCheckPgid
2b660 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  x(Fts5Index *p, 
2b670 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 29  Fts5Data *pLeaf)
2b680 7b 0a 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66  {.  int iTermOff
2b690 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 69 3b 0a   = 0;.  int ii;.
2b6a0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75  .  Fts5Buffer bu
2b6b0 66 31 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 20 20  f1 = {0,0,0};.  
2b6c0 46 74 73 35 42 75 66 66 65 72 20 62 75 66 32 20  Fts5Buffer buf2 
2b6d0 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 0a 20 20 69 69  = {0,0,0};..  ii
2b6e0 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66   = pLeaf->szLeaf
2b6f0 3b 0a 20 20 77 68 69 6c 65 28 20 69 69 3c 70 4c  ;.  while( ii<pL
2b700 65 61 66 2d 3e 6e 6e 20 26 26 20 70 2d 3e 72 63  eaf->nn && p->rc
2b710 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b720 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
2b730 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 69 6e  int iOff;.    in
2b740 74 20 6e 49 6e 63 72 3b 0a 0a 20 20 20 20 69 69  t nIncr;..    ii
2b750 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
2b760 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 69  t32(&pLeaf->p[ii
2b770 5d 2c 20 6e 49 6e 63 72 29 3b 0a 20 20 20 20 69  ], nIncr);.    i
2b780 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 49 6e 63 72  TermOff += nIncr
2b790 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65  ;.    iOff = iTe
2b7a0 72 6d 4f 66 66 3b 0a 0a 20 20 20 20 69 66 28 20  rmOff;..    if( 
2b7b0 69 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c  iOff>=pLeaf->szL
2b7c0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  eaf ){.      p->
2b7d0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2b7e0 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
2b7f0 20 69 54 65 72 6d 4f 66 66 3d 3d 6e 49 6e 63 72   iTermOff==nIncr
2b800 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
2b810 79 74 65 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  yte;.      iOff 
2b820 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
2b830 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  32(&pLeaf->p[iOf
2b840 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  f], nByte);.    
2b850 20 20 69 66 28 20 28 69 4f 66 66 2b 6e 42 79 74    if( (iOff+nByt
2b860 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  e)>pLeaf->szLeaf
2b870 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
2b880 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2b890 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2b8a0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
2b8b0 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rSet(&p->rc, &bu
2b8c0 66 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65 61  f1, nByte, &pLea
2b8d0 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20  f->p[iOff]);.   
2b8e0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2b8f0 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 2c        int nKeep,
2b900 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 69 4f   nByte;.      iO
2b910 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
2b920 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b  int32(&pLeaf->p[
2b930 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20  iOff], nKeep);. 
2b940 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
2b950 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
2b960 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42  eaf->p[iOff], nB
2b970 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  yte);.      if( 
2b980 6e 4b 65 65 70 3e 62 75 66 31 2e 6e 20 7c 7c 20  nKeep>buf1.n || 
2b990 28 69 4f 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65  (iOff+nByte)>pLe
2b9a0 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
2b9b0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
2b9c0 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2b9d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2b9e0 20 62 75 66 31 2e 6e 20 3d 20 6e 4b 65 65 70 3b   buf1.n = nKeep;
2b9f0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
2ba00 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
2ba10 2d 3e 72 63 2c 20 26 62 75 66 31 2c 20 6e 42 79  ->rc, &buf1, nBy
2ba20 74 65 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  te, &pLeaf->p[iO
2ba30 66 66 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ff]);.      }.. 
2ba40 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
2ba50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ba60 20 20 20 20 20 72 65 73 20 3d 20 66 74 73 35 42       res = fts5B
2ba70 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26 62 75  ufferCompare(&bu
2ba80 66 31 2c 20 26 62 75 66 32 29 3b 0a 20 20 20 20  f1, &buf2);.    
2ba90 20 20 20 20 69 66 28 20 72 65 73 3c 3d 30 20 29      if( res<=0 )
2baa0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2bab0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  RRUPT;.      }. 
2bac0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66     }.    fts5Buf
2bad0 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26  ferSet(&p->rc, &
2bae0 62 75 66 32 2c 20 62 75 66 31 2e 6e 2c 20 62 75  buf2, buf1.n, bu
2baf0 66 31 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20 66 74  f1.p);.  }..  ft
2bb00 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75  s5BufferFree(&bu
2bb10 66 31 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  f1);.  fts5Buffe
2bb20 72 46 72 65 65 28 26 62 75 66 32 29 3b 0a 7d 0a  rFree(&buf2);.}.
2bb30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
2bb40 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43  5IndexIntegrityC
2bb50 68 65 63 6b 53 65 67 6d 65 6e 74 28 0a 20 20 46  heckSegment(.  F
2bb60 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
2bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bb80 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
2bb90 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
2bba0 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
2bbb0 2a 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53 65  *pSeg      /* Se
2bbc0 67 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69  gment to check i
2bbd0 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65  nternal consiste
2bbe0 6e 63 79 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  ncy */.){.  Fts5
2bbf0 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
2bc00 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
2bc10 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
2bc20 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  tmt = 0;.  int r
2bc30 63 32 3b 0a 20 20 69 6e 74 20 69 49 64 78 50 72  c2;.  int iIdxPr
2bc40 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70  evLeaf = pSeg->p
2bc50 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20 69 6e  gnoFirst-1;.  in
2bc60 74 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66  t iDlidxPrevLeaf
2bc70 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73   = pSeg->pgnoLas
2bc80 74 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d 3e  t;..  if( pSeg->
2bc90 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29 20 72  pgnoFirst==0 ) r
2bca0 65 74 75 72 6e 3b 0a 0a 20 20 66 74 73 35 49 6e  eturn;..  fts5In
2bcb0 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70  dexPrepareStmt(p
2bcc0 2c 20 26 70 53 74 6d 74 2c 20 73 71 6c 69 74 65  , &pStmt, sqlite
2bcd0 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
2bce0 20 22 53 45 4c 45 43 54 20 73 65 67 69 64 2c 20   "SELECT segid, 
2bcf0 74 65 72 6d 2c 20 28 70 67 6e 6f 3e 3e 31 29 2c  term, (pgno>>1),
2bd00 20 28 70 67 6e 6f 26 31 29 20 46 52 4f 4d 20 25   (pgno&1) FROM %
2bd10 51 2e 27 25 71 5f 69 64 78 27 20 57 48 45 52 45  Q.'%q_idx' WHERE
2bd20 20 73 65 67 69 64 3d 25 64 22 2c 0a 20 20 20 20   segid=%d",.    
2bd30 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
2bd40 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 2c 20  pConfig->zName, 
2bd50 70 53 65 67 2d 3e 69 53 65 67 69 64 0a 20 20 29  pSeg->iSegid.  )
2bd60 29 3b 0a 0a 20 20 2f 2a 20 49 74 65 72 61 74 65  );..  /* Iterate
2bd70 20 74 68 72 6f 75 67 68 20 74 68 65 20 62 2d 74   through the b-t
2bd80 72 65 65 20 68 69 65 72 61 72 63 68 79 2e 20 20  ree hierarchy.  
2bd90 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  */.  while( p->r
2bda0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2bdb0 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
2bdc0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
2bdd0 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 3b  ){.    i64 iRow;
2bde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdf0 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f       /* Rowid fo
2be00 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20  r this leaf */. 
2be10 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65     Fts5Data *pLe
2be20 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
2be30 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 69   /* Data for thi
2be40 73 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 20 20 69  s leaf */..    i
2be50 6e 74 20 6e 49 64 78 54 65 72 6d 20 3d 20 73 71  nt nIdxTerm = sq
2be60 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
2be70 65 73 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  es(pStmt, 1);.  
2be80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
2be90 64 78 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20  dxTerm = (const 
2bea0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
2beb0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
2bec0 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 69 49 64   1);.    int iId
2bed0 78 4c 65 61 66 20 3d 20 73 71 6c 69 74 65 33 5f  xLeaf = sqlite3_
2bee0 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
2bef0 2c 20 32 29 3b 0a 20 20 20 20 69 6e 74 20 62 49  , 2);.    int bI
2bf00 64 78 44 6c 69 64 78 20 3d 20 73 71 6c 69 74 65  dxDlidx = sqlite
2bf10 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
2bf20 6d 74 2c 20 33 29 3b 0a 0a 20 20 20 20 2f 2a 20  mt, 3);..    /* 
2bf30 49 66 20 74 68 65 20 6c 65 61 66 20 69 6e 20 71  If the leaf in q
2bf40 75 65 73 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  uestion has alre
2bf50 61 64 79 20 62 65 65 6e 20 74 72 69 6d 6d 65 64  ady been trimmed
2bf60 20 66 72 6f 6d 20 74 68 65 20 73 65 67 6d 65 6e   from the segmen
2bf70 74 2c 20 0a 20 20 20 20 2a 2a 20 69 67 6e 6f 72  t, .    ** ignor
2bf80 65 20 74 68 69 73 20 62 2d 74 72 65 65 20 65 6e  e this b-tree en
2bf90 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  try. Otherwise, 
2bfa0 6c 6f 61 64 20 69 74 20 69 6e 74 6f 20 6d 65 6d  load it into mem
2bfb0 6f 72 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ory. */.    if( 
2bfc0 69 49 64 78 4c 65 61 66 3c 70 53 65 67 2d 3e 70  iIdxLeaf<pSeg->p
2bfd0 67 6e 6f 46 69 72 73 74 20 29 20 63 6f 6e 74 69  gnoFirst ) conti
2bfe0 6e 75 65 3b 0a 20 20 20 20 69 52 6f 77 20 3d 20  nue;.    iRow = 
2bff0 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
2c000 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  ID(pSeg->iSegid,
2c010 20 69 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20   iIdxLeaf);.    
2c020 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61  pLeaf = fts5Data
2c030 52 65 61 64 28 70 2c 20 69 52 6f 77 29 3b 0a 20  Read(p, iRow);. 
2c040 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20     if( pLeaf==0 
2c050 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a  ) break;..    /*
2c060 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
2c070 6c 65 61 66 20 63 6f 6e 74 61 69 6e 73 20 61 74  leaf contains at
2c080 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2c   least one term,
2c090 20 61 6e 64 20 74 68 61 74 20 69 74 20 69 73 20   and that it is 
2c0a0 65 71 75 61 6c 0a 20 20 20 20 2a 2a 20 74 6f 20  equal.    ** to 
2c0b0 6f 72 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  or larger than t
2c0c0 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 69 6e 20  he split-key in 
2c0d0 7a 49 64 78 54 65 72 6d 2e 20 20 41 6c 73 6f 20  zIdxTerm.  Also 
2c0e0 63 68 65 63 6b 20 74 68 61 74 20 69 66 20 74 68  check that if th
2c0f0 65 72 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c  ere.    ** is al
2c100 73 6f 20 61 20 72 6f 77 69 64 20 70 6f 69 6e 74  so a rowid point
2c110 65 72 20 77 69 74 68 69 6e 20 74 68 65 20 6c 65  er within the le
2c120 61 66 20 70 61 67 65 20 68 65 61 64 65 72 2c 20  af page header, 
2c130 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 0a 20  it points to a. 
2c140 20 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 62     ** location b
2c150 65 66 6f 72 65 20 74 68 65 20 74 65 72 6d 2e 20  efore the term. 
2c160 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 61   */.    if( pLea
2c170 66 2d 3e 6e 6e 3c 3d 70 4c 65 61 66 2d 3e 73 7a  f->nn<=pLeaf->sz
2c180 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 2d  Leaf ){.      p-
2c190 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2c1a0 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
2c1b0 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 20 20       int iOff;  
2c1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c1d0 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
2c1e0 72 73 74 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66  rst term on leaf
2c1f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 52   */.      int iR
2c200 6f 77 69 64 4f 66 66 3b 20 20 20 20 20 20 20 20  owidOff;        
2c210 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2c220 6f 66 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  of first rowid o
2c230 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 20 20  n leaf */.      
2c240 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20  int nTerm;      
2c250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2c260 69 7a 65 20 6f 66 20 74 65 72 6d 20 6f 6e 20 6c  ize of term on l
2c270 65 61 66 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  eaf in bytes */.
2c280 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 20 20        int res;  
2c290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2a0 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
2c2b0 6f 66 20 74 65 72 6d 20 61 6e 64 20 73 70 6c 69  of term and spli
2c2c0 74 2d 6b 65 79 20 2a 2f 0a 0a 20 20 20 20 20 20  t-key */..      
2c2d0 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46  iOff = fts5LeafF
2c2e0 69 72 73 74 54 65 72 6d 4f 66 66 28 70 4c 65 61  irstTermOff(pLea
2c2f0 66 29 3b 0a 20 20 20 20 20 20 69 52 6f 77 69 64  f);.      iRowid
2c300 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69  Off = fts5LeafFi
2c310 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61  rstRowidOff(pLea
2c320 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 52  f);.      if( iR
2c330 6f 77 69 64 4f 66 66 3e 3d 69 4f 66 66 20 29 7b  owidOff>=iOff ){
2c340 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
2c350 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2c360 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2c370 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
2c380 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65  GetVarint32(&pLe
2c390 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65  af->p[iOff], nTe
2c3a0 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73  rm);.        res
2c3b0 20 3d 20 6d 65 6d 63 6d 70 28 26 70 4c 65 61 66   = memcmp(&pLeaf
2c3c0 2d 3e 70 5b 69 4f 66 66 5d 2c 20 7a 49 64 78 54  ->p[iOff], zIdxT
2c3d0 65 72 6d 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20  erm, MIN(nTerm, 
2c3e0 6e 49 64 78 54 65 72 6d 29 29 3b 0a 20 20 20 20  nIdxTerm));.    
2c3f0 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
2c400 20 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20 6e   res = nTerm - n
2c410 49 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  IdxTerm;.       
2c420 20 69 66 28 20 72 65 73 3c 30 20 29 20 70 2d 3e   if( res<0 ) p->
2c430 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2c440 54 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  T;.      }..    
2c450 20 20 66 74 73 35 49 6e 74 65 67 72 69 74 79 43    fts5IntegrityC
2c460 68 65 63 6b 50 67 69 64 78 28 70 2c 20 70 4c 65  heckPgidx(p, pLe
2c470 61 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  af);.    }.    f
2c480 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
2c490 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20 70  Leaf);.    if( p
2c4a0 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20  ->rc ) break;.. 
2c4b0 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20     /* Now check 
2c4c0 74 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45  that the iter.nE
2c4d0 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c  mpty leaves foll
2c4e0 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  owing the curren
2c4f0 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28 61  t leaf.    ** (a
2c500 29 20 65 78 69 73 74 20 61 6e 64 20 28 62 29 20  ) exist and (b) 
2c510 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73  contain no terms
2c520 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 49 6e 64  . */.    fts5Ind
2c530 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  exIntegrityCheck
2c540 45 6d 70 74 79 28 0a 20 20 20 20 20 20 20 20 70  Empty(.        p
2c550 2c 20 70 53 65 67 2c 20 69 49 64 78 50 72 65 76  , pSeg, iIdxPrev
2c560 4c 65 61 66 2b 31 2c 20 69 44 6c 69 64 78 50 72  Leaf+1, iDlidxPr
2c570 65 76 4c 65 61 66 2b 31 2c 20 69 49 64 78 4c 65  evLeaf+1, iIdxLe
2c580 61 66 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20 20  af-1.    );.    
2c590 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61  if( p->rc ) brea
2c5a0 6b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  k;..    /* If th
2c5b0 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74  ere is a doclist
2c5c0 2d 69 6e 64 65 78 2c 20 63 68 65 63 6b 20 74 68  -index, check th
2c5d0 61 74 20 69 74 20 6c 6f 6f 6b 73 20 72 69 67 68  at it looks righ
2c5e0 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 49  t. */.    if( bI
2c5f0 64 78 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20  dxDlidx ){.     
2c600 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
2c610 70 44 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20  pDlidx = 0;  /* 
2c620 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  For iterating th
2c630 72 6f 75 67 68 20 64 6f 63 6c 69 73 74 20 69 6e  rough doclist in
2c640 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  dex */.      int
2c650 20 69 50 72 65 76 4c 65 61 66 20 3d 20 69 49 64   iPrevLeaf = iId
2c660 78 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74  xLeaf;.      int
2c670 20 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e   iSegid = pSeg->
2c680 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69 6e  iSegid;.      in
2c690 74 20 69 50 67 20 3d 20 30 3b 0a 20 20 20 20 20  t iPg = 0;.     
2c6a0 20 69 36 34 20 69 4b 65 79 3b 0a 0a 20 20 20 20   i64 iKey;..    
2c6b0 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73    for(pDlidx=fts
2c6c0 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70  5DlidxIterInit(p
2c6d0 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69 49 64  , 0, iSegid, iId
2c6e0 78 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  xLeaf);.        
2c6f0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45    fts5DlidxIterE
2c700 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30  of(p, pDlidx)==0
2c710 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
2c720 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c  DlidxIterNext(p,
2c730 20 70 44 6c 69 64 78 29 0a 20 20 20 20 20 20 29   pDlidx).      )
2c740 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  {..        /* Ch
2c750 65 63 6b 20 61 6e 79 20 72 6f 77 69 64 2d 6c 65  eck any rowid-le
2c760 73 73 20 70 61 67 65 73 20 74 68 61 74 20 6f 63  ss pages that oc
2c770 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20 63  cur before the c
2c780 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a  urrent leaf. */.
2c790 20 20 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d          for(iPg=
2c7a0 69 50 72 65 76 4c 65 61 66 2b 31 3b 20 69 50 67  iPrevLeaf+1; iPg
2c7b0 3c 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67  <fts5DlidxIterPg
2c7c0 6e 6f 28 70 44 6c 69 64 78 29 3b 20 69 50 67 2b  no(pDlidx); iPg+
2c7d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4b  +){.          iK
2c7e0 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  ey = FTS5_SEGMEN
2c7f0 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20  T_ROWID(iSegid, 
2c800 69 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iPg);.          
2c810 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61  pLeaf = fts5Data
2c820 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20  Read(p, iKey);. 
2c830 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65           if( pLe
2c840 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
2c850 20 20 69 66 28 20 66 74 73 35 4c 65 61 66 46 69    if( fts5LeafFi
2c860 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61  rstRowidOff(pLea
2c870 66 29 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20  f)!=0 ) p->rc = 
2c880 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2c890 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61            fts5Da
2c8a0 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29  taRelease(pLeaf)
2c8b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2c8c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c8d0 69 50 72 65 76 4c 65 61 66 20 3d 20 66 74 73 35  iPrevLeaf = fts5
2c8e0 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44  DlidxIterPgno(pD
2c8f0 6c 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20  lidx);..        
2c900 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
2c910 65 20 6c 65 61 66 20 70 61 67 65 20 69 6e 64 69  e leaf page indi
2c920 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65  cated by the ite
2c930 72 61 74 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65  rator really doe
2c940 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  s.        ** con
2c950 74 61 69 6e 20 74 68 65 20 72 6f 77 69 64 20 73  tain the rowid s
2c960 75 67 67 65 73 74 65 64 20 62 79 20 74 68 65 20  uggested by the 
2c970 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  same. */.       
2c980 20 69 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47   iKey = FTS5_SEG
2c990 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69  MENT_ROWID(iSegi
2c9a0 64 2c 20 69 50 72 65 76 4c 65 61 66 29 3b 0a 20  d, iPrevLeaf);. 
2c9b0 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66         pLeaf = f
2c9c0 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
2c9d0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
2c9e0 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ( pLeaf ){.     
2c9f0 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b       i64 iRowid;
2ca00 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
2ca10 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c  RowidOff = fts5L
2ca20 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
2ca30 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
2ca40 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46     ASSERT_SZLEAF
2ca50 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  _OK(pLeaf);.    
2ca60 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64        if( iRowid
2ca70 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65  Off>=pLeaf->szLe
2ca80 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
2ca90 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
2caa0 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
2cab0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2cac0 20 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69       fts5GetVari
2cad0 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f  nt(&pLeaf->p[iRo
2cae0 77 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  widOff], (u64*)&
2caf0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
2cb00 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 21       if( iRowid!
2cb10 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f  =fts5DlidxIterRo
2cb20 77 69 64 28 70 44 6c 69 64 78 29 20 29 20 70 2d  wid(pDlidx) ) p-
2cb30 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2cb40 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  PT;.          }.
2cb50 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61            fts5Da
2cb60 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29  taRelease(pLeaf)
2cb70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2cb80 20 20 7d 0a 0a 20 20 20 20 20 20 69 44 6c 69 64    }..      iDlid
2cb90 78 50 72 65 76 4c 65 61 66 20 3d 20 69 50 67 3b  xPrevLeaf = iPg;
2cba0 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
2cbb0 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29  IterFree(pDlidx)
2cbc0 3b 0a 20 20 20 20 20 20 66 74 73 35 54 65 73 74  ;.      fts5Test
2cbd0 44 6c 69 64 78 52 65 76 65 72 73 65 28 70 2c 20  DlidxReverse(p, 
2cbe0 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66  iSegid, iIdxLeaf
2cbf0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2cc00 20 20 20 20 69 44 6c 69 64 78 50 72 65 76 4c 65      iDlidxPrevLe
2cc10 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  af = pSeg->pgnoL
2cc20 61 73 74 3b 0a 20 20 20 20 20 20 2f 2a 20 54 4f  ast;.      /* TO
2cc30 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 72 65 20  DO: Check there 
2cc40 69 73 20 6e 6f 20 64 6f 63 6c 69 73 74 20 69 6e  is no doclist in
2cc50 64 65 78 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20  dex */.    }..  
2cc60 20 20 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d    iIdxPrevLeaf =
2cc70 20 69 49 64 78 4c 65 61 66 3b 0a 20 20 7d 0a 0a   iIdxLeaf;.  }..
2cc80 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
2cc90 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2cca0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
2ccb0 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20  LITE_OK ) p->rc 
2ccc0 3d 20 72 63 32 3b 0a 0a 20 20 2f 2a 20 50 61 67  = rc2;..  /* Pag
2ccd0 65 20 69 74 65 72 2e 69 4c 65 61 66 20 6d 75 73  e iter.iLeaf mus
2cce0 74 20 6e 6f 77 20 62 65 20 74 68 65 20 72 69 67  t now be the rig
2ccf0 68 74 6d 6f 73 74 20 6c 65 61 66 2d 70 61 67 65  htmost leaf-page
2cd00 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20   in the segment 
2cd10 2a 2f 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70  */.#if 0.  if( p
2cd20 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
2cd30 26 26 20 69 74 65 72 2e 69 4c 65 61 66 21 3d 70  && iter.iLeaf!=p
2cd40 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b  Seg->pgnoLast ){
2cd50 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53  .    p->rc = FTS
2cd60 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 23  5_CORRUPT;.  }.#
2cd70 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
2cd80 52 75 6e 20 69 6e 74 65 72 6e 61 6c 20 63 68 65  Run internal che
2cd90 63 6b 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68  cks to ensure th
2cda0 61 74 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  at the FTS index
2cdb0 20 28 61 29 20 69 73 20 69 6e 74 65 72 6e 61 6c   (a) is internal
2cdc0 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65 6e  ly .** consisten
2cdd0 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69  t and (b) contai
2cde0 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 77  ns entries for w
2cdf0 68 69 63 68 20 74 68 65 20 58 4f 52 20 6f 66 20  hich the XOR of 
2ce00 74 68 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a  the checksums.**
2ce10 20 61 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62   as calculated b
2ce20 79 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  y sqlite3Fts5Ind
2ce30 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 29 20 69  exEntryCksum() i
2ce40 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52  s cksum..**.** R
2ce50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2ce60 52 55 50 54 20 69 66 20 61 6e 79 20 6f 66 20 74  RUPT if any of t
2ce70 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63  he internal chec
2ce80 6b 73 20 66 61 69 6c 2c 20 6f 72 20 69 66 20 74  ks fail, or if t
2ce90 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 64  he.** checksum d
2cea0 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 52  oes not match. R
2ceb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
2cec0 69 66 20 61 6c 6c 20 63 68 65 63 6b 73 20 70 61  if all checks pa
2ced0 73 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 65 72  ss without.** er
2cee0 72 6f 72 2c 20 6f 72 20 73 6f 6d 65 20 6f 74 68  ror, or some oth
2cef0 65 72 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  er SQLite error 
2cf00 63 6f 64 65 20 69 66 20 61 6e 6f 74 68 65 72 20  code if another 
2cf10 65 72 72 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d 29  error (e.g. OOM)
2cf20 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69  .** occurs..*/.i
2cf30 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
2cf40 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63  dexIntegrityChec
2cf50 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  k(Fts5Index *p, 
2cf60 75 36 34 20 63 6b 73 75 6d 29 7b 0a 20 20 69 6e  u64 cksum){.  in
2cf70 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70  t eDetail = p->p
2cf80 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b  Config->eDetail;
2cf90 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20  .  u64 cksum2 = 
2cfa0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2cfb0 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62     /* Checksum b
2cfc0 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73  ased on contents
2cfd0 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20   of indexes */. 
2cfe0 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c   Fts5Buffer posl
2cff0 69 73 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20  ist = {0,0,0};  
2d000 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20   /* Buffer used 
2d010 74 6f 20 68 6f 6c 64 20 61 20 70 6f 73 6c 69 73  to hold a poslis
2d020 74 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20  t */.  Fts5Iter 
2d030 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
2d040 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
2d050 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
2d060 68 20 65 6e 74 69 72 65 20 69 6e 64 65 78 20 2a  h entire index *
2d070 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
2d080 65 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20 20  e *pStruct;     
2d090 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72      /* Index str
2d0a0 75 63 74 75 72 65 20 2a 2f 0a 0a 23 69 66 64 65  ucture */..#ifde
2d0b0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
2d0c0 20 2f 2a 20 55 73 65 64 20 62 79 20 65 78 74 72   /* Used by extr
2d0d0 61 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 73  a internal tests
2d0e0 20 6f 6e 6c 79 20 72 75 6e 20 69 66 20 4e 44 45   only run if NDE
2d0f0 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
2d100 65 64 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75  ed */.  u64 cksu
2d110 6d 33 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  m3 = 0;         
2d120 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
2d130 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e  sum based on con
2d140 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73  tents of indexes
2d150 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
2d160 20 74 65 72 6d 20 3d 20 7b 30 2c 30 2c 30 7d 3b   term = {0,0,0};
2d170 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
2d180 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 6d 6f 73  used to hold mos
2d190 74 20 72 65 63 65 6e 74 20 74 65 72 6d 20 2a 2f  t recent term */
2d1a0 0a 23 65 6e 64 69 66 0a 20 20 63 6f 6e 73 74 20  .#endif.  const 
2d1b0 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35  int flags = FTS5
2d1c0 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55  INDEX_QUERY_NOOU
2d1d0 54 50 55 54 3b 0a 20 20 0a 20 20 2f 2a 20 4c 6f  TPUT;.  .  /* Lo
2d1e0 61 64 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  ad the FTS index
2d1f0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
2d200 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
2d210 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
2d220 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
2d230 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
2d240 64 65 73 20 6f 66 20 65 61 63 68 20 73 65 67 6d  des of each segm
2d250 65 6e 74 20 6d 61 74 63 68 20 74 68 65 20 6c 65  ent match the le
2d260 61 76 65 73 20 2a 2f 0a 20 20 69 66 28 20 70 53  aves */.  if( pS
2d270 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74  truct ){.    int
2d280 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20   iLvl, iSeg;.   
2d290 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
2d2a0 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
2d2b0 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
2d2c0 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
2d2d0 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  eg<pStruct->aLev
2d2e0 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69  el[iLvl].nSeg; i
2d2f0 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
2d300 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
2d310 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 53  ment *pSeg = &pS
2d320 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
2d330 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a  vl].aSeg[iSeg];.
2d340 20 20 20 20 20 20 20 20 66 74 73 35 49 6e 64 65          fts5Inde
2d350 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53  xIntegrityCheckS
2d360 65 67 6d 65 6e 74 28 70 2c 20 70 53 65 67 29 3b  egment(p, pSeg);
2d370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2d380 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6b 73   }..  /* The cks
2d390 75 6d 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  um argument pass
2d3a0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
2d3b0 69 6f 6e 20 69 73 20 61 20 63 68 65 63 6b 73 75  ion is a checksu
2d3c0 6d 20 63 61 6c 63 75 6c 61 74 65 64 0a 20 20 2a  m calculated.  *
2d3d0 2a 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20 65  * based on all e
2d3e0 78 70 65 63 74 65 64 20 65 6e 74 72 69 65 73 20  xpected entries 
2d3f0 69 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  in the FTS index
2d400 20 28 69 6e 63 6c 75 64 69 6e 67 20 70 72 65 66   (including pref
2d410 69 78 20 69 6e 64 65 78 0a 20 20 2a 2a 20 65 6e  ix index.  ** en
2d420 74 72 69 65 73 29 2e 20 54 68 69 73 20 62 6c 6f  tries). This blo
2d430 63 6b 20 63 68 65 63 6b 73 20 74 68 61 74 20 61  ck checks that a
2d440 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c   checksum calcul
2d450 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  ated based on th
2d460 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 63 6f  e.  ** actual co
2d470 6e 74 65 6e 74 73 20 6f 66 20 46 54 53 20 69 6e  ntents of FTS in
2d480 64 65 78 20 69 73 20 69 64 65 6e 74 69 63 61 6c  dex is identical
2d490 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 77 6f 20  ..  **.  ** Two 
2d4a0 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
2d4b0 73 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 61 72  same checksum ar
2d4c0 65 20 63 61 6c 63 75 6c 61 74 65 64 2e 20 54 68  e calculated. Th
2d4d0 65 20 66 69 72 73 74 20 28 73 74 61 63 6b 0a 20  e first (stack. 
2d4e0 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 63 6b 73   ** variable cks
2d4f0 75 6d 32 29 20 62 61 73 65 64 20 6f 6e 20 65 6e  um2) based on en
2d500 74 72 69 65 73 20 65 78 74 72 61 63 74 65 64 20  tries extracted 
2d510 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d 74 65  from the full-te
2d520 78 74 20 69 6e 64 65 78 0a 20 20 2a 2a 20 77 68  xt index.  ** wh
2d530 69 6c 65 20 64 6f 69 6e 67 20 61 20 6c 69 6e 65  ile doing a line
2d540 61 72 20 73 63 61 6e 20 6f 66 20 65 61 63 68 20  ar scan of each 
2d550 69 6e 64 69 76 69 64 75 61 6c 20 69 6e 64 65 78  individual index
2d560 20 69 6e 20 74 75 72 6e 2e 20 0a 20 20 2a 2a 0a   in turn. .  **.
2d570 20 20 2a 2a 20 41 73 20 65 61 63 68 20 74 65 72    ** As each ter
2d580 6d 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65  m visited by the
2d590 20 6c 69 6e 65 61 72 20 73 63 61 6e 73 2c 20 61   linear scans, a
2d5a0 20 73 65 70 61 72 61 74 65 20 71 75 65 72 79 20   separate query 
2d5b0 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d  for the.  ** sam
2d5c0 65 20 74 65 72 6d 20 69 73 20 70 65 72 66 6f 72  e term is perfor
2d5d0 6d 65 64 2e 20 63 6b 73 75 6d 33 20 69 73 20 63  med. cksum3 is c
2d5e0 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64 20  alculated based 
2d5f0 6f 6e 20 74 68 65 20 65 6e 74 72 69 65 73 0a 20  on the entries. 
2d600 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 62 79   ** extracted by
2d610 20 74 68 65 73 65 20 71 75 65 72 69 65 73 2e 0a   these queries..
2d620 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74 73 35 4d    */.  for(fts5M
2d630 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70  ultiIterNew(p, p
2d640 53 74 72 75 63 74 2c 20 66 6c 61 67 73 2c 20 30  Struct, flags, 0
2d650 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20 26  , 0, 0, -1, 0, &
2d660 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74  pIter);.      ft
2d670 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
2d680 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20  , pIter)==0;.   
2d690 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
2d6a0 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30  Next(p, pIter, 0
2d6b0 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  , 0).  ){.    in
2d6c0 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
2d6d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2d6e0 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74  e of term in byt
2d6f0 65 73 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 50  es */.    i64 iP
2d700 6f 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  os = 0;         
2d710 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
2d720 6e 20 72 65 61 64 20 66 72 6f 6d 20 70 6f 73 6c  n read from posl
2d730 69 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ist */.    int i
2d740 4f 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Off = 0;        
2d750 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2d760 20 77 69 74 68 69 6e 20 70 6f 73 6c 69 73 74 20   within poslist 
2d770 2a 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69  */.    i64 iRowi
2d780 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  d = fts5MultiIte
2d790 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20  rRowid(pIter);. 
2d7a0 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68     char *z = (ch
2d7b0 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65  ar*)fts5MultiIte
2d7c0 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29  rTerm(pIter, &n)
2d7d0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
2d7e0 73 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2c  s is a new term,
2d7f0 20 71 75 65 72 79 20 66 6f 72 20 69 74 2e 20 55   query for it. U
2d800 70 64 61 74 65 20 63 6b 73 75 6d 33 20 77 69 74  pdate cksum3 wit
2d810 68 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 2a  h the results. *
2d820 2f 0a 20 20 20 20 66 74 73 35 54 65 73 74 54 65  /.    fts5TestTe
2d830 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20 7a 2c 20  rm(p, &term, z, 
2d840 6e 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75  n, cksum2, &cksu
2d850 6d 33 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 44  m3);..    if( eD
2d860 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
2d870 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  IL_NONE ){.     
2d880 20 69 66 28 20 30 3d 3d 66 74 73 35 4d 75 6c 74   if( 0==fts5Mult
2d890 69 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20  iIterIsEmpty(p, 
2d8a0 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20 20 20  pIter) ){.      
2d8b0 20 20 63 6b 73 75 6d 32 20 5e 3d 20 73 71 6c 69    cksum2 ^= sqli
2d8c0 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72  te3Fts5IndexEntr
2d8d0 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 30  yCksum(iRowid, 0
2d8e0 2c 20 30 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a  , 0, -1, z, n);.
2d8f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2d900 65 7b 0a 20 20 20 20 20 20 70 6f 73 6c 69 73 74  e{.      poslist
2d910 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 74  .n = 0;.      ft
2d920 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74  s5SegiterPoslist
2d930 28 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67  (p, &pIter->aSeg
2d940 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31  [pIter->aFirst[1
2d950 5d 2e 69 46 69 72 73 74 5d 2c 20 30 2c 20 26 70  ].iFirst], 0, &p
2d960 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  oslist);.      w
2d970 68 69 6c 65 28 20 30 3d 3d 73 71 6c 69 74 65 33  hile( 0==sqlite3
2d980 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
2d990 34 28 70 6f 73 6c 69 73 74 2e 70 2c 20 70 6f 73  4(poslist.p, pos
2d9a0 6c 69 73 74 2e 6e 2c 20 26 69 4f 66 66 2c 20 26  list.n, &iOff, &
2d9b0 69 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 20  iPos) ){.       
2d9c0 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35   int iCol = FTS5
2d9d0 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f 73  _POS2COLUMN(iPos
2d9e0 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  );.        int i
2d9f0 54 6f 6b 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f  TokOff = FTS5_PO
2da00 53 32 4f 46 46 53 45 54 28 69 50 6f 73 29 3b 0a  S2OFFSET(iPos);.
2da10 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20 5e          cksum2 ^
2da20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
2da30 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f  exEntryCksum(iRo
2da40 77 69 64 2c 20 69 43 6f 6c 2c 20 69 54 6f 6b 4f  wid, iCol, iTokO
2da50 66 66 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20  ff, -1, z, n);. 
2da60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2da70 0a 20 20 66 74 73 35 54 65 73 74 54 65 72 6d 28  .  fts5TestTerm(
2da80 70 2c 20 26 74 65 72 6d 2c 20 30 2c 20 30 2c 20  p, &term, 0, 0, 
2da90 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33 29  cksum2, &cksum3)
2daa0 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74  ;..  fts5MultiIt
2dab0 65 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20  erFree(pIter);. 
2dac0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
2dad0 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21 3d  TE_OK && cksum!=
2dae0 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d  cksum2 ) p->rc =
2daf0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a   FTS5_CORRUPT;..
2db00 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
2db10 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
2db20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2db30 45 42 55 47 0a 20 20 66 74 73 35 42 75 66 66 65  EBUG.  fts5Buffe
2db40 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 23 65  rFree(&term);.#e
2db50 6e 64 69 66 0a 20 20 66 74 73 35 42 75 66 66 65  ndif.  fts5Buffe
2db60 72 46 72 65 65 28 26 70 6f 73 6c 69 73 74 29 3b  rFree(&poslist);
2db70 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
2db80 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
2db90 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
2dba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dbb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dbc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dbd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
2dbe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dbf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dc00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dc10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dc20 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20  ******.** Below 
2dc30 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68  this point is th
2dc40 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2dc50 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63   of the fts5_dec
2dc60 6f 64 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a 20  ode() scalar.** 
2dc70 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a  function only..*
2dc80 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  /../*.** Decode 
2dc90 61 20 73 65 67 6d 65 6e 74 2d 64 61 74 61 20 72  a segment-data r
2dca0 6f 77 69 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  owid from the %_
2dcb0 64 61 74 61 20 74 61 62 6c 65 2e 20 54 68 69 73  data table. This
2dcc0 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
2dcd0 74 68 65 20 6f 70 70 6f 73 69 74 65 20 6f 66 20  the opposite of 
2dce0 6d 61 63 72 6f 20 46 54 53 35 5f 53 45 47 4d 45  macro FTS5_SEGME
2dcf0 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73  NT_ROWID()..*/.s
2dd00 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
2dd10 65 63 6f 64 65 52 6f 77 69 64 28 0a 20 20 69 36  ecodeRowid(.  i6
2dd20 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20  4 iRowid,       
2dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dd40 20 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64 61   Rowid from %_da
2dd50 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  ta table */.  in
2dd60 74 20 2a 70 69 53 65 67 69 64 2c 20 20 20 20 20  t *piSegid,     
2dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dd80 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74 20 69 64   OUT: Segment id
2dd90 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6c 69   */.  int *pbDli
2dda0 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
2ddb0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6c        /* OUT: Dl
2ddc0 69 64 78 20 66 6c 61 67 20 2a 2f 0a 20 20 69 6e  idx flag */.  in
2ddd0 74 20 2a 70 69 48 65 69 67 68 74 2c 20 20 20 20  t *piHeight,    
2dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ddf0 20 4f 55 54 3a 20 48 65 69 67 68 74 20 2a 2f 0a   OUT: Height */.
2de00 20 20 69 6e 74 20 2a 70 69 50 67 6e 6f 20 20 20    int *piPgno   
2de10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de20 20 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20 6e    /* OUT: Page n
2de30 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70  umber */.){.  *p
2de40 69 50 67 6e 6f 20 3d 20 28 69 6e 74 29 28 69 52  iPgno = (int)(iR
2de50 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20  owid & (((i64)1 
2de60 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47  << FTS5_DATA_PAG
2de70 45 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52  E_B) - 1));.  iR
2de80 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41  owid >>= FTS5_DA
2de90 54 41 5f 50 41 47 45 5f 42 3b 0a 0a 20 20 2a 70  TA_PAGE_B;..  *p
2dea0 69 48 65 69 67 68 74 20 3d 20 28 69 6e 74 29 28  iHeight = (int)(
2deb0 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29  iRowid & (((i64)
2dec0 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48  1 << FTS5_DATA_H
2ded0 45 49 47 48 54 5f 42 29 20 2d 20 31 29 29 3b 0a  EIGHT_B) - 1));.
2dee0 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53    iRowid >>= FTS
2def0 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 3b  5_DATA_HEIGHT_B;
2df00 0a 0a 20 20 2a 70 62 44 6c 69 64 78 20 3d 20 28  ..  *pbDlidx = (
2df10 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 30 78  int)(iRowid & 0x
2df20 30 30 30 31 29 3b 0a 20 20 69 52 6f 77 69 64 20  0001);.  iRowid 
2df30 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 44 4c  >>= FTS5_DATA_DL
2df40 49 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67 69 64  I_B;..  *piSegid
2df50 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20   = (int)(iRowid 
2df60 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54  & (((i64)1 << FT
2df70 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d 20  S5_DATA_ID_B) - 
2df80 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  1));.}..static v
2df90 6f 69 64 20 66 74 73 35 44 65 62 75 67 52 6f 77  oid fts5DebugRow
2dfa0 69 64 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  id(int *pRc, Fts
2dfb0 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69  5Buffer *pBuf, i
2dfc0 36 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74 20  64 iKey){.  int 
2dfd0 69 53 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c  iSegid, iHeight,
2dfe0 20 69 50 67 6e 6f 2c 20 62 44 6c 69 64 78 3b 20   iPgno, bDlidx; 
2dff0 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 63        /* Rowid c
2e000 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a 20 20 66  ompenents */.  f
2e010 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 69  ts5DecodeRowid(i
2e020 4b 65 79 2c 20 26 69 53 65 67 69 64 2c 20 26 62  Key, &iSegid, &b
2e030 44 6c 69 64 78 2c 20 26 69 48 65 69 67 68 74 2c  Dlidx, &iHeight,
2e040 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69 66 28   &iPgno);..  if(
2e050 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20   iSegid==0 ){.  
2e060 20 20 69 66 28 20 69 4b 65 79 3d 3d 46 54 53 35    if( iKey==FTS5
2e070 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20  _AVERAGES_ROWID 
2e080 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2e090 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2e0a0 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2e0b0 2c 20 22 7b 61 76 65 72 61 67 65 73 7d 20 22 29  , "{averages} ")
2e0c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e0d0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2e0e0 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2e0f0 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 73 74  (pRc, pBuf, "{st
2e100 72 75 63 74 75 72 65 7d 22 29 3b 0a 20 20 20 20  ructure}");.    
2e110 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 7b 0a 20 20  }.  }.  else{.  
2e120 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2e130 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2e140 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 25 73 73  pRc, pBuf, "{%ss
2e150 65 67 69 64 3d 25 64 20 68 3d 25 64 20 70 67 6e  egid=%d h=%d pgn
2e160 6f 3d 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20  o=%d}",.        
2e170 62 44 6c 69 64 78 20 3f 20 22 64 6c 69 64 78 20  bDlidx ? "dlidx 
2e180 22 20 3a 20 22 22 2c 20 69 53 65 67 69 64 2c 20  " : "", iSegid, 
2e190 69 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a 20  iHeight, iPgno. 
2e1a0 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61     );.  }.}..sta
2e1b0 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62  tic void fts5Deb
2e1c0 75 67 53 74 72 75 63 74 75 72 65 28 0a 20 20 69  ugStructure(.  i
2e1d0 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20  nt *pRc,        
2e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e1f0 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20  * IN/OUT: error 
2e200 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  code */.  Fts5Bu
2e210 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 46 74  ffer *pBuf,.  Ft
2e220 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 0a 29  s5Structure *p.)
2e230 7b 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53  {.  int iLvl, iS
2e240 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
2e250 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74      /* Iterate t
2e260 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 2c 20 73  hrough levels, s
2e270 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 66 6f  egments */..  fo
2e280 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
2e290 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b  ->nLevel; iLvl++
2e2a0 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ){.    Fts5Struc
2e2b0 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
2e2c0 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  = &p->aLevel[iLv
2e2d0 6c 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  l];.    sqlite3F
2e2e0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2e2f0 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2e300 20 0a 20 20 20 20 20 20 20 20 22 20 7b 6c 76 6c   .        " {lvl
2e310 3d 25 64 20 6e 4d 65 72 67 65 3d 25 64 20 6e 53  =%d nMerge=%d nS
2e320 65 67 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70 4c  eg=%d", iLvl, pL
2e330 76 6c 2d 3e 6e 4d 65 72 67 65 2c 20 70 4c 76 6c  vl->nMerge, pLvl
2e340 2d 3e 6e 53 65 67 0a 20 20 20 20 29 3b 0a 20 20  ->nSeg.    );.  
2e350 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
2e360 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69  eg<pLvl->nSeg; i
2e370 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  Seg++){.      Ft
2e380 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
2e390 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c  nt *pSeg = &pLvl
2e3a0 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20  ->aSeg[iSeg];.  
2e3b0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2e3c0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2e3d0 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 7b  f(pRc, pBuf, " {
2e3e0 69 64 3d 25 64 20 6c 65 61 76 65 73 3d 25 64 2e  id=%d leaves=%d.
2e3f0 2e 25 64 7d 22 2c 20 0a 20 20 20 20 20 20 20 20  .%d}", .        
2e400 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20    pSeg->iSegid, 
2e410 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2c  pSeg->pgnoFirst,
2e420 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a   pSeg->pgnoLast.
2e430 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
2e440 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2e450 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2e460 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7d 22 29  (pRc, pBuf, "}")
2e470 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
2e480 68 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 74  his is part of t
2e490 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29  he fts5_decode()
2e4a0 20 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a   debugging aid..
2e4b0 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20  **.** Arguments 
2e4c0 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74  pBlob/nBlob cont
2e4d0 61 69 6e 20 61 20 73 65 72 69 61 6c 69 7a 65 64  ain a serialized
2e4e0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f   Fts5Structure o
2e4f0 62 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66  bject. This.** f
2e500 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20  unction appends 
2e510 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  a human-readable
2e520 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2e530 6f 66 20 74 68 65 20 73 61 6d 65 20 6f 62 6a 65  of the same obje
2e540 63 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 66  ct.** to the buf
2e550 66 65 72 20 70 61 73 73 65 64 20 61 73 20 74 68  fer passed as th
2e560 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2e570 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  t. .*/.static vo
2e580 69 64 20 66 74 73 35 44 65 63 6f 64 65 53 74 72  id fts5DecodeStr
2e590 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70  ucture(.  int *p
2e5a0 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc,             
2e5b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
2e5c0 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20  OUT: error code 
2e5d0 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
2e5e0 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75  *pBuf,.  const u
2e5f0 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42  8 *pBlob, int nB
2e600 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  lob.){.  int rc;
2e610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e620 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2e630 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn code */.  Fts
2e640 35 53 74 72 75 63 74 75 72 65 20 2a 70 20 3d 20  5Structure *p = 
2e650 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
2e660 44 65 63 6f 64 65 64 20 73 74 72 75 63 74 75 72  Decoded structur
2e670 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 72  e object */..  r
2e680 63 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  c = fts5Structur
2e690 65 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20 6e  eDecode(pBlob, n
2e6a0 42 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20 20  Blob, 0, &p);.  
2e6b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2e6c0 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20  K ){.    *pRc = 
2e6d0 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
2e6e0 20 20 7d 0a 0a 20 20 66 74 73 35 44 65 62 75 67    }..  fts5Debug
2e6f0 53 74 72 75 63 74 75 72 65 28 70 52 63 2c 20 70  Structure(pRc, p
2e700 42 75 66 2c 20 70 29 3b 0a 20 20 66 74 73 35 53  Buf, p);.  fts5S
2e710 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
2e720 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  p);.}../*.** Thi
2e730 73 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  s is part of the
2e740 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64   fts5_decode() d
2e750 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a  ebugging aid..**
2e760 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42  .** Arguments pB
2e770 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69  lob/nBlob contai
2e780 6e 20 61 6e 20 22 61 76 65 72 61 67 65 73 22 20  n an "averages" 
2e790 72 65 63 6f 72 64 2e 20 54 68 69 73 20 66 75 6e  record. This fun
2e7a0 63 74 69 6f 6e 20 0a 2a 2a 20 61 70 70 65 6e 64  ction .** append
2e7b0 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  s a human-readab
2e7c0 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
2e7d0 6e 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 74  n of record to t
2e7e0 68 65 20 62 75 66 66 65 72 20 70 61 73 73 65 64  he buffer passed
2e7f0 20 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f   .** as the seco
2e800 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f  nd argument. .*/
2e810 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
2e820 35 44 65 63 6f 64 65 41 76 65 72 61 67 65 73 28  5DecodeAverages(
2e830 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20  .  int *pRc,    
2e840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e850 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72     /* IN/OUT: er
2e860 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  ror code */.  Ft
2e870 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a  s5Buffer *pBuf,.
2e880 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f    const u8 *pBlo
2e890 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a  b, int nBlob.){.
2e8a0 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 63    int i = 0;.  c
2e8b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 61 63  onst char *zSpac
2e8c0 65 20 3d 20 22 22 3b 0a 0a 20 20 77 68 69 6c 65  e = "";..  while
2e8d0 28 20 69 3c 6e 42 6c 6f 62 20 29 7b 0a 20 20 20  ( i<nBlob ){.   
2e8e0 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69   u64 iVal;.    i
2e8f0 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47   += sqlite3Fts5G
2e900 65 74 56 61 72 69 6e 74 28 26 70 42 6c 6f 62 5b  etVarint(&pBlob[
2e910 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20  i], &iVal);.    
2e920 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2e930 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
2e940 63 2c 20 70 42 75 66 2c 20 22 25 73 25 64 22 2c  c, pBuf, "%s%d",
2e950 20 7a 53 70 61 63 65 2c 20 28 69 6e 74 29 69 56   zSpace, (int)iV
2e960 61 6c 29 3b 0a 20 20 20 20 7a 53 70 61 63 65 20  al);.    zSpace 
2e970 3d 20 22 20 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = " ";.  }.}../*
2e980 0a 2a 2a 20 42 75 66 66 65 72 20 28 61 2f 6e 29  .** Buffer (a/n)
2e990 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63   is assumed to c
2e9a0 6f 6e 74 61 69 6e 20 61 20 6c 69 73 74 20 6f 66  ontain a list of
2e9b0 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 72 69   serialized vari
2e9c0 6e 74 73 2e 20 52 65 61 64 0a 2a 2a 20 65 61 63  nts. Read.** eac
2e9d0 68 20 76 61 72 69 6e 74 20 61 6e 64 20 61 70 70  h varint and app
2e9e0 65 6e 64 20 69 74 73 20 73 74 72 69 6e 67 20 72  end its string r
2e9f0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 74 6f  epresentation to
2ea00 20 62 75 66 66 65 72 20 70 42 75 66 2e 20 52 65   buffer pBuf. Re
2ea10 74 75 72 6e 0a 2a 2a 20 61 66 74 65 72 20 65 69  turn.** after ei
2ea20 74 68 65 72 20 74 68 65 20 69 6e 70 75 74 20 62  ther the input b
2ea30 75 66 66 65 72 20 69 73 20 65 78 68 61 75 73 74  uffer is exhaust
2ea40 65 64 20 6f 72 20 61 20 30 20 76 61 6c 75 65 20  ed or a 0 value 
2ea50 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  is read..**.** T
2ea60 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2ea70 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2ea80 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d   bytes read from
2ea90 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65   the input buffe
2eaa0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2eab0 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69   fts5DecodePosli
2eac0 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  st(int *pRc, Fts
2ead0 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63  5Buffer *pBuf, c
2eae0 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20  onst u8 *a, int 
2eaf0 6e 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d  n){.  int iOff =
2eb00 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f 66   0;.  while( iOf
2eb10 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  f<n ){.    int i
2eb20 56 61 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  Val;.    iOff +=
2eb30 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
2eb40 28 26 61 5b 69 4f 66 66 5d 2c 20 69 56 61 6c 29  (&a[iOff], iVal)
2eb50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
2eb60 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2eb70 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
2eb80 20 25 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20 7d   %d", iVal);.  }
2eb90 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a  .  return iOff;.
2eba0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61  }../*.** The sta
2ebb0 72 74 20 6f 66 20 62 75 66 66 65 72 20 28 61 2f  rt of buffer (a/
2ebc0 6e 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  n) contains the 
2ebd0 73 74 61 72 74 20 6f 66 20 61 20 64 6f 63 6c 69  start of a docli
2ebe0 73 74 2e 20 54 68 65 20 64 6f 63 6c 69 73 74 0a  st. The doclist.
2ebf0 2a 2a 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  ** may or may no
2ec00 74 20 66 69 6e 69 73 68 20 77 69 74 68 69 6e 20  t finish within 
2ec10 74 68 65 20 62 75 66 66 65 72 2e 20 54 68 69 73  the buffer. This
2ec20 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
2ec30 73 20 61 20 74 65 78 74 0a 2a 2a 20 72 65 70 72  s a text.** repr
2ec40 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
2ec50 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 6f  e part of the do
2ec60 63 6c 69 73 74 20 74 68 61 74 20 69 73 20 70 72  clist that is pr
2ec70 65 73 65 6e 74 20 74 6f 20 62 75 66 66 65 72 0a  esent to buffer.
2ec80 2a 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a 20  ** pBuf. .**.** 
2ec90 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
2eca0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2ecb0 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f  f bytes read fro
2ecc0 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66  m the input buff
2ecd0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2ece0 74 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c  t fts5DecodeDocl
2ecf0 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  ist(int *pRc, Ft
2ed00 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
2ed10 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74  const u8 *a, int
2ed20 20 6e 29 7b 0a 20 20 69 36 34 20 69 44 6f 63 69   n){.  i64 iDoci
2ed30 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  d = 0;.  int iOf
2ed40 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3e  f = 0;..  if( n>
2ed50 30 20 29 7b 0a 20 20 20 20 69 4f 66 66 20 3d 20  0 ){.    iOff = 
2ed60 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
2ed70 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26 69  rint(a, (u64*)&i
2ed80 44 6f 63 69 64 29 3b 0a 20 20 20 20 73 71 6c 69  Docid);.    sqli
2ed90 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2eda0 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2edb0 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c  Buf, " id=%lld",
2edc0 20 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20 20   iDocid);.  }.  
2edd0 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b  while( iOff<n ){
2ede0 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20  .    int nPos;. 
2edf0 20 20 20 69 6e 74 20 62 44 65 6c 3b 0a 20 20 20     int bDel;.   
2ee00 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
2ee10 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69  PoslistSize(&a[i
2ee20 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44  Off], &nPos, &bD
2ee30 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  el);.    sqlite3
2ee40 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2ee50 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2ee60 2c 20 22 20 6e 50 6f 73 3d 25 64 25 73 22 2c 20  , " nPos=%d%s", 
2ee70 6e 50 6f 73 2c 20 62 44 65 6c 3f 22 2a 22 3a 22  nPos, bDel?"*":"
2ee80 22 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  ");.    iOff += 
2ee90 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73  fts5DecodePoslis
2eea0 74 28 70 52 63 2c 20 70 42 75 66 2c 20 26 61 5b  t(pRc, pBuf, &a[
2eeb0 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f 66  iOff], MIN(n-iOf
2eec0 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20 69  f, nPos));.    i
2eed0 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  f( iOff<n ){.   
2eee0 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20     i64 iDelta;. 
2eef0 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c       iOff += sql
2ef00 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
2ef10 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
2ef20 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
2ef30 20 20 69 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c    iDocid += iDel
2ef40 74 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ta;.      sqlite
2ef50 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2ef60 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2ef70 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20 69  f, " id=%lld", i
2ef80 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Docid);.    }.  
2ef90 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66  }..  return iOff
2efa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2efb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72 74  function is part
2efc0 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63   of the fts5_dec
2efd0 6f 64 65 28 29 20 64 65 62 75 67 67 69 6e 67 20  ode() debugging 
2efe0 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  function. It is 
2eff0 0a 2a 2a 20 6f 6e 6c 79 20 65 76 65 72 20 75 73  .** only ever us
2f000 65 64 20 77 69 74 68 20 64 65 74 61 69 6c 3d 6e  ed with detail=n
2f010 6f 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a  one tables..**.*
2f020 2a 20 42 75 66 66 65 72 20 28 70 44 61 74 61 2f  * Buffer (pData/
2f030 6e 44 61 74 61 29 20 63 6f 6e 74 61 69 6e 73 20  nData) contains 
2f040 61 20 64 6f 63 6c 69 73 74 20 69 6e 20 74 68 65  a doclist in the
2f050 20 66 6f 72 6d 61 74 20 75 73 65 64 20 62 79 20   format used by 
2f060 64 65 74 61 69 6c 3d 6e 6f 6e 65 0a 2a 2a 20 74  detail=none.** t
2f070 61 62 6c 65 73 2e 20 54 68 69 73 20 66 75 6e 63  ables. This func
2f080 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 68  tion appends a h
2f090 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 76 65  uman-readable ve
2f0a0 72 73 69 6f 6e 20 6f 66 20 74 68 61 74 20 6c 69  rsion of that li
2f0b0 73 74 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20  st to.** buffer 
2f0c0 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a  pBuf..**.** If *
2f0d0 70 52 63 20 69 73 20 6f 74 68 65 72 20 74 68 61  pRc is other tha
2f0e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e  n SQLITE_OK when
2f0f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2f100 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
2f110 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 49 66 20 61  a.** no-op. If a
2f120 6e 20 4f 4f 4d 20 6f 72 20 6f 74 68 65 72 20 65  n OOM or other e
2f130 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68  rror occurs with
2f140 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
2f150 2c 20 2a 70 52 63 20 69 73 0a 2a 2a 20 73 65 74  , *pRc is.** set
2f160 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 65 72   to an SQLite er
2f170 72 6f 72 20 63 6f 64 65 20 62 65 66 6f 72 65 20  ror code before 
2f180 72 65 74 75 72 6e 69 6e 67 2e 20 54 68 65 20 66  returning. The f
2f190 69 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 62 75  inal state of bu
2f1a0 66 66 65 72 0a 2a 2a 20 70 42 75 66 20 69 73 20  ffer.** pBuf is 
2f1b0 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  undefined in thi
2f1c0 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  s case..*/.stati
2f1d0 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64  c void fts5Decod
2f1e0 65 52 6f 77 69 64 4c 69 73 74 28 0a 20 20 69 6e  eRowidList(.  in
2f1f0 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
2f200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f210 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63   IN/OUT: Error c
2f220 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ode */.  Fts5Buf
2f230 66 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20  fer *pBuf,      
2f240 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
2f250 65 72 20 74 6f 20 61 70 70 65 6e 64 20 74 65 78  er to append tex
2f260 74 20 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  t to */.  const 
2f270 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e  u8 *pData, int n
2f280 44 61 74 61 20 20 20 20 20 20 2f 2a 20 44 61 74  Data      /* Dat
2f290 61 20 74 6f 20 64 65 63 6f 64 65 20 6c 69 73 74  a to decode list
2f2a0 2d 6f 66 2d 72 6f 77 69 64 73 20 66 72 6f 6d 20  -of-rowids from 
2f2b0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  */.){.  int i = 
2f2c0 30 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 20  0;.  i64 iRowid 
2f2d0 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 69  = 0;..  while( i
2f2e0 3c 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 63 6f  <nData ){.    co
2f2f0 6e 73 74 20 63 68 61 72 20 2a 7a 41 70 70 20 3d  nst char *zApp =
2f300 20 22 22 3b 0a 20 20 20 20 75 36 34 20 69 56 61   "";.    u64 iVa
2f310 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69  l;.    i += sqli
2f320 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
2f330 28 26 70 44 61 74 61 5b 69 5d 2c 20 26 69 56 61  (&pData[i], &iVa
2f340 6c 29 3b 0a 20 20 20 20 69 52 6f 77 69 64 20 2b  l);.    iRowid +
2f350 3d 20 69 56 61 6c 3b 0a 0a 20 20 20 20 69 66 28  = iVal;..    if(
2f360 20 69 3c 6e 44 61 74 61 20 26 26 20 70 44 61 74   i<nData && pDat
2f370 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b 0a 20 20  a[i]==0x00 ){.  
2f380 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69      i++;.      i
2f390 66 28 20 69 3c 6e 44 61 74 61 20 26 26 20 70 44  f( i<nData && pD
2f3a0 61 74 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b 0a  ata[i]==0x00 ){.
2f3b0 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
2f3c0 20 20 20 20 20 7a 41 70 70 20 3d 20 22 2b 22 3b       zApp = "+";
2f3d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2f3e0 20 20 20 20 20 20 7a 41 70 70 20 3d 20 22 2a 22        zApp = "*"
2f3f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2f400 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
2f410 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2f420 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20  tf(pRc, pBuf, " 
2f430 25 6c 6c 64 25 73 22 2c 20 69 52 6f 77 69 64 2c  %lld%s", iRowid,
2f440 20 7a 41 70 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   zApp);.  }.}../
2f450 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
2f460 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d  ntation of user-
2f470 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66  defined scalar f
2f480 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 64 65 63  unction fts5_dec
2f490 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ode()..*/.static
2f4a0 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65   void fts5Decode
2f4b0 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  Function(.  sqli
2f4c0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2f4d0 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  x,          /* F
2f4e0 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e  unction call con
2f4f0 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  text */.  int nA
2f500 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
2f510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2f520 62 65 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77  ber of args (alw
2f530 61 79 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69  ays 2) */.  sqli
2f540 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
2f550 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  l           /* F
2f560 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
2f570 73 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52  s */.){.  i64 iR
2f580 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
2f590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
2f5a0 69 64 20 66 6f 72 20 72 65 63 6f 72 64 20 62 65  id for record be
2f5b0 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20  ing decoded */. 
2f5c0 20 69 6e 74 20 69 53 65 67 69 64 2c 69 48 65 69   int iSegid,iHei
2f5d0 67 68 74 2c 69 50 67 6e 6f 2c 62 44 6c 69 64 78  ght,iPgno,bDlidx
2f5e0 3b 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 6f 6e  ;/* Rowid compon
2f5f0 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ents */.  const 
2f600 75 38 20 2a 61 42 6c 6f 62 3b 20 69 6e 74 20 6e  u8 *aBlob; int n
2f610 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 63  ;         /* Rec
2f620 6f 72 64 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f  ord to decode */
2f630 0a 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20  .  u8 *a = 0;.  
2f640 46 74 73 35 42 75 66 66 65 72 20 73 3b 20 20 20  Fts5Buffer s;   
2f650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f660 2f 2a 20 42 75 69 6c 64 20 75 70 20 74 65 78 74  /* Build up text
2f670 20 74 6f 20 72 65 74 75 72 6e 20 68 65 72 65 20   to return here 
2f680 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
2f690 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2f6a0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2f6b0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70  ode */.  int nSp
2f6c0 61 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 65  ace = 0;.  int e
2f6d0 44 65 74 61 69 6c 4e 6f 6e 65 20 3d 20 28 73 71  DetailNone = (sq
2f6e0 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
2f6f0 70 43 74 78 29 21 3d 30 29 3b 0a 0a 20 20 61 73  pCtx)!=0);..  as
2f700 73 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b  sert( nArg==2 );
2f710 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  .  UNUSED_PARAM(
2f720 6e 41 72 67 29 3b 0a 20 20 6d 65 6d 73 65 74 28  nArg);.  memset(
2f730 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  &s, 0, sizeof(Ft
2f740 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69 52  s5Buffer));.  iR
2f750 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76  owid = sqlite3_v
2f760 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c  alue_int64(apVal
2f770 5b 30 5d 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  [0]);..  /* Make
2f780 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
2f790 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 28  econd argument (
2f7a0 61 20 62 6c 6f 62 29 20 69 6e 20 61 42 6c 6f 62  a blob) in aBlob
2f7b0 5b 5d 2e 20 54 68 65 20 61 42 6c 6f 62 5b 5d 0a  []. The aBlob[].
2f7c0 20 20 2a 2a 20 63 6f 70 79 20 69 73 20 66 6f 6c    ** copy is fol
2f7d0 6c 6f 77 65 64 20 62 79 20 46 54 53 35 5f 44 41  lowed by FTS5_DA
2f7e0 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 20  TA_ZERO_PADDING 
2f7f0 30 78 30 30 20 62 79 74 65 73 2c 20 77 68 69 63  0x00 bytes, whic
2f800 68 20 70 72 65 76 65 6e 74 73 0a 20 20 2a 2a 20  h prevents.  ** 
2f810 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73  buffer overreads
2f820 20 65 76 65 6e 20 69 66 20 74 68 65 20 72 65 63   even if the rec
2f830 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 2e 20  ord is corrupt. 
2f840 20 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65   */.  n = sqlite
2f850 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 70  3_value_bytes(ap
2f860 56 61 6c 5b 31 5d 29 3b 0a 20 20 61 42 6c 6f 62  Val[1]);.  aBlob
2f870 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2f880 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 31 5d 29 3b  _blob(apVal[1]);
2f890 0a 20 20 6e 53 70 61 63 65 20 3d 20 6e 20 2b 20  .  nSpace = n + 
2f8a0 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50  FTS5_DATA_ZERO_P
2f8b0 41 44 44 49 4e 47 3b 0a 20 20 61 20 3d 20 28 75  ADDING;.  a = (u
2f8c0 38 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  8*)sqlite3Fts5Ma
2f8d0 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 53  llocZero(&rc, nS
2f8e0 70 61 63 65 29 3b 0a 20 20 69 66 28 20 61 3d 3d  pace);.  if( a==
2f8f0 30 20 29 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f  0 ) goto decode_
2f900 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28 61 2c  out;.  memcpy(a,
2f910 20 61 42 6c 6f 62 2c 20 6e 29 3b 0a 0a 0a 20 20   aBlob, n);...  
2f920 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28  fts5DecodeRowid(
2f930 69 52 6f 77 69 64 2c 20 26 69 53 65 67 69 64 2c  iRowid, &iSegid,
2f940 20 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69 67   &bDlidx, &iHeig
2f950 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20  ht, &iPgno);..  
2f960 66 74 73 35 44 65 62 75 67 52 6f 77 69 64 28 26  fts5DebugRowid(&
2f970 72 63 2c 20 26 73 2c 20 69 52 6f 77 69 64 29 3b  rc, &s, iRowid);
2f980 0a 20 20 69 66 28 20 62 44 6c 69 64 78 20 29 7b  .  if( bDlidx ){
2f990 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 64 6c  .    Fts5Data dl
2f9a0 69 64 78 3b 0a 20 20 20 20 46 74 73 35 44 6c 69  idx;.    Fts5Dli
2f9b0 64 78 4c 76 6c 20 6c 76 6c 3b 0a 0a 20 20 20 20  dxLvl lvl;..    
2f9c0 64 6c 69 64 78 2e 70 20 3d 20 61 3b 0a 20 20 20  dlidx.p = a;.   
2f9d0 20 64 6c 69 64 78 2e 6e 6e 20 3d 20 6e 3b 0a 0a   dlidx.nn = n;..
2f9e0 20 20 20 20 6d 65 6d 73 65 74 28 26 6c 76 6c 2c      memset(&lvl,
2f9f0 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44   0, sizeof(Fts5D
2fa00 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 6c  lidxLvl));.    l
2fa10 76 6c 2e 70 44 61 74 61 20 3d 20 26 64 6c 69 64  vl.pData = &dlid
2fa20 78 3b 0a 20 20 20 20 6c 76 6c 2e 69 4c 65 61 66  x;.    lvl.iLeaf
2fa30 50 67 6e 6f 20 3d 20 69 50 67 6e 6f 3b 0a 0a 20  Pgno = iPgno;.. 
2fa40 20 20 20 66 6f 72 28 66 74 73 35 44 6c 69 64 78     for(fts5Dlidx
2fa50 4c 76 6c 4e 65 78 74 28 26 6c 76 6c 29 3b 20 6c  LvlNext(&lvl); l
2fa60 76 6c 2e 62 45 6f 66 3d 3d 30 3b 20 66 74 73 35  vl.bEof==0; fts5
2fa70 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c 76  DlidxLvlNext(&lv
2fa80 6c 29 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l)){.      sqlit
2fa90 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2faa0 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73  ndPrintf(&rc, &s
2fab0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 20 25  , .          " %
2fac0 64 28 25 6c 6c 64 29 22 2c 20 6c 76 6c 2e 69 4c  d(%lld)", lvl.iL
2fad0 65 61 66 50 67 6e 6f 2c 20 6c 76 6c 2e 69 52 6f  eafPgno, lvl.iRo
2fae0 77 69 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  wid.      );.   
2faf0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69   }.  }else if( i
2fb00 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Segid==0 ){.    
2fb10 69 66 28 20 69 52 6f 77 69 64 3d 3d 46 54 53 35  if( iRowid==FTS5
2fb20 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20  _AVERAGES_ROWID 
2fb30 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 65 63  ){.      fts5Dec
2fb40 6f 64 65 41 76 65 72 61 67 65 73 28 26 72 63 2c  odeAverages(&rc,
2fb50 20 26 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20   &s, a, n);.    
2fb60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73  }else{.      fts
2fb70 35 44 65 63 6f 64 65 53 74 72 75 63 74 75 72 65  5DecodeStructure
2fb80 28 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b  (&rc, &s, a, n);
2fb90 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
2fba0 66 28 20 65 44 65 74 61 69 6c 4e 6f 6e 65 20 29  f( eDetailNone )
2fbb0 7b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  {.    Fts5Buffer
2fbc0 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20   term;          
2fbd0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74      /* Current t
2fbe0 65 72 6d 20 72 65 61 64 20 66 72 6f 6d 20 70 61  erm read from pa
2fbf0 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ge */.    int sz
2fc00 4c 65 61 66 3b 0a 20 20 20 20 69 6e 74 20 69 50  Leaf;.    int iP
2fc10 67 69 64 78 4f 66 66 20 3d 20 73 7a 4c 65 61 66  gidxOff = szLeaf
2fc20 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61   = fts5GetU16(&a
2fc30 5b 32 5d 29 3b 0a 20 20 20 20 69 6e 74 20 69 54  [2]);.    int iT
2fc40 65 72 6d 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20  ermOff;.    int 
2fc50 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20 20 69  nKeep = 0;.    i
2fc60 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 20 20 6d 65  nt iOff;..    me
2fc70 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73  mset(&term, 0, s
2fc80 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
2fc90 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f  ));..    /* Deco
2fca0 64 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74  de any entries t
2fcb0 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65  hat occur before
2fcc0 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 2e   the first term.
2fcd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 7a 4c 65   */.    if( szLe
2fce0 61 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 50  af<n ){.      iP
2fcf0 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47  gidxOff += fts5G
2fd00 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50  etVarint32(&a[iP
2fd10 67 69 64 78 4f 66 66 5d 2c 20 69 54 65 72 6d 4f  gidxOff], iTermO
2fd20 66 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ff);.    }else{.
2fd30 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20 3d        iTermOff =
2fd40 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 7d 0a 20   szLeaf;.    }. 
2fd50 20 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77     fts5DecodeRow
2fd60 69 64 4c 69 73 74 28 26 72 63 2c 20 26 73 2c 20  idList(&rc, &s, 
2fd70 26 61 5b 34 5d 2c 20 69 54 65 72 6d 4f 66 66 2d  &a[4], iTermOff-
2fd80 34 29 3b 0a 0a 20 20 20 20 69 4f 66 66 20 3d 20  4);..    iOff = 
2fd90 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 77 68  iTermOff;.    wh
2fda0 69 6c 65 28 20 69 4f 66 66 3c 73 7a 4c 65 61 66  ile( iOff<szLeaf
2fdb0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41   ){.      int nA
2fdc0 70 70 65 6e 64 3b 0a 0a 20 20 20 20 20 20 2f 2a  ppend;..      /*
2fdd0 20 52 65 61 64 20 74 68 65 20 74 65 72 6d 20 64   Read the term d
2fde0 61 74 61 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ata for the next
2fdf0 20 74 65 72 6d 2a 2f 0a 20 20 20 20 20 20 69 4f   term*/.      iO
2fe00 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
2fe10 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
2fe20 6e 41 70 70 65 6e 64 29 3b 0a 20 20 20 20 20 20  nAppend);.      
2fe30 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a  term.n = nKeep;.
2fe40 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
2fe50 41 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20  AppendBlob(&rc, 
2fe60 26 74 65 72 6d 2c 20 6e 41 70 70 65 6e 64 2c 20  &term, nAppend, 
2fe70 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20  &a[iOff]);.     
2fe80 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2fe90 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 0a  erAppendPrintf(.
2fea0 20 20 20 20 20 20 20 20 20 20 26 72 63 2c 20 26            &rc, &
2feb0 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c  s, " term=%.*s",
2fec0 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20   term.n, (const 
2fed0 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20  char*)term.p.   
2fee0 20 20 20 29 3b 0a 20 20 20 20 20 20 69 4f 66 66     );.      iOff
2fef0 20 2b 3d 20 6e 41 70 70 65 6e 64 3b 0a 0a 20 20   += nAppend;..  
2ff00 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
2ff10 74 20 77 68 65 72 65 20 74 68 65 20 64 6f 63 6c  t where the docl
2ff20 69 73 74 20 66 6f 72 20 74 68 69 73 20 74 65 72  ist for this ter
2ff30 6d 20 65 6e 64 73 20 2a 2f 0a 20 20 20 20 20 20  m ends */.      
2ff40 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20  if( iPgidxOff<n 
2ff50 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
2ff60 49 6e 63 72 3b 0a 20 20 20 20 20 20 20 20 69 50  Incr;.        iP
2ff70 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47  gidxOff += fts5G
2ff80 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50  etVarint32(&a[iP
2ff90 67 69 64 78 4f 66 66 5d 2c 20 6e 49 6e 63 72 29  gidxOff], nIncr)
2ffa0 3b 0a 20 20 20 20 20 20 20 20 69 54 65 72 6d 4f  ;.        iTermO
2ffb0 66 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20 20  ff += nIncr;.   
2ffc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ffd0 20 20 69 54 65 72 6d 4f 66 66 20 3d 20 73 7a 4c    iTermOff = szL
2ffe0 65 61 66 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eaf;.      }..  
2fff0 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f      fts5DecodeRo
30000 77 69 64 4c 69 73 74 28 26 72 63 2c 20 26 73 2c  widList(&rc, &s,
30010 20 26 61 5b 69 4f 66 66 5d 2c 20 69 54 65 72 6d   &a[iOff], iTerm
30020 4f 66 66 2d 69 4f 66 66 29 3b 0a 20 20 20 20 20  Off-iOff);.     
30030 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66   iOff = iTermOff
30040 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66  ;.      if( iOff
30050 3c 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  <szLeaf ){.     
30060 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
30070 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
30080 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  ff], nKeep);.   
30090 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
300a0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
300b0 74 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  term);.  }else{.
300c0 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 74      Fts5Buffer t
300d0 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
300e0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 65 72    /* Current ter
300f0 6d 20 72 65 61 64 20 66 72 6f 6d 20 70 61 67 65  m read from page
30100 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65   */.    int szLe
30110 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
30120 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
30130 6f 66 20 70 67 69 64 78 20 69 6e 20 61 5b 5d 20  of pgidx in a[] 
30140 2a 2f 0a 20 20 20 20 69 6e 74 20 69 50 67 69 64  */.    int iPgid
30150 78 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 69 50  xOff;.    int iP
30160 67 69 64 78 50 72 65 76 20 3d 20 30 3b 20 20 20  gidxPrev = 0;   
30170 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
30180 6f 75 73 20 76 61 6c 75 65 20 72 65 61 64 20 66  ous value read f
30190 72 6f 6d 20 70 67 69 64 78 20 2a 2f 0a 20 20 20  rom pgidx */.   
301a0 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20   int iTermOff = 
301b0 30 3b 0a 20 20 20 20 69 6e 74 20 69 52 6f 77 69  0;.    int iRowi
301c0 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e  dOff = 0;.    in
301d0 74 20 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20  t iOff;.    int 
301e0 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 20 20 6d  nDoclist;..    m
301f0 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20  emset(&term, 0, 
30200 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
30210 72 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 3c  r));..    if( n<
30220 34 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  4 ){.      sqlit
30230 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28  e3Fts5BufferSet(
30240 26 72 63 2c 20 26 73 2c 20 37 2c 20 28 63 6f 6e  &rc, &s, 7, (con
30250 73 74 20 75 38 2a 29 22 63 6f 72 72 75 70 74 22  st u8*)"corrupt"
30260 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  );.      goto de
30270 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 65  code_out;.    }e
30280 6c 73 65 7b 0a 20 20 20 20 20 20 69 52 6f 77 69  lse{.      iRowi
30290 64 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31  dOff = fts5GetU1
302a0 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  6(&a[0]);.      
302b0 69 50 67 69 64 78 4f 66 66 20 3d 20 73 7a 4c 65  iPgidxOff = szLe
302c0 61 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  af = fts5GetU16(
302d0 26 61 5b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  &a[2]);.      if
302e0 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b  ( iPgidxOff<n ){
302f0 0a 20 20 20 20 20 20 20 20 66 74 73 35 47 65 74  .        fts5Get
30300 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69  Varint32(&a[iPgi
30310 64 78 4f 66 66 5d 2c 20 69 54 65 72 6d 4f 66 66  dxOff], iTermOff
30320 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
30330 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
30340 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
30350 74 20 74 61 69 6c 20 61 74 20 74 68 65 20 73 74  t tail at the st
30360 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  art of the page 
30370 2a 2f 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69  */.    if( iRowi
30380 64 4f 66 66 21 3d 30 20 29 7b 0a 20 20 20 20 20  dOff!=0 ){.     
30390 20 69 4f 66 66 20 3d 20 69 52 6f 77 69 64 4f 66   iOff = iRowidOf
303a0 66 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  f;.    }else if(
303b0 20 69 54 65 72 6d 4f 66 66 21 3d 30 20 29 7b 0a   iTermOff!=0 ){.
303c0 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65        iOff = iTe
303d0 72 6d 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65  rmOff;.    }else
303e0 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 73  {.      iOff = s
303f0 7a 4c 65 61 66 3b 0a 20 20 20 20 7d 0a 20 20 20  zLeaf;.    }.   
30400 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69   fts5DecodePosli
30410 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 34  st(&rc, &s, &a[4
30420 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a 20 20 20  ], iOff-4);..   
30430 20 2f 2a 20 44 65 63 6f 64 65 20 61 6e 79 20 6d   /* Decode any m
30440 6f 72 65 20 64 6f 63 6c 69 73 74 20 64 61 74 61  ore doclist data
30450 20 74 68 61 74 20 61 70 70 65 61 72 73 20 6f 6e   that appears on
30460 20 74 68 65 20 70 61 67 65 20 62 65 66 6f 72 65   the page before
30470 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73   the.    ** firs
30480 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 6e  t term. */.    n
30490 44 6f 63 6c 69 73 74 20 3d 20 28 69 54 65 72 6d  Doclist = (iTerm
304a0 4f 66 66 20 3f 20 69 54 65 72 6d 4f 66 66 20 3a  Off ? iTermOff :
304b0 20 73 7a 4c 65 61 66 29 20 2d 20 69 4f 66 66 3b   szLeaf) - iOff;
304c0 0a 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 44  .    fts5DecodeD
304d0 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20  oclist(&rc, &s, 
304e0 26 61 5b 69 4f 66 66 5d 2c 20 6e 44 6f 63 6c 69  &a[iOff], nDocli
304f0 73 74 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  st);..    while(
30500 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a   iPgidxOff<n ){.
30510 20 20 20 20 20 20 69 6e 74 20 62 46 69 72 73 74        int bFirst
30520 20 3d 20 28 69 50 67 69 64 78 4f 66 66 3d 3d 73   = (iPgidxOff==s
30530 7a 4c 65 61 66 29 3b 20 20 20 20 20 2f 2a 20 54  zLeaf);     /* T
30540 72 75 65 20 66 6f 72 20 66 69 72 73 74 20 74 65  rue for first te
30550 72 6d 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20  rm on page */.  
30560 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20      int nByte;  
30570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
30590 65 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  es of data */.  
305a0 20 20 20 20 69 6e 74 20 69 45 6e 64 3b 0a 20 20      int iEnd;.  
305b0 20 20 20 20 0a 20 20 20 20 20 20 69 50 67 69 64      .      iPgid
305c0 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  xOff += fts5GetV
305d0 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64  arint32(&a[iPgid
305e0 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  xOff], nByte);. 
305f0 20 20 20 20 20 69 50 67 69 64 78 50 72 65 76 20       iPgidxPrev 
30600 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  += nByte;.      
30610 69 4f 66 66 20 3d 20 69 50 67 69 64 78 50 72 65  iOff = iPgidxPre
30620 76 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 50  v;..      if( iP
30630 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  gidxOff<n ){.   
30640 20 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69       fts5GetVari
30650 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66  nt32(&a[iPgidxOf
30660 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  f], nByte);.    
30670 20 20 20 20 69 45 6e 64 20 3d 20 69 50 67 69 64      iEnd = iPgid
30680 78 50 72 65 76 20 2b 20 6e 42 79 74 65 3b 0a 20  xPrev + nByte;. 
30690 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
306a0 20 20 20 20 69 45 6e 64 20 3d 20 73 7a 4c 65 61      iEnd = szLea
306b0 66 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  f;.      }..    
306c0 20 20 69 66 28 20 62 46 69 72 73 74 3d 3d 30 20    if( bFirst==0 
306d0 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ){.        iOff 
306e0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
306f0 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79  32(&a[iOff], nBy
30700 74 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 72  te);.        ter
30710 6d 2e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20  m.n = nByte;.   
30720 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 66 66 20     }.      iOff 
30730 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
30740 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79  32(&a[iOff], nBy
30750 74 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  te);.      fts5B
30760 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
30770 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 42 79 74  &rc, &term, nByt
30780 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20  e, &a[iOff]);.  
30790 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 42 79 74      iOff += nByt
307a0 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e;..      sqlite
307b0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
307c0 64 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  dPrintf(.       
307d0 20 20 20 26 72 63 2c 20 26 73 2c 20 22 20 74 65     &rc, &s, " te
307e0 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e  rm=%.*s", term.n
307f0 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 74  , (const char*)t
30800 65 72 6d 2e 70 0a 20 20 20 20 20 20 29 3b 0a 20  erm.p.      );. 
30810 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
30820 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26  5DecodeDoclist(&
30830 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d  rc, &s, &a[iOff]
30840 2c 20 69 45 6e 64 2d 69 4f 66 66 29 3b 0a 20 20  , iEnd-iOff);.  
30850 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66    }..    fts5Buf
30860 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a  ferFree(&term);.
30870 20 20 7d 0a 20 20 0a 20 64 65 63 6f 64 65 5f 6f    }.  . decode_o
30880 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ut:.  sqlite3_fr
30890 65 65 28 61 29 3b 0a 20 20 69 66 28 20 72 63 3d  ee(a);.  if( rc=
308a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
308b0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
308c0 5f 74 65 78 74 28 70 43 74 78 2c 20 28 63 6f 6e  _text(pCtx, (con
308d0 73 74 20 63 68 61 72 2a 29 73 2e 70 2c 20 73 2e  st char*)s.p, s.
308e0 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
308f0 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ENT);.  }else{. 
30900 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
30910 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 74  t_error_code(pCt
30920 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66 74  x, rc);.  }.  ft
30930 73 35 42 75 66 66 65 72 46 72 65 65 28 26 73 29  s5BufferFree(&s)
30940 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  ;.}../*.** The i
30950 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
30960 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63   user-defined sc
30970 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 74  alar function ft
30980 73 35 5f 72 6f 77 69 64 28 29 2e 0a 2a 2f 0a 73  s5_rowid()..*/.s
30990 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 52  tatic void fts5R
309a0 6f 77 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20  owidFunction(.  
309b0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
309c0 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
309d0 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  /* Function call
309e0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
309f0 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20  t nArg,         
30a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30a10 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20   Number of args 
30a20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20  (always 2) */.  
30a30 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
30a40 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20  apVal           
30a50 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75  /* Function argu
30a60 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ments */.){.  co
30a70 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a  nst char *zArg;.
30a80 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 7b    if( nArg==0 ){
30a90 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
30aa0 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20  ult_error(pCtx, 
30ab0 22 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35  "should be: fts5
30ac0 5f 72 6f 77 69 64 28 73 75 62 6a 65 63 74 2c 20  _rowid(subject, 
30ad0 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a 20 20 7d  ....)", -1);.  }
30ae0 65 6c 73 65 7b 0a 20 20 20 20 7a 41 72 67 20 3d  else{.    zArg =
30af0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
30b00 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
30b10 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20 20  (apVal[0]);.    
30b20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73  if( 0==sqlite3_s
30b30 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 73 65  tricmp(zArg, "se
30b40 67 6d 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20  gment") ){.     
30b50 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20   i64 iRowid;.   
30b60 20 20 20 69 6e 74 20 73 65 67 69 64 2c 20 70 67     int segid, pg
30b70 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41  no;.      if( nA
30b80 72 67 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  rg!=3 ){.       
30b90 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
30ba0 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20  error(pCtx, .   
30bb0 20 20 20 20 20 20 20 20 20 22 73 68 6f 75 6c 64           "should
30bc0 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28   be: fts5_rowid(
30bd0 27 73 65 67 6d 65 6e 74 27 2c 20 73 65 67 69 64  'segment', segid
30be0 2c 20 70 67 6e 6f 29 29 22 2c 20 2d 31 0a 20 20  , pgno))", -1.  
30bf0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
30c00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65  else{.        se
30c10 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  gid = sqlite3_va
30c20 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 31 5d  lue_int(apVal[1]
30c30 29 3b 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 20  );.        pgno 
30c40 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
30c50 69 6e 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20  int(apVal[2]);. 
30c60 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 3d 20         iRowid = 
30c70 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
30c80 49 44 28 73 65 67 69 64 2c 20 70 67 6e 6f 29 3b  ID(segid, pgno);
30c90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30ca0 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43  _result_int64(pC
30cb0 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  tx, iRowid);.   
30cc0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
30cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
30ce0 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c  sult_error(pCtx,
30cf0 20 0a 20 20 20 20 20 20 20 20 22 66 69 72 73 74   .        "first
30d00 20 61 72 67 20 74 6f 20 66 74 73 35 5f 72 6f 77   arg to fts5_row
30d10 69 64 28 29 20 6d 75 73 74 20 62 65 20 27 73 65  id() must be 'se
30d20 67 6d 65 6e 74 27 22 20 2c 20 2d 31 0a 20 20 20  gment'" , -1.   
30d30 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a     );.    }.  }.
30d40 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
30d50 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20   called as part 
30d60 6f 66 20 72 65 67 69 73 74 65 72 69 6e 67 20 74  of registering t
30d70 68 65 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 77  he FTS5 module w
30d80 69 74 68 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ith database.** 
30d90 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 20 49  connection db. I
30da0 74 20 72 65 67 69 73 74 65 72 73 20 73 65 76 65  t registers seve
30db0 72 61 6c 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ral user-defined
30dc0 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
30dd0 73 20 75 73 65 66 75 6c 0a 2a 2a 20 77 69 74 68  s useful.** with
30de0 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   FTS5..**.** If 
30df0 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
30e00 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
30e10 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  d. If an error o
30e20 63 63 75 72 73 2c 20 73 6f 6d 65 20 6f 74 68 65  ccurs, some othe
30e30 72 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f  r.** SQLite erro
30e40 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
30e50 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 69  ed instead..*/.i
30e60 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
30e70 64 65 78 49 6e 69 74 28 73 71 6c 69 74 65 33 20  dexInit(sqlite3 
30e80 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *db){.  int rc =
30e90 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
30ea0 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20  function(.      
30eb0 64 62 2c 20 22 66 74 73 35 5f 64 65 63 6f 64 65  db, "fts5_decode
30ec0 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 2, SQLITE_UTF
30ed0 38 2c 20 30 2c 20 66 74 73 35 44 65 63 6f 64 65  8, 0, fts5Decode
30ee0 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20  Function, 0, 0. 
30ef0 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
30f00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30f10 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
30f20 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
30f30 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f        db, "fts5_
30f40 64 65 63 6f 64 65 5f 6e 6f 6e 65 22 2c 20 32 2c  decode_none", 2,
30f50 20 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45   .        SQLITE
30f60 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 64 62  _UTF8, (void*)db
30f70 2c 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63  , fts5DecodeFunc
30f80 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20 29  tion, 0, 0.    )
30f90 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
30fa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30fb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
30fc0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
30fd0 20 20 20 20 20 20 20 20 64 62 2c 20 22 66 74 73          db, "fts
30fe0 35 5f 72 6f 77 69 64 22 2c 20 2d 31 2c 20 53 51  5_rowid", -1, SQ
30ff0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74  LITE_UTF8, 0, ft
31000 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 2c  s5RowidFunction,
31010 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d   0, 0.    );.  }
31020 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
31030 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
31040 35 49 6e 64 65 78 52 65 73 65 74 28 46 74 73 35  5IndexReset(Fts5
31050 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61 73 73  Index *p){.  ass
31060 65 72 74 28 20 70 2d 3e 70 53 74 72 75 63 74 3d  ert( p->pStruct=
31070 3d 30 20 7c 7c 20 70 2d 3e 69 53 74 72 75 63 74  =0 || p->iStruct
31080 56 65 72 73 69 6f 6e 21 3d 30 20 29 3b 0a 20 20  Version!=0 );.  
31090 69 66 28 20 66 74 73 35 49 6e 64 65 78 44 61 74  if( fts5IndexDat
310a0 61 56 65 72 73 69 6f 6e 28 70 29 21 3d 70 2d 3e  aVersion(p)!=p->
310b0 69 53 74 72 75 63 74 56 65 72 73 69 6f 6e 20 29  iStructVersion )
310c0 7b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  {.    fts5Struct
310d0 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29  ureInvalidate(p)
310e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  ;.  }.  return f
310f0 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
31100 29 3b 0a 7d 0a                                   );.}.