/ Hex Artifact Content
Login

Artifact 97d84ca8ed6f347efea4bd4f831d6c5d3b7efeb7cb41cc281ee3886dc61eed0d:


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 42 75 66 66 65 72 20 70 6f 73 6c   Fts5Buffer posl
4d20: 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
4d30: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
4d40: 69 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 70 6f  ining current po
4d50: 73 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 43  slist */.  Fts5C
4d60: 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20  olset *pColset; 
4d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
4d80: 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74  strict matches t
4d90: 6f 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20  o these columns 
4da0: 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 64  */..  /* Invoked
4db0: 20 74 6f 20 73 65 74 20 6f 75 74 70 75 74 20 76   to set output v
4dc0: 61 72 69 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 76  ariables. */.  v
4dd0: 6f 69 64 20 28 2a 78 53 65 74 4f 75 74 70 75 74  oid (*xSetOutput
4de0: 73 29 28 46 74 73 35 49 74 65 72 2a 2c 20 46 74  s)(Fts5Iter*, Ft
4df0: 73 35 53 65 67 49 74 65 72 2a 29 3b 0a 0a 20 20  s5SegIter*);..  
4e00: 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20  int nSeg;       
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 53 65 67 5b  /* Size of aSeg[
4e30: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  ] array */.  int
4e40: 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e60: 54 72 75 65 20 74 6f 20 69 74 65 72 61 74 65 20  True to iterate 
4e70: 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
4e80: 20 2a 2f 0a 20 20 75 38 20 62 53 6b 69 70 45 6d   */.  u8 bSkipEm
4e90: 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  pty;            
4ea0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
4eb0: 20 73 6b 69 70 20 64 65 6c 65 74 65 64 20 65 6e   skip deleted en
4ec0: 74 72 69 65 73 20 2a 2f 0a 0a 20 20 69 36 34 20  tries */..  i64 
4ed0: 69 53 77 69 74 63 68 52 6f 77 69 64 3b 20 20 20  iSwitchRowid;   
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4ef0: 69 72 73 74 65 73 74 20 72 6f 77 69 64 20 6f 66  irstest rowid of
4f00: 20 6f 74 68 65 72 20 74 68 61 6e 20 61 46 69 72   other than aFir
4f10: 73 74 5b 31 5d 20 2a 2f 0a 20 20 46 74 73 35 43  st[1] */.  Fts5C
4f20: 52 65 73 75 6c 74 20 2a 61 46 69 72 73 74 3b 20  Result *aFirst; 
4f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4f40: 72 72 65 6e 74 20 6d 65 72 67 65 20 73 74 61 74  rrent merge stat
4f50: 65 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f  e (see above) */
4f60: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 61  .  Fts5SegIter a
4f70: 53 65 67 5b 31 5d 3b 20 20 20 20 20 20 20 20 20  Seg[1];         
4f80: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
4f90: 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73  egment iterators
4fa0: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41   */.};.../*.** A
4fb0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
4fc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65  e following type
4fd0: 20 69 73 20 75 73 65 64 20 74 6f 20 69 74 65 72   is used to iter
4fe0: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
4ff0: 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61  contents.** of a
5000: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72   doclist-index r
5010: 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61  ecord..**.** pDa
5020: 74 61 3a 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20  ta:.**   Record 
5030: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 64  containing the d
5040: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 64 61 74  oclist-index dat
5050: 61 2e 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a  a..**.** bEof:.*
5060: 2a 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20  *   Set to true 
5070: 6f 6e 63 65 20 69 74 65 72 61 74 6f 72 20 68 61  once iterator ha
5080: 73 20 72 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a  s reached EOF..*
5090: 2a 0a 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20  *.** iOff:.**   
50a0: 53 65 74 20 74 6f 20 74 68 65 20 63 75 72 72 65  Set to the curre
50b0: 6e 74 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  nt offset within
50c0: 20 72 65 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a   record pData..*
50d0: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c 69  /.struct Fts5Dli
50e0: 64 78 4c 76 6c 20 7b 0a 20 20 46 74 73 35 44 61  dxLvl {.  Fts5Da
50f0: 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  ta *pData;      
5100: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
5110: 66 6f 72 20 63 75 72 72 65 6e 74 20 70 61 67 65  for current page
5120: 20 6f 66 20 74 68 69 73 20 6c 65 76 65 6c 20 2a   of this level *
5130: 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20  /.  int iOff;   
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5150: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66    /* Current off
5160: 73 65 74 20 69 6e 74 6f 20 70 44 61 74 61 20 2a  set into pData *
5170: 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20  /.  int bEof;   
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 2f 2a 20 41 74 20 45 4f 46 20 61 6c 72 65    /* At EOF alre
51a0: 61 64 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  ady */.  int iFi
51b0: 72 73 74 4f 66 66 3b 20 20 20 20 20 20 20 20 20  rstOff;         
51c0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62         /* Used b
51d0: 79 20 72 65 76 65 72 73 65 20 69 74 65 72 61 74  y reverse iterat
51e0: 6f 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74  ors */..  /* Out
51f0: 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f  put variables */
5200: 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
5210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5220: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
5230: 6f 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  of current leaf 
5240: 70 61 67 65 20 2a 2f 0a 20 20 69 36 34 20 69 52  page */.  i64 iR
5250: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
5260: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
5270: 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 69   rowid on leaf i
5280: 4c 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73  LeafPgno */.};.s
5290: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
52a0: 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c  ter {.  int nLvl
52b0: 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a  ;.  int iSegid;.
52c0: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 61    Fts5DlidxLvl a
52d0: 4c 76 6c 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74 61 74  Lvl[1];.};..stat
52e0: 69 63 20 76 6f 69 64 20 66 74 73 35 50 75 74 55  ic void fts5PutU
52f0: 31 36 28 75 38 20 2a 61 4f 75 74 2c 20 75 31 36  16(u8 *aOut, u16
5300: 20 69 56 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30   iVal){.  aOut[0
5310: 5d 20 3d 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20  ] = (iVal>>8);. 
5320: 20 61 4f 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c   aOut[1] = (iVal
5330: 26 30 78 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69  &0xFF);.}..stati
5340: 63 20 75 31 36 20 66 74 73 35 47 65 74 55 31 36  c u16 fts5GetU16
5350: 28 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b  (const u8 *aIn){
5360: 0a 20 20 72 65 74 75 72 6e 20 28 28 75 31 36 29  .  return ((u16)
5370: 61 49 6e 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61  aIn[0] << 8) + a
5380: 49 6e 5b 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a 2a 2a  In[1];.} ../*.**
5390: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   Allocate and re
53a0: 74 75 72 6e 20 61 20 62 75 66 66 65 72 20 61 74  turn a buffer at
53b0: 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79 74   least nByte byt
53c0: 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
53d0: 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
53e0: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
53f0: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
5400: 64 20 73 65 74 20 74 68 65 20 65 72 72 6f 72 20  d set the error 
5410: 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46  code in.** the F
5420: 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 20  ts5Index handle 
5430: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
5440: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  rst argument..*/
5450: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74  .static void *ft
5460: 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35  s5IdxMalloc(Fts5
5470: 49 6e 64 65 78 20 2a 70 2c 20 73 71 6c 69 74 65  Index *p, sqlite
5480: 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a  3_int64 nByte){.
5490: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
54a0: 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
54b0: 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 7d  p->rc, nByte);.}
54c0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
54d0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
54e0: 74 68 65 20 70 4c 65 66 74 20 62 75 66 66 65 72  the pLeft buffer
54f0: 20 77 69 74 68 20 74 68 65 20 70 52 69 67 68 74   with the pRight
5500: 2f 6e 52 69 67 68 74 20 62 6c 6f 62 2e 0a 2a 2a  /nRight blob..**
5510: 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76 65 20 69  .** Return -ve i
5520: 66 20 70 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c  f pLeft is small
5530: 65 72 20 74 68 61 6e 20 70 52 69 67 68 74 2c 20  er than pRight, 
5540: 30 20 69 66 20 74 68 65 79 20 61 72 65 20 65 71  0 if they are eq
5550: 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66  ual or.** +ve if
5560: 20 70 52 69 67 68 74 20 69 73 20 73 6d 61 6c 6c   pRight is small
5570: 65 72 20 74 68 61 6e 20 70 4c 65 66 74 2e 20 49  er than pLeft. I
5580: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a  n other words:.*
5590: 2a 0a 2a 2a 20 20 20 20 20 72 65 73 20 3d 20 2a  *.**     res = *
55a0: 70 4c 65 66 74 20 2d 20 2a 70 52 69 67 68 74 0a  pLeft - *pRight.
55b0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
55c0: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
55d0: 74 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  t fts5BufferComp
55e0: 61 72 65 42 6c 6f 62 28 0a 20 20 46 74 73 35 42  areBlob(.  Fts5B
55f0: 75 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 20 20  uffer *pLeft,   
5600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
5610: 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft hand side of 
5620: 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20  comparison */.  
5630: 63 6f 6e 73 74 20 75 38 20 2a 70 52 69 67 68 74  const u8 *pRight
5640: 2c 20 69 6e 74 20 6e 52 69 67 68 74 20 20 20 20  , int nRight    
5650: 2f 2a 20 52 69 67 68 74 20 68 61 6e 64 20 73 69  /* Right hand si
5660: 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  de of comparison
5670: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d   */.){.  int nCm
5680: 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e  p = MIN(pLeft->n
5690: 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e 74  , nRight);.  int
56a0: 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c   res = memcmp(pL
56b0: 65 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2c 20  eft->p, pRight, 
56c0: 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  nCmp);.  return 
56d0: 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74  (res==0 ? (pLeft
56e0: 2d 3e 6e 20 2d 20 6e 52 69 67 68 74 29 20 3a 20  ->n - nRight) : 
56f0: 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  res);.}.#endif..
5700: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
5710: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
5720: 65 20 74 77 6f 20 62 75 66 66 65 72 73 20 75 73  e two buffers us
5730: 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66  ing memcmp(). If
5740: 20 6f 6e 65 20 62 75 66 66 65 72 0a 2a 2a 20 69   one buffer.** i
5750: 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
5760: 65 20 6f 74 68 65 72 2c 20 69 74 20 69 73 20 63  e other, it is c
5770: 6f 6e 73 69 64 65 72 65 64 20 74 68 65 20 6c 65  onsidered the le
5780: 73 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  sser..**.** Retu
5790: 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20  rn -ve if pLeft 
57a0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
57b0: 70 52 69 67 68 74 2c 20 30 20 69 66 20 74 68 65  pRight, 0 if the
57c0: 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a  y are equal or.*
57d0: 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68 74 20  * +ve if pRight 
57e0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
57f0: 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20  pLeft. In other 
5800: 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  words:.**.**    
5810: 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20   res = *pLeft - 
5820: 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69  *pRight.*/.stati
5830: 63 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72  c int fts5Buffer
5840: 43 6f 6d 70 61 72 65 28 46 74 73 35 42 75 66 66  Compare(Fts5Buff
5850: 65 72 20 2a 70 4c 65 66 74 2c 20 46 74 73 35 42  er *pLeft, Fts5B
5860: 75 66 66 65 72 20 2a 70 52 69 67 68 74 29 7b 0a  uffer *pRight){.
5870: 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
5880: 28 70 4c 65 66 74 2d 3e 6e 2c 20 70 52 69 67 68  (pLeft->n, pRigh
5890: 74 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20 72 65 73  t->n);.  int res
58a0: 20 3d 20 66 74 73 35 4d 65 6d 63 6d 70 28 70 4c   = fts5Memcmp(pL
58b0: 65 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2d 3e  eft->p, pRight->
58c0: 70 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75  p, nCmp);.  retu
58d0: 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c  rn (res==0 ? (pL
58e0: 65 66 74 2d 3e 6e 20 2d 20 70 52 69 67 68 74 2d  eft->n - pRight-
58f0: 3e 6e 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 73  >n) : res);.}..s
5900: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4c 65  tatic int fts5Le
5910: 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 46  afFirstTermOff(F
5920: 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 29 7b  ts5Data *pLeaf){
5930: 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 66 74  .  int ret;.  ft
5940: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
5950: 4c 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73  Leaf->p[pLeaf->s
5960: 7a 4c 65 61 66 5d 2c 20 72 65 74 29 3b 0a 20 20  zLeaf], ret);.  
5970: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
5980: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 72  *.** Close the r
5990: 65 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61  ead-only blob ha
59a0: 6e 64 6c 65 2c 20 69 66 20 69 74 20 69 73 20 6f  ndle, if it is o
59b0: 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pen..*/.static v
59c0: 6f 69 64 20 66 74 73 35 43 6c 6f 73 65 52 65 61  oid fts5CloseRea
59d0: 64 65 72 28 46 74 73 35 49 6e 64 65 78 20 2a 70  der(Fts5Index *p
59e0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61  ){.  if( p->pRea
59f0: 64 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  der ){.    sqlit
5a00: 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72  e3_blob *pReader
5a10: 20 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20   = p->pReader;. 
5a20: 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20     p->pReader = 
5a30: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  0;.    sqlite3_b
5a40: 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65  lob_close(pReade
5a50: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
5a60: 20 52 65 74 72 69 65 76 65 20 61 20 72 65 63 6f   Retrieve a reco
5a70: 72 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  rd from the %_da
5a80: 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ta table..**.** 
5a90: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
5aa0: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
5ab0: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
5ac0: 72 20 6c 65 66 74 20 69 6e 20 74 68 65 20 0a 2a  r left in the .*
5ad0: 2a 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65  * Fts5Index obje
5ae0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74  ct..*/.static Ft
5af0: 73 35 44 61 74 61 20 2a 66 74 73 35 44 61 74 61  s5Data *fts5Data
5b00: 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a  Read(Fts5Index *
5b10: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  p, i64 iRowid){.
5b20: 20 20 46 74 73 35 44 61 74 61 20 2a 70 52 65 74    Fts5Data *pRet
5b30: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72   = 0;.  if( p->r
5b40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5b50: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
5b60: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20 69 66 28  ITE_OK;..    if(
5b70: 20 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20   p->pReader ){. 
5b80: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c       /* This cal
5b90: 6c 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  l may return SQL
5ba0: 49 54 45 5f 41 42 4f 52 54 20 69 66 20 74 68 65  ITE_ABORT if the
5bb0: 72 65 20 68 61 73 20 62 65 65 6e 20 61 20 73 61  re has been a sa
5bc0: 76 65 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a  vepoint.      **
5bd0: 20 72 6f 6c 6c 62 61 63 6b 20 73 69 6e 63 65 20   rollback since 
5be0: 69 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  it was last used
5bf0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
5c00: 20 6e 65 77 20 62 6c 6f 62 20 68 61 6e 64 6c 65   new blob handle
5c10: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71  .      ** is req
5c20: 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20  uired.  */.     
5c30: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
5c40: 42 6c 6f 62 20 3d 20 70 2d 3e 70 52 65 61 64 65  Blob = p->pReade
5c50: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 61  r;.      p->pRea
5c60: 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  der = 0;.      r
5c70: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
5c80: 5f 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69  _reopen(pBlob, i
5c90: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 61 73  Rowid);.      as
5ca0: 73 65 72 74 28 20 70 2d 3e 70 52 65 61 64 65 72  sert( p->pReader
5cb0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==0 );.      p->
5cc0: 70 52 65 61 64 65 72 20 3d 20 70 42 6c 6f 62 3b  pReader = pBlob;
5cd0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
5ce0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5cf0: 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61      fts5CloseRea
5d00: 64 65 72 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  der(p);.      }.
5d10: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
5d20: 4c 49 54 45 5f 41 42 4f 52 54 20 29 20 72 63 20  LITE_ABORT ) rc 
5d30: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
5d40: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
5d50: 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73  e blob handle is
5d60: 20 6e 6f 74 20 6f 70 65 6e 20 61 74 20 74 68 69   not open at thi
5d70: 73 20 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 69 74  s point, open it
5d80: 20 61 6e 64 20 73 65 65 6b 20 0a 20 20 20 20 2a   and seek .    *
5d90: 2a 20 74 6f 20 74 68 65 20 72 65 71 75 65 73 74  * to the request
5da0: 65 64 20 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20  ed entry.  */.  
5db0: 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72    if( p->pReader
5dc0: 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ==0 && rc==SQLIT
5dd0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46 74  E_OK ){.      Ft
5de0: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
5df0: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
5e00: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
5e10: 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f  e3_blob_open(pCo
5e20: 6e 66 69 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20  nfig->db, .     
5e30: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
5e40: 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  b, p->zDataTbl, 
5e50: 22 62 6c 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c  "block", iRowid,
5e60: 20 30 2c 20 26 70 2d 3e 70 52 65 61 64 65 72 0a   0, &p->pReader.
5e70: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
5e80: 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72      /* If either
5e90: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
5ea0: 62 6c 6f 62 5f 6f 70 65 6e 28 29 20 6f 72 20 73  blob_open() or s
5eb0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70  qlite3_blob_reop
5ec0: 65 6e 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a  en() calls.    *
5ed0: 2a 20 61 62 6f 76 65 20 72 65 74 75 72 6e 65 64  * above returned
5ee0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 72   SQLITE_ERROR, r
5ef0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
5f00: 52 55 50 54 5f 56 54 41 42 20 69 6e 73 74 65 61  RUPT_VTAB instea
5f10: 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 6c 20 74 68  d..    ** All th
5f20: 65 20 72 65 61 73 6f 6e 73 20 74 68 6f 73 65 20  e reasons those 
5f30: 66 75 6e 63 74 69 6f 6e 73 20 6d 69 67 68 74 20  functions might 
5f40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
5f50: 52 4f 52 20 2d 20 6d 69 73 73 69 6e 67 0a 20 20  ROR - missing.  
5f60: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 6d 69 73 73    ** table, miss
5f70: 69 6e 67 20 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f  ing row, non-blo
5f80: 62 2f 74 65 78 74 20 69 6e 20 62 6c 6f 63 6b 20  b/text in block 
5f90: 63 6f 6c 75 6d 6e 20 2d 20 69 6e 64 69 63 61 74  column - indicat
5fa0: 65 20 0a 20 20 20 20 2a 2a 20 62 61 63 6b 69 6e  e .    ** backin
5fb0: 67 20 73 74 6f 72 65 20 63 6f 72 72 75 70 74 69  g store corrupti
5fc0: 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  on.  */.    if( 
5fd0: 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52  rc==SQLITE_ERROR
5fe0: 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52   ) rc = FTS5_COR
5ff0: 52 55 50 54 3b 0a 0a 20 20 20 20 69 66 28 20 72  RUPT;..    if( r
6000: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6010: 20 20 20 20 20 20 75 38 20 2a 61 4f 75 74 20 3d        u8 *aOut =
6020: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
6030: 20 20 2f 2a 20 52 65 61 64 20 62 6c 6f 62 20 64    /* Read blob d
6040: 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 62 75  ata into this bu
6050: 66 66 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ffer */.      in
6060: 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65  t nByte = sqlite
6070: 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e  3_blob_bytes(p->
6080: 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20  pReader);.      
6090: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 41  sqlite3_int64 nA
60a0: 6c 6c 6f 63 20 3d 20 73 69 7a 65 6f 66 28 46 74  lloc = sizeof(Ft
60b0: 73 35 44 61 74 61 29 20 2b 20 6e 42 79 74 65 20  s5Data) + nByte 
60c0: 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44  + FTS5_DATA_PADD
60d0: 49 4e 47 3b 0a 20 20 20 20 20 20 70 52 65 74 20  ING;.      pRet 
60e0: 3d 20 28 46 74 73 35 44 61 74 61 2a 29 73 71 6c  = (Fts5Data*)sql
60f0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 41  ite3_malloc64(nA
6100: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 69 66 28  lloc);.      if(
6110: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20   pRet ){.       
6120: 20 70 52 65 74 2d 3e 6e 6e 20 3d 20 6e 42 79 74   pRet->nn = nByt
6130: 65 3b 0a 20 20 20 20 20 20 20 20 61 4f 75 74 20  e;.        aOut 
6140: 3d 20 70 52 65 74 2d 3e 70 20 3d 20 28 75 38 2a  = pRet->p = (u8*
6150: 29 26 70 52 65 74 5b 31 5d 3b 0a 20 20 20 20 20  )&pRet[1];.     
6160: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6170: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
6180: 4d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  M;.      }..    
6190: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
61a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
61b0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
61c0: 5f 72 65 61 64 28 70 2d 3e 70 52 65 61 64 65 72  _read(p->pReader
61d0: 2c 20 61 4f 75 74 2c 20 6e 42 79 74 65 2c 20 30  , aOut, nByte, 0
61e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
61f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6200: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
6210: 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65 74 29  lite3_free(pRet)
6220: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d  ;.        pRet =
6230: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
6240: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  .        /* TODO
6250: 31 3a 20 46 69 78 20 74 68 69 73 20 2a 2f 0a 20  1: Fix this */. 
6260: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 70 5b 6e         pRet->p[n
6270: 42 79 74 65 5d 20 3d 20 30 78 30 30 3b 0a 20 20  Byte] = 0x00;.  
6280: 20 20 20 20 20 20 70 52 65 74 2d 3e 73 7a 4c 65        pRet->szLe
6290: 61 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  af = fts5GetU16(
62a0: 26 70 52 65 74 2d 3e 70 5b 32 5d 29 3b 0a 20 20  &pRet->p[2]);.  
62b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
62c0: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
62d0: 70 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20 20 7d 0a  p->nRead++;.  }.
62e0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 52 65 74  .  assert( (pRet
62f0: 3d 3d 30 29 3d 3d 28 70 2d 3e 72 63 21 3d 53 51  ==0)==(p->rc!=SQ
6300: 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 72 65  LITE_OK) );.  re
6310: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
6320: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65  .** Release a re
6330: 66 65 72 65 6e 63 65 20 74 6f 20 64 61 74 61 20  ference to data 
6340: 72 65 63 6f 72 64 20 72 65 74 75 72 6e 65 64 20  record returned 
6350: 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
6360: 6c 6c 20 74 6f 0a 2a 2a 20 66 74 73 35 44 61 74  ll to.** fts5Dat
6370: 61 52 65 61 64 28 29 2e 0a 2a 2f 0a 73 74 61 74  aRead()..*/.stat
6380: 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61  ic void fts5Data
6390: 52 65 6c 65 61 73 65 28 46 74 73 35 44 61 74 61  Release(Fts5Data
63a0: 20 2a 70 44 61 74 61 29 7b 0a 20 20 73 71 6c 69   *pData){.  sqli
63b0: 74 65 33 5f 66 72 65 65 28 70 44 61 74 61 29 3b  te3_free(pData);
63c0: 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 44  .}..static Fts5D
63d0: 61 74 61 20 2a 66 74 73 35 4c 65 61 66 52 65 61  ata *fts5LeafRea
63e0: 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  d(Fts5Index *p, 
63f0: 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 46  i64 iRowid){.  F
6400: 74 73 35 44 61 74 61 20 2a 70 52 65 74 20 3d 20  ts5Data *pRet = 
6410: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
6420: 69 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 70  iRowid);.  if( p
6430: 52 65 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Ret ){.    if( p
6440: 52 65 74 2d 3e 73 7a 4c 65 61 66 3e 70 52 65 74  Ret->szLeaf>pRet
6450: 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d  ->nn ){.      p-
6460: 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
6470: 50 54 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61  PT;.      fts5Da
6480: 74 61 52 65 6c 65 61 73 65 28 70 52 65 74 29 3b  taRelease(pRet);
6490: 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b  .      pRet = 0;
64a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
64b0: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 73 74 61  urn pRet;.}..sta
64c0: 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65  tic int fts5Inde
64d0: 78 50 72 65 70 61 72 65 53 74 6d 74 28 0a 20 20  xPrepareStmt(.  
64e0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20  Fts5Index *p,.  
64f0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
6500: 70 53 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a 7a  pStmt,.  char *z
6510: 53 71 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Sql.){.  if( p->
6520: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6530: 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 20 29 7b  .    if( zSql ){
6540: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
6550: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
6560: 33 28 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 64 62  3(p->pConfig->db
6570: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 0a 20 20 20 20  , zSql, -1,.    
6580: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 50 52 45        SQLITE_PRE
6590: 50 41 52 45 5f 50 45 52 53 49 53 54 45 4e 54 7c  PARE_PERSISTENT|
65a0: 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 4e  SQLITE_PREPARE_N
65b0: 4f 5f 56 54 41 42 2c 0a 20 20 20 20 20 20 20 20  O_VTAB,.        
65c0: 20 20 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20    ppStmt, 0);.  
65d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
65e0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
65f0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
6600: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
6610: 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ql);.  return p-
6620: 3e 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  >rc;.}.../*.** I
6630: 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45  NSERT OR REPLACE
6640: 20 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74   a record into t
6650: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  he %_data table.
6660: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6670: 66 74 73 35 44 61 74 61 57 72 69 74 65 28 46 74  fts5DataWrite(Ft
6680: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20  s5Index *p, i64 
6690: 69 52 6f 77 69 64 2c 20 63 6f 6e 73 74 20 75 38  iRowid, const u8
66a0: 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
66b0: 74 61 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ta){.  if( p->rc
66c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
66d0: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  turn;..  if( p->
66e0: 70 57 72 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20  pWriter==0 ){.  
66f0: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
6700: 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
6710: 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65  ig;.    fts5Inde
6720: 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20  xPrepareStmt(p, 
6730: 26 70 2d 3e 70 57 72 69 74 65 72 2c 20 73 71 6c  &p->pWriter, sql
6740: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
6750: 20 20 20 20 20 20 20 20 22 52 45 50 4c 41 43 45          "REPLACE
6760: 20 49 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f 64   INTO '%q'.'%q_d
6770: 61 74 61 27 28 69 64 2c 20 62 6c 6f 63 6b 29 20  ata'(id, block) 
6780: 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 20 0a 20  VALUES(?,?)", . 
6790: 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
67a0: 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
67b0: 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20  zName.    ));.  
67c0: 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
67d0: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  turn;.  }..  sql
67e0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
67f0: 70 2d 3e 70 57 72 69 74 65 72 2c 20 31 2c 20 69  p->pWriter, 1, i
6800: 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Rowid);.  sqlite
6810: 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70  3_bind_blob(p->p
6820: 57 72 69 74 65 72 2c 20 32 2c 20 70 44 61 74 61  Writer, 2, pData
6830: 2c 20 6e 44 61 74 61 2c 20 53 51 4c 49 54 45 5f  , nData, SQLITE_
6840: 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74  STATIC);.  sqlit
6850: 65 33 5f 73 74 65 70 28 70 2d 3e 70 57 72 69 74  e3_step(p->pWrit
6860: 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73  er);.  p->rc = s
6870: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e  qlite3_reset(p->
6880: 70 57 72 69 74 65 72 29 3b 0a 20 20 73 71 6c 69  pWriter);.  sqli
6890: 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 2d  te3_bind_null(p-
68a0: 3e 70 57 72 69 74 65 72 2c 20 32 29 3b 0a 7d 0a  >pWriter, 2);.}.
68b0: 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74  ./*.** Execute t
68c0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c  he following SQL
68d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45 4c 45  :.**.**     DELE
68e0: 54 45 20 46 52 4f 4d 20 25 5f 64 61 74 61 20 57  TE FROM %_data W
68f0: 48 45 52 45 20 69 64 20 42 45 54 57 45 45 4e 20  HERE id BETWEEN 
6900: 24 69 46 69 72 73 74 20 41 4e 44 20 24 69 4c 61  $iFirst AND $iLa
6910: 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  st.*/.static voi
6920: 64 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65  d fts5DataDelete
6930: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
6940: 36 34 20 69 46 69 72 73 74 2c 20 69 36 34 20 69  64 iFirst, i64 i
6950: 4c 61 73 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Last){.  if( p->
6960: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
6970: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70  return;..  if( p
6980: 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b  ->pDeleter==0 ){
6990: 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20  .    Fts5Config 
69a0: 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
69b0: 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68 61 72 20  onfig;.    char 
69c0: 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *zSql = sqlite3_
69d0: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
69e0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25   "DELETE FROM '%
69f0: 71 27 2e 27 25 71 5f 64 61 74 61 27 20 57 48 45  q'.'%q_data' WHE
6a00: 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64 3c  RE id>=? AND id<
6a10: 3d 3f 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  =?", .          
6a20: 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43  pConfig->zDb, pC
6a30: 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20  onfig->zName.   
6a40: 20 29 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35   );.    if( fts5
6a50: 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74  IndexPrepareStmt
6a60: 28 70 2c 20 26 70 2d 3e 70 44 65 6c 65 74 65 72  (p, &p->pDeleter
6a70: 2c 20 7a 53 71 6c 29 20 29 20 72 65 74 75 72 6e  , zSql) ) return
6a80: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
6a90: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70  _bind_int64(p->p
6aa0: 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 46 69 72  Deleter, 1, iFir
6ab0: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  st);.  sqlite3_b
6ac0: 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65  ind_int64(p->pDe
6ad0: 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61 73 74 29  leter, 2, iLast)
6ae0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
6af0: 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20  (p->pDeleter);. 
6b00: 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
6b10: 5f 72 65 73 65 74 28 70 2d 3e 70 44 65 6c 65 74  _reset(p->pDelet
6b20: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
6b30: 6d 6f 76 65 20 61 6c 6c 20 72 65 63 6f 72 64 73  move all records
6b40: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6b50: 20 73 65 67 6d 65 6e 74 20 69 53 65 67 69 64 2e   segment iSegid.
6b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6b70: 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65  fts5DataRemoveSe
6b80: 67 6d 65 6e 74 28 46 74 73 35 49 6e 64 65 78 20  gment(Fts5Index 
6b90: 2a 70 2c 20 69 6e 74 20 69 53 65 67 69 64 29 7b  *p, int iSegid){
6ba0: 0a 20 20 69 36 34 20 69 46 69 72 73 74 20 3d 20  .  i64 iFirst = 
6bb0: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
6bc0: 49 44 28 69 53 65 67 69 64 2c 20 30 29 3b 0a 20  ID(iSegid, 0);. 
6bd0: 20 69 36 34 20 69 4c 61 73 74 20 3d 20 46 54 53   i64 iLast = FTS
6be0: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
6bf0: 69 53 65 67 69 64 2b 31 2c 20 30 29 2d 31 3b 0a  iSegid+1, 0)-1;.
6c00: 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65    fts5DataDelete
6c10: 28 70 2c 20 69 46 69 72 73 74 2c 20 69 4c 61 73  (p, iFirst, iLas
6c20: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 49 64  t);.  if( p->pId
6c30: 78 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20  xDeleter==0 ){. 
6c40: 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
6c50: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
6c60: 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64  fig;.    fts5Ind
6c70: 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c  exPrepareStmt(p,
6c80: 20 26 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72   &p->pIdxDeleter
6c90: 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  , sqlite3_mprint
6ca0: 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 44 45  f(.          "DE
6cb0: 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 27  LETE FROM '%q'.'
6cc0: 25 71 5f 69 64 78 27 20 57 48 45 52 45 20 73 65  %q_idx' WHERE se
6cd0: 67 69 64 3d 3f 22 2c 0a 20 20 20 20 20 20 20 20  gid=?",.        
6ce0: 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
6cf0: 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
6d00: 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28     ));.  }.  if(
6d10: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
6d20: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
6d30: 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64  _bind_int(p->pId
6d40: 78 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 53 65  xDeleter, 1, iSe
6d50: 67 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  gid);.    sqlite
6d60: 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78 44 65  3_step(p->pIdxDe
6d70: 6c 65 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72  leter);.    p->r
6d80: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
6d90: 74 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72  t(p->pIdxDeleter
6da0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6db0: 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65  Release a refere
6dc0: 6e 63 65 20 74 6f 20 61 6e 20 46 74 73 35 53 74  nce to an Fts5St
6dd0: 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 72  ructure object r
6de0: 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61  eturned by an ea
6df0: 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20 74  rlier .** call t
6e00: 6f 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  o fts5StructureR
6e10: 65 61 64 28 29 20 6f 72 20 66 74 73 35 53 74 72  ead() or fts5Str
6e20: 75 63 74 75 72 65 44 65 63 6f 64 65 28 29 2e 0a  uctureDecode()..
6e30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
6e40: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
6e50: 61 73 65 28 46 74 73 35 53 74 72 75 63 74 75 72  ase(Fts5Structur
6e60: 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
6e70: 66 28 20 70 53 74 72 75 63 74 20 26 26 20 30 3e  f( pStruct && 0>
6e80: 3d 28 2d 2d 70 53 74 72 75 63 74 2d 3e 6e 52 65  =(--pStruct->nRe
6e90: 66 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  f) ){.    int i;
6ea0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
6eb0: 72 75 63 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  ruct->nRef==0 );
6ec0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6ed0: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
6ee0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
6ef0: 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75 63  ite3_free(pStruc
6f00: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65  t->aLevel[i].aSe
6f10: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  g);.    }.    sq
6f20: 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75  lite3_free(pStru
6f30: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ct);.  }.}..stat
6f40: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
6f50: 63 74 75 72 65 52 65 66 28 46 74 73 35 53 74 72  ctureRef(Fts5Str
6f60: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
6f70: 7b 0a 20 20 70 53 74 72 75 63 74 2d 3e 6e 52 65  {.  pStruct->nRe
6f80: 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  f++;.}../*.** De
6f90: 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65  serialize and re
6fa0: 74 75 72 6e 20 74 68 65 20 73 74 72 75 63 74 75  turn the structu
6fb0: 72 65 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e  re record curren
6fc0: 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 73 65  tly stored in se
6fd0: 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72 6d  rialized.** form
6fe0: 20 77 69 74 68 69 6e 20 62 75 66 66 65 72 20 70   within buffer p
6ff0: 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a 2a  Data/nData..**.*
7000: 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63 74  * The Fts5Struct
7010: 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64  ure.aLevel[] and
7020: 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63 74   each Fts5Struct
7030: 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20  ureLevel.aSeg[] 
7040: 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65  array.** are ove
7050: 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 6f  r-allocated by o
7060: 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73 20 61 6c  ne slot. This al
7070: 6c 6f 77 73 20 74 68 65 20 73 74 72 75 63 74 75  lows the structu
7080: 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 74  re contents.** t
7090: 6f 20 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79  o be more easily
70a0: 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   edited..**.** I
70b0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
70c0: 73 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74  s, *ppOut is set
70d0: 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20   to NULL and an 
70e0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
70f0: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f  e.** returned. O
7100: 74 68 65 72 77 69 73 65 2c 20 2a 70 70 4f 75 74  therwise, *ppOut
7110: 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
7120: 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65   to the new obje
7130: 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ct and.** SQLITE
7140: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
7150: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
7160: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
7170: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61  .  const u8 *pDa
7180: 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
7190: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
71a0: 74 61 69 6e 69 6e 67 20 73 65 72 69 61 6c 69 7a  taining serializ
71b0: 65 64 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ed structure */.
71c0: 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20    int nData,    
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
71f0: 66 65 72 20 70 44 61 74 61 20 69 6e 20 62 79 74  fer pData in byt
7200: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43  es */.  int *piC
7210: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20 20 20 20  ookie,          
7220: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
7230: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
7240: 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74 73 35 53  value */.  Fts5S
7250: 74 72 75 63 74 75 72 65 20 2a 2a 70 70 4f 75 74  tructure **ppOut
7260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
7270: 54 3a 20 44 65 73 65 72 69 61 6c 69 7a 65 64 20  T: Deserialized 
7280: 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69  object */.){.  i
7290: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
72a0: 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  K;.  int i = 0;.
72b0: 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 69 6e    int iLvl;.  in
72c0: 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20  t nLevel = 0;.  
72d0: 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30  int nSegment = 0
72e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
72f0: 34 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  4 nByte;        
7300: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
7310: 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
7320: 65 20 61 74 20 70 52 65 74 20 2a 2f 0a 20 20 46  e at pRet */.  F
7330: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 52  ts5Structure *pR
7340: 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  et = 0;        /
7350: 2a 20 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65  * Structure obje
7360: 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ct to return */.
7370: 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 63  .  /* Grab the c
7380: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20  ookie value */. 
7390: 20 69 66 28 20 70 69 43 6f 6f 6b 69 65 20 29 20   if( piCookie ) 
73a0: 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c 69  *piCookie = sqli
73b0: 74 65 33 46 74 73 35 47 65 74 33 32 28 70 44 61  te3Fts5Get32(pDa
73c0: 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b 0a 0a 20  ta);.  i = 4;.. 
73d0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 74 6f 74   /* Read the tot
73e0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76  al number of lev
73f0: 65 6c 73 20 61 6e 64 20 73 65 67 6d 65 6e 74 73  els and segments
7400: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
7410: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 74 72 75  of the.  ** stru
7420: 63 74 75 72 65 20 72 65 63 6f 72 64 2e 20 20 2a  cture record.  *
7430: 2f 0a 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74  /.  i += fts5Get
7440: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
7450: 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20 20 69  i], nLevel);.  i
7460: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
7470: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e  t32(&pData[i], n
7480: 53 65 67 6d 65 6e 74 29 3b 0a 20 20 69 66 28 20  Segment);.  if( 
7490: 6e 4c 65 76 65 6c 3e 46 54 53 35 5f 4d 41 58 5f  nLevel>FTS5_MAX_
74a0: 53 45 47 4d 45 4e 54 20 20 20 7c 7c 20 6e 4c 65  SEGMENT   || nLe
74b0: 76 65 6c 3c 30 0a 20 20 20 7c 7c 20 6e 53 65 67  vel<0.   || nSeg
74c0: 6d 65 6e 74 3e 46 54 53 35 5f 4d 41 58 5f 53 45  ment>FTS5_MAX_SE
74d0: 47 4d 45 4e 54 20 7c 7c 20 6e 53 65 67 6d 65 6e  GMENT || nSegmen
74e0: 74 3c 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  t<0.  ){.    ret
74f0: 75 72 6e 20 46 54 53 35 5f 43 4f 52 52 55 50 54  urn FTS5_CORRUPT
7500: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
7510: 28 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46  (.      sizeof(F
7520: 74 73 35 53 74 72 75 63 74 75 72 65 29 20 2b 20  ts5Structure) + 
7530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7540: 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72 75 63     /* Main struc
7550: 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20 73 69  ture */.      si
7560: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7570: 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c 65 76  reLevel) * (nLev
7580: 65 6c 2d 31 29 20 20 20 20 2f 2a 20 61 4c 65 76  el-1)    /* aLev
7590: 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  el[] array */.  
75a0: 29 3b 0a 20 20 70 52 65 74 20 3d 20 28 46 74 73  );.  pRet = (Fts
75b0: 35 53 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69  5Structure*)sqli
75c0: 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
75d0: 6f 28 26 72 63 2c 20 6e 42 79 74 65 29 3b 0a 0a  o(&rc, nByte);..
75e0: 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
75f0: 20 20 70 52 65 74 2d 3e 6e 52 65 66 20 3d 20 31    pRet->nRef = 1
7600: 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 4c 65 76  ;.    pRet->nLev
7610: 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b 0a 20 20 20  el = nLevel;.   
7620: 20 70 52 65 74 2d 3e 6e 53 65 67 6d 65 6e 74 20   pRet->nSegment 
7630: 3d 20 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20  = nSegment;.    
7640: 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  i += sqlite3Fts5
7650: 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61  GetVarint(&pData
7660: 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e 57 72 69  [i], &pRet->nWri
7670: 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20  teCounter);..   
7680: 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 72 63 3d   for(iLvl=0; rc=
7690: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c  =SQLITE_OK && iL
76a0: 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  vl<nLevel; iLvl+
76b0: 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74  +){.      Fts5St
76c0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
76d0: 76 6c 20 3d 20 26 70 52 65 74 2d 3e 61 4c 65 76  vl = &pRet->aLev
76e0: 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20  el[iLvl];.      
76f0: 69 6e 74 20 6e 54 6f 74 61 6c 20 3d 20 30 3b 0a  int nTotal = 0;.
7700: 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 3b 0a        int iSeg;.
7710: 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 44  .      if( i>=nD
7720: 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ata ){.        r
7730: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
7740: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7750: 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35         i += fts5
7760: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
7770: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e 4d 65  ta[i], pLvl->nMe
7780: 72 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 20  rge);.        i 
7790: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
77a0: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 54  32(&pData[i], nT
77b0: 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  otal);.        i
77c0: 66 28 20 6e 54 6f 74 61 6c 3c 70 4c 76 6c 2d 3e  f( nTotal<pLvl->
77d0: 6e 4d 65 72 67 65 20 29 20 72 63 20 3d 20 46 54  nMerge ) rc = FT
77e0: 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
77f0: 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d      pLvl->aSeg =
7800: 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53   (Fts5StructureS
7810: 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46  egment*)sqlite3F
7820: 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
7830: 63 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  c, .            
7840: 6e 54 6f 74 61 6c 20 2a 20 73 69 7a 65 6f 66 28  nTotal * sizeof(
7850: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
7860: 6d 65 6e 74 29 0a 20 20 20 20 20 20 20 20 29 3b  ment).        );
7870: 0a 20 20 20 20 20 20 20 20 6e 53 65 67 6d 65 6e  .        nSegmen
7880: 74 20 2d 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20 20  t -= nTotal;.   
7890: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
78a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
78b0: 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e  .        pLvl->n
78c0: 53 65 67 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20  Seg = nTotal;.  
78d0: 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30        for(iSeg=0
78e0: 3b 20 69 53 65 67 3c 6e 54 6f 74 61 6c 3b 20 69  ; iSeg<nTotal; i
78f0: 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
7900: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
7910: 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26  egment *pSeg = &
7920: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
7930: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
7940: 69 3e 3d 6e 44 61 74 61 20 29 7b 0a 20 20 20 20  i>=nData ){.    
7950: 20 20 20 20 20 20 20 20 72 63 20 3d 20 46 54 53          rc = FTS
7960: 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
7970: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7980: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7990: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
79a0: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
79b0: 69 5d 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64  i], pSeg->iSegid
79c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
79d0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
79e0: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 53 65  2(&pData[i], pSe
79f0: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20  g->pgnoFirst);. 
7a00: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74           i += ft
7a10: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
7a20: 44 61 74 61 5b 69 5d 2c 20 70 53 65 67 2d 3e 70  Data[i], pSeg->p
7a30: 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20  gnoLast);.      
7a40: 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67      if( pSeg->pg
7a50: 6e 6f 4c 61 73 74 3c 70 53 65 67 2d 3e 70 67 6e  noLast<pSeg->pgn
7a60: 6f 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20  oFirst ){.      
7a70: 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f        rc = FTS5_
7a80: 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
7a90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7aa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7ab0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4c  }.        if( iL
7ac0: 76 6c 3e 30 20 26 26 20 70 4c 76 6c 5b 2d 31 5d  vl>0 && pLvl[-1]
7ad0: 2e 6e 4d 65 72 67 65 20 26 26 20 6e 54 6f 74 61  .nMerge && nTota
7ae0: 6c 3d 3d 30 20 29 20 72 63 20 3d 20 46 54 53 35  l==0 ) rc = FTS5
7af0: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
7b00: 20 20 69 66 28 20 69 4c 76 6c 3d 3d 6e 4c 65 76    if( iLvl==nLev
7b10: 65 6c 2d 31 20 26 26 20 70 4c 76 6c 2d 3e 6e 4d  el-1 && pLvl->nM
7b20: 65 72 67 65 20 29 20 72 63 20 3d 20 46 54 53 35  erge ) rc = FTS5
7b30: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
7b40: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
7b50: 6e 53 65 67 6d 65 6e 74 21 3d 30 20 26 26 20 72  nSegment!=0 && r
7b60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
7b70: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
7b80: 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  ;..    if( rc!=S
7b90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7ba0: 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
7bb0: 65 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20  elease(pRet);.  
7bc0: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
7bd0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f 75    }.  }..  *ppOu
7be0: 74 20 3d 20 70 52 65 74 3b 0a 20 20 72 65 74 75  t = pRet;.  retu
7bf0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  rn rc;.}../*.**.
7c00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
7c10: 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c  ts5StructureAddL
7c20: 65 76 65 6c 28 69 6e 74 20 2a 70 52 63 2c 20 46  evel(int *pRc, F
7c30: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
7c40: 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20  pStruct){.  if( 
7c50: 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
7c60: 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ){.    Fts5Struc
7c70: 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
7c80: 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20 69  *ppStruct;.    i
7c90: 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72  nt nLevel = pStr
7ca0: 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 20  uct->nLevel;.   
7cb0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
7cc0: 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20  Byte = (.       
7cd0: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
7ce0: 63 74 75 72 65 29 20 2b 20 20 20 20 20 20 20 20  cture) +        
7cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69            /* Mai
7d00: 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  n structure */. 
7d10: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74         sizeof(Ft
7d20: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7d30: 29 20 2a 20 28 6e 4c 65 76 65 6c 2b 31 29 20 20  ) * (nLevel+1)  
7d40: 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61  /* aLevel[] arra
7d50: 79 20 2a 2f 0a 20 20 20 20 29 3b 0a 0a 20 20 20  y */.    );..   
7d60: 20 70 53 74 72 75 63 74 20 3d 20 73 71 6c 69 74   pStruct = sqlit
7d70: 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 53 74  e3_realloc64(pSt
7d80: 72 75 63 74 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ruct, nByte);.  
7d90: 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
7da0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
7db0: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 6e  Struct->aLevel[n
7dc0: 4c 65 76 65 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f  Level], 0, sizeo
7dd0: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  f(Fts5StructureL
7de0: 65 76 65 6c 29 29 3b 0a 20 20 20 20 20 20 70 53  evel));.      pS
7df0: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b  truct->nLevel++;
7e00: 0a 20 20 20 20 20 20 2a 70 70 53 74 72 75 63 74  .      *ppStruct
7e10: 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 20 20   = pStruct;.    
7e20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52  }else{.      *pR
7e30: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
7e40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
7e50: 2a 0a 2a 2a 20 45 78 74 65 6e 64 20 6c 65 76 65  *.** Extend leve
7e60: 6c 20 69 4c 76 6c 20 73 6f 20 74 68 61 74 20 74  l iLvl so that t
7e70: 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72  here is room for
7e80: 20 61 74 20 6c 65 61 73 74 20 6e 45 78 74 72 61   at least nExtra
7e90: 20 6d 6f 72 65 0a 2a 2a 20 73 65 67 6d 65 6e 74   more.** segment
7ea0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
7eb0: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45  d fts5StructureE
7ec0: 78 74 65 6e 64 4c 65 76 65 6c 28 0a 20 20 69 6e  xtendLevel(.  in
7ed0: 74 20 2a 70 52 63 2c 20 0a 20 20 46 74 73 35 53  t *pRc, .  Fts5S
7ee0: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
7ef0: 74 2c 20 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20  t, .  int iLvl, 
7f00: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 0a  .  int nExtra, .
7f10: 20 20 69 6e 74 20 62 49 6e 73 65 72 74 0a 29 7b    int bInsert.){
7f20: 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
7f30: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
7f40: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7f50: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
7f60: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
7f70: 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
7f80: 72 65 53 65 67 6d 65 6e 74 20 2a 61 4e 65 77 3b  reSegment *aNew;
7f90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
7fa0: 36 34 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e  64 nByte;..    n
7fb0: 42 79 74 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53  Byte = (pLvl->nS
7fc0: 65 67 20 2b 20 6e 45 78 74 72 61 29 20 2a 20 73  eg + nExtra) * s
7fd0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
7fe0: 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ureSegment);.   
7ff0: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   aNew = sqlite3_
8000: 72 65 61 6c 6c 6f 63 36 34 28 70 4c 76 6c 2d 3e  realloc64(pLvl->
8010: 61 53 65 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20  aSeg, nByte);.  
8020: 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20    if( aNew ){.  
8030: 20 20 20 20 69 66 28 20 62 49 6e 73 65 72 74 3d      if( bInsert=
8040: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =0 ){.        me
8050: 6d 73 65 74 28 26 61 4e 65 77 5b 70 4c 76 6c 2d  mset(&aNew[pLvl-
8060: 3e 6e 53 65 67 5d 2c 20 30 2c 20 73 69 7a 65 6f  >nSeg], 0, sizeo
8070: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
8080: 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61  egment) * nExtra
8090: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
80a0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76          int nMov
80b0: 65 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a  e = pLvl->nSeg *
80c0: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
80d0: 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20  ctureSegment);. 
80e0: 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26         memmove(&
80f0: 61 4e 65 77 5b 6e 45 78 74 72 61 5d 2c 20 61 4e  aNew[nExtra], aN
8100: 65 77 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20  ew, nMove);.    
8110: 20 20 20 20 6d 65 6d 73 65 74 28 61 4e 65 77 2c      memset(aNew,
8120: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
8130: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
8140: 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20   * nExtra);.    
8150: 20 20 7d 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e    }.      pLvl->
8160: 61 53 65 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20  aSeg = aNew;.   
8170: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
8180: 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
8190: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  M;.    }.  }.}..
81a0: 73 74 61 74 69 63 20 46 74 73 35 53 74 72 75 63  static Fts5Struc
81b0: 74 75 72 65 20 2a 66 74 73 35 53 74 72 75 63 74  ture *fts5Struct
81c0: 75 72 65 52 65 61 64 55 6e 63 61 63 68 65 64 28  ureReadUncached(
81d0: 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
81e0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
81f0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 46 74 73 35  pRet = 0;.  Fts5
8200: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
8210: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
8220: 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20  int iCookie;    
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8240: 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  /* Configuration
8250: 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 46 74 73   cookie */.  Fts
8260: 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 0a 20  5Data *pData;.. 
8270: 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74   pData = fts5Dat
8280: 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 54  aRead(p, FTS5_ST
8290: 52 55 43 54 55 52 45 5f 52 4f 57 49 44 29 3b 0a  RUCTURE_ROWID);.
82a0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
82b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
82c0: 20 54 4f 44 4f 3a 20 44 6f 20 77 65 20 6e 65 65   TODO: Do we nee
82d0: 64 20 74 68 69 73 20 69 66 20 74 68 65 20 6c 65  d this if the le
82e0: 61 66 2d 69 6e 64 65 78 20 69 73 20 61 70 70 65  af-index is appe
82f0: 6e 64 65 64 3f 20 50 72 6f 62 61 62 6c 79 2e 2e  nded? Probably..
8300: 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  . */.    memset(
8310: 26 70 44 61 74 61 2d 3e 70 5b 70 44 61 74 61 2d  &pData->p[pData-
8320: 3e 6e 6e 5d 2c 20 30 2c 20 46 54 53 35 5f 44 41  >nn], 0, FTS5_DA
8330: 54 41 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 20  TA_PADDING);.   
8340: 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 53 74 72   p->rc = fts5Str
8350: 75 63 74 75 72 65 44 65 63 6f 64 65 28 70 44 61  uctureDecode(pDa
8360: 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e 6e 6e  ta->p, pData->nn
8370: 2c 20 26 69 43 6f 6f 6b 69 65 2c 20 26 70 52 65  , &iCookie, &pRe
8380: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  t);.    if( p->r
8390: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
83a0: 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65  pConfig->iCookie
83b0: 21 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20 20 20  !=iCookie ){.   
83c0: 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
83d0: 65 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64  e3Fts5ConfigLoad
83e0: 28 70 43 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69  (pConfig, iCooki
83f0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  e);.    }.    ft
8400: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44  s5DataRelease(pD
8410: 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  ata);.    if( p-
8420: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
8430: 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75  {.      fts5Stru
8440: 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 52 65  ctureRelease(pRe
8450: 74 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d  t);.      pRet =
8460: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
8470: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
8480: 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35  .static i64 fts5
8490: 49 6e 64 65 78 44 61 74 61 56 65 72 73 69 6f 6e  IndexDataVersion
84a0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
84b0: 20 20 69 36 34 20 69 56 65 72 73 69 6f 6e 20 3d    i64 iVersion =
84c0: 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
84d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
84e0: 20 20 20 69 66 28 20 70 2d 3e 70 44 61 74 61 56     if( p->pDataV
84f0: 65 72 73 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20  ersion==0 ){.   
8500: 20 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 49     p->rc = fts5I
8510: 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
8520: 70 2c 20 26 70 2d 3e 70 44 61 74 61 56 65 72 73  p, &p->pDataVers
8530: 69 6f 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ion, .          
8540: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
8550: 22 50 52 41 47 4d 41 20 25 51 2e 64 61 74 61 5f  "PRAGMA %Q.data_
8560: 76 65 72 73 69 6f 6e 22 2c 20 70 2d 3e 70 43 6f  version", p->pCo
8570: 6e 66 69 67 2d 3e 7a 44 62 29 0a 20 20 20 20 20  nfig->zDb).     
8580: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
8590: 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
85a0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   0;.    }..    i
85b0: 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
85c0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70  qlite3_step(p->p
85d0: 44 61 74 61 56 65 72 73 69 6f 6e 29 20 29 7b 0a  DataVersion) ){.
85e0: 20 20 20 20 20 20 69 56 65 72 73 69 6f 6e 20 3d        iVersion =
85f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
8600: 69 6e 74 36 34 28 70 2d 3e 70 44 61 74 61 56 65  int64(p->pDataVe
8610: 72 73 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 7d  rsion, 0);.    }
8620: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
8630: 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44  ite3_reset(p->pD
8640: 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20 7d  ataVersion);.  }
8650: 0a 0a 20 20 72 65 74 75 72 6e 20 69 56 65 72 73  ..  return iVers
8660: 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ion;.}../*.** Re
8670: 61 64 2c 20 64 65 73 65 72 69 61 6c 69 7a 65 20  ad, deserialize 
8680: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 73  and return the s
8690: 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e  tructure record.
86a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53  .**.** The Fts5S
86b0: 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b  tructure.aLevel[
86c0: 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73 35 53  ] and each Fts5S
86d0: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53  tructureLevel.aS
86e0: 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72  eg[] array.** ar
86f0: 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64  e over-allocated
8700: 20 61 73 20 64 65 73 63 72 69 62 65 64 20 66 6f   as described fo
8710: 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 53  r function fts5S
8720: 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 29  tructureDecode()
8730: 20 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a   .** above..**.*
8740: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
8750: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
8760: 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72  turned and an er
8770: 72 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69 6e  ror code left in
8780: 20 74 68 65 0a 2a 2a 20 46 74 73 35 49 6e 64 65   the.** Fts5Inde
8790: 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 61 6e 20  x handle. If an 
87a0: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
87b0: 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
87c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
87d0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
87e0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
87f0: 61 74 69 63 20 46 74 73 35 53 74 72 75 63 74 75  atic Fts5Structu
8800: 72 65 20 2a 66 74 73 35 53 74 72 75 63 74 75 72  re *fts5Structur
8810: 65 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20  eRead(Fts5Index 
8820: 2a 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  *p){..  if( p->p
8830: 53 74 72 75 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Struct==0 ){.   
8840: 20 70 2d 3e 69 53 74 72 75 63 74 56 65 72 73 69   p->iStructVersi
8850: 6f 6e 20 3d 20 66 74 73 35 49 6e 64 65 78 44 61  on = fts5IndexDa
8860: 74 61 56 65 72 73 69 6f 6e 28 70 29 3b 0a 20 20  taVersion(p);.  
8870: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
8880: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8890: 70 2d 3e 70 53 74 72 75 63 74 20 3d 20 66 74 73  p->pStruct = fts
88a0: 35 53 74 72 75 63 74 75 72 65 52 65 61 64 55 6e  5StructureReadUn
88b0: 63 61 63 68 65 64 28 70 29 3b 0a 20 20 20 20 7d  cached(p);.    }
88c0: 0a 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 65 6c  .  }..#if 0.  el
88d0: 73 65 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75  se{.    Fts5Stru
88e0: 63 74 75 72 65 20 2a 70 54 65 73 74 20 3d 20 66  cture *pTest = f
88f0: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
8900: 55 6e 63 61 63 68 65 64 28 70 29 3b 0a 20 20 20  Uncached(p);.   
8910: 20 69 66 28 20 70 54 65 73 74 20 29 7b 0a 20 20   if( pTest ){.  
8920: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
8930: 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70      assert_nc( p
8940: 2d 3e 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ->pStruct->nSegm
8950: 65 6e 74 3d 3d 70 54 65 73 74 2d 3e 6e 53 65 67  ent==pTest->nSeg
8960: 6d 65 6e 74 20 29 3b 0a 20 20 20 20 20 20 61 73  ment );.      as
8970: 73 65 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74 72  sert_nc( p->pStr
8980: 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54 65  uct->nLevel==pTe
8990: 73 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20 20  st->nLevel );.  
89a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
89b0: 54 65 73 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b  Test->nLevel; i+
89c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
89d0: 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74 72 75 63  rt_nc( p->pStruc
89e0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65  t->aLevel[i].nMe
89f0: 72 67 65 3d 3d 70 54 65 73 74 2d 3e 61 4c 65 76  rge==pTest->aLev
8a00: 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 20 29 3b 0a  el[i].nMerge );.
8a10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e          assert_n
8a20: 63 28 20 70 2d 3e 70 53 74 72 75 63 74 2d 3e 61  c( p->pStruct->a
8a30: 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65 67 3d 3d 70  Level[i].nSeg==p
8a40: 54 65 73 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  Test->aLevel[i].
8a50: 6e 53 65 67 20 29 3b 0a 20 20 20 20 20 20 20 20  nSeg );.        
8a60: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 65 73 74  for(j=0; j<pTest
8a70: 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65 67  ->aLevel[i].nSeg
8a80: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
8a90: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
8aa0: 65 67 6d 65 6e 74 20 2a 70 31 20 3d 20 26 70 54  egment *p1 = &pT
8ab0: 65 73 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61  est->aLevel[i].a
8ac0: 53 65 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  Seg[j];.        
8ad0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
8ae0: 65 67 6d 65 6e 74 20 2a 70 32 20 3d 20 26 70 2d  egment *p2 = &p-
8af0: 3e 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  >pStruct->aLevel
8b00: 5b 69 5d 2e 61 53 65 67 5b 6a 5d 3b 0a 20 20 20  [i].aSeg[j];.   
8b10: 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63         assert_nc
8b20: 28 20 70 31 2d 3e 69 53 65 67 69 64 3d 3d 70 32  ( p1->iSegid==p2
8b30: 2d 3e 69 53 65 67 69 64 20 29 3b 0a 20 20 20 20  ->iSegid );.    
8b40: 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
8b50: 20 70 31 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d   p1->pgnoFirst==
8b60: 70 32 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 3b  p2->pgnoFirst );
8b70: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
8b80: 74 5f 6e 63 28 20 70 31 2d 3e 70 67 6e 6f 4c 61  t_nc( p1->pgnoLa
8b90: 73 74 3d 3d 70 32 2d 3e 70 67 6e 6f 4c 61 73 74  st==p2->pgnoLast
8ba0: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
8bb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
8bc0: 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
8bd0: 28 70 54 65 73 74 29 3b 0a 20 20 20 20 7d 0a 20  (pTest);.    }. 
8be0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
8bf0: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
8c00: 4b 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  K ) return 0;.  
8c10: 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 72 75  assert( p->iStru
8c20: 63 74 56 65 72 73 69 6f 6e 21 3d 30 20 29 3b 0a  ctVersion!=0 );.
8c30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 74    assert( p->pSt
8c40: 72 75 63 74 21 3d 30 20 29 3b 0a 20 20 66 74 73  ruct!=0 );.  fts
8c50: 35 53 74 72 75 63 74 75 72 65 52 65 66 28 70 2d  5StructureRef(p-
8c60: 3e 70 53 74 72 75 63 74 29 3b 0a 20 20 72 65 74  >pStruct);.  ret
8c70: 75 72 6e 20 70 2d 3e 70 53 74 72 75 63 74 3b 0a  urn p->pStruct;.
8c80: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
8c90: 74 73 35 53 74 72 75 63 74 75 72 65 49 6e 76 61  ts5StructureInva
8ca0: 6c 69 64 61 74 65 28 46 74 73 35 49 6e 64 65 78  lidate(Fts5Index
8cb0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70   *p){.  if( p->p
8cc0: 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 66 74  Struct ){.    ft
8cd0: 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
8ce0: 73 65 28 70 2d 3e 70 53 74 72 75 63 74 29 3b 0a  se(p->pStruct);.
8cf0: 20 20 20 20 70 2d 3e 70 53 74 72 75 63 74 20 3d      p->pStruct =
8d00: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
8d10: 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61   Return the tota
8d20: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  l number of segm
8d30: 65 6e 74 73 20 69 6e 20 69 6e 64 65 78 20 73 74  ents in index st
8d40: 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e  ructure pStruct.
8d50: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
8d60: 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75  n is only ever u
8d70: 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  sed as part of a
8d80: 73 73 65 72 74 28 29 20 63 6f 6e 64 69 74 69 6f  ssert() conditio
8d90: 6e 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ns..*/.#ifdef SQ
8da0: 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
8db0: 63 20 69 6e 74 20 66 74 73 35 53 74 72 75 63 74  c int fts5Struct
8dc0: 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73  ureCountSegments
8dd0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a  (Fts5Structure *
8de0: 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20  pStruct){.  int 
8df0: 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 20 20 20  nSegment = 0;   
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8e10: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
8e20: 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 66 28  egments */.  if(
8e30: 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
8e40: 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20  int iLvl;       
8e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8e60: 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
8e70: 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20   through levels 
8e80: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  */.    for(iLvl=
8e90: 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
8ea0: 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
8eb0: 7b 0a 20 20 20 20 20 20 6e 53 65 67 6d 65 6e 74  {.      nSegment
8ec0: 20 2b 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65   += pStruct->aLe
8ed0: 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a  vel[iLvl].nSeg;.
8ee0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
8ef0: 75 72 6e 20 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a  urn nSegment;.}.
8f00: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
8f10: 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
8f20: 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70  pendBlob(pBuf, p
8f30: 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 20 7b 20 20  Blob, nBlob) {  
8f40: 20 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20 28     \.  assert( (
8f50: 70 42 75 66 29 2d 3e 6e 53 70 61 63 65 3e 3d 28  pBuf)->nSpace>=(
8f60: 28 70 42 75 66 29 2d 3e 6e 2b 6e 42 6c 6f 62 29  (pBuf)->n+nBlob)
8f70: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
8f80: 5c 0a 20 20 6d 65 6d 63 70 79 28 26 28 70 42 75  \.  memcpy(&(pBu
8f90: 66 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e 5d  f)->p[(pBuf)->n]
8fa0: 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b  , pBlob, nBlob);
8fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
8fc0: 20 28 70 42 75 66 29 2d 3e 6e 20 2b 3d 20 6e 42   (pBuf)->n += nB
8fd0: 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  lob;            
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ff0: 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23            \.}..#
9000: 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65  define fts5Buffe
9010: 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
9020: 74 28 70 42 75 66 2c 20 69 56 61 6c 29 20 7b 20  t(pBuf, iVal) { 
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
9040: 0a 20 20 28 70 42 75 66 29 2d 3e 6e 20 2b 3d 20  .  (pBuf)->n += 
9050: 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61  sqlite3Fts5PutVa
9060: 72 69 6e 74 28 26 28 70 42 75 66 29 2d 3e 70 5b  rint(&(pBuf)->p[
9070: 28 70 42 75 66 29 2d 3e 6e 5d 2c 20 28 69 56 61  (pBuf)->n], (iVa
9080: 6c 29 29 3b 20 20 5c 0a 20 20 61 73 73 65 72 74  l));  \.  assert
9090: 28 20 28 70 42 75 66 29 2d 3e 6e 53 70 61 63 65  ( (pBuf)->nSpace
90a0: 3e 3d 28 70 42 75 66 29 2d 3e 6e 20 29 3b 20 20  >=(pBuf)->n );  
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90c0: 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f 2a          \.}.../*
90d0: 0a 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 61 6e  .** Serialize an
90e0: 64 20 73 74 6f 72 65 20 74 68 65 20 22 73 74 72  d store the "str
90f0: 75 63 74 75 72 65 22 20 72 65 63 6f 72 64 2e 0a  ucture" record..
9100: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
9110: 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
9120: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e  an error code in
9130: 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f   the Fts5Index o
9140: 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20  bject. If an.** 
9150: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
9160: 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
9170: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
9180: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
9190: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
91a0: 72 65 57 72 69 74 65 28 46 74 73 35 49 6e 64 65  reWrite(Fts5Inde
91b0: 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74  x *p, Fts5Struct
91c0: 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
91d0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
91e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
91f0: 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20  5Buffer buf;    
9200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
9210: 66 66 65 72 20 74 6f 20 73 65 72 69 61 6c 69 7a  ffer to serializ
9220: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a 2f  e record into */
9230: 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20  .    int iLvl;  
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9250: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
9260: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65  erate through le
9270: 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  vels */.    int 
9280: 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20  iCookie;        
9290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f            /* Coo
92a0: 6b 69 65 20 76 61 6c 75 65 20 74 6f 20 73 74 6f  kie value to sto
92b0: 72 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  re */..    asser
92c0: 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67  t( pStruct->nSeg
92d0: 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74  ment==fts5Struct
92e0: 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73  ureCountSegments
92f0: 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20  (pStruct) );.   
9300: 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c   memset(&buf, 0,
9310: 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
9320: 65 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70  er));..    /* Ap
9330: 70 65 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  pend the current
9340: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   configuration c
9350: 6f 6f 6b 69 65 20 2a 2f 0a 20 20 20 20 69 43 6f  ookie */.    iCo
9360: 6f 6b 69 65 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  okie = p->pConfi
9370: 67 2d 3e 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20  g->iCookie;.    
9380: 69 66 28 20 69 43 6f 6f 6b 69 65 3c 30 20 29 20  if( iCookie<0 ) 
9390: 69 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 0a 20 20  iCookie = 0;..  
93a0: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
93b0: 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26  Fts5BufferSize(&
93c0: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 34 2b 39  p->rc, &buf, 4+9
93d0: 2b 39 2b 39 29 20 29 7b 0a 20 20 20 20 20 20 73  +9+9) ){.      s
93e0: 71 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28  qlite3Fts5Put32(
93f0: 62 75 66 2e 70 2c 20 69 43 6f 6f 6b 69 65 29 3b  buf.p, iCookie);
9400: 0a 20 20 20 20 20 20 62 75 66 2e 6e 20 3d 20 34  .      buf.n = 4
9410: 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
9420: 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
9430: 6e 74 28 26 62 75 66 2c 20 70 53 74 72 75 63 74  nt(&buf, pStruct
9440: 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20  ->nLevel);.     
9450: 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
9460: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62 75 66  ppendVarint(&buf
9470: 2c 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  , pStruct->nSegm
9480: 65 6e 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ent);.      fts5
9490: 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
94a0: 56 61 72 69 6e 74 28 26 62 75 66 2c 20 28 69 36  Varint(&buf, (i6
94b0: 34 29 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74  4)pStruct->nWrit
94c0: 65 43 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20 7d  eCounter);.    }
94d0: 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30  ..    for(iLvl=0
94e0: 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ; iLvl<pStruct->
94f0: 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
9500: 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 3b  .      int iSeg;
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
9530: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
9540: 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  segments */.    
9550: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
9560: 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53  evel *pLvl = &pS
9570: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
9580: 76 6c 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 42  vl];.      fts5B
9590: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
95a0: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
95b0: 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20  pLvl->nMerge);. 
95c0: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
95d0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
95e0: 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e  rc, &buf, pLvl->
95f0: 6e 53 65 67 29 3b 0a 20 20 20 20 20 20 61 73 73  nSeg);.      ass
9600: 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  ert( pLvl->nMerg
9610: 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b  e<=pLvl->nSeg );
9620: 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67  ..      for(iSeg
9630: 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e  =0; iSeg<pLvl->n
9640: 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20  Seg; iSeg++){.  
9650: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
9660: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
9670: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
9680: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67  >aSeg[iSeg].iSeg
9690: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
96a0: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
96b0: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
96c0: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
96d0: 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20  g].pgnoFirst);. 
96e0: 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
96f0: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
9700: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
9710: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e  ->aSeg[iSeg].pgn
9720: 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  oLast);.      }.
9730: 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 44      }..    fts5D
9740: 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35  ataWrite(p, FTS5
9750: 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44  _STRUCTURE_ROWID
9760: 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b  , buf.p, buf.n);
9770: 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
9780: 72 65 65 28 26 62 75 66 29 3b 0a 20 20 7d 0a 7d  ree(&buf);.  }.}
9790: 0a 0a 23 69 66 20 30 0a 73 74 61 74 69 63 20 76  ..#if 0.static v
97a0: 6f 69 64 20 66 74 73 35 44 65 62 75 67 53 74 72  oid fts5DebugStr
97b0: 75 63 74 75 72 65 28 69 6e 74 2a 2c 46 74 73 35  ucture(int*,Fts5
97c0: 42 75 66 66 65 72 2a 2c 46 74 73 35 53 74 72 75  Buffer*,Fts5Stru
97d0: 63 74 75 72 65 2a 29 3b 0a 73 74 61 74 69 63 20  cture*);.static 
97e0: 76 6f 69 64 20 66 74 73 35 50 72 69 6e 74 53 74  void fts5PrintSt
97f0: 72 75 63 74 75 72 65 28 63 6f 6e 73 74 20 63 68  ructure(const ch
9800: 61 72 20 2a 7a 43 61 70 74 69 6f 6e 2c 20 46 74  ar *zCaption, Ft
9810: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
9820: 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  ruct){.  int rc 
9830: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46  = SQLITE_OK;.  F
9840: 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20  ts5Buffer buf;. 
9850: 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c   memset(&buf, 0,
9860: 20 73 69 7a 65 6f 66 28 62 75 66 29 29 3b 0a 20   sizeof(buf));. 
9870: 20 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74   fts5DebugStruct
9880: 75 72 65 28 26 72 63 2c 20 26 62 75 66 2c 20 70  ure(&rc, &buf, p
9890: 53 74 72 75 63 74 29 3b 0a 20 20 66 70 72 69 6e  Struct);.  fprin
98a0: 74 66 28 73 74 64 6f 75 74 2c 20 22 25 73 3a 20  tf(stdout, "%s: 
98b0: 25 73 5c 6e 22 2c 20 7a 43 61 70 74 69 6f 6e 2c  %s\n", zCaption,
98c0: 20 62 75 66 2e 70 29 3b 0a 20 20 66 66 6c 75 73   buf.p);.  fflus
98d0: 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 66 74 73  h(stdout);.  fts
98e0: 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66  5BufferFree(&buf
98f0: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
9900: 69 6e 65 20 66 74 73 35 50 72 69 6e 74 53 74 72  ine fts5PrintStr
9910: 75 63 74 75 72 65 28 78 2c 79 29 0a 23 65 6e 64  ucture(x,y).#end
9920: 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  if..static int f
9930: 74 73 35 53 65 67 6d 65 6e 74 53 69 7a 65 28 46  ts5SegmentSize(F
9940: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
9950: 65 6e 74 20 2a 70 53 65 67 29 7b 0a 20 20 72 65  ent *pSeg){.  re
9960: 74 75 72 6e 20 31 20 2b 20 70 53 65 67 2d 3e 70  turn 1 + pSeg->p
9970: 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e  gnoLast - pSeg->
9980: 70 67 6e 6f 46 69 72 73 74 3b 0a 7d 0a 0a 2f 2a  pgnoFirst;.}../*
9990: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 63 6f 70  .** Return a cop
99a0: 79 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75 63  y of index struc
99b0: 74 75 72 65 20 70 53 74 72 75 63 74 2e 20 45 78  ture pStruct. Ex
99c0: 63 65 70 74 2c 20 70 72 6f 6d 6f 74 65 20 61 73  cept, promote as
99d0: 20 6d 61 6e 79 20 0a 2a 2a 20 73 65 67 6d 65 6e   many .** segmen
99e0: 74 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 74  ts as possible t
99f0: 6f 20 6c 65 76 65 6c 20 69 50 72 6f 6d 6f 74 65  o level iPromote
9a00: 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75  . If an OOM occu
9a10: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 0a 2a 2a 20  rs, NULL is .** 
9a20: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
9a30: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72  tic void fts5Str
9a40: 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28  ucturePromoteTo(
9a50: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
9a60: 0a 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 2c  .  int iPromote,
9a70: 0a 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65  .  int szPromote
9a80: 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ,.  Fts5Structur
9a90: 65 20 2a 70 53 74 72 75 63 74 0a 29 7b 0a 20 20  e *pStruct.){.  
9aa0: 69 6e 74 20 69 6c 2c 20 69 73 3b 0a 20 20 46 74  int il, is;.  Ft
9ab0: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
9ac0: 20 2a 70 4f 75 74 20 3d 20 26 70 53 74 72 75 63   *pOut = &pStruc
9ad0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 50 72 6f 6d 6f  t->aLevel[iPromo
9ae0: 74 65 5d 3b 0a 0a 20 20 69 66 28 20 70 4f 75 74  te];..  if( pOut
9af0: 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20  ->nMerge==0 ){. 
9b00: 20 20 20 66 6f 72 28 69 6c 3d 69 50 72 6f 6d 6f     for(il=iPromo
9b10: 74 65 2b 31 3b 20 69 6c 3c 70 53 74 72 75 63 74  te+1; il<pStruct
9b20: 2d 3e 6e 4c 65 76 65 6c 3b 20 69 6c 2b 2b 29 7b  ->nLevel; il++){
9b30: 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
9b40: 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
9b50: 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
9b60: 65 6c 5b 69 6c 5d 3b 0a 20 20 20 20 20 20 69 66  el[il];.      if
9b70: 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29  ( pLvl->nMerge )
9b80: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 66   return;.      f
9b90: 6f 72 28 69 73 3d 70 4c 76 6c 2d 3e 6e 53 65 67  or(is=pLvl->nSeg
9ba0: 2d 31 3b 20 69 73 3e 3d 30 3b 20 69 73 2d 2d 29  -1; is>=0; is--)
9bb0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  {.        int sz
9bc0: 20 3d 20 66 74 73 35 53 65 67 6d 65 6e 74 53 69   = fts5SegmentSi
9bd0: 7a 65 28 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  ze(&pLvl->aSeg[i
9be0: 73 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  s]);.        if(
9bf0: 20 73 7a 3e 73 7a 50 72 6f 6d 6f 74 65 20 29 20   sz>szPromote ) 
9c00: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
9c10: 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74  fts5StructureExt
9c20: 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c  endLevel(&p->rc,
9c30: 20 70 53 74 72 75 63 74 2c 20 69 50 72 6f 6d 6f   pStruct, iPromo
9c40: 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  te, 1, 1);.     
9c50: 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72     if( p->rc ) r
9c60: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 6d  eturn;.        m
9c70: 65 6d 63 70 79 28 70 4f 75 74 2d 3e 61 53 65 67  emcpy(pOut->aSeg
9c80: 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73  , &pLvl->aSeg[is
9c90: 5d 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74  ], sizeof(Fts5St
9ca0: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 29  ructureSegment))
9cb0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e  ;.        pOut->
9cc0: 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nSeg++;.        
9cd0: 70 4c 76 6c 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20  pLvl->nSeg--;.  
9ce0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9cf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 65 77 20 73  }../*.** A new s
9d00: 65 67 6d 65 6e 74 20 68 61 73 20 6a 75 73 74 20  egment has just 
9d10: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
9d20: 6c 65 76 65 6c 20 69 4c 76 6c 20 6f 66 20 69 6e  level iLvl of in
9d30: 64 65 78 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  dex structure.**
9d40: 20 70 53 74 72 75 63 74 2e 20 54 68 69 73 20 66   pStruct. This f
9d50: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
9d60: 65 73 20 69 66 20 61 6e 79 20 73 65 67 6d 65 6e  es if any segmen
9d70: 74 73 20 73 68 6f 75 6c 64 20 62 65 20 70 72 6f  ts should be pro
9d80: 6d 6f 74 65 64 0a 2a 2a 20 61 73 20 61 20 72 65  moted.** as a re
9d90: 73 75 6c 74 2e 20 53 65 67 6d 65 6e 74 73 20 61  sult. Segments a
9da0: 72 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e 20 74  re promoted in t
9db0: 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a  wo scenarios:.**
9dc0: 0a 2a 2a 20 20 20 61 29 20 49 66 20 74 68 65 20  .**   a) If the 
9dd0: 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69  segment just wri
9de0: 74 74 65 6e 20 69 73 20 73 6d 61 6c 6c 65 72 20  tten is smaller 
9df0: 74 68 61 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  than one or more
9e00: 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 20 20 20   segments.**    
9e10: 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 72 65    within the pre
9e20: 76 69 6f 75 73 20 70 6f 70 75 6c 61 74 65 64 20  vious populated 
9e30: 6c 65 76 65 6c 2c 20 69 74 20 69 73 20 70 72 6f  level, it is pro
9e40: 6d 6f 74 65 64 20 74 6f 20 74 68 65 20 70 72 65  moted to the pre
9e50: 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20 70 6f  vious.**      po
9e60: 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2e 0a 2a  pulated level..*
9e70: 2a 0a 2a 2a 20 20 20 62 29 20 49 66 20 74 68 65  *.**   b) If the
9e80: 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72   segment just wr
9e90: 69 74 74 65 6e 20 69 73 20 6c 61 72 67 65 72 20  itten is larger 
9ea0: 74 68 61 6e 20 74 68 65 20 6e 65 77 65 73 74 20  than the newest 
9eb0: 73 65 67 6d 65 6e 74 20 6f 6e 0a 2a 2a 20 20 20  segment on.**   
9ec0: 20 20 20 74 68 65 20 6e 65 78 74 20 70 6f 70 75     the next popu
9ed0: 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 74 68 65  lated level, the
9ee0: 6e 20 74 68 61 74 20 73 65 67 6d 65 6e 74 2c 20  n that segment, 
9ef0: 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 61 64  and any other ad
9f00: 6a 61 63 65 6e 74 0a 2a 2a 20 20 20 20 20 20 73  jacent.**      s
9f10: 65 67 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65  egments that are
9f20: 20 61 6c 73 6f 20 73 6d 61 6c 6c 65 72 20 74 68   also smaller th
9f30: 61 6e 20 74 68 65 20 6f 6e 65 20 6a 75 73 74 20  an the one just 
9f40: 77 72 69 74 74 65 6e 2c 20 61 72 65 20 0a 2a 2a  written, are .**
9f50: 20 20 20 20 20 20 70 72 6f 6d 6f 74 65 64 2e 20        promoted. 
9f60: 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 6f 72  .**.** If one or
9f70: 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 20 61   more segments a
9f80: 72 65 20 70 72 6f 6d 6f 74 65 64 2c 20 74 68 65  re promoted, the
9f90: 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63   structure objec
9fa0: 74 20 69 73 20 75 70 64 61 74 65 64 0a 2a 2a 20  t is updated.** 
9fb0: 74 6f 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e  to reflect this.
9fc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9fd0: 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
9fe0: 6d 6f 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65  mote(.  Fts5Inde
9ff0: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
a000: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
a010: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
a020: 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20  /.  int iLvl,   
a030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a040: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6c 65 76      /* Index lev
a050: 65 6c 20 6a 75 73 74 20 75 70 64 61 74 65 64 20  el just updated 
a060: 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
a070: 72 65 20 2a 70 53 74 72 75 63 74 20 20 20 20 20  re *pStruct     
a080: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74       /* Index st
a090: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
a0a0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
a0b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
a0c0: 69 54 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 50  iTst;.    int iP
a0d0: 72 6f 6d 6f 74 65 20 3d 20 2d 31 3b 0a 20 20 20  romote = -1;.   
a0e0: 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 20 3d   int szPromote =
a0f0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
a100: 2a 20 50 72 6f 6d 6f 74 65 20 61 6e 79 74 68 69  * Promote anythi
a110: 6e 67 20 74 68 69 73 20 73 69 7a 65 20 6f 72 20  ng this size or 
a120: 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 46  smaller */.    F
a130: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
a140: 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a 20  ent *pSeg;   /* 
a150: 53 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69  Segment just wri
a160: 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tten */.    int 
a170: 73 7a 53 65 67 3b 20 20 20 20 20 20 20 20 20 20  szSeg;          
a180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
a190: 65 20 6f 66 20 73 65 67 6d 65 6e 74 20 6a 75 73  e of segment jus
a1a0: 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20  t written */.   
a1b0: 20 69 6e 74 20 6e 53 65 67 20 3d 20 70 53 74 72   int nSeg = pStr
a1c0: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
a1d0: 5d 2e 6e 53 65 67 3b 0a 0a 20 20 20 20 69 66 28  ].nSeg;..    if(
a1e0: 20 6e 53 65 67 3d 3d 30 20 29 20 72 65 74 75 72   nSeg==0 ) retur
a1f0: 6e 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70  n;.    pSeg = &p
a200: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
a210: 4c 76 6c 5d 2e 61 53 65 67 5b 70 53 74 72 75 63  Lvl].aSeg[pStruc
a220: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
a230: 6e 53 65 67 2d 31 5d 3b 0a 20 20 20 20 73 7a 53  nSeg-1];.    szS
a240: 65 67 20 3d 20 28 31 20 2b 20 70 53 65 67 2d 3e  eg = (1 + pSeg->
a250: 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d  pgnoLast - pSeg-
a260: 3e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 0a 20 20  >pgnoFirst);..  
a270: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63    /* Check for c
a280: 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 2a 2f 0a  ondition (a) */.
a290: 20 20 20 20 66 6f 72 28 69 54 73 74 3d 69 4c 76      for(iTst=iLv
a2a0: 6c 2d 31 3b 20 69 54 73 74 3e 3d 30 20 26 26 20  l-1; iTst>=0 && 
a2b0: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
a2c0: 69 54 73 74 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69  iTst].nSeg==0; i
a2d0: 54 73 74 2d 2d 29 3b 0a 20 20 20 20 69 66 28 20  Tst--);.    if( 
a2e0: 69 54 73 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iTst>=0 ){.     
a2f0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e   int i;.      in
a300: 74 20 73 7a 4d 61 78 20 3d 20 30 3b 0a 20 20 20  t szMax = 0;.   
a310: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
a320: 4c 65 76 65 6c 20 2a 70 54 73 74 20 3d 20 26 70  Level *pTst = &p
a330: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
a340: 54 73 74 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  Tst];.      asse
a350: 72 74 28 20 70 54 73 74 2d 3e 6e 4d 65 72 67 65  rt( pTst->nMerge
a360: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  ==0 );.      for
a370: 28 69 3d 30 3b 20 69 3c 70 54 73 74 2d 3e 6e 53  (i=0; i<pTst->nS
a380: 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  eg; i++){.      
a390: 20 20 69 6e 74 20 73 7a 20 3d 20 70 54 73 74 2d    int sz = pTst-
a3a0: 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 4c 61 73  >aSeg[i].pgnoLas
a3b0: 74 20 2d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69  t - pTst->aSeg[i
a3c0: 5d 2e 70 67 6e 6f 46 69 72 73 74 20 2b 20 31 3b  ].pgnoFirst + 1;
a3d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e  .        if( sz>
a3e0: 73 7a 4d 61 78 20 29 20 73 7a 4d 61 78 20 3d 20  szMax ) szMax = 
a3f0: 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sz;.      }.    
a400: 20 20 69 66 28 20 73 7a 4d 61 78 3e 3d 73 7a 53    if( szMax>=szS
a410: 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  eg ){.        /*
a420: 20 43 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69   Condition (a) i
a430: 73 20 74 72 75 65 2e 20 50 72 6f 6d 6f 74 65 20  s true. Promote 
a440: 74 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65  the newest segme
a450: 6e 74 20 6f 6e 20 6c 65 76 65 6c 20 0a 20 20 20  nt on level .   
a460: 20 20 20 20 20 2a 2a 20 69 4c 76 6c 20 74 6f 20       ** iLvl to 
a470: 6c 65 76 65 6c 20 69 54 73 74 2e 20 20 2a 2f 0a  level iTst.  */.
a480: 20 20 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65          iPromote
a490: 20 3d 20 69 54 73 74 3b 0a 20 20 20 20 20 20 20   = iTst;.       
a4a0: 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 4d   szPromote = szM
a4b0: 61 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ax;.      }.    
a4c0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6e  }..    /* If con
a4d0: 64 69 74 69 6f 6e 20 28 61 29 20 69 73 20 6e 6f  dition (a) is no
a4e0: 74 20 6d 65 74 2c 20 61 73 73 75 6d 65 20 28 62  t met, assume (b
a4f0: 29 20 69 73 20 74 72 75 65 2e 20 53 74 72 75 63  ) is true. Struc
a500: 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 29 0a  turePromoteTo().
a510: 20 20 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f      ** is a no-o
a520: 70 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20  p if it is not. 
a530: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 72 6f   */.    if( iPro
a540: 6d 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  mote<0 ){.      
a550: 69 50 72 6f 6d 6f 74 65 20 3d 20 69 4c 76 6c 3b  iPromote = iLvl;
a560: 0a 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65  .      szPromote
a570: 20 3d 20 73 7a 53 65 67 3b 0a 20 20 20 20 7d 0a   = szSeg;.    }.
a580: 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
a590: 65 50 72 6f 6d 6f 74 65 54 6f 28 70 2c 20 69 50  ePromoteTo(p, iP
a5a0: 72 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f 6d 6f 74  romote, szPromot
a5b0: 65 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d  e, pStruct);.  }
a5c0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  .}.../*.** Advan
a5d0: 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ce the iterator 
a5e0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
a5f0: 6c 79 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  ly argument. If 
a600: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
a610: 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ** doclist-index
a620: 20 70 61 67 65 20 69 73 20 72 65 61 63 68 65 64   page is reached
a630: 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  , return non-zer
a640: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
a650: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78   fts5DlidxLvlNex
a660: 74 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a  t(Fts5DlidxLvl *
a670: 70 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 61 74  pLvl){.  Fts5Dat
a680: 61 20 2a 70 44 61 74 61 20 3d 20 70 4c 76 6c 2d  a *pData = pLvl-
a690: 3e 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 70  >pData;..  if( p
a6a0: 4c 76 6c 2d 3e 69 4f 66 66 3d 3d 30 20 29 7b 0a  Lvl->iOff==0 ){.
a6b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c      assert( pLvl
a6c0: 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 20  ->bEof==0 );.   
a6d0: 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 31 3b   pLvl->iOff = 1;
a6e0: 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20  .    pLvl->iOff 
a6f0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
a700: 33 32 28 26 70 44 61 74 61 2d 3e 70 5b 31 5d 2c  32(&pData->p[1],
a710: 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f   pLvl->iLeafPgno
a720: 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66  );.    pLvl->iOf
a730: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
a740: 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 70 4c 76  nt(&pData->p[pLv
a750: 6c 2d 3e 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  l->iOff], (u64*)
a760: 26 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 29 3b 0a  &pLvl->iRowid);.
a770: 20 20 20 20 70 4c 76 6c 2d 3e 69 46 69 72 73 74      pLvl->iFirst
a780: 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66  Off = pLvl->iOff
a790: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
a7a0: 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 66 6f 72  nt iOff;.    for
a7b0: 28 69 4f 66 66 3d 70 4c 76 6c 2d 3e 69 4f 66 66  (iOff=pLvl->iOff
a7c0: 3b 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 6e  ; iOff<pData->nn
a7d0: 3b 20 69 4f 66 66 2b 2b 29 7b 0a 20 20 20 20 20  ; iOff++){.     
a7e0: 20 69 66 28 20 70 44 61 74 61 2d 3e 70 5b 69 4f   if( pData->p[iO
a7f0: 66 66 5d 20 29 20 62 72 65 61 6b 3b 20 0a 20 20  ff] ) break; .  
a800: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4f 66    }..    if( iOf
a810: 66 3c 70 44 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20  f<pData->nn ){. 
a820: 20 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20       i64 iVal;. 
a830: 20 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66       pLvl->iLeaf
a840: 50 67 6e 6f 20 2b 3d 20 28 69 4f 66 66 20 2d 20  Pgno += (iOff - 
a850: 70 4c 76 6c 2d 3e 69 4f 66 66 29 20 2b 20 31 3b  pLvl->iOff) + 1;
a860: 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  .      iOff += f
a870: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
a880: 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  ata->p[iOff], (u
a890: 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20  64*)&iVal);.    
a8a0: 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20 2b    pLvl->iRowid +
a8b0: 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 70 4c  = iVal;.      pL
a8c0: 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66 3b  vl->iOff = iOff;
a8d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a8e0: 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 31    pLvl->bEof = 1
a8f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
a900: 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66  eturn pLvl->bEof
a910: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
a920: 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ce the iterator 
a930: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
a940: 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
a950: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
a960: 6c 69 64 78 49 74 65 72 4e 65 78 74 52 28 46 74  lidxIterNextR(Ft
a970: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
a980: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
a990: 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20 20 46  , int iLvl){.  F
a9a0: 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76  ts5DlidxLvl *pLv
a9b0: 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c  l = &pIter->aLvl
a9c0: 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73 65 72  [iLvl];..  asser
a9d0: 74 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e  t( iLvl<pIter->n
a9e0: 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20 66 74 73  Lvl );.  if( fts
a9f0: 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c  5DlidxLvlNext(pL
aa00: 76 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  vl) ){.    if( (
aa10: 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65 72 2d  iLvl+1) < pIter-
aa20: 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20 20 66  >nLvl ){.      f
aa30: 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
aa40: 52 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 76 6c  R(p, pIter, iLvl
aa50: 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  +1);.      if( p
aa60: 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20 29  Lvl[1].bEof==0 )
aa70: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61  {.        fts5Da
aa80: 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e  taRelease(pLvl->
aa90: 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
aaa0: 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20  memset(pLvl, 0, 
aab0: 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
aac0: 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 70  Lvl));.        p
aad0: 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73  Lvl->pData = fts
aae0: 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20  5DataRead(p, .  
aaf0: 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44            FTS5_D
ab00: 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65 72  LIDX_ROWID(pIter
ab10: 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c 2c 20  ->iSegid, iLvl, 
ab20: 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50 67 6e  pLvl[1].iLeafPgn
ab30: 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  o).        );.  
ab40: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
ab50: 70 44 61 74 61 20 29 20 66 74 73 35 44 6c 69 64  pData ) fts5Dlid
ab60: 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3b 0a  xLvlNext(pLvl);.
ab70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ab80: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65  }..  return pIte
ab90: 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b  r->aLvl[0].bEof;
aba0: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  .}.static int ft
abb0: 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28  s5DlidxIterNext(
abc0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
abd0: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
abe0: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74  er){.  return ft
abf0: 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52  s5DlidxIterNextR
ac00: 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 7d  (p, pIter, 0);.}
ac10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72  ../*.** The iter
ac20: 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
ac30: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
ac40: 74 20 68 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77  t has the follow
ac50: 69 6e 67 20 66 69 65 6c 64 73 20 73 65 74 0a 2a  ing fields set.*
ac60: 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20 54 68  * as follows. Th
ac70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
ac80: 20 75 70 20 74 68 65 20 72 65 73 74 20 6f 66 20   up the rest of 
ac90: 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20  the iterator so 
aca0: 74 68 61 74 20 69 74 0a 2a 2a 20 70 6f 69 6e 74  that it.** point
acb0: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72  s to the first r
acc0: 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c  owid in the docl
acd0: 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  ist-index..**.**
ace0: 20 20 20 70 44 61 74 61 3a 0a 2a 2a 20 20 20 20     pData:.**    
acf0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c   pointer to docl
ad00: 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f 72 64  ist-index record
ad10: 2c 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  , .**.** When th
ad20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
ad30: 61 6c 6c 65 64 20 70 49 74 65 72 2d 3e 69 4c 65  alled pIter->iLe
ad40: 61 66 50 67 6e 6f 20 69 73 20 74 68 65 20 70 61  afPgno is the pa
ad50: 67 65 20 6e 75 6d 62 65 72 20 74 68 65 0a 2a 2a  ge number the.**
ad60: 20 64 6f 63 6c 69 73 74 20 69 73 20 61 73 73 6f   doclist is asso
ad70: 63 69 61 74 65 64 20 77 69 74 68 20 28 74 68 65  ciated with (the
ad80: 20 6f 6e 65 20 66 65 61 74 75 72 69 6e 67 20 74   one featuring t
ad90: 68 65 20 74 65 72 6d 29 2e 0a 2a 2f 0a 73 74 61  he term)..*/.sta
ada0: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
adb0: 78 49 74 65 72 46 69 72 73 74 28 46 74 73 35 44  xIterFirst(Fts5D
adc0: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
add0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
ade0: 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
adf0: 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66  Lvl; i++){.    f
ae00: 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
ae10: 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 29  &pIter->aLvl[i])
ae20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
ae30: 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45  Iter->aLvl[0].bE
ae40: 6f 66 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69  of;.}...static i
ae50: 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  nt fts5DlidxIter
ae60: 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70  Eof(Fts5Index *p
ae70: 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  , Fts5DlidxIter 
ae80: 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72  *pIter){.  retur
ae90: 6e 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  n p->rc!=SQLITE_
aea0: 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 61 4c 76  OK || pIter->aLv
aeb0: 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 73 74  l[0].bEof;.}..st
aec0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c  atic void fts5Dl
aed0: 69 64 78 49 74 65 72 4c 61 73 74 28 46 74 73 35  idxIterLast(Fts5
aee0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c  Index *p, Fts5Dl
aef0: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
af00: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
af10: 41 64 76 61 6e 63 65 20 65 61 63 68 20 6c 65 76  Advance each lev
af20: 65 6c 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  el to the last e
af30: 6e 74 72 79 20 6f 6e 20 74 68 65 20 6c 61 73 74  ntry on the last
af40: 20 70 61 67 65 20 2a 2f 0a 20 20 66 6f 72 28 69   page */.  for(i
af50: 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c 2d 31 3b 20  =pIter->nLvl-1; 
af60: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
af70: 20 26 26 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a   && i>=0; i--){.
af80: 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c      Fts5DlidxLvl
af90: 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d   *pLvl = &pIter-
afa0: 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 77 68  >aLvl[i];.    wh
afb0: 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c 76  ile( fts5DlidxLv
afc0: 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20 29  lNext(pLvl)==0 )
afd0: 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66  ;.    pLvl->bEof
afe0: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69   = 0;..    if( i
aff0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  >0 ){.      Fts5
b000: 44 6c 69 64 78 4c 76 6c 20 2a 70 43 68 69 6c 64  DlidxLvl *pChild
b010: 20 3d 20 26 70 4c 76 6c 5b 2d 31 5d 3b 0a 20 20   = &pLvl[-1];.  
b020: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
b030: 61 73 65 28 70 43 68 69 6c 64 2d 3e 70 44 61 74  ase(pChild->pDat
b040: 61 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  a);.      memset
b050: 28 70 43 68 69 6c 64 2c 20 30 2c 20 73 69 7a 65  (pChild, 0, size
b060: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
b070: 29 3b 0a 20 20 20 20 20 20 70 43 68 69 6c 64 2d  );.      pChild-
b080: 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74  >pData = fts5Dat
b090: 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20  aRead(p, .      
b0a0: 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52      FTS5_DLIDX_R
b0b0: 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67  OWID(pIter->iSeg
b0c0: 69 64 2c 20 69 2d 31 2c 20 70 4c 76 6c 2d 3e 69  id, i-1, pLvl->i
b0d0: 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20  LeafPgno).      
b0e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
b0f0: 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69  /*.** Move the i
b100: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
b110: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
b120: 65 6e 74 20 74 6f 20 74 68 65 20 70 72 65 76 69  ent to the previ
b130: 6f 75 73 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74  ous entry..*/.st
b140: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
b150: 64 78 4c 76 6c 50 72 65 76 28 46 74 73 35 44 6c  dxLvlPrev(Fts5Dl
b160: 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20  idxLvl *pLvl){. 
b170: 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 4c 76 6c   int iOff = pLvl
b180: 2d 3e 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72  ->iOff;..  asser
b190: 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30  t( pLvl->bEof==0
b1a0: 20 29 3b 0a 20 20 69 66 28 20 69 4f 66 66 3c 3d   );.  if( iOff<=
b1b0: 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20  pLvl->iFirstOff 
b1c0: 29 7b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f  ){.    pLvl->bEo
b1d0: 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f = 1;.  }else{.
b1e0: 20 20 20 20 75 38 20 2a 61 20 3d 20 70 4c 76 6c      u8 *a = pLvl
b1f0: 2d 3e 70 44 61 74 61 2d 3e 70 3b 0a 20 20 20 20  ->pData->p;.    
b200: 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 6e  i64 iVal;.    in
b210: 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 6e  t iLimit;.    in
b220: 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 5a  t ii;.    int nZ
b230: 65 72 6f 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ero = 0;..    /*
b240: 20 43 75 72 72 65 6e 74 6c 79 20 69 4f 66 66 20   Currently iOff 
b250: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
b260: 72 73 74 20 62 79 74 65 20 6f 66 20 61 20 76 61  rst byte of a va
b270: 72 69 6e 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b  rint. This block
b280: 20 0a 20 20 20 20 2a 2a 20 64 65 63 72 65 6d 65   .    ** decreme
b290: 6e 74 73 20 69 4f 66 66 20 75 6e 74 69 6c 20 69  nts iOff until i
b2a0: 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
b2b0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
b2c0: 65 20 70 72 65 76 69 6f 75 73 20 0a 20 20 20 20  e previous .    
b2d0: 2a 2a 20 76 61 72 69 6e 74 2e 20 54 61 6b 69 6e  ** varint. Takin
b2e0: 67 20 63 61 72 65 20 6e 6f 74 20 74 6f 20 72 65  g care not to re
b2f0: 61 64 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6c 6f  ad any memory lo
b300: 63 61 74 69 6f 6e 73 20 74 68 61 74 20 6f 63 63  cations that occ
b310: 75 72 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  ur.    ** before
b320: 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 20 6d   the buffer in m
b330: 65 6d 6f 72 79 2e 20 20 2a 2f 0a 20 20 20 20 69  emory.  */.    i
b340: 4c 69 6d 69 74 20 3d 20 28 69 4f 66 66 3e 39 20  Limit = (iOff>9 
b350: 3f 20 69 4f 66 66 2d 39 20 3a 20 30 29 3b 0a 20  ? iOff-9 : 0);. 
b360: 20 20 20 66 6f 72 28 69 4f 66 66 2d 2d 3b 20 69     for(iOff--; i
b370: 4f 66 66 3e 69 4c 69 6d 69 74 3b 20 69 4f 66 66  Off>iLimit; iOff
b380: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  --){.      if( (
b390: 61 5b 69 4f 66 66 2d 31 5d 20 26 20 30 78 38 30  a[iOff-1] & 0x80
b3a0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
b3b0: 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 47 65 74    }..    fts5Get
b3c0: 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
b3d0: 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20   (u64*)&iVal);. 
b3e0: 20 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20     pLvl->iRowid 
b3f0: 2d 3d 20 69 56 61 6c 3b 0a 20 20 20 20 70 4c 76  -= iVal;.    pLv
b400: 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a  l->iLeafPgno--;.
b410: 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20 62 61 63  .    /* Skip bac
b420: 6b 77 61 72 64 73 20 70 61 73 74 20 61 6e 79 20  kwards past any 
b430: 30 78 30 30 20 76 61 72 69 6e 74 73 2e 20 2a 2f  0x00 varints. */
b440: 0a 20 20 20 20 66 6f 72 28 69 69 3d 69 4f 66 66  .    for(ii=iOff
b450: 2d 31 3b 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46  -1; ii>=pLvl->iF
b460: 69 72 73 74 4f 66 66 20 26 26 20 61 5b 69 69 5d  irstOff && a[ii]
b470: 3d 3d 30 78 30 30 3b 20 69 69 2d 2d 29 7b 0a 20  ==0x00; ii--){. 
b480: 20 20 20 20 20 6e 5a 65 72 6f 2b 2b 3b 0a 20 20       nZero++;.  
b490: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 69 3e 3d    }.    if( ii>=
b4a0: 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20  pLvl->iFirstOff 
b4b0: 26 26 20 28 61 5b 69 69 5d 20 26 20 30 78 38 30  && (a[ii] & 0x80
b4c0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
b4d0: 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65  e byte immediate
b4e0: 6c 79 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61  ly before the la
b4f0: 73 74 20 30 78 30 30 20 62 79 74 65 20 68 61 73  st 0x00 byte has
b500: 20 74 68 65 20 30 78 38 30 20 62 69 74 0a 20 20   the 0x80 bit.  
b510: 20 20 20 20 2a 2a 20 73 65 74 2e 20 53 6f 20 74      ** set. So t
b520: 68 65 20 6c 61 73 74 20 30 78 30 30 20 69 73 20  he last 0x00 is 
b530: 6f 6e 6c 79 20 61 20 76 61 72 69 6e 74 20 30 20  only a varint 0 
b540: 69 66 20 74 68 65 72 65 20 61 72 65 20 38 20 6d  if there are 8 m
b550: 6f 72 65 20 30 78 38 30 0a 20 20 20 20 20 20 2a  ore 0x80.      *
b560: 2a 20 62 79 74 65 73 20 62 65 66 6f 72 65 20 61  * bytes before a
b570: 5b 69 69 5d 2e 20 2a 2f 0a 20 20 20 20 20 20 69  [ii]. */.      i
b580: 6e 74 20 62 5a 65 72 6f 20 3d 20 30 3b 20 20 20  nt bZero = 0;   
b590: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
b5a0: 75 65 20 69 66 20 6c 61 73 74 20 30 78 30 30 20  ue if last 0x00 
b5b0: 63 6f 75 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  counts */.      
b5c0: 69 66 28 20 28 69 69 2d 38 29 3e 3d 70 4c 76 6c  if( (ii-8)>=pLvl
b5d0: 2d 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20  ->iFirstOff ){. 
b5e0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
b5f0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a        for(j=1; j
b600: 3c 3d 38 20 26 26 20 28 61 5b 69 69 2d 6a 5d 20  <=8 && (a[ii-j] 
b610: 26 20 30 78 38 30 29 3b 20 6a 2b 2b 29 3b 0a 20  & 0x80); j++);. 
b620: 20 20 20 20 20 20 20 62 5a 65 72 6f 20 3d 20 28         bZero = (
b630: 6a 3e 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  j>8);.      }.  
b640: 20 20 20 20 69 66 28 20 62 5a 65 72 6f 3d 3d 30      if( bZero==0
b650: 20 29 20 6e 5a 65 72 6f 2d 2d 3b 0a 20 20 20 20   ) nZero--;.    
b660: 7d 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61  }.    pLvl->iLea
b670: 66 50 67 6e 6f 20 2d 3d 20 6e 5a 65 72 6f 3b 0a  fPgno -= nZero;.
b680: 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d      pLvl->iOff =
b690: 20 69 4f 66 66 20 2d 20 6e 5a 65 72 6f 3b 0a 20   iOff - nZero;. 
b6a0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 76   }..  return pLv
b6b0: 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74  l->bEof;.}..stat
b6c0: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
b6d0: 49 74 65 72 50 72 65 76 52 28 46 74 73 35 49 6e  IterPrevR(Fts5In
b6e0: 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64  dex *p, Fts5Dlid
b6f0: 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e  xIter *pIter, in
b700: 74 20 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44  t iLvl){.  Fts5D
b710: 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20  lidxLvl *pLvl = 
b720: 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76  &pIter->aLvl[iLv
b730: 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  l];..  assert( i
b740: 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20  Lvl<pIter->nLvl 
b750: 29 3b 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69  );.  if( fts5Dli
b760: 64 78 4c 76 6c 50 72 65 76 28 70 4c 76 6c 29 20  dxLvlPrev(pLvl) 
b770: 29 7b 0a 20 20 20 20 69 66 28 20 28 69 4c 76 6c  ){.    if( (iLvl
b780: 2b 31 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76  +1) < pIter->nLv
b790: 6c 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44  l ){.      fts5D
b7a0: 6c 69 64 78 49 74 65 72 50 72 65 76 52 28 70 2c  lidxIterPrevR(p,
b7b0: 20 70 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b   pIter, iLvl+1);
b7c0: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 5b  .      if( pLvl[
b7d0: 31 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20  1].bEof==0 ){.  
b7e0: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
b7f0: 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74  lease(pLvl->pDat
b800: 61 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  a);.        mems
b810: 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65  et(pLvl, 0, size
b820: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
b830: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  );.        pLvl-
b840: 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74  >pData = fts5Dat
b850: 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20  aRead(p, .      
b860: 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58        FTS5_DLIDX
b870: 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53  _ROWID(pIter->iS
b880: 65 67 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c  egid, iLvl, pLvl
b890: 5b 31 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20  [1].iLeafPgno). 
b8a0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
b8b0: 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74    if( pLvl->pDat
b8c0: 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  a ){.          w
b8d0: 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c  hile( fts5DlidxL
b8e0: 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20  vlNext(pLvl)==0 
b8f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76  );.          pLv
b900: 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20  l->bEof = 0;.   
b910: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b920: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
b930: 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30  rn pIter->aLvl[0
b940: 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63  ].bEof;.}.static
b950: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
b960: 65 72 50 72 65 76 28 46 74 73 35 49 6e 64 65 78  erPrev(Fts5Index
b970: 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74   *p, Fts5DlidxIt
b980: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
b990: 74 75 72 6e 20 66 74 73 35 44 6c 69 64 78 49 74  turn fts5DlidxIt
b9a0: 65 72 50 72 65 76 52 28 70 2c 20 70 49 74 65 72  erPrevR(p, pIter
b9b0: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  , 0);.}../*.** F
b9c0: 72 65 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e  ree a doclist-in
b9d0: 64 65 78 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  dex iterator obj
b9e0: 65 63 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  ect allocated by
b9f0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e   fts5DlidxIterIn
ba00: 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  it()..*/.static 
ba10: 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74  void fts5DlidxIt
ba20: 65 72 46 72 65 65 28 46 74 73 35 44 6c 69 64 78  erFree(Fts5Dlidx
ba30: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
ba40: 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20  if( pIter ){.   
ba50: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
ba60: 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c  i=0; i<pIter->nL
ba70: 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  vl; i++){.      
ba80: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
ba90: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70  pIter->aLvl[i].p
baa0: 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Data);.    }.   
bab0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
bac0: 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  ter);.  }.}..sta
bad0: 74 69 63 20 46 74 73 35 44 6c 69 64 78 49 74 65  tic Fts5DlidxIte
bae0: 72 20 2a 66 74 73 35 44 6c 69 64 78 49 74 65 72  r *fts5DlidxIter
baf0: 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Init(.  Fts5Inde
bb00: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
bb10: 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20          /* Fts5 
bb20: 42 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61  Backend to itera
bb30: 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69  te within */.  i
bb40: 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20  nt bRev,        
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bb60: 2a 20 54 72 75 65 20 66 6f 72 20 4f 52 44 45 52  * True for ORDER
bb70: 20 42 59 20 41 53 43 20 2a 2f 0a 20 20 69 6e 74   BY ASC */.  int
bb80: 20 69 53 65 67 69 64 2c 20 20 20 20 20 20 20 20   iSegid,        
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bba0: 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20  Segment id */.  
bbb0: 69 6e 74 20 69 4c 65 61 66 50 67 20 20 20 20 20  int iLeafPg     
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbd0: 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d  /* Leaf page num
bbe0: 62 65 72 20 74 6f 20 6c 6f 61 64 20 64 6c 69 64  ber to load dlid
bbf0: 78 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74  x for */.){.  Ft
bc00: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
bc10: 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  er = 0;.  int i;
bc20: 0a 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30  .  int bDone = 0
bc30: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d  ;..  for(i=0; p-
bc40: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
bc50: 26 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29  & bDone==0; i++)
bc60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
bc70: 74 36 34 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  t64 nByte = size
bc80: 6f 66 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  of(Fts5DlidxIter
bc90: 29 20 2b 20 69 20 2a 20 73 69 7a 65 6f 66 28 46  ) + i * sizeof(F
bca0: 74 73 35 44 6c 69 64 78 4c 76 6c 29 3b 0a 20 20  ts5DlidxLvl);.  
bcb0: 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
bcc0: 2a 70 4e 65 77 3b 0a 0a 20 20 20 20 70 4e 65 77  *pNew;..    pNew
bcd0: 20 3d 20 28 46 74 73 35 44 6c 69 64 78 49 74 65   = (Fts5DlidxIte
bce0: 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  r*)sqlite3_reall
bcf0: 6f 63 36 34 28 70 49 74 65 72 2c 20 6e 42 79 74  oc64(pIter, nByt
bd00: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  e);.    if( pNew
bd10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
bd20: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
bd30: 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
bd40: 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
bd50: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
bd60: 44 28 69 53 65 67 69 64 2c 20 69 2c 20 69 4c 65  D(iSegid, i, iLe
bd70: 61 66 50 67 29 3b 0a 20 20 20 20 20 20 46 74 73  afPg);.      Fts
bd80: 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20  5DlidxLvl *pLvl 
bd90: 3d 20 26 70 4e 65 77 2d 3e 61 4c 76 6c 5b 69 5d  = &pNew->aLvl[i]
bda0: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 20 3d 20  ;.      pIter = 
bdb0: 70 4e 65 77 3b 0a 20 20 20 20 20 20 6d 65 6d 73  pNew;.      mems
bdc0: 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65  et(pLvl, 0, size
bdd0: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
bde0: 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70  );.      pLvl->p
bdf0: 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
be00: 65 61 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a  ead(p, iRowid);.
be10: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
be20: 70 44 61 74 61 20 26 26 20 28 70 4c 76 6c 2d 3e  pData && (pLvl->
be30: 70 44 61 74 61 2d 3e 70 5b 30 5d 20 26 20 30 78  pData->p[0] & 0x
be40: 30 30 30 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  0001)==0 ){.    
be50: 20 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20      bDone = 1;. 
be60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74       }.      pIt
be70: 65 72 2d 3e 6e 4c 76 6c 20 3d 20 69 2b 31 3b 0a  er->nLvl = i+1;.
be80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
be90: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
bea0: 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  K ){.    pIter->
beb0: 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
bec0: 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30  .    if( bRev==0
bed0: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c   ){.      fts5Dl
bee0: 69 64 78 49 74 65 72 46 69 72 73 74 28 70 49 74  idxIterFirst(pIt
bef0: 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  er);.    }else{.
bf00: 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
bf10: 74 65 72 4c 61 73 74 28 70 2c 20 70 49 74 65 72  terLast(p, pIter
bf20: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
bf30: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
bf40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74 73 35  E_OK ){.    fts5
bf50: 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 49  DlidxIterFree(pI
bf60: 74 65 72 29 3b 0a 20 20 20 20 70 49 74 65 72 20  ter);.    pIter 
bf70: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
bf80: 72 6e 20 70 49 74 65 72 3b 0a 7d 0a 0a 73 74 61  rn pIter;.}..sta
bf90: 74 69 63 20 69 36 34 20 66 74 73 35 44 6c 69 64  tic i64 fts5Dlid
bfa0: 78 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 44  xIterRowid(Fts5D
bfb0: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
bfc0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  {.  return pIter
bfd0: 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 52 6f 77 69 64  ->aLvl[0].iRowid
bfe0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  ;.}.static int f
bff0: 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
c000: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
c010: 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
c020: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
c030: 69 4c 65 61 66 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  iLeafPgno;.}../*
c040: 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 6e 65 78  .** Load the nex
c050: 74 20 6c 65 61 66 20 70 61 67 65 20 69 6e 74 6f  t leaf page into
c060: 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69 74 65   the segment ite
c070: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
c080: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
c090: 72 4e 65 78 74 50 61 67 65 28 0a 20 20 46 74 73  rNextPage(.  Fts
c0a0: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c0c0: 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
c0d0: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
c0e0: 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
c0f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
c100: 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
c110: 74 6f 20 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a  to next page */.
c120: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
c130: 4c 65 61 66 3b 0a 20 20 46 74 73 35 53 74 72 75  Leaf;.  Fts5Stru
c140: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
c150: 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67  eg = pIter->pSeg
c160: 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ;.  fts5DataRele
c170: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
c180: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  );.  pIter->iLea
c190: 66 50 67 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 70  fPgno++;.  if( p
c1a0: 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20  Iter->pNextLeaf 
c1b0: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  ){.    pIter->pL
c1c0: 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4e 65  eaf = pIter->pNe
c1d0: 78 74 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65  xtLeaf;.    pIte
c1e0: 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 30  r->pNextLeaf = 0
c1f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49  ;.  }else if( pI
c200: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d  ter->iLeafPgno<=
c210: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29  pSeg->pgnoLast )
c220: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65  {.    pIter->pLe
c230: 61 66 20 3d 20 66 74 73 35 4c 65 61 66 52 65 61  af = fts5LeafRea
c240: 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20 46 54  d(p, .        FT
c250: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
c260: 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70  (pSeg->iSegid, p
c270: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 29  Iter->iLeafPgno)
c280: 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .    );.  }else{
c290: 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  .    pIter->pLea
c2a0: 66 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 65  f = 0;.  }.  pLe
c2b0: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
c2c0: 66 3b 0a 0a 20 20 69 66 28 20 70 4c 65 61 66 20  f;..  if( pLeaf 
c2d0: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50  ){.    pIter->iP
c2e0: 67 69 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d  gidxOff = pLeaf-
c2f0: 3e 73 7a 4c 65 61 66 3b 0a 20 20 20 20 69 66 28  >szLeaf;.    if(
c300: 20 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c   fts5LeafIsTerml
c310: 65 73 73 28 70 4c 65 61 66 29 20 29 7b 0a 20 20  ess(pLeaf) ){.  
c320: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
c330: 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61 66  fDoclist = pLeaf
c340: 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  ->nn+1;.    }els
c350: 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  e{.      pIter->
c360: 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73  iPgidxOff += fts
c370: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
c380: 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 50  eaf->p[pIter->iP
c390: 67 69 64 78 4f 66 66 5d 2c 0a 20 20 20 20 20 20  gidxOff],.      
c3a0: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
c3b0: 66 44 6f 63 6c 69 73 74 0a 20 20 20 20 20 20 29  fDoclist.      )
c3c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
c3d0: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20  *.** Argument p 
c3e0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
c3f0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  er containing a 
c400: 76 61 72 69 6e 74 20 74 6f 20 62 65 20 69 6e 74  varint to be int
c410: 65 72 70 72 65 74 65 64 20 61 73 20 61 0a 2a 2a  erpreted as a.**
c420: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73   position list s
c430: 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61 64 20  ize field. Read 
c440: 74 68 65 20 76 61 72 69 6e 74 20 61 6e 64 20 72  the varint and r
c450: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
c460: 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61   of bytes.** rea
c470: 64 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  d. Before return
c480: 69 6e 67 2c 20 73 65 74 20 2a 70 6e 53 7a 20 74  ing, set *pnSz t
c490: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
c4a0: 62 79 74 65 73 20 69 6e 20 74 68 65 20 70 6f 73  bytes in the pos
c4b0: 69 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 2c 20 61  ition.** list, a
c4c0: 6e 64 20 2a 70 62 44 65 6c 20 74 6f 20 74 72 75  nd *pbDel to tru
c4d0: 65 20 69 66 20 74 68 65 20 64 65 6c 65 74 65 20  e if the delete 
c4e0: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6f 72 20  flag is set, or 
c4f0: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
c500: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
c510: 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a  ts5GetPoslistSiz
c520: 65 28 63 6f 6e 73 74 20 75 38 20 2a 70 2c 20 69  e(const u8 *p, i
c530: 6e 74 20 2a 70 6e 53 7a 2c 20 69 6e 74 20 2a 70  nt *pnSz, int *p
c540: 62 44 65 6c 29 7b 0a 20 20 69 6e 74 20 6e 53 7a  bDel){.  int nSz
c550: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  ;.  int n = 0;. 
c560: 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69   fts5FastGetVari
c570: 6e 74 33 32 28 70 2c 20 6e 2c 20 6e 53 7a 29 3b  nt32(p, n, nSz);
c580: 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 53  .  assert_nc( nS
c590: 7a 3e 3d 30 20 29 3b 0a 20 20 2a 70 6e 53 7a 20  z>=0 );.  *pnSz 
c5a0: 3d 20 6e 53 7a 2f 32 3b 0a 20 20 2a 70 62 44 65  = nSz/2;.  *pbDe
c5b0: 6c 20 3d 20 6e 53 7a 20 26 20 30 78 30 30 30 31  l = nSz & 0x0001
c5c0: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
c5d0: 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74  ./*.** Fts5SegIt
c5e0: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63  er.iLeafOffset c
c5f0: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
c600: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
c610: 65 20 6f 66 20 61 0a 2a 2a 20 70 6f 73 69 74 69  e of a.** positi
c620: 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
c630: 6c 64 2e 20 52 65 61 64 20 74 68 65 20 76 61 6c  ld. Read the val
c640: 75 65 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20  ue of the field 
c650: 61 6e 64 20 73 74 6f 72 65 20 69 74 0a 2a 2a 20  and store it.** 
c660: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
c670: 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a   variables:.**.*
c680: 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e  *   Fts5SegIter.
c690: 6e 50 6f 73 0a 2a 2a 20 20 20 46 74 73 35 53 65  nPos.**   Fts5Se
c6a0: 67 49 74 65 72 2e 62 44 65 6c 0a 2a 2a 0a 2a 2a  gIter.bDel.**.**
c6b0: 20 4c 65 61 76 65 20 46 74 73 35 53 65 67 49 74   Leave Fts5SegIt
c6c0: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70  er.iLeafOffset p
c6d0: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
c6e0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
c6f0: 20 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69   .** position li
c700: 73 74 20 63 6f 6e 74 65 6e 74 20 28 69 66 20 61  st content (if a
c710: 6e 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ny)..*/.static v
c720: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c  oid fts5SegIterL
c730: 6f 61 64 4e 50 6f 73 28 46 74 73 35 49 6e 64 65  oadNPos(Fts5Inde
c740: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
c750: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
c760: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
c770: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  K ){.    int iOf
c780: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
c790: 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73  Offset;  /* Offs
c7a0: 65 74 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f  et to read at */
c7b0: 0a 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45  .    ASSERT_SZLE
c7c0: 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65  AF_OK(pIter->pLe
c7d0: 61 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  af);.    if( p->
c7e0: 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
c7f0: 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  ==FTS5_DETAIL_NO
c800: 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  NE ){.      int 
c810: 69 45 6f 64 20 3d 20 4d 49 4e 28 70 49 74 65 72  iEod = MIN(pIter
c820: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 2c  ->iEndofDoclist,
c830: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73   pIter->pLeaf->s
c840: 7a 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70 49  zLeaf);.      pI
c850: 74 65 72 2d 3e 62 44 65 6c 20 3d 20 30 3b 0a 20  ter->bDel = 0;. 
c860: 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73       pIter->nPos
c870: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
c880: 69 4f 66 66 3c 69 45 6f 64 20 26 26 20 70 49 74  iOff<iEod && pIt
c890: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  er->pLeaf->p[iOf
c8a0: 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  f]==0 ){.       
c8b0: 20 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 31   pIter->bDel = 1
c8c0: 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b  ;.        iOff++
c8d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4f  ;.        if( iO
c8e0: 66 66 3c 69 45 6f 64 20 26 26 20 70 49 74 65 72  ff<iEod && pIter
c8f0: 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  ->pLeaf->p[iOff]
c900: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
c910: 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 31   pIter->nPos = 1
c920: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66  ;.          iOff
c930: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
c940: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  e{.          pIt
c950: 65 72 2d 3e 6e 50 6f 73 20 3d 20 30 3b 0a 20 20  er->nPos = 0;.  
c960: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
c970: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c980: 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 20 20 20 20   int nSz;.      
c990: 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
c9a0: 74 33 32 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  t32(pIter->pLeaf
c9b0: 2d 3e 70 2c 20 69 4f 66 66 2c 20 6e 53 7a 29 3b  ->p, iOff, nSz);
c9c0: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44  .      pIter->bD
c9d0: 65 6c 20 3d 20 28 6e 53 7a 20 26 20 30 78 30 30  el = (nSz & 0x00
c9e0: 30 31 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  01);.      pIter
c9f0: 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31 3b  ->nPos = nSz>>1;
ca00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63  .      assert_nc
ca10: 28 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3e 3d 30  ( pIter->nPos>=0
ca20: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49   );.    }.    pI
ca30: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
ca40: 20 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a 7d 0a 0a   = iOff;.  }.}..
ca50: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
ca60: 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64  SegIterLoadRowid
ca70: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
ca80: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
ca90: 72 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49  r){.  u8 *a = pI
caa0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20  ter->pLeaf->p;  
cab0: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
cac0: 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f  to read data fro
cad0: 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20  m */.  int iOff 
cae0: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
caf0: 66 73 65 74 3b 0a 0a 20 20 41 53 53 45 52 54 5f  fset;..  ASSERT_
cb00: 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d  SZLEAF_OK(pIter-
cb10: 3e 70 4c 65 61 66 29 3b 0a 20 20 69 66 28 20 69  >pLeaf);.  if( i
cb20: 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61  Off>=pIter->pLea
cb30: 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
cb40: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
cb50: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
cb60: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
cb70: 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Leaf==0 ){.     
cb80: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
cb90: 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20  TE_OK ) p->rc = 
cba0: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
cbb0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
cbc0: 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a  }.    iOff = 4;.
cbd0: 20 20 20 20 61 20 3d 20 70 49 74 65 72 2d 3e 70      a = pIter->p
cbe0: 4c 65 61 66 2d 3e 70 3b 0a 20 20 7d 0a 20 20 69  Leaf->p;.  }.  i
cbf0: 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  Off += sqlite3Ft
cc00: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
cc10: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  Off], (u64*)&pIt
cc20: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 70  er->iRowid);.  p
cc30: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
cc40: 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a  t = iOff;.}../*.
cc50: 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 69  ** Fts5SegIter.i
cc60: 4c 65 61 66 4f 66 66 73 65 74 20 63 75 72 72 65  LeafOffset curre
cc70: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
cc80: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
cc90: 20 74 68 65 20 0a 2a 2a 20 22 6e 53 75 66 66 69   the .** "nSuffi
cca0: 78 22 20 66 69 65 6c 64 20 6f 66 20 61 20 74 65  x" field of a te
ccb0: 72 6d 2e 20 46 75 6e 63 74 69 6f 6e 20 70 61 72  rm. Function par
ccc0: 61 6d 65 74 65 72 20 6e 4b 65 65 70 20 63 6f 6e  ameter nKeep con
ccd0: 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 0a  tains the value.
cce0: 2a 2a 20 6f 66 20 74 68 65 20 22 6e 50 72 65 66  ** of the "nPref
ccf0: 69 78 22 20 66 69 65 6c 64 20 28 69 66 20 74 68  ix" field (if th
cd00: 65 72 65 20 77 61 73 20 6f 6e 65 20 2d 20 69 74  ere was one - it
cd10: 20 69 73 20 70 61 73 73 65 64 20 30 20 69 66 20   is passed 0 if 
cd20: 74 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66  this is.** the f
cd30: 69 72 73 74 20 74 65 72 6d 20 69 6e 20 74 68 65  irst term in the
cd40: 20 73 65 67 6d 65 6e 74 29 2e 0a 2a 2a 0a 2a 2a   segment)..**.**
cd50: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
cd60: 6f 70 75 6c 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  opulates:.**.** 
cd70: 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 74 65    Fts5SegIter.te
cd80: 72 6d 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49  rm.**   Fts5SegI
cd90: 74 65 72 2e 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  ter.rowid.**.** 
cda0: 61 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 20  accordingly and 
cdb0: 6c 65 61 76 65 73 20 28 46 74 73 35 53 65 67 49  leaves (Fts5SegI
cdc0: 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 29  ter.iLeafOffset)
cdd0: 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6e 74   set to the cont
cde0: 65 6e 74 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69  ent of.** the fi
cdf0: 72 73 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  rst position lis
ce00: 74 2e 20 54 68 65 20 70 6f 73 69 74 69 6f 6e 20  t. The position 
ce10: 6c 69 73 74 20 62 65 6c 6f 6e 67 69 6e 67 20 74  list belonging t
ce20: 6f 20 64 6f 63 75 6d 65 6e 74 20 0a 2a 2a 20 28  o document .** (
ce30: 46 74 73 35 53 65 67 49 74 65 72 2e 69 52 6f 77  Fts5SegIter.iRow
ce40: 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  id)..*/.static v
ce50: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c  oid fts5SegIterL
ce60: 6f 61 64 54 65 72 6d 28 46 74 73 35 49 6e 64 65  oadTerm(Fts5Inde
ce70: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
ce80: 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 6e 4b  r *pIter, int nK
ce90: 65 65 70 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20  eep){.  u8 *a = 
cea0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
ceb0: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
cec0: 72 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66  r to read data f
ced0: 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66  rom */.  int iOf
cee0: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
cef0: 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73  Offset;  /* Offs
cf00: 65 74 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f  et to read at */
cf10: 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20  .  int nNew;    
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6e     /* Bytes of n
cf40: 65 77 20 64 61 74 61 20 2a 2f 0a 0a 20 20 69 4f  ew data */..  iO
cf50: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
cf60: 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
cf70: 6e 4e 65 77 29 3b 0a 20 20 69 66 28 20 69 4f 66  nNew);.  if( iOf
cf80: 66 2b 6e 4e 65 77 3e 70 49 74 65 72 2d 3e 70 4c  f+nNew>pIter->pL
cf90: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 7c 7c 20 6e  eaf->szLeaf || n
cfa0: 4b 65 65 70 3e 70 49 74 65 72 2d 3e 74 65 72 6d  Keep>pIter->term
cfb0: 2e 6e 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  .n ){.    p->rc 
cfc0: 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
cfd0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
cfe0: 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20    pIter->term.n 
cff0: 3d 20 6e 4b 65 65 70 3b 0a 20 20 66 74 73 35 42  = nKeep;.  fts5B
d000: 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
d010: 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e  &p->rc, &pIter->
d020: 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69  term, nNew, &a[i
d030: 4f 66 66 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  Off]);.  assert(
d040: 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 3c 3d   pIter->term.n<=
d050: 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 53 70 61  pIter->term.nSpa
d060: 63 65 20 29 3b 0a 20 20 69 4f 66 66 20 2b 3d 20  ce );.  iOff += 
d070: 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e 69  nNew;.  pIter->i
d080: 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 3d  TermLeafOffset =
d090: 20 69 4f 66 66 3b 0a 20 20 70 49 74 65 72 2d 3e   iOff;.  pIter->
d0a0: 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d 20  iTermLeafPgno = 
d0b0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
d0c0: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  ;.  pIter->iLeaf
d0d0: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a  Offset = iOff;..
d0e0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 50 67    if( pIter->iPg
d0f0: 69 64 78 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70  idxOff>=pIter->p
d100: 4c 65 61 66 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20  Leaf->nn ){.    
d110: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
d120: 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c  list = pIter->pL
d130: 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65 6c  eaf->nn+1;.  }el
d140: 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 74  se{.    int nExt
d150: 72 61 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  ra;.    pIter->i
d160: 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35  PgidxOff += fts5
d170: 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 70  GetVarint32(&a[p
d180: 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 5d  Iter->iPgidxOff]
d190: 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 70  , nExtra);.    p
d1a0: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
d1b0: 69 73 74 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 20  ist += nExtra;. 
d1c0: 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65   }..  fts5SegIte
d1d0: 72 4c 6f 61 64 52 6f 77 69 64 28 70 2c 20 70 49  rLoadRowid(p, pI
d1e0: 74 65 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ter);.}..static 
d1f0: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
d200: 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 2a 2c  Next(Fts5Index*,
d210: 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c 20 69   Fts5SegIter*, i
d220: 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  nt*);.static voi
d230: 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  d fts5SegIterNex
d240: 74 5f 52 65 76 65 72 73 65 28 46 74 73 35 49 6e  t_Reverse(Fts5In
d250: 64 65 78 2a 2c 20 46 74 73 35 53 65 67 49 74 65  dex*, Fts5SegIte
d260: 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74 69  r*, int*);.stati
d270: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
d280: 65 72 4e 65 78 74 5f 4e 6f 6e 65 28 46 74 73 35  erNext_None(Fts5
d290: 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67 49  Index*, Fts5SegI
d2a0: 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 73 74  ter*, int*);..st
d2b0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
d2c0: 67 49 74 65 72 53 65 74 4e 65 78 74 28 46 74 73  gIterSetNext(Fts
d2d0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
d2e0: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
d2f0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c 61    if( pIter->fla
d300: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
d310: 52 5f 52 45 56 45 52 53 45 20 29 7b 0a 20 20 20  R_REVERSE ){.   
d320: 20 70 49 74 65 72 2d 3e 78 4e 65 78 74 20 3d 20   pIter->xNext = 
d330: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f  fts5SegIterNext_
d340: 52 65 76 65 72 73 65 3b 0a 20 20 7d 65 6c 73 65  Reverse;.  }else
d350: 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d   if( p->pConfig-
d360: 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44  >eDetail==FTS5_D
d370: 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
d380: 20 20 70 49 74 65 72 2d 3e 78 4e 65 78 74 20 3d    pIter->xNext =
d390: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
d3a0: 5f 4e 6f 6e 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _None;.  }else{.
d3b0: 20 20 20 20 70 49 74 65 72 2d 3e 78 4e 65 78 74      pIter->xNext
d3c0: 20 3d 20 66 74 73 35 53 65 67 49 74 65 72 4e 65   = fts5SegIterNe
d3d0: 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  xt;.  }.}../*.**
d3e0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
d3f0: 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
d400: 70 49 74 65 72 20 74 6f 20 69 74 65 72 61 74 65  pIter to iterate
d410: 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 6e 74   through the ent
d420: 72 69 65 73 20 69 6e 0a 2a 2a 20 73 65 67 6d 65  ries in.** segme
d430: 6e 74 20 70 53 65 67 2e 20 54 68 65 20 69 74 65  nt pSeg. The ite
d440: 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  rator is left po
d450: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
d460: 72 73 74 20 65 6e 74 72 79 20 77 68 65 6e 20 0a  rst entry when .
d470: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
d480: 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20   returns..**.** 
d490: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
d4a0: 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63  rs, Fts5Index.rc
d4b0: 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70   is set to an ap
d4c0: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
d4d0: 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20  code. If .** an 
d4e0: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
d4f0: 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
d500: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
d510: 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
d520: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
d530: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
d540: 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e  erInit(.  Fts5In
d550: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
d560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
d570: 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f   index object */
d580: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
d590: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20  Segment *pSeg,  
d5a0: 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
d5b0: 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  n of segment */.
d5c0: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
d5d0: 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  Iter            
d5e0: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70    /* Object to p
d5f0: 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20  opulate */.){.  
d600: 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69  if( pSeg->pgnoFi
d610: 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  rst==0 ){.    /*
d620: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66   This happens if
d630: 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69 73 20   the segment is 
d640: 62 65 69 6e 67 20 75 73 65 64 20 61 73 20 61 6e  being used as an
d650: 20 69 6e 70 75 74 20 74 6f 20 61 6e 20 69 6e 63   input to an inc
d660: 72 65 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a 20  remental.    ** 
d670: 6d 65 72 67 65 20 61 6e 64 20 61 6c 6c 20 64 61  merge and all da
d680: 74 61 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ta has already b
d690: 65 65 6e 20 22 74 72 69 6d 6d 65 64 22 2e 20 53  een "trimmed". S
d6a0: 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  ee function.    
d6b0: 2a 2a 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65  ** fts5TrimSegme
d6c0: 6e 74 73 28 29 20 66 6f 72 20 64 65 74 61 69 6c  nts() for detail
d6d0: 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
d6e0: 6c 65 61 76 65 20 74 68 65 20 69 74 65 72 61 74  leave the iterat
d6f0: 6f 72 20 65 6d 70 74 79 2e 0a 20 20 20 20 2a 2a  or empty..    **
d700: 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
d710: 20 73 65 65 20 74 68 65 20 28 70 49 74 65 72 2d   see the (pIter-
d720: 3e 70 4c 65 61 66 3d 3d 30 29 20 61 6e 64 20 61  >pLeaf==0) and a
d730: 73 73 75 6d 65 20 74 68 65 20 69 74 65 72 61 74  ssume the iterat
d740: 6f 72 20 69 73 0a 20 20 20 20 2a 2a 20 61 74 20  or is.    ** at 
d750: 45 4f 46 20 61 6c 72 65 61 64 79 2e 20 2a 2f 0a  EOF already. */.
d760: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
d770: 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a 20  r->pLeaf==0 );. 
d780: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
d790: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
d7a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 65  ITE_OK ){.    me
d7b0: 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73  mset(pIter, 0, s
d7c0: 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a  izeof(*pIter));.
d7d0: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 53      fts5SegIterS
d7e0: 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29  etNext(p, pIter)
d7f0: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 53 65  ;.    pIter->pSe
d800: 67 20 3d 20 70 53 65 67 3b 0a 20 20 20 20 70 49  g = pSeg;.    pI
d810: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d  ter->iLeafPgno =
d820: 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
d830: 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49  -1;.    fts5SegI
d840: 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
d850: 49 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Iter);.  }..  if
d860: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
d870: 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  OK ){.    pIter-
d880: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 34  >iLeafOffset = 4
d890: 3b 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28  ;.    assert_nc(
d8a0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e   pIter->pLeaf->n
d8b0: 6e 3e 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  n>4 );.    asser
d8c0: 74 5f 6e 63 28 20 66 74 73 35 4c 65 61 66 46 69  t_nc( fts5LeafFi
d8d0: 72 73 74 54 65 72 6d 4f 66 66 28 70 49 74 65 72  rstTermOff(pIter
d8e0: 2d 3e 70 4c 65 61 66 29 3d 3d 34 20 29 3b 0a 20  ->pLeaf)==4 );. 
d8f0: 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78     pIter->iPgidx
d900: 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  Off = pIter->pLe
d910: 61 66 2d 3e 73 7a 4c 65 61 66 2b 31 3b 0a 20 20  af->szLeaf+1;.  
d920: 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
d930: 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20  dTerm(p, pIter, 
d940: 30 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49  0);.    fts5SegI
d950: 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
d960: 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Iter);.  }.}../*
d970: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
d980: 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63  n is only ever c
d990: 61 6c 6c 65 64 20 6f 6e 20 69 74 65 72 61 74 6f  alled on iterato
d9a0: 72 73 20 63 72 65 61 74 65 64 20 62 79 20 63 61  rs created by ca
d9b0: 6c 6c 73 20 74 6f 0a 2a 2a 20 46 74 73 35 49 6e  lls to.** Fts5In
d9c0: 64 65 78 51 75 65 72 79 28 29 20 77 69 74 68 20  dexQuery() with 
d9d0: 74 68 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55  the FTS5INDEX_QU
d9e0: 45 52 59 5f 44 45 53 43 20 66 6c 61 67 20 73 65  ERY_DESC flag se
d9f0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65  t..**.** The ite
da00: 72 61 74 6f 72 20 69 73 20 69 6e 20 61 6e 20 75  rator is in an u
da10: 6e 75 73 75 61 6c 20 73 74 61 74 65 20 77 68 65  nusual state whe
da20: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
da30: 69 73 20 63 61 6c 6c 65 64 3a 20 74 68 65 0a 2a  is called: the.*
da40: 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c  * Fts5SegIter.iL
da50: 65 61 66 4f 66 66 73 65 74 20 76 61 72 69 61 62  eafOffset variab
da60: 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  le is set to the
da70: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
da80: 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 70  tart of.** the p
da90: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a  osition-list siz
daa0: 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20  e field for the 
dab0: 66 69 72 73 74 20 72 65 6c 65 76 61 6e 74 20 72  first relevant r
dac0: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
dad0: 2e 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72  ..** Fts5SegIter
dae0: 2e 72 6f 77 69 64 20 69 73 20 73 65 74 2c 20 62  .rowid is set, b
daf0: 75 74 20 6e 50 6f 73 20 61 6e 64 20 62 44 65 6c  ut nPos and bDel
db00: 20 61 72 65 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20   are not..**.** 
db10: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64  This function ad
db20: 76 61 6e 63 65 73 20 74 68 65 20 69 74 65 72 61  vances the itera
db30: 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  tor so that it p
db40: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73  oints to the las
db50: 74 20 0a 2a 2a 20 72 65 6c 65 76 61 6e 74 20 72  t .** relevant r
db60: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
db70: 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61   and, if necessa
db80: 72 79 2c 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  ry, initializes 
db90: 74 68 65 20 0a 2a 2a 20 61 52 6f 77 69 64 4f 66  the .** aRowidOf
dba0: 66 73 65 74 5b 5d 20 61 6e 64 20 69 52 6f 77 69  fset[] and iRowi
dbb0: 64 4f 66 66 73 65 74 20 76 61 72 69 61 62 6c 65  dOffset variable
dbc0: 73 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  s. At this point
dbd0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a   the iterator.**
dbe0: 20 69 73 20 69 6e 20 69 74 73 20 72 65 67 75 6c   is in its regul
dbf0: 61 72 20 73 74 61 74 65 20 2d 20 46 74 73 35 53  ar state - Fts5S
dc00: 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73  egIter.iLeafOffs
dc10: 65 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  et points to the
dc20: 20 66 69 72 73 74 0a 2a 2a 20 62 79 74 65 20 6f   first.** byte o
dc30: 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  f the position l
dc40: 69 73 74 20 63 6f 6e 74 65 6e 74 20 61 73 73 6f  ist content asso
dc50: 63 69 61 74 65 64 20 77 69 74 68 20 73 61 69 64  ciated with said
dc60: 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69   rowid..*/.stati
dc70: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
dc80: 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
dc90: 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
dca0: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
dcb0: 65 72 29 7b 0a 20 20 69 6e 74 20 65 44 65 74 61  er){.  int eDeta
dcc0: 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  il = p->pConfig-
dcd0: 3e 65 44 65 74 61 69 6c 3b 0a 20 20 69 6e 74 20  >eDetail;.  int 
dce0: 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  n = pIter->pLeaf
dcf0: 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 69 6e 74 20  ->szLeaf;.  int 
dd00: 69 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  i = pIter->iLeaf
dd10: 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 61 20  Offset;.  u8 *a 
dd20: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
dd30: 70 3b 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f  p;.  int iRowidO
dd40: 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66  ffset = 0;..  if
dd50: 28 20 6e 3e 70 49 74 65 72 2d 3e 69 45 6e 64 6f  ( n>pIter->iEndo
dd60: 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20  fDoclist ){.    
dd70: 6e 20 3d 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f  n = pIter->iEndo
dd80: 66 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20  fDoclist;.  }.. 
dd90: 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f   ASSERT_SZLEAF_O
dda0: 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  K(pIter->pLeaf);
ddb0: 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
ddc0: 20 20 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20     i64 iDelta = 
ddd0: 30 3b 0a 0a 20 20 20 20 69 66 28 20 65 44 65 74  0;..    if( eDet
dde0: 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
ddf0: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 2f  _NONE ){.      /
de00: 2a 20 74 6f 64 6f 20 2a 2f 0a 20 20 20 20 20 20  * todo */.      
de10: 69 66 28 20 69 3c 6e 20 26 26 20 61 5b 69 5d 3d  if( i<n && a[i]=
de20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 2b  =0 ){.        i+
de30: 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  +;.        if( i
de40: 3c 6e 20 26 26 20 61 5b 69 5d 3d 3d 30 20 29 20  <n && a[i]==0 ) 
de50: 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i++;.      }.   
de60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
de70: 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69 6e  t nPos;.      in
de80: 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20  t bDummy;.      
de90: 69 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c  i += fts5GetPosl
dea0: 69 73 74 53 69 7a 65 28 26 61 5b 69 5d 2c 20 26  istSize(&a[i], &
deb0: 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a  nPos, &bDummy);.
dec0: 20 20 20 20 20 20 69 20 2b 3d 20 6e 50 6f 73 3b        i += nPos;
ded0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
dee0: 3e 3d 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  >=n ) break;.   
def0: 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
df00: 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a  int(&a[i], (u64*
df10: 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 70  )&iDelta);.    p
df20: 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20  Iter->iRowid += 
df30: 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 2f 2a 20  iDelta;..    /* 
df40: 49 66 20 6e 65 63 65 73 73 61 72 79 2c 20 67 72  If necessary, gr
df50: 6f 77 20 74 68 65 20 70 49 74 65 72 2d 3e 61 52  ow the pIter->aR
df60: 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 72 72  owidOffset[] arr
df70: 61 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  ay. */.    if( i
df80: 52 6f 77 69 64 4f 66 66 73 65 74 3e 3d 70 49 74  RowidOffset>=pIt
df90: 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74  er->nRowidOffset
dfa0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e   ){.      int nN
dfb0: 65 77 20 3d 20 70 49 74 65 72 2d 3e 6e 52 6f 77  ew = pIter->nRow
dfc0: 69 64 4f 66 66 73 65 74 20 2b 20 38 3b 0a 20 20  idOffset + 8;.  
dfd0: 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 20 3d 20      int *aNew = 
dfe0: 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65  (int*)sqlite3_re
dff0: 61 6c 6c 6f 63 36 34 28 70 49 74 65 72 2d 3e 61  alloc64(pIter->a
e000: 52 6f 77 69 64 4f 66 66 73 65 74 2c 6e 4e 65 77  RowidOffset,nNew
e010: 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20  *sizeof(int));. 
e020: 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
e030: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
e040: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
e050: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
e060: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
e070: 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73  Iter->aRowidOffs
e080: 65 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  et = aNew;.     
e090: 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66   pIter->nRowidOf
e0a0: 66 73 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20  fset = nNew;.   
e0b0: 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 61   }..    pIter->a
e0c0: 52 6f 77 69 64 4f 66 66 73 65 74 5b 69 52 6f 77  RowidOffset[iRow
e0d0: 69 64 4f 66 66 73 65 74 2b 2b 5d 20 3d 20 70 49  idOffset++] = pI
e0e0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
e0f0: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
e100: 61 66 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20  afOffset = i;.  
e110: 7d 0a 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69  }.  pIter->iRowi
e120: 64 4f 66 66 73 65 74 20 3d 20 69 52 6f 77 69 64  dOffset = iRowid
e130: 4f 66 66 73 65 74 3b 0a 20 20 66 74 73 35 53 65  Offset;.  fts5Se
e140: 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
e150: 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pIter);.}../*.*
e160: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
e170: 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
e180: 72 73 65 4e 65 77 50 61 67 65 28 46 74 73 35 49  rseNewPage(Fts5I
e190: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
e1a0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
e1b0: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66  assert( pIter->f
e1c0: 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
e1d0: 54 45 52 5f 52 45 56 45 52 53 45 20 29 3b 0a 20  TER_REVERSE );. 
e1e0: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
e1f0: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
e200: 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a  ITER_ONETERM );.
e210: 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
e220: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
e230: 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  ;.  pIter->pLeaf
e240: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70   = 0;.  while( p
e250: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
e260: 26 26 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  && pIter->iLeafP
e270: 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 54 65 72 6d  gno>pIter->iTerm
e280: 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20  LeafPgno ){.    
e290: 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77 3b 0a  Fts5Data *pNew;.
e2a0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
e2b0: 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 70 4e 65 77  Pgno--;.    pNew
e2c0: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
e2d0: 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  p, FTS5_SEGMENT_
e2e0: 52 4f 57 49 44 28 0a 20 20 20 20 20 20 20 20 20  ROWID(.         
e2f0: 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53   pIter->pSeg->iS
e300: 65 67 69 64 2c 20 70 49 74 65 72 2d 3e 69 4c 65  egid, pIter->iLe
e310: 61 66 50 67 6e 6f 0a 20 20 20 20 29 29 3b 0a 20  afPgno.    ));. 
e320: 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
e330: 20 20 20 20 20 2f 2a 20 69 54 65 72 6d 4c 65 61       /* iTermLea
e340: 66 4f 66 66 73 65 74 20 6d 61 79 20 62 65 20 65  fOffset may be e
e350: 71 75 61 6c 20 74 6f 20 73 7a 4c 65 61 66 20 69  qual to szLeaf i
e360: 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 74 68  f the term is th
e370: 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20  e last.      ** 
e380: 74 68 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  thing on the pag
e390: 65 20 2d 20 69 2e 65 2e 20 74 68 65 20 66 69 72  e - i.e. the fir
e3a0: 73 74 20 72 6f 77 69 64 20 69 73 20 6f 6e 20 74  st rowid is on t
e3b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67  he following pag
e3c0: 65 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74  e..      ** In t
e3d0: 68 69 73 20 63 61 73 65 20 6c 65 61 76 65 20 70  his case leave p
e3e0: 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 2c 20  Iter->pLeaf==0, 
e3f0: 74 68 69 73 20 69 74 65 72 61 74 6f 72 20 69 73  this iterator is
e400: 20 61 74 20 45 4f 46 2e 20 2a 2f 0a 20 20 20 20   at EOF. */.    
e410: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65    if( pIter->iLe
e420: 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69  afPgno==pIter->i
e430: 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a  TermLeafPgno ){.
e440: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e450: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
e460: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
e470: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f  Iter->iTermLeafO
e480: 66 66 73 65 74 3c 70 4e 65 77 2d 3e 73 7a 4c 65  ffset<pNew->szLe
e490: 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
e4a0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
e4b0: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70  New;.          p
e4c0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
e4d0: 74 20 3d 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  t = pIter->iTerm
e4e0: 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20  LeafOffset;.    
e4f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
e500: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  e{.        int i
e510: 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20  RowidOff;.      
e520: 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74    iRowidOff = ft
e530: 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
e540: 4f 66 66 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  Off(pNew);.     
e550: 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66     if( iRowidOff
e560: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49   ){.          pI
e570: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65  ter->pLeaf = pNe
e580: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  w;.          pIt
e590: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
e5a0: 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20  = iRowidOff;.   
e5b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
e5c0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
e5d0: 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  >pLeaf ){.      
e5e0: 20 20 75 38 20 2a 61 20 3d 20 26 70 49 74 65 72    u8 *a = &pIter
e5f0: 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72  ->pLeaf->p[pIter
e600: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a  ->iLeafOffset];.
e610: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
e620: 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20 66 74  LeafOffset += ft
e630: 73 35 47 65 74 56 61 72 69 6e 74 28 61 2c 20 28  s5GetVarint(a, (
e640: 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
e650: 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72  wid);.        br
e660: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
e670: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61  {.        fts5Da
e680: 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77 29 3b  taRelease(pNew);
e690: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e6a0: 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d   }..  if( pIter-
e6b0: 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 70 49  >pLeaf ){.    pI
e6c0: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
e6d0: 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  st = pIter->pLea
e6e0: 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 66 74 73  f->nn+1;.    fts
e6f0: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49  5SegIterReverseI
e700: 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  nitPage(p, pIter
e710: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
e720: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
e730: 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
e740: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
e750: 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65 6e   argument curren
e760: 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  tly.** points to
e770: 20 61 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72   a delete marker
e780: 2e 20 41 20 64 65 6c 65 74 65 20 6d 61 72 6b 65  . A delete marke
e790: 72 20 69 73 20 61 6e 20 65 6e 74 72 79 20 77 69  r is an entry wi
e7a0: 74 68 20 61 20 30 20 62 79 74 65 0a 2a 2a 20 70  th a 0 byte.** p
e7b0: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a 2a 2f  osition-list..*/
e7c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
e7d0: 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79  MultiIterIsEmpty
e7e0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
e7f0: 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ts5Iter *pIter){
e800: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
e810: 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
e820: 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73  Seg[pIter->aFirs
e830: 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20  t[1].iFirst];.  
e840: 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53  return (p->rc==S
e850: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 65 67  QLITE_OK && pSeg
e860: 2d 3e 70 4c 65 61 66 20 26 26 20 70 53 65 67 2d  ->pLeaf && pSeg-
e870: 3e 6e 50 6f 73 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a  >nPos==0);.}../*
e880: 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72  .** Advance iter
e890: 61 74 6f 72 20 70 49 74 65 72 20 74 6f 20 74 68  ator pIter to th
e8a0: 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 0a 2a 2a  e next entry..**
e8b0: 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e  .** This version
e8c0: 20 6f 66 20 66 74 73 35 53 65 67 49 74 65 72 4e   of fts5SegIterN
e8d0: 65 78 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73  ext() is only us
e8e0: 65 64 20 62 79 20 72 65 76 65 72 73 65 20 69 74  ed by reverse it
e8f0: 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74  erators..*/.stat
e900: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
e910: 74 65 72 4e 65 78 74 5f 52 65 76 65 72 73 65 28  terNext_Reverse(
e920: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
e930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e940: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
e950: 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
e960: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
e970: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
e980: 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
e990: 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  vance */.  int *
e9a0: 70 62 55 6e 75 73 65 64 20 20 20 20 20 20 20 20  pbUnused        
e9b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
e9c0: 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  used */.){.  ass
e9d0: 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67  ert( pIter->flag
e9e0: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
e9f0: 5f 52 45 56 45 52 53 45 20 29 3b 0a 20 20 61 73  _REVERSE );.  as
ea00: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4e 65  sert( pIter->pNe
ea10: 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 55  xtLeaf==0 );.  U
ea20: 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 62 55 6e  NUSED_PARAM(pbUn
ea30: 75 73 65 64 29 3b 0a 0a 20 20 69 66 28 20 70 49  used);..  if( pI
ea40: 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65  ter->iRowidOffse
ea50: 74 3e 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 61  t>0 ){.    u8 *a
ea60: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
ea70: 3e 70 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66  >p;.    int iOff
ea80: 3b 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74 61  ;.    i64 iDelta
ea90: 3b 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52  ;..    pIter->iR
eaa0: 6f 77 69 64 4f 66 66 73 65 74 2d 2d 3b 0a 20 20  owidOffset--;.  
eab0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
eac0: 66 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 61 52  fset = pIter->aR
ead0: 6f 77 69 64 4f 66 66 73 65 74 5b 70 49 74 65 72  owidOffset[pIter
eae0: 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 5d 3b  ->iRowidOffset];
eaf0: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
eb00: 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
eb10: 72 29 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 70  r);.    iOff = p
eb20: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
eb30: 74 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 43  t;.    if( p->pC
eb40: 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d  onfig->eDetail!=
eb50: 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
eb60: 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b   ){.      iOff +
eb70: 3d 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a 20  = pIter->nPos;. 
eb80: 20 20 20 7d 0a 20 20 20 20 66 74 73 35 47 65 74     }.    fts5Get
eb90: 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
eba0: 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b   (u64*)&iDelta);
ebb0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77  .    pIter->iRow
ebc0: 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20  id -= iDelta;.  
ebd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 53  }else{.    fts5S
ebe0: 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65 77  egIterReverseNew
ebf0: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
ec00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76    }.}../*.** Adv
ec10: 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 70 49  ance iterator pI
ec20: 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ter to the next 
ec30: 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  entry..**.** Thi
ec40: 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 74 73  s version of fts
ec50: 35 53 65 67 49 74 65 72 4e 65 78 74 28 29 20 69  5SegIterNext() i
ec60: 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20 64  s only used if d
ec70: 65 74 61 69 6c 3d 6e 6f 6e 65 20 61 6e 64 20 74  etail=none and t
ec80: 68 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 69  he.** iterator i
ec90: 73 20 6e 6f 74 20 61 20 72 65 76 65 72 73 65 20  s not a reverse 
eca0: 64 69 72 65 63 74 69 6f 6e 20 69 74 65 72 61 74  direction iterat
ecb0: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  or..*/.static vo
ecc0: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  id fts5SegIterNe
ecd0: 78 74 5f 4e 6f 6e 65 28 0a 20 20 46 74 73 35 49  xt_None(.  Fts5I
ece0: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
ecf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
ed00: 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
ed10: 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
ed20: 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
ed30: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
ed40: 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f  or to advance */
ed50: 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72  .  int *pbNewTer
ed60: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
ed70: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66     /* OUT: Set f
ed80: 6f 72 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29  or new term */.)
ed90: 7b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20  {.  int iOff;.. 
eda0: 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
edb0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61  SQLITE_OK );.  a
edc0: 73 73 65 72 74 28 20 28 70 49 74 65 72 2d 3e 66  ssert( (pIter->f
edd0: 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
ede0: 54 45 52 5f 52 45 56 45 52 53 45 29 3d 3d 30 20  TER_REVERSE)==0 
edf0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
ee00: 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
ee10: 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  ==FTS5_DETAIL_NO
ee20: 4e 45 20 29 3b 0a 0a 20 20 41 53 53 45 52 54 5f  NE );..  ASSERT_
ee30: 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d  SZLEAF_OK(pIter-
ee40: 3e 70 4c 65 61 66 29 3b 0a 20 20 69 4f 66 66 20  >pLeaf);.  iOff 
ee50: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
ee60: 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 4e 65 78 74  fset;..  /* Next
ee70: 20 65 6e 74 72 79 20 69 73 20 6f 6e 20 74 68 65   entry is on the
ee80: 20 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a 20 20   next page */.  
ee90: 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65 67 20  if( pIter->pSeg 
eea0: 26 26 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  && iOff>=pIter->
eeb0: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
eec0: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
eed0: 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65  NextPage(p, pIte
eee0: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  r);.    if( p->r
eef0: 63 20 7c 7c 20 70 49 74 65 72 2d 3e 70 4c 65 61  c || pIter->pLea
ef00: 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  f==0 ) return;. 
ef10: 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64     pIter->iRowid
ef20: 20 3d 20 30 3b 0a 20 20 20 20 69 4f 66 66 20 3d   = 0;.    iOff =
ef30: 20 34 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69   4;.  }..  if( i
ef40: 4f 66 66 3c 70 49 74 65 72 2d 3e 69 45 6e 64 6f  Off<pIter->iEndo
ef50: 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20  fDoclist ){.    
ef60: 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 69 73  /* Next entry is
ef70: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
ef80: 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 36 34 20  page */.    i64 
ef90: 69 44 65 6c 74 61 3b 0a 20 20 20 20 69 4f 66 66  iDelta;.    iOff
efa0: 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47   += sqlite3Fts5G
efb0: 65 74 56 61 72 69 6e 74 28 26 70 49 74 65 72 2d  etVarint(&pIter-
efc0: 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  >pLeaf->p[iOff],
efd0: 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b   (u64*)&iDelta);
efe0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
eff0: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
f000: 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
f010: 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 7d  d += iDelta;.  }
f020: 65 6c 73 65 20 69 66 28 20 28 70 49 74 65 72 2d  else if( (pIter-
f030: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
f040: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 3d 3d  GITER_ONETERM)==
f050: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  0 ){.    if( pIt
f060: 65 72 2d 3e 70 53 65 67 20 29 7b 0a 20 20 20 20  er->pSeg ){.    
f070: 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b    int nKeep = 0;
f080: 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 21  .      if( iOff!
f090: 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65  =fts5LeafFirstTe
f0a0: 72 6d 4f 66 66 28 70 49 74 65 72 2d 3e 70 4c 65  rmOff(pIter->pLe
f0b0: 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  af) ){.        i
f0c0: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
f0d0: 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 70  rint32(&pIter->p
f0e0: 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e  Leaf->p[iOff], n
f0f0: 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Keep);.      }. 
f100: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
f110: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
f120: 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
f130: 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74  rLoadTerm(p, pIt
f140: 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  er, nKeep);.    
f150: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e  }else{.      con
f160: 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20 30  st u8 *pList = 0
f170: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
f180: 61 72 20 2a 7a 54 65 72 6d 20 3d 20 30 3b 0a 20  ar *zTerm = 0;. 
f190: 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 3b 0a       int nList;.
f1a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
f1b0: 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28 70 2d  5HashScanNext(p-
f1c0: 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 20 20 73  >pHash);.      s
f1d0: 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
f1e0: 61 6e 45 6e 74 72 79 28 70 2d 3e 70 48 61 73 68  anEntry(p->pHash
f1f0: 2c 20 26 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74  , &zTerm, &pList
f200: 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20  , &nList);.     
f210: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
f220: 67 6f 74 6f 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65  goto next_none_e
f230: 6f 66 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  of;.      pIter-
f240: 3e 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a  >pLeaf->p = (u8*
f250: 29 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49  )pList;.      pI
f260: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 3d  ter->pLeaf->nn =
f270: 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49   nList;.      pI
f280: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
f290: 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20  af = nList;.    
f2a0: 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
f2b0: 6f 63 6c 69 73 74 20 3d 20 6e 4c 69 73 74 3b 0a  oclist = nList;.
f2c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
f2d0: 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
f2e0: 63 2c 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  c,&pIter->term, 
f2f0: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65 72  (int)strlen(zTer
f300: 6d 29 2c 20 28 75 38 2a 29 7a 54 65 72 6d 29 3b  m), (u8*)zTerm);
f310: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  .      pIter->iL
f320: 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35  eafOffset = fts5
f330: 47 65 74 56 61 72 69 6e 74 28 70 4c 69 73 74 2c  GetVarint(pList,
f340: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
f350: 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  Rowid);.    }.. 
f360: 20 20 20 69 66 28 20 70 62 4e 65 77 54 65 72 6d     if( pbNewTerm
f370: 20 29 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20   ) *pbNewTerm = 
f380: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
f390: 67 6f 74 6f 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65  goto next_none_e
f3a0: 6f 66 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53  of;.  }..  fts5S
f3b0: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
f3c0: 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 72 65 74  , pIter);..  ret
f3d0: 75 72 6e 3b 0a 20 6e 65 78 74 5f 6e 6f 6e 65 5f  urn;. next_none_
f3e0: 65 6f 66 3a 0a 20 20 66 74 73 35 44 61 74 61 52  eof:.  fts5DataR
f3f0: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
f400: 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70  eaf);.  pIter->p
f410: 4c 65 61 66 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a  Leaf = 0;.}.../*
f420: 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72  .** Advance iter
f430: 61 74 6f 72 20 70 49 74 65 72 20 74 6f 20 74 68  ator pIter to th
f440: 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a  e next entry. .*
f450: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
f460: 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64   occurs, Fts5Ind
f470: 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20  ex.rc is set to 
f480: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
f490: 72 72 6f 72 20 63 6f 64 65 2e 20 49 74 20 0a 2a  rror code. It .*
f4a0: 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  * is not conside
f4b0: 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20  red an error if 
f4c0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61  the iterator rea
f4d0: 63 68 65 73 20 45 4f 46 2e 20 49 66 20 61 6e 20  ches EOF. If an 
f4e0: 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c  error has .** al
f4f0: 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
f500: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
f510: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
f520: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
f530: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
f540: 65 67 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74  egIterNext(.  Ft
f550: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f570: 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
f580: 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
f590: 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  gIter *pIter,   
f5a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
f5b0: 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65  rator to advance
f5c0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77   */.  int *pbNew
f5d0: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
f5e0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65        /* OUT: Se
f5f0: 74 20 66 6f 72 20 6e 65 77 20 74 65 72 6d 20 2a  t for new term *
f600: 2f 0a 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20  /.){.  Fts5Data 
f610: 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e  *pLeaf = pIter->
f620: 70 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69 4f 66  pLeaf;.  int iOf
f630: 66 3b 0a 20 20 69 6e 74 20 62 4e 65 77 54 65 72  f;.  int bNewTer
f640: 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65  m = 0;.  int nKe
f650: 65 70 20 3d 20 30 3b 0a 20 20 75 38 20 2a 61 3b  ep = 0;.  u8 *a;
f660: 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 61 73 73  .  int n;..  ass
f670: 65 72 74 28 20 70 62 4e 65 77 54 65 72 6d 3d 3d  ert( pbNewTerm==
f680: 30 20 7c 7c 20 2a 70 62 4e 65 77 54 65 72 6d 3d  0 || *pbNewTerm=
f690: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
f6a0: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
f6b0: 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail!=FTS5_DETAIL
f6c0: 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 2f 2a 20 53  _NONE );..  /* S
f6d0: 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 65 6e  earch for the en
f6e0: 64 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f  d of the positio
f6f0: 6e 20 6c 69 73 74 20 77 69 74 68 69 6e 20 74 68  n list within th
f700: 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
f710: 2a 2f 0a 20 20 61 20 3d 20 70 4c 65 61 66 2d 3e  */.  a = pLeaf->
f720: 70 3b 0a 20 20 6e 20 3d 20 70 4c 65 61 66 2d 3e  p;.  n = pLeaf->
f730: 73 7a 4c 65 61 66 3b 0a 0a 20 20 41 53 53 45 52  szLeaf;..  ASSER
f740: 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61  T_SZLEAF_OK(pLea
f750: 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 70 49 74  f);.  iOff = pIt
f760: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
f770: 2b 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a 0a  + pIter->nPos;..
f780: 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a    if( iOff<n ){.
f790: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
f7a0: 65 6e 74 72 79 20 69 73 20 6f 6e 20 74 68 65 20  entry is on the 
f7b0: 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f  current page. */
f7c0: 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20  .    assert_nc( 
f7d0: 69 4f 66 66 3c 3d 70 49 74 65 72 2d 3e 69 45 6e  iOff<=pIter->iEn
f7e0: 64 6f 66 44 6f 63 6c 69 73 74 20 29 3b 0a 20 20  dofDoclist );.  
f7f0: 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49 74 65    if( iOff>=pIte
f800: 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
f810: 20 29 7b 0a 20 20 20 20 20 20 62 4e 65 77 54 65   ){.      bNewTe
f820: 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  rm = 1;.      if
f830: 28 20 69 4f 66 66 21 3d 66 74 73 35 4c 65 61 66  ( iOff!=fts5Leaf
f840: 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70 4c 65  FirstTermOff(pLe
f850: 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  af) ){.        i
f860: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
f870: 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c  rint32(&a[iOff],
f880: 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 7d   nKeep);.      }
f890: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f8a0: 20 20 75 36 34 20 69 44 65 6c 74 61 3b 0a 20 20    u64 iDelta;.  
f8b0: 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69      iOff += sqli
f8c0: 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
f8d0: 28 26 61 5b 69 4f 66 66 5d 2c 20 26 69 44 65 6c  (&a[iOff], &iDel
f8e0: 74 61 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  ta);.      pIter
f8f0: 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c  ->iRowid += iDel
f900: 74 61 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ta;.      assert
f910: 5f 6e 63 28 20 69 44 65 6c 74 61 3e 30 20 29 3b  _nc( iDelta>0 );
f920: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65 72  .    }.    pIter
f930: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
f940: 69 4f 66 66 3b 0a 0a 20 20 7d 65 6c 73 65 20 69  iOff;..  }else i
f950: 66 28 20 70 49 74 65 72 2d 3e 70 53 65 67 3d 3d  f( pIter->pSeg==
f960: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  0 ){.    const u
f970: 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20  8 *pList = 0;.  
f980: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
f990: 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  erm = 0;.    int
f9a0: 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20   nList = 0;.    
f9b0: 61 73 73 65 72 74 28 20 28 70 49 74 65 72 2d 3e  assert( (pIter->
f9c0: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
f9d0: 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 20 7c 7c  ITER_ONETERM) ||
f9e0: 20 70 62 4e 65 77 54 65 72 6d 20 29 3b 0a 20 20   pbNewTerm );.  
f9f0: 20 20 69 66 28 20 30 3d 3d 28 70 49 74 65 72 2d    if( 0==(pIter-
fa00: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
fa10: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 20 29  GITER_ONETERM) )
fa20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
fa30: 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28  ts5HashScanNext(
fa40: 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 20  p->pHash);.     
fa50: 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
fa60: 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70 48 61  ScanEntry(p->pHa
fa70: 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 4c 69  sh, &zTerm, &pLi
fa80: 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20  st, &nList);.   
fa90: 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74   }.    if( pList
faa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ==0 ){.      fts
fab0: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
fac0: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20  er->pLeaf);.    
fad0: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
fae0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
faf0: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
fb00: 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69 73  f->p = (u8*)pLis
fb10: 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  t;.      pIter->
fb20: 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 6e 4c 69 73  pLeaf->nn = nLis
fb30: 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  t;.      pIter->
fb40: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20  pLeaf->szLeaf = 
fb50: 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74  nList;.      pIt
fb60: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
fb70: 74 20 3d 20 6e 4c 69 73 74 2b 31 3b 0a 20 20 20  t = nList+1;.   
fb80: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
fb90: 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
fba0: 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 28 69  &pIter->term, (i
fbb0: 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29  nt)strlen(zTerm)
fbc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 28 75 38 2a  ,.          (u8*
fbd0: 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 70  )zTerm);.      p
fbe0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
fbf0: 74 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e  t = fts5GetVarin
fc00: 74 28 70 4c 69 73 74 2c 20 28 75 36 34 2a 29 26  t(pList, (u64*)&
fc10: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
fc20: 20 20 20 20 20 20 2a 70 62 4e 65 77 54 65 72 6d        *pbNewTerm
fc30: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
fc40: 6c 73 65 7b 0a 20 20 20 20 69 4f 66 66 20 3d 20  lse{.    iOff = 
fc50: 30 3b 0a 20 20 20 20 2f 2a 20 4e 65 78 74 20 65  0;.    /* Next e
fc60: 6e 74 72 79 20 69 73 20 6e 6f 74 20 6f 6e 20 74  ntry is not on t
fc70: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
fc80: 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4f  */.    while( iO
fc90: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  ff==0 ){.      f
fca0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
fcb0: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
fcc0: 20 20 20 20 70 4c 65 61 66 20 3d 20 70 49 74 65      pLeaf = pIte
fcd0: 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20 20 20  r->pLeaf;.      
fce0: 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 62  if( pLeaf==0 ) b
fcf0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 41 53 53 45  reak;.      ASSE
fd00: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65  RT_SZLEAF_OK(pLe
fd10: 61 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  af);.      if( (
fd20: 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46  iOff = fts5LeafF
fd30: 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65  irstRowidOff(pLe
fd40: 61 66 29 29 20 26 26 20 69 4f 66 66 3c 70 4c 65  af)) && iOff<pLe
fd50: 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
fd60: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71        iOff += sq
fd70: 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
fd80: 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  nt(&pLeaf->p[iOf
fd90: 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  f], (u64*)&pIter
fda0: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
fdb0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
fdc0: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20  ffset = iOff;.. 
fdd0: 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66         if( pLeaf
fde0: 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ->nn>pLeaf->szLe
fdf0: 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
fe00: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
fe10: 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66   = pLeaf->szLeaf
fe20: 20 2b 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   + fts5GetVarint
fe30: 33 32 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  32(.            
fe40: 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65 61    &pLeaf->p[pLea
fe50: 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 70 49 74 65  f->szLeaf], pIte
fe60: 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
fe70: 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
fe80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
fe90: 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 70        else if( p
fea0: 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e  Leaf->nn>pLeaf->
feb0: 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
fec0: 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f    pIter->iPgidxO
fed0: 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65  ff = pLeaf->szLe
fee0: 61 66 20 2b 20 66 74 73 35 47 65 74 56 61 72 69  af + fts5GetVari
fef0: 6e 74 33 32 28 0a 20 20 20 20 20 20 20 20 20 20  nt32(.          
ff00: 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65 61    &pLeaf->p[pLea
ff10: 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 69 4f 66 66  f->szLeaf], iOff
ff20: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
ff30: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
ff40: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20  Offset = iOff;. 
ff50: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45         pIter->iE
ff60: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 69 4f  ndofDoclist = iO
ff70: 66 66 3b 0a 20 20 20 20 20 20 20 20 62 4e 65 77  ff;.        bNew
ff80: 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
ff90: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e  }.      assert_n
ffa0: 63 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 73  c( iOff<pLeaf->s
ffb0: 7a 4c 65 61 66 20 29 3b 0a 20 20 20 20 20 20 69  zLeaf );.      i
ffc0: 66 28 20 69 4f 66 66 3e 70 4c 65 61 66 2d 3e 73  f( iOff>pLeaf->s
ffd0: 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  zLeaf ){.       
ffe0: 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
fff0: 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 72  RRUPT;.        r
10000 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
10010 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
10020 68 65 63 6b 20 69 66 20 74 68 65 20 69 74 65 72  heck if the iter
10030 61 74 6f 72 20 69 73 20 6e 6f 77 20 61 74 20 45  ator is now at E
10040 4f 46 2e 20 49 66 20 73 6f 2c 20 72 65 74 75 72  OF. If so, retur
10050 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 69 66  n early. */.  if
10060 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29  ( pIter->pLeaf )
10070 7b 0a 20 20 20 20 69 66 28 20 62 4e 65 77 54 65  {.    if( bNewTe
10080 72 6d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rm ){.      if( 
10090 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
100a0 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
100b0 45 52 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ERM ){.        f
100c0 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
100d0 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
100e0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
100f0 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  af = 0;.      }e
10100 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73  lse{.        fts
10110 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d  5SegIterLoadTerm
10120 28 70 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65 70  (p, pIter, nKeep
10130 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  );.        fts5S
10140 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
10150 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
10160 20 20 69 66 28 20 70 62 4e 65 77 54 65 72 6d 20    if( pbNewTerm 
10170 29 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31  ) *pbNewTerm = 1
10180 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
10190 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  lse{.      /* Th
101a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 75 6c  e following coul
101b0 64 20 62 65 20 64 6f 6e 65 20 62 79 20 63 61 6c  d be done by cal
101c0 6c 69 6e 67 20 66 74 73 35 53 65 67 49 74 65 72  ling fts5SegIter
101d0 4c 6f 61 64 4e 50 6f 73 28 29 2e 20 42 75 74 0a  LoadNPos(). But.
101e0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 62 6c        ** this bl
101f0 6f 63 6b 20 69 73 20 70 61 72 74 69 63 75 6c 61  ock is particula
10200 72 6c 79 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  rly performance 
10210 63 72 69 74 69 63 61 6c 2c 20 73 6f 20 65 71 75  critical, so equ
10220 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20 2a 2a  ivalent.      **
10230 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64   code is inlined
10240 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
10250 20 20 2a 2a 20 4c 61 74 65 72 3a 20 53 77 69 74    ** Later: Swit
10260 63 68 65 64 20 62 61 63 6b 20 74 6f 20 66 74 73  ched back to fts
10270 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
10280 28 29 20 62 65 63 61 75 73 65 20 69 74 20 73 75  () because it su
10290 70 70 6f 72 74 73 0a 20 20 20 20 20 20 2a 2a 20  pports.      ** 
102a0 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 6d 6f 64 65  detail=none mode
102b0 2e 20 4e 6f 74 20 69 64 65 61 6c 2e 0a 20 20 20  . Not ideal..   
102c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
102d0 6e 53 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nSz;.      asser
102e0 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
102f0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
10300 65 72 74 28 20 70 49 74 65 72 2d 3e 69 4c 65 61  ert( pIter->iLea
10310 66 4f 66 66 73 65 74 3c 3d 70 49 74 65 72 2d 3e  fOffset<=pIter->
10320 70 4c 65 61 66 2d 3e 6e 6e 20 29 3b 0a 20 20 20  pLeaf->nn );.   
10330 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61     fts5FastGetVa
10340 72 69 6e 74 33 32 28 70 49 74 65 72 2d 3e 70 4c  rint32(pIter->pL
10350 65 61 66 2d 3e 70 2c 20 70 49 74 65 72 2d 3e 69  eaf->p, pIter->i
10360 4c 65 61 66 4f 66 66 73 65 74 2c 20 6e 53 7a 29  LeafOffset, nSz)
10370 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62  ;.      pIter->b
10380 44 65 6c 20 3d 20 28 6e 53 7a 20 26 20 30 78 30  Del = (nSz & 0x0
10390 30 30 31 29 3b 0a 20 20 20 20 20 20 70 49 74 65  001);.      pIte
103a0 72 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31  r->nPos = nSz>>1
103b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e  ;.      assert_n
103c0 63 28 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3e 3d  c( pIter->nPos>=
103d0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  0 );.    }.  }.}
103e0 0a 0a 23 64 65 66 69 6e 65 20 53 57 41 50 56 41  ..#define SWAPVA
103f0 4c 28 54 2c 20 61 2c 20 62 29 20 7b 20 54 20 74  L(T, a, b) { T t
10400 6d 70 3b 20 74 6d 70 3d 61 3b 20 61 3d 62 3b 20  mp; tmp=a; a=b; 
10410 62 3d 74 6d 70 3b 20 7d 0a 0a 23 64 65 66 69 6e  b=tmp; }..#defin
10420 65 20 66 74 73 35 49 6e 64 65 78 53 6b 69 70 56  e fts5IndexSkipV
10430 61 72 69 6e 74 28 61 2c 20 69 4f 66 66 29 20 7b  arint(a, iOff) {
10440 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
10450 69 6e 74 20 69 45 6e 64 20 3d 20 69 4f 66 66 2b  int iEnd = iOff+
10460 39 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  9;              
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10480 5c 0a 20 20 77 68 69 6c 65 28 20 28 61 5b 69 4f  \.  while( (a[iO
10490 66 66 2b 2b 5d 20 26 20 30 78 38 30 29 20 26 26  ff++] & 0x80) &&
104a0 20 69 4f 66 66 3c 69 45 6e 64 20 29 3b 20 20 20   iOff<iEnd );   
104b0 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49      \.}../*.** I
104c0 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75  terator pIter cu
104d0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
104e0 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69  o the first rowi
104f0 64 20 69 6e 20 61 20 64 6f 63 6c 69 73 74 2e 20  d in a doclist. 
10500 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
10510 20 73 65 74 73 20 74 68 65 20 69 74 65 72 61 74   sets the iterat
10520 6f 72 20 75 70 20 73 6f 20 74 68 61 74 20 69 74  or up so that it
10530 65 72 61 74 65 73 20 69 6e 20 72 65 76 65 72 73  erates in revers
10540 65 20 6f 72 64 65 72 20 74 68 72 6f 75 67 68 0a  e order through.
10550 2a 2a 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 0a  ** the doclist..
10560 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
10570 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
10580 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
10590 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
105a0 65 72 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78  er){.  Fts5Dlidx
105b0 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 70  Iter *pDlidx = p
105c0 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20  Iter->pDlidx;.  
105d0 46 74 73 35 44 61 74 61 20 2a 70 4c 61 73 74 20  Fts5Data *pLast 
105e0 3d 20 30 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c  = 0;.  int pgnoL
105f0 61 73 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ast = 0;..  if( 
10600 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 69 6e  pDlidx ){.    in
10610 74 20 69 53 65 67 69 64 20 3d 20 70 49 74 65 72  t iSegid = pIter
10620 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  ->pSeg->iSegid;.
10630 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 66      pgnoLast = f
10640 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
10650 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 70 4c  (pDlidx);.    pL
10660 61 73 74 20 3d 20 66 74 73 35 44 61 74 61 52 65  ast = fts5DataRe
10670 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45  ad(p, FTS5_SEGME
10680 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c  NT_ROWID(iSegid,
10690 20 70 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20 7d   pgnoLast));.  }
106a0 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 44 61  else{.    Fts5Da
106b0 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65  ta *pLeaf = pIte
106c0 72 2d 3e 70 4c 65 61 66 3b 20 20 20 20 20 20 20  r->pLeaf;       
106d0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61    /* Current lea
106e0 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20 20 20 2f  f data */..    /
106f0 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 46 74 73  * Currently, Fts
10700 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
10710 66 73 65 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  fset points to t
10720 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
10730 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e  .    ** position
10740 2d 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 66 6f  -list content fo
10750 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  r the current ro
10760 77 69 64 2e 20 42 61 63 6b 20 69 74 20 75 70 20  wid. Back it up 
10770 73 6f 20 74 68 61 74 20 69 74 0a 20 20 20 20 2a  so that it.    *
10780 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
10790 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 6f 73  start of the pos
107a0 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
107b0 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20 20 69 6e  field. */.    in
107c0 74 20 69 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20  t iPoslist;.    
107d0 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  if( pIter->iTerm
107e0 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d  LeafPgno==pIter-
107f0 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  >iLeafPgno ){.  
10800 20 20 20 20 69 50 6f 73 6c 69 73 74 20 3d 20 70      iPoslist = p
10810 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f  Iter->iTermLeafO
10820 66 66 73 65 74 3b 0a 20 20 20 20 7d 65 6c 73 65  ffset;.    }else
10830 7b 0a 20 20 20 20 20 20 69 50 6f 73 6c 69 73 74  {.      iPoslist
10840 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 4;.    }.    
10850 66 74 73 35 49 6e 64 65 78 53 6b 69 70 56 61 72  fts5IndexSkipVar
10860 69 6e 74 28 70 4c 65 61 66 2d 3e 70 2c 20 69 50  int(pLeaf->p, iP
10870 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 70 49 74  oslist);.    pIt
10880 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
10890 3d 20 69 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 20  = iPoslist;..   
108a0 20 2f 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 64   /* If this cond
108b0 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 74 68  ition is true th
108c0 65 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  en the largest r
108d0 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63 75 72  owid for the cur
108e0 72 65 6e 74 0a 20 20 20 20 2a 2a 20 74 65 72 6d  rent.    ** term
108f0 20 6d 61 79 20 6e 6f 74 20 62 65 20 73 74 6f 72   may not be stor
10900 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ed on the curren
10910 74 20 70 61 67 65 2e 20 53 6f 20 73 65 61 72 63  t page. So searc
10920 68 20 66 6f 72 77 61 72 64 20 74 6f 0a 20 20 20  h forward to.   
10930 20 2a 2a 20 73 65 65 20 77 68 65 72 65 20 73 61   ** see where sa
10940 69 64 20 72 6f 77 69 64 20 72 65 61 6c 6c 79 20  id rowid really 
10950 69 73 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  is.  */.    if( 
10960 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
10970 6c 69 73 74 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c  list>=pLeaf->szL
10980 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  eaf ){.      int
10990 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 46 74 73   pgno;.      Fts
109a0 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
109b0 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d  t *pSeg = pIter-
109c0 3e 70 53 65 67 3b 0a 0a 20 20 20 20 20 20 2f 2a  >pSeg;..      /*
109d0 20 54 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20   The last rowid 
109e0 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20 6d  in the doclist m
109f0 61 79 20 6e 6f 74 20 62 65 20 6f 6e 20 74 68 65  ay not be on the
10a00 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 53   current page. S
10a10 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2a 20 66  earch.      ** f
10a20 6f 72 77 61 72 64 20 74 6f 20 66 69 6e 64 20 74  orward to find t
10a30 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69  he page containi
10a40 6e 67 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69  ng the last rowi
10a50 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  d.  */.      for
10a60 28 70 67 6e 6f 3d 70 49 74 65 72 2d 3e 69 4c 65  (pgno=pIter->iLe
10a70 61 66 50 67 6e 6f 2b 31 3b 20 21 70 2d 3e 72 63  afPgno+1; !p->rc
10a80 20 26 26 20 70 67 6e 6f 3c 3d 70 53 65 67 2d 3e   && pgno<=pSeg->
10a90 70 67 6e 6f 4c 61 73 74 3b 20 70 67 6e 6f 2b 2b  pgnoLast; pgno++
10aa0 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  ){.        i64 i
10ab0 41 62 73 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  Abs = FTS5_SEGME
10ac0 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69  NT_ROWID(pSeg->i
10ad0 53 65 67 69 64 2c 20 70 67 6e 6f 29 3b 0a 20 20  Segid, pgno);.  
10ae0 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a        Fts5Data *
10af0 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61 52  pNew = fts5DataR
10b00 65 61 64 28 70 2c 20 69 41 62 73 29 3b 0a 20 20  ead(p, iAbs);.  
10b10 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
10b20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
10b30 69 52 6f 77 69 64 2c 20 62 54 65 72 6d 6c 65 73  iRowid, bTermles
10b40 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f  s;.          iRo
10b50 77 69 64 20 3d 20 66 74 73 35 4c 65 61 66 46 69  wid = fts5LeafFi
10b60 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4e 65 77  rstRowidOff(pNew
10b70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 54 65  );.          bTe
10b80 72 6d 6c 65 73 73 20 3d 20 66 74 73 35 4c 65 61  rmless = fts5Lea
10b90 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4e 65 77  fIsTermless(pNew
10ba0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
10bb0 20 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20   iRowid ){.     
10bc0 20 20 20 20 20 20 20 53 57 41 50 56 41 4c 28 46         SWAPVAL(F
10bd0 74 73 35 44 61 74 61 2a 2c 20 70 4e 65 77 2c 20  ts5Data*, pNew, 
10be0 70 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pLast);.        
10bf0 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 70      pgnoLast = p
10c00 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  gno;.          }
10c10 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44  .          fts5D
10c20 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77 29  ataRelease(pNew)
10c30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
10c40 62 54 65 72 6d 6c 65 73 73 3d 3d 30 20 29 20 62  bTermless==0 ) b
10c50 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
10c60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10c70 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 61 73 74  }..  /* If pLast
10c80 20 69 73 20 4e 55 4c 4c 20 61 74 20 74 68 69 73   is NULL at this
10c90 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 65   point, then the
10ca0 20 6c 61 73 74 20 72 6f 77 69 64 20 66 6f 72 20   last rowid for 
10cb0 74 68 69 73 20 64 6f 63 6c 69 73 74 0a 20 20 2a  this doclist.  *
10cc0 2a 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61  * lies on the pa
10cd0 67 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 64  ge currently ind
10ce0 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74  icated by the it
10cf0 65 72 61 74 6f 72 2e 20 49 6e 20 74 68 69 73 20  erator. In this 
10d00 63 61 73 65 20 0a 20 20 2a 2a 20 70 49 74 65 72  case .  ** pIter
10d10 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 69 73  ->iLeafOffset is
10d20 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20   already set to 
10d30 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 6f 73  point to the pos
10d40 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a  ition-list size.
10d50 20 20 2a 2a 20 66 69 65 6c 64 20 61 73 73 6f 63    ** field assoc
10d60 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66  iated with the f
10d70 69 72 73 74 20 72 65 6c 65 76 61 6e 74 20 72 6f  irst relevant ro
10d80 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  wid on the page.
10d90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69  .  **.  ** Or, i
10da0 66 20 70 4c 61 73 74 20 69 73 20 6e 6f 6e 2d 4e  f pLast is non-N
10db0 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
10dc0 74 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  the page that co
10dd0 6e 74 61 69 6e 73 20 74 68 65 20 6c 61 73 74 0a  ntains the last.
10de0 20 20 2a 2a 20 72 6f 77 69 64 2e 20 49 6e 20 74    ** rowid. In t
10df0 68 69 73 20 63 61 73 65 20 63 6f 6e 66 69 67 75  his case configu
10e00 72 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  re the iterator 
10e10 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
10e20 73 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69  s to the.  ** fi
10e30 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 69  rst rowid on thi
10e40 73 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  s page..  */.  i
10e50 66 28 20 70 4c 61 73 74 20 29 7b 0a 20 20 20 20  f( pLast ){.    
10e60 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 66 74  int iOff;.    ft
10e70 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
10e80 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
10e90 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
10ea0 70 4c 61 73 74 3b 0a 20 20 20 20 70 49 74 65 72  pLast;.    pIter
10eb0 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 67  ->iLeafPgno = pg
10ec0 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 69 4f 66 66  noLast;.    iOff
10ed0 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
10ee0 52 6f 77 69 64 4f 66 66 28 70 4c 61 73 74 29 3b  RowidOff(pLast);
10ef0 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73  .    iOff += fts
10f00 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 61 73  5GetVarint(&pLas
10f10 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t->p[iOff], (u64
10f20 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
10f30 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  );.    pIter->iL
10f40 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
10f50 3b 0a 0a 20 20 20 20 69 66 28 20 66 74 73 35 4c  ;..    if( fts5L
10f60 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c  eafIsTermless(pL
10f70 61 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70 49  ast) ){.      pI
10f80 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
10f90 73 74 20 3d 20 70 4c 61 73 74 2d 3e 6e 6e 2b 31  st = pLast->nn+1
10fa0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10fb0 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
10fc0 44 6f 63 6c 69 73 74 20 3d 20 66 74 73 35 4c 65  Doclist = fts5Le
10fd0 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70  afFirstTermOff(p
10fe0 4c 61 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Last);.    }..  
10ff0 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72  }..  fts5SegIter
11000 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28  ReverseInitPage(
11010 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  p, pIter);.}../*
11020 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
11030 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  er currently poi
11040 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
11050 20 72 6f 77 69 64 20 6f 66 20 61 20 64 6f 63 6c   rowid of a docl
11060 69 73 74 2e 0a 2a 2a 20 54 68 65 72 65 20 69 73  ist..** There is
11070 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
11080 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
11090 20 74 68 65 20 66 69 6e 61 6c 20 74 65 72 6d 20   the final term 
110a0 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a  on the current .
110b0 2a 2a 20 70 61 67 65 2e 20 49 66 20 74 68 65 20  ** page. If the 
110c0 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20  current term is 
110d0 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e  the last term on
110e0 20 74 68 65 20 70 61 67 65 2c 20 6c 6f 61 64 20   the page, load 
110f0 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d  the .** doclist-
11100 69 6e 64 65 78 20 66 72 6f 6d 20 64 69 73 6b 20  index from disk 
11110 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  and initialize a
11120 6e 20 69 74 65 72 61 74 6f 72 20 61 74 20 28 70  n iterator at (p
11130 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 2e 0a 2a  Iter->pDlidx)..*
11140 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
11150 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44 6c 69  s5SegIterLoadDli
11160 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  dx(Fts5Index *p,
11170 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
11180 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 53 65 67  ter){.  int iSeg
11190 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e   = pIter->pSeg->
111a0 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 62 52  iSegid;.  int bR
111b0 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61  ev = (pIter->fla
111c0 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
111d0 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74  R_REVERSE);.  Ft
111e0 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20  s5Data *pLeaf = 
111f0 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20 2f 2a  pIter->pLeaf; /*
11200 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61   Current leaf da
11210 74 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ta */..  assert(
11220 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
11230 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
11240 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74  TERM );.  assert
11250 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3d  ( pIter->pDlidx=
11260 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  =0 );..  /* Chec
11270 6b 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  k if the current
11280 20 64 6f 63 6c 69 73 74 20 65 6e 64 73 20 6f 6e   doclist ends on
11290 20 74 68 69 73 20 70 61 67 65 2e 20 49 66 20 69   this page. If i
112a0 74 20 64 6f 65 73 2c 20 72 65 74 75 72 6e 0a 20  t does, return. 
112b0 20 2a 2a 20 65 61 72 6c 79 20 77 69 74 68 6f 75   ** early withou
112c0 74 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 6f  t loading the do
112d0 63 6c 69 73 74 2d 69 6e 64 65 78 20 28 61 73 20  clist-index (as 
112e0 69 74 20 62 65 6c 6f 6e 67 73 20 74 6f 20 61 20  it belongs to a 
112f0 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a 20 74  different.  ** t
11300 65 72 6d 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49  erm. */.  if( pI
11310 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
11320 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66  no==pIter->iLeaf
11330 50 67 6e 6f 20 0a 20 20 20 26 26 20 70 49 74 65  Pgno .   && pIte
11340 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
11350 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 0a  <pLeaf->szLeaf .
11360 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b    ){.    return;
11370 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 70  .  }..  pIter->p
11380 44 6c 69 64 78 20 3d 20 66 74 73 35 44 6c 69 64  Dlidx = fts5Dlid
11390 78 49 74 65 72 49 6e 69 74 28 70 2c 20 62 52 65  xIterInit(p, bRe
113a0 76 2c 20 69 53 65 67 2c 20 70 49 74 65 72 2d 3e  v, iSeg, pIter->
113b0 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a  iTermLeafPgno);.
113c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65  }../*.** The ite
113d0 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73  rator object pas
113e0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
113f0 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65  d argument curre
11400 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  ntly contains.**
11410 20 6e 6f 20 76 61 6c 69 64 20 76 61 6c 75 65 73   no valid values
11420 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20   except for the 
11430 46 74 73 35 53 65 67 49 74 65 72 2e 70 4c 65 61  Fts5SegIter.pLea
11440 66 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c  f member variabl
11450 65 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  e. This.** funct
11460 69 6f 6e 20 73 65 61 72 63 68 65 73 20 74 68 65  ion searches the
11470 20 6c 65 61 66 20 70 61 67 65 20 66 6f 72 20 61   leaf page for a
11480 20 74 65 72 6d 20 6d 61 74 63 68 69 6e 67 20 28   term matching (
11490 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 2a 2a  pTerm/nTerm)..**
114a0 0a 2a 2a 20 49 66 20 74 68 65 20 73 70 65 63 69  .** If the speci
114b0 66 69 65 64 20 74 65 72 6d 20 69 73 20 66 6f 75  fied term is fou
114c0 6e 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  nd on the page, 
114d0 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 6f  then the iterato
114e0 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69  r is left.** poi
114f0 6e 74 69 6e 67 20 74 6f 20 69 74 2e 20 49 66 20  nting to it. If 
11500 61 72 67 75 6d 65 6e 74 20 62 47 65 20 69 73 20  argument bGe is 
11510 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 74 65 72  zero and the ter
11520 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 0a  m is not found,.
11530 2a 2a 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ** the iterator 
11540 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
11550 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49   at EOF..**.** I
11560 66 20 62 47 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  f bGe is non-zer
11570 6f 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66  o and the specif
11580 69 65 64 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  ied term is not 
11590 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 0a  found, then the.
115a0 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c  ** iterator is l
115b0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
115c0 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 74 65 72  the smallest ter
115d0 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74  m in the segment
115e0 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67   that.** is larg
115f0 65 72 20 74 68 61 6e 20 74 68 65 20 73 70 65 63  er than the spec
11600 69 66 69 65 64 20 74 65 72 6d 2c 20 65 76 65 6e  ified term, even
11610 20 69 66 20 74 68 69 73 20 74 65 72 6d 20 69 73   if this term is
11620 20 6e 6f 74 20 6f 6e 20 74 68 65 0a 2a 2a 20 63   not on the.** c
11630 75 72 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2f 0a  urrent page..*/.
11640 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
11650 4c 65 61 66 53 65 65 6b 28 0a 20 20 46 74 73 35  LeafSeek(.  Fts5
11660 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
11670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
11680 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 63  eave any error c
11690 6f 64 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ode here */.  in
116a0 74 20 62 47 65 2c 20 20 20 20 20 20 20 20 20 20  t bGe,          
116b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
116c0 20 54 72 75 65 20 66 6f 72 20 61 20 3e 3d 20 73   True for a >= s
116d0 65 61 72 63 68 20 2a 2f 0a 20 20 46 74 73 35 53  earch */.  Fts5S
116e0 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  egIter *pIter,  
116f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
11700 65 72 61 74 6f 72 20 74 6f 20 73 65 65 6b 20 2a  erator to seek *
11710 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
11720 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20  erm, int nTerm  
11730 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
11740 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 29 7b 0a  earch for */.){.
11750 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 63 6f    int iOff;.  co
11760 6e 73 74 20 75 38 20 2a 61 20 3d 20 70 49 74 65  nst u8 *a = pIte
11770 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 69  r->pLeaf->p;.  i
11780 6e 74 20 73 7a 4c 65 61 66 20 3d 20 70 49 74 65  nt szLeaf = pIte
11790 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  r->pLeaf->szLeaf
117a0 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65  ;.  int n = pIte
117b0 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a 20  r->pLeaf->nn;.. 
117c0 20 75 33 32 20 6e 4d 61 74 63 68 20 3d 20 30 3b   u32 nMatch = 0;
117d0 0a 20 20 75 33 32 20 6e 4b 65 65 70 20 3d 20 30  .  u32 nKeep = 0
117e0 3b 0a 20 20 75 33 32 20 6e 4e 65 77 20 3d 20 30  ;.  u32 nNew = 0
117f0 3b 0a 20 20 75 33 32 20 69 54 65 72 6d 4f 66 66  ;.  u32 iTermOff
11800 3b 0a 20 20 69 6e 74 20 69 50 67 69 64 78 3b 20  ;.  int iPgidx; 
11810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11820 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
11830 66 66 73 65 74 20 69 6e 20 70 67 69 64 78 20 2a  ffset in pgidx *
11840 2f 0a 20 20 69 6e 74 20 62 45 6e 64 4f 66 50 61  /.  int bEndOfPa
11850 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
11860 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
11870 5f 4f 4b 20 29 3b 0a 0a 20 20 69 50 67 69 64 78  _OK );..  iPgidx
11880 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 69 50 67   = szLeaf;.  iPg
11890 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61  idx += fts5GetVa
118a0 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78  rint32(&a[iPgidx
118b0 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20  ], iTermOff);.  
118c0 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
118d0 0a 20 20 69 66 28 20 69 4f 66 66 3e 6e 20 29 7b  .  if( iOff>n ){
118e0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53  .    p->rc = FTS
118f0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  5_CORRUPT;.    r
11900 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 77 68  eturn;.  }..  wh
11910 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f  ile( 1 ){..    /
11920 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
11930 20 6d 61 6e 79 20 6e 65 77 20 62 79 74 65 73 20   many new bytes 
11940 61 72 65 20 69 6e 20 74 68 69 73 20 74 65 72 6d  are in this term
11950 20 2a 2f 0a 20 20 20 20 66 74 73 35 46 61 73 74   */.    fts5Fast
11960 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20 69  GetVarint32(a, i
11970 4f 66 66 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20  Off, nNew);.    
11980 69 66 28 20 6e 4b 65 65 70 3c 6e 4d 61 74 63 68  if( nKeep<nMatch
11990 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
119a0 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20  earch_failed;.  
119b0 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
119c0 20 6e 4b 65 65 70 3e 3d 6e 4d 61 74 63 68 20 29   nKeep>=nMatch )
119d0 3b 0a 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3d  ;.    if( nKeep=
119e0 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  =nMatch ){.     
119f0 20 75 33 32 20 6e 43 6d 70 3b 0a 20 20 20 20 20   u32 nCmp;.     
11a00 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 6e 43   u32 i;.      nC
11a10 6d 70 20 3d 20 28 75 33 32 29 4d 49 4e 28 6e 4e  mp = (u32)MIN(nN
11a20 65 77 2c 20 6e 54 65 72 6d 2d 6e 4d 61 74 63 68  ew, nTerm-nMatch
11a30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
11a40 3b 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a  ; i<nCmp; i++){.
11a50 20 20 20 20 20 20 20 20 69 66 28 20 61 5b 69 4f          if( a[iO
11a60 66 66 2b 69 5d 21 3d 70 54 65 72 6d 5b 6e 4d 61  ff+i]!=pTerm[nMa
11a70 74 63 68 2b 69 5d 20 29 20 62 72 65 61 6b 3b 0a  tch+i] ) break;.
11a80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4d        }.      nM
11a90 61 74 63 68 20 2b 3d 20 69 3b 0a 0a 20 20 20 20  atch += i;..    
11aa0 20 20 69 66 28 20 28 75 33 32 29 6e 54 65 72 6d    if( (u32)nTerm
11ab0 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20  ==nMatch ){.    
11ac0 20 20 20 20 69 66 28 20 69 3d 3d 6e 4e 65 77 20      if( i==nNew 
11ad0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
11ae0 6f 20 73 65 61 72 63 68 5f 73 75 63 63 65 73 73  o search_success
11af0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
11b00 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
11b10 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20  search_failed;. 
11b20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11b30 65 6c 73 65 20 69 66 28 20 69 3c 6e 4e 65 77 20  else if( i<nNew 
11b40 26 26 20 61 5b 69 4f 66 66 2b 69 5d 3e 70 54 65  && a[iOff+i]>pTe
11b50 72 6d 5b 6e 4d 61 74 63 68 5d 20 29 7b 0a 20 20  rm[nMatch] ){.  
11b60 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63        goto searc
11b70 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  h_failed;.      
11b80 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
11b90 20 69 50 67 69 64 78 3e 3d 6e 20 29 7b 0a 20 20   iPgidx>=n ){.  
11ba0 20 20 20 20 62 45 6e 64 4f 66 50 61 67 65 20 3d      bEndOfPage =
11bb0 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
11bc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 50 67 69  .    }..    iPgi
11bd0 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  dx += fts5GetVar
11be0 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 5d  int32(&a[iPgidx]
11bf0 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 69 54  , nKeep);.    iT
11c00 65 72 6d 4f 66 66 20 2b 3d 20 6e 4b 65 65 70 3b  ermOff += nKeep;
11c10 0a 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72  .    iOff = iTer
11c20 6d 4f 66 66 3b 0a 0a 20 20 20 20 69 66 28 20 69  mOff;..    if( i
11c30 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20  Off>=n ){.      
11c40 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
11c50 52 55 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  RUPT;.      retu
11c60 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rn;.    }..    /
11c70 2a 20 52 65 61 64 20 74 68 65 20 6e 4b 65 65 70  * Read the nKeep
11c80 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6e 65   field of the ne
11c90 78 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  xt term. */.    
11ca0 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
11cb0 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e 4b 65  t32(a, iOff, nKe
11cc0 65 70 29 3b 0a 20 20 7d 0a 0a 20 73 65 61 72 63  ep);.  }.. searc
11cd0 68 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  h_failed:.  if( 
11ce0 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74  bGe==0 ){.    ft
11cf0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
11d00 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
11d10 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
11d20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  0;.    return;. 
11d30 20 7d 65 6c 73 65 20 69 66 28 20 62 45 6e 64 4f   }else if( bEndO
11d40 66 50 61 67 65 20 29 7b 0a 20 20 20 20 64 6f 20  fPage ){.    do 
11d50 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
11d60 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
11d70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Iter);.      if(
11d80 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
11d90 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
11da0 20 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61   a = pIter->pLea
11db0 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69 66 28 20  f->p;.      if( 
11dc0 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65  fts5LeafIsTermle
11dd0 73 73 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  ss(pIter->pLeaf)
11de0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
11df0 50 67 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70  Pgidx = pIter->p
11e00 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20  Leaf->szLeaf;.  
11e10 20 20 20 20 20 20 69 50 67 69 64 78 20 2b 3d 20        iPgidx += 
11e20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
11e30 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70  &pIter->pLeaf->p
11e40 5b 69 50 67 69 64 78 5d 2c 20 69 4f 66 66 29 3b  [iPgidx], iOff);
11e50 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66  .        if( iOf
11e60 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 70 49 74  f<4 || iOff>=pIt
11e70 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  er->pLeaf->szLea
11e80 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  f ){.          p
11e90 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
11ea0 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72  UPT;.          r
11eb0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
11ec0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
11ed0 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20 20 20  nKeep = 0;.     
11ee0 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20 3d 20       iTermOff = 
11ef0 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20  iOff;.          
11f00 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  n = pIter->pLeaf
11f10 2d 3e 6e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  ->nn;.          
11f20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
11f30 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
11f40 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , nNew);.       
11f50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
11f60 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11f70 7d 77 68 69 6c 65 28 20 31 20 29 3b 0a 20 20 7d  }while( 1 );.  }
11f80 0a 0a 20 73 65 61 72 63 68 5f 73 75 63 63 65 73  .. search_succes
11f90 73 3a 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  s:.  pIter->iLea
11fa0 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 20 2b  fOffset = iOff +
11fb0 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70 49 74   nNew;.  if( pIt
11fc0 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3e  er->iLeafOffset>
11fd0 6e 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  n ){.    p->rc =
11fe0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
11ff0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
12000 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
12010 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d  fOffset = pIter-
12020 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
12030 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
12040 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c  Pgno = pIter->iL
12050 65 61 66 50 67 6e 6f 3b 0a 0a 20 20 66 74 73 35  eafPgno;..  fts5
12060 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
12070 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
12080 6e 4b 65 65 70 2c 20 70 54 65 72 6d 29 3b 0a 20  nKeep, pTerm);. 
12090 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
120a0 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
120b0 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77  Iter->term, nNew
120c0 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 0a 20 20  , &a[iOff]);..  
120d0 69 66 28 20 69 50 67 69 64 78 3e 3d 6e 20 29 7b  if( iPgidx>=n ){
120e0 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64  .    pIter->iEnd
120f0 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 49 74 65  ofDoclist = pIte
12100 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a  r->pLeaf->nn+1;.
12110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
12120 20 6e 45 78 74 72 61 3b 0a 20 20 20 20 69 50 67   nExtra;.    iPg
12130 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61  idx += fts5GetVa
12140 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78  rint32(&a[iPgidx
12150 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  ], nExtra);.    
12160 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
12170 6c 69 73 74 20 3d 20 69 54 65 72 6d 4f 66 66 20  list = iTermOff 
12180 2b 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 20 20  + nExtra;.  }.  
12190 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
121a0 20 3d 20 69 50 67 69 64 78 3b 0a 0a 20 20 66 74   = iPgidx;..  ft
121b0 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77  s5SegIterLoadRow
121c0 69 64 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  id(p, pIter);.  
121d0 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
121e0 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d  Pos(p, pIter);.}
121f0 0a 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  ..static sqlite3
12200 5f 73 74 6d 74 20 2a 66 74 73 35 49 64 78 53 65  _stmt *fts5IdxSe
12210 6c 65 63 74 53 74 6d 74 28 46 74 73 35 49 6e 64  lectStmt(Fts5Ind
12220 65 78 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  ex *p){.  if( p-
12230 3e 70 49 64 78 53 65 6c 65 63 74 3d 3d 30 20 29  >pIdxSelect==0 )
12240 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  {.    Fts5Config
12250 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
12260 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35  Config;.    fts5
12270 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74  IndexPrepareStmt
12280 28 70 2c 20 26 70 2d 3e 70 49 64 78 53 65 6c 65  (p, &p->pIdxSele
12290 63 74 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  ct, sqlite3_mpri
122a0 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
122b0 53 45 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d  SELECT pgno FROM
122c0 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27 20 57   '%q'.'%q_idx' W
122d0 48 45 52 45 20 22 0a 20 20 20 20 20 20 20 20 20  HERE ".         
122e0 20 22 73 65 67 69 64 3d 3f 20 41 4e 44 20 74 65   "segid=? AND te
122f0 72 6d 3c 3d 3f 20 4f 52 44 45 52 20 42 59 20 74  rm<=? ORDER BY t
12300 65 72 6d 20 44 45 53 43 20 4c 49 4d 49 54 20 31  erm DESC LIMIT 1
12310 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ",.          pCo
12320 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66  nfig->zDb, pConf
12330 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29  ig->zName.    ))
12340 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
12350 2d 3e 70 49 64 78 53 65 6c 65 63 74 3b 0a 7d 0a  ->pIdxSelect;.}.
12360 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
12370 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70 49 74  e the object pIt
12380 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  er to point to t
12390 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20  erm pTerm/nTerm 
123a0 77 69 74 68 69 6e 20 73 65 67 6d 65 6e 74 0a 2a  within segment.*
123b0 2a 20 70 53 65 67 2e 20 49 66 20 74 68 65 72 65  * pSeg. If there
123c0 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d   is no such term
123d0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 74   in the index, t
123e0 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 73  he iterator is s
123f0 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  et to EOF..**.**
12400 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
12410 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72  urs, Fts5Index.r
12420 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61  c is set to an a
12430 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
12440 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e   code. If .** an
12450 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
12460 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
12470 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
12480 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
12490 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
124a0 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
124b0 74 65 72 53 65 65 6b 49 6e 69 74 28 0a 20 20 46  terSeekInit(.  F
124c0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
124d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
124e0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a  * FTS5 backend *
124f0 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
12500 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20  erm, int nTerm, 
12510 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
12520 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  eek to */.  int 
12530 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
12540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
12550 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58  ask of FTS5INDEX
12560 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
12570 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
12580 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20  ment *pSeg,     
12590 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
125a0 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46  f segment */.  F
125b0 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
125c0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r              /
125d0 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75  * Object to popu
125e0 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  late */.){.  int
125f0 20 69 50 67 20 3d 20 31 3b 0a 20 20 69 6e 74 20   iPg = 1;.  int 
12600 62 47 65 20 3d 20 28 66 6c 61 67 73 20 26 20 46  bGe = (flags & F
12610 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
12620 43 41 4e 29 3b 0a 20 20 69 6e 74 20 62 44 6c 69  CAN);.  int bDli
12630 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  dx = 0;         
12640 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
12650 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64 6f  if there is a do
12660 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 20  clist-index */. 
12670 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
12680 49 64 78 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a  IdxSelect = 0;..
12690 20 20 61 73 73 65 72 74 28 20 62 47 65 3d 3d 30    assert( bGe==0
126a0 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53   || (flags & FTS
126b0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
126c0 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  C)==0 );.  asser
126d0 74 28 20 70 54 65 72 6d 20 26 26 20 6e 54 65 72  t( pTerm && nTer
126e0 6d 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  m );.  memset(pI
126f0 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
12700 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72  pIter));.  pIter
12710 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 0a  ->pSeg = pSeg;..
12720 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
12730 73 65 74 73 20 73 74 61 63 6b 20 76 61 72 69 61  sets stack varia
12740 62 6c 65 20 69 50 67 20 74 6f 20 74 68 65 20 6c  ble iPg to the l
12750 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
12760 74 68 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63 6f  that may.  ** co
12770 6e 74 61 69 6e 20 74 65 72 6d 20 28 70 54 65 72  ntain term (pTer
12780 6d 2f 6e 54 65 72 6d 29 2c 20 69 66 20 69 74 20  m/nTerm), if it 
12790 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  is present in th
127a0 65 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20  e segment. */.  
127b0 70 49 64 78 53 65 6c 65 63 74 20 3d 20 66 74 73  pIdxSelect = fts
127c0 35 49 64 78 53 65 6c 65 63 74 53 74 6d 74 28 70  5IdxSelectStmt(p
127d0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29  );.  if( p->rc )
127e0 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
127f0 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 49 64 78  e3_bind_int(pIdx
12800 53 65 6c 65 63 74 2c 20 31 2c 20 70 53 65 67 2d  Select, 1, pSeg-
12810 3e 69 53 65 67 69 64 29 3b 0a 20 20 73 71 6c 69  >iSegid);.  sqli
12820 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 49  te3_bind_blob(pI
12830 64 78 53 65 6c 65 63 74 2c 20 32 2c 20 70 54 65  dxSelect, 2, pTe
12840 72 6d 2c 20 6e 54 65 72 6d 2c 20 53 51 4c 49 54  rm, nTerm, SQLIT
12850 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28  E_STATIC);.  if(
12860 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
12870 69 74 65 33 5f 73 74 65 70 28 70 49 64 78 53 65  ite3_step(pIdxSe
12880 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 36 34  lect) ){.    i64
12890 20 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63   val = sqlite3_c
128a0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 49 64 78 53 65  olumn_int(pIdxSe
128b0 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 50  lect, 0);.    iP
128c0 67 20 3d 20 28 69 6e 74 29 28 76 61 6c 3e 3e 31  g = (int)(val>>1
128d0 29 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20  );.    bDlidx = 
128e0 28 76 61 6c 20 26 20 30 78 30 30 30 31 29 3b 0a  (val & 0x0001);.
128f0 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71    }.  p->rc = sq
12900 6c 69 74 65 33 5f 72 65 73 65 74 28 70 49 64 78  lite3_reset(pIdx
12910 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74  Select);.  sqlit
12920 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 49 64  e3_bind_null(pId
12930 78 53 65 6c 65 63 74 2c 20 32 29 3b 0a 0a 20 20  xSelect, 2);..  
12940 69 66 28 20 69 50 67 3c 70 53 65 67 2d 3e 70 67  if( iPg<pSeg->pg
12950 6e 6f 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69  noFirst ){.    i
12960 50 67 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46  Pg = pSeg->pgnoF
12970 69 72 73 74 3b 0a 20 20 20 20 62 44 6c 69 64 78  irst;.    bDlidx
12980 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 49 74   = 0;.  }..  pIt
12990 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  er->iLeafPgno = 
129a0 69 50 67 20 2d 20 31 3b 0a 20 20 66 74 73 35 53  iPg - 1;.  fts5S
129b0 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70  egIterNextPage(p
129c0 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 69 66 28  , pIter);..  if(
129d0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b   pIter->pLeaf ){
129e0 0a 20 20 20 20 66 74 73 35 4c 65 61 66 53 65 65  .    fts5LeafSee
129f0 6b 28 70 2c 20 62 47 65 2c 20 70 49 74 65 72 2c  k(p, bGe, pIter,
12a00 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   pTerm, nTerm);.
12a10 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
12a20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
12a30 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 74  Ge==0 ){.    pIt
12a40 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53  er->flags |= FTS
12a50 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
12a60 4d 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  M;.    if( pIter
12a70 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ->pLeaf ){.     
12a80 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53   if( flags & FTS
12a90 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
12aa0 43 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  C ){.        pIt
12ab0 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53  er->flags |= FTS
12ac0 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
12ad0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  E;.      }.     
12ae0 20 69 66 28 20 62 44 6c 69 64 78 20 29 7b 0a 20   if( bDlidx ){. 
12af0 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
12b00 65 72 4c 6f 61 64 44 6c 69 64 78 28 70 2c 20 70  erLoadDlidx(p, p
12b10 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
12b20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26       if( flags &
12b30 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
12b40 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20  _DESC ){.       
12b50 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
12b60 72 73 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  rse(p, pIter);. 
12b70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
12b80 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 53  ..  fts5SegIterS
12b90 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29  etNext(p, pIter)
12ba0 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 3a 0a  ;..  /* Either:.
12bb0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 29 20 61    **.  **   1) a
12bc0 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
12bd0 72 72 65 64 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  rred, or.  **   
12be0 32 29 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  2) the iterator 
12bf0 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46 2c 20 6f  points to EOF, o
12c00 72 0a 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20  r.  **   3) the 
12c10 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20  iterator points 
12c20 74 6f 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68  to an entry with
12c30 20 74 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65   term (pTerm/nTe
12c40 72 6d 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 34  rm), or.  **   4
12c50 29 20 74 68 65 20 46 54 53 35 49 4e 44 45 58 5f  ) the FTS5INDEX_
12c60 51 55 45 52 59 5f 53 43 41 4e 20 66 6c 61 67 20  QUERY_SCAN flag 
12c70 77 61 73 20 73 65 74 20 61 6e 64 20 74 68 65 20  was set and the 
12c80 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 0a  iterator points.
12c90 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 61 6e 20    **      to an 
12ca0 65 6e 74 72 79 20 77 69 74 68 20 61 20 74 65 72  entry with a ter
12cb0 6d 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  m greater than o
12cc0 72 20 65 71 75 61 6c 20 74 6f 20 28 70 54 65 72  r equal to (pTer
12cd0 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20 2a 2f 0a 20  m/nTerm)..  */. 
12ce0 20 61 73 73 65 72 74 5f 6e 63 28 20 70 2d 3e 72   assert_nc( p->r
12cf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20  c!=SQLITE_OK    
12d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 7c 7c     /* 1 */.   ||
12d30 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12d70 2a 20 32 20 2a 2f 0a 20 20 20 7c 7c 20 66 74 73  * 2 */.   || fts
12d80 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c  5BufferCompareBl
12d90 6f 62 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  ob(&pIter->term,
12da0 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3d 3d   pTerm, nTerm)==
12db0 30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20  0          /* 3 
12dc0 2a 2f 0a 20 20 20 7c 7c 20 28 62 47 65 20 26 26  */.   || (bGe &&
12dd0 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61   fts5BufferCompa
12de0 72 65 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e 74  reBlob(&pIter->t
12df0 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  erm, pTerm, nTer
12e00 6d 29 3e 30 29 20 20 2f 2a 20 34 20 2a 2f 0a 20  m)>0)  /* 4 */. 
12e10 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   );.}../*.** Ini
12e20 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65  tialize the obje
12e30 63 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e  ct pIter to poin
12e40 74 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f  t to term pTerm/
12e50 6e 54 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65  nTerm within the
12e60 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  .** in-memory ha
12e70 73 68 20 74 61 62 6c 65 2e 20 49 66 20 74 68 65  sh table. If the
12e80 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65  re is no such te
12e90 72 6d 20 69 6e 20 74 68 65 20 68 61 73 68 2d 74  rm in the hash-t
12ea0 61 62 6c 65 2c 20 74 68 65 20 0a 2a 2a 20 69 74  able, the .** it
12eb0 65 72 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f  erator is set to
12ec0 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61   EOF..**.** If a
12ed0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
12ee0 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20  Fts5Index.rc is 
12ef0 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70  set to an approp
12f00 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
12f10 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f  . If .** an erro
12f20 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
12f30 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
12f40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
12f50 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
12f60 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
12f70 69 64 20 66 74 73 35 53 65 67 49 74 65 72 48 61  id fts5SegIterHa
12f80 73 68 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e  shInit(.  Fts5In
12f90 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
12fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
12fb0 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63  5 backend */.  c
12fc0 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20  onst u8 *pTerm, 
12fd0 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f  int nTerm,     /
12fe0 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74  * Term to seek t
12ff0 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  o */.  int flags
13000 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13010 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
13020 66 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20  f FTS5INDEX_XXX 
13030 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53  flags */.  Fts5S
13040 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  egIter *pIter   
13050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
13060 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ject to populate
13070 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
13080 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20  8 *pList = 0;.  
13090 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20  int nList = 0;. 
130a0 20 63 6f 6e 73 74 20 75 38 20 2a 7a 20 3d 20 30   const u8 *z = 0
130b0 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a  ;.  int n = 0;..
130c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61    assert( p->pHa
130d0 73 68 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  sh );.  assert( 
130e0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
130f0 20 29 3b 0a 0a 20 20 69 66 28 20 70 54 65 72 6d   );..  if( pTerm
13100 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
13110 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
13120 53 43 41 4e 29 20 29 7b 0a 20 20 20 20 70 2d 3e  SCAN) ){.    p->
13130 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
13140 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70 2d 3e  HashScanInit(p->
13150 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68  pHash, (const ch
13160 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d  ar*)pTerm, nTerm
13170 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
13180 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28  s5HashScanEntry(
13190 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74  p->pHash, (const
131a0 20 63 68 61 72 2a 2a 29 26 7a 2c 20 26 70 4c 69   char**)&z, &pLi
131b0 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20  st, &nList);.   
131c0 20 6e 20 3d 20 28 7a 20 3f 20 28 69 6e 74 29 73   n = (z ? (int)s
131d0 74 72 6c 65 6e 28 28 63 6f 6e 73 74 20 63 68 61  trlen((const cha
131e0 72 2a 29 7a 29 20 3a 20 30 29 3b 0a 20 20 7d 65  r*)z) : 0);.  }e
131f0 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  lse{.    pIter->
13200 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
13210 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20  GITER_ONETERM;. 
13220 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
13230 73 68 51 75 65 72 79 28 70 2d 3e 70 48 61 73 68  shQuery(p->pHash
13240 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  , (const char*)p
13250 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 70 4c  Term, nTerm, &pL
13260 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20  ist, &nList);.  
13270 20 20 7a 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20    z = pTerm;.   
13280 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 7d 0a   n = nTerm;.  }.
13290 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
132a0 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c      Fts5Data *pL
132b0 65 61 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eaf;.    sqlite3
132c0 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  Fts5BufferSet(&p
132d0 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65  ->rc, &pIter->te
132e0 72 6d 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 70  rm, n, z);.    p
132f0 4c 65 61 66 20 3d 20 66 74 73 35 49 64 78 4d 61  Leaf = fts5IdxMa
13300 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46  lloc(p, sizeof(F
13310 74 73 35 44 61 74 61 29 29 3b 0a 20 20 20 20 69  ts5Data));.    i
13320 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 72 65  f( pLeaf==0 ) re
13330 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 61 66 2d  turn;.    pLeaf-
13340 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b  >p = (u8*)pList;
13350 0a 20 20 20 20 70 4c 65 61 66 2d 3e 6e 6e 20 3d  .    pLeaf->nn =
13360 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d   pLeaf->szLeaf =
13370 20 6e 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65   nList;.    pIte
13380 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 65 61 66  r->pLeaf = pLeaf
13390 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
133a0 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47  afOffset = fts5G
133b0 65 74 56 61 72 69 6e 74 28 70 4c 65 61 66 2d 3e  etVarint(pLeaf->
133c0 70 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  p, (u64*)&pIter-
133d0 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 49  >iRowid);.    pI
133e0 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
133f0 73 74 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e 3b 0a  st = pLeaf->nn;.
13400 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
13410 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
13420 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 70  _DESC ){.      p
13430 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46  Iter->flags |= F
13440 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
13450 52 53 45 3b 0a 20 20 20 20 20 20 66 74 73 35 53  RSE;.      fts5S
13460 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69  egIterReverseIni
13470 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
13480 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13490 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
134a0 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
134b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74  .    }.  }..  ft
134c0 73 35 53 65 67 49 74 65 72 53 65 74 4e 65 78 74  s5SegIterSetNext
134d0 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f  (p, pIter);.}../
134e0 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20 69 74  *.** Zero the it
134f0 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
13500 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
13510 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
13520 69 64 20 66 74 73 35 53 65 67 49 74 65 72 43 6c  id fts5SegIterCl
13530 65 61 72 28 46 74 73 35 53 65 67 49 74 65 72 20  ear(Fts5SegIter 
13540 2a 70 49 74 65 72 29 7b 0a 20 20 66 74 73 35 42  *pIter){.  fts5B
13550 75 66 66 65 72 46 72 65 65 28 26 70 49 74 65 72  ufferFree(&pIter
13560 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 44  ->term);.  fts5D
13570 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
13580 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 66 74 73 35  ->pLeaf);.  fts5
13590 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
135a0 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20  r->pNextLeaf);. 
135b0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
135c0 65 65 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78  ee(pIter->pDlidx
135d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
135e0 65 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f  e(pIter->aRowidO
135f0 66 66 73 65 74 29 3b 0a 20 20 6d 65 6d 73 65 74  ffset);.  memset
13600 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
13610 66 28 46 74 73 35 53 65 67 49 74 65 72 29 29 3b  f(Fts5SegIter));
13620 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
13630 45 5f 44 45 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54  E_DEBUG../*.** T
13640 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
13650 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
13660 74 68 65 20 62 69 67 20 61 73 73 65 72 74 28 29  the big assert()
13670 20 70 72 6f 63 65 64 75 72 65 20 69 6d 70 6c 65   procedure imple
13680 6d 65 6e 74 65 64 20 62 79 0a 2a 2a 20 66 74 73  mented by.** fts
13690 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
136a0 53 65 74 75 70 28 29 2e 20 49 74 20 65 6e 73 75  Setup(). It ensu
136b0 72 65 73 20 74 68 61 74 20 74 68 65 20 72 65 73  res that the res
136c0 75 6c 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74  ult currently st
136d0 6f 72 65 64 0a 2a 2a 20 69 6e 20 2a 70 52 65 73  ored.** in *pRes
136e0 20 69 73 20 74 68 65 20 63 6f 72 72 65 63 74 20   is the correct 
136f0 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  result of compar
13700 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
13710 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 74 68 65  positions of the
13720 0a 2a 2a 20 74 77 6f 20 69 74 65 72 61 74 6f 72  .** two iterator
13730 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
13740 64 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70  d fts5AssertComp
13750 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 0a 20 20  arisonResult(.  
13760 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c  Fts5Iter *pIter,
13770 20 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20   .  Fts5SegIter 
13780 2a 70 31 2c 0a 20 20 46 74 73 35 53 65 67 49 74  *p1,.  Fts5SegIt
13790 65 72 20 2a 70 32 2c 0a 20 20 46 74 73 35 43 52  er *p2,.  Fts5CR
137a0 65 73 75 6c 74 20 2a 70 52 65 73 0a 29 7b 0a 20  esult *pRes.){. 
137b0 20 69 6e 74 20 69 31 20 3d 20 70 31 20 2d 20 70   int i1 = p1 - p
137c0 49 74 65 72 2d 3e 61 53 65 67 3b 0a 20 20 69 6e  Iter->aSeg;.  in
137d0 74 20 69 32 20 3d 20 70 32 20 2d 20 70 49 74 65  t i2 = p2 - pIte
137e0 72 2d 3e 61 53 65 67 3b 0a 0a 20 20 69 66 28 20  r->aSeg;..  if( 
137f0 70 31 2d 3e 70 4c 65 61 66 20 7c 7c 20 70 32 2d  p1->pLeaf || p2-
13800 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 69 66  >pLeaf ){.    if
13810 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  ( p1->pLeaf==0 )
13820 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
13830 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32  pRes->iFirst==i2
13840 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
13850 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  ( p2->pLeaf==0 )
13860 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
13870 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31  pRes->iFirst==i1
13880 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
13890 20 20 20 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20       int nMin = 
138a0 4d 49 4e 28 70 31 2d 3e 74 65 72 6d 2e 6e 2c 20  MIN(p1->term.n, 
138b0 70 32 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20  p2->term.n);.   
138c0 20 20 20 69 6e 74 20 72 65 73 20 3d 20 66 74 73     int res = fts
138d0 35 4d 65 6d 63 6d 70 28 70 31 2d 3e 74 65 72 6d  5Memcmp(p1->term
138e0 2e 70 2c 20 70 32 2d 3e 74 65 72 6d 2e 70 2c 20  .p, p2->term.p, 
138f0 6e 4d 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  nMin);.      if(
13900 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20   res==0 ) res = 
13910 70 31 2d 3e 74 65 72 6d 2e 6e 20 2d 20 70 32 2d  p1->term.n - p2-
13920 3e 74 65 72 6d 2e 6e 3b 0a 0a 20 20 20 20 20 20  >term.n;..      
13930 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
13940 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
13950 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 31 20 29  es->bTermEq==1 )
13960 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
13970 28 20 70 31 2d 3e 69 52 6f 77 69 64 21 3d 70 32  ( p1->iRowid!=p2
13980 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  ->iRowid );.    
13990 20 20 20 20 72 65 73 20 3d 20 28 28 70 31 2d 3e      res = ((p1->
139a0 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f  iRowid > p2->iRo
139b0 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65  wid)==pIter->bRe
139c0 76 29 20 3f 20 2d 31 20 3a 20 31 3b 0a 20 20 20  v) ? -1 : 1;.   
139d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
139e0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
139f0 62 54 65 72 6d 45 71 3d 3d 30 20 29 3b 0a 20 20  bTermEq==0 );.  
13a00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
13a10 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20   res<0 ){.      
13a20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
13a30 69 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20  iFirst==i1 );.  
13a40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13a50 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
13a60 3e 69 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a 20  >iFirst==i2 );. 
13a70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
13a80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
13a90 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
13aa0 6f 70 20 75 6e 6c 65 73 73 20 53 51 4c 49 54 45  op unless SQLITE
13ab0 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  _DEBUG is define
13ac0 64 20 77 68 65 6e 20 74 68 69 73 20 6d 6f 64 75  d when this modu
13ad0 6c 65 0a 2a 2a 20 69 73 20 63 6f 6d 70 69 6c 65  le.** is compile
13ae0 64 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  d. In that case,
13af0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
13b00 73 20 65 73 73 65 6e 74 69 61 6c 6c 79 20 61 6e  s essentially an
13b10 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74   assert() .** st
13b20 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20  atement used to 
13b30 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
13b40 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
13b50 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 5d 20  pIter->aFirst[] 
13b60 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 63 6f 72  array.** are cor
13b70 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rect..*/.static 
13b80 76 6f 69 64 20 66 74 73 35 41 73 73 65 72 74 4d  void fts5AssertM
13b90 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 46 74  ultiIterSetup(Ft
13ba0 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
13bb0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
13bc0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
13bd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35  E_OK ){.    Fts5
13be0 53 65 67 49 74 65 72 20 2a 70 46 69 72 73 74 20  SegIter *pFirst 
13bf0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  = &pIter->aSeg[ 
13c00 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
13c10 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 69  .iFirst ];.    i
13c20 6e 74 20 69 3b 0a 0a 20 20 20 20 61 73 73 65 72  nt i;..    asser
13c30 74 28 20 28 70 46 69 72 73 74 2d 3e 70 4c 65 61  t( (pFirst->pLea
13c40 66 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62 61  f==0)==pIter->ba
13c50 73 65 2e 62 45 6f 66 20 29 3b 0a 0a 20 20 20 20  se.bEof );..    
13c60 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 70 49  /* Check that pI
13c70 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
13c80 64 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74  d is set correct
13c90 6c 79 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ly. */.    for(i
13ca0 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65  =0; i<pIter->nSe
13cb0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46  g; i++){.      F
13cc0 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d  ts5SegIter *p1 =
13cd0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d   &pIter->aSeg[i]
13ce0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13cf0 70 31 3d 3d 70 46 69 72 73 74 20 0a 20 20 20 20  p1==pFirst .    
13d00 20 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e 70 4c         || p1->pL
13d10 65 61 66 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  eaf==0 .        
13d20 20 20 20 7c 7c 20 66 74 73 35 42 75 66 66 65 72     || fts5Buffer
13d30 43 6f 6d 70 61 72 65 28 26 70 46 69 72 73 74 2d  Compare(&pFirst-
13d40 3e 74 65 72 6d 2c 20 26 70 31 2d 3e 74 65 72 6d  >term, &p1->term
13d50 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
13d60 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 49 74   p1->iRowid==pIt
13d70 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
13d80 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
13d90 70 31 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65 72  p1->iRowid<pIter
13da0 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d  ->iSwitchRowid)=
13db0 3d 70 49 74 65 72 2d 3e 62 52 65 76 0a 20 20 20  =pIter->bRev.   
13dc0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
13dd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
13de0 72 2d 3e 6e 53 65 67 3b 20 69 2b 3d 32 29 7b 0a  r->nSeg; i+=2){.
13df0 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
13e00 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e  r *p1 = &pIter->
13e10 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20 46  aSeg[i];.      F
13e20 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d  ts5SegIter *p2 =
13e30 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 2b   &pIter->aSeg[i+
13e40 31 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 43 52  1];.      Fts5CR
13e50 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70  esult *pRes = &p
13e60 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 28 70 49  Iter->aFirst[(pI
13e70 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69 29 20 2f  ter->nSeg + i) /
13e80 20 32 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 41   2];.      fts5A
13e90 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52  ssertComparisonR
13ea0 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31 2c  esult(pIter, p1,
13eb0 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20 20   p2, pRes);.    
13ec0 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  }..    for(i=1; 
13ed0 69 3c 28 70 49 74 65 72 2d 3e 6e 53 65 67 20 2f  i<(pIter->nSeg /
13ee0 20 32 29 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20   2); i+=2){.    
13ef0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
13f00 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  1 = &pIter->aSeg
13f10 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
13f20 69 2a 32 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  i*2].iFirst ];. 
13f30 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72       Fts5SegIter
13f40 20 2a 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61   *p2 = &pIter->a
13f50 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
13f60 73 74 5b 69 2a 32 2b 31 5d 2e 69 46 69 72 73 74  st[i*2+1].iFirst
13f70 20 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 43 52   ];.      Fts5CR
13f80 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70  esult *pRes = &p
13f90 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d 3b  Iter->aFirst[i];
13fa0 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65 72  .      fts5Asser
13fb0 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c  tComparisonResul
13fc0 74 28 70 49 74 65 72 2c 20 70 31 2c 20 70 32 2c  t(pIter, p1, p2,
13fd0 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20   pRes);.    }.  
13fe0 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
13ff0 6e 65 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c  ne fts5AssertMul
14000 74 69 49 74 65 72 53 65 74 75 70 28 78 2c 79 29  tiIterSetup(x,y)
14010 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
14020 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
14030 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 70 6f   necessary to po
14040 70 75 6c 61 74 65 20 70 49 74 65 72 2d 3e 61 46  pulate pIter->aF
14050 69 72 73 74 5b 69 4f 75 74 5d 2e 0a 2a 2a 0a 2a  irst[iOut]..**.*
14060 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65  * If the returne
14070 64 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a  d value is non-z
14080 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ero, then it is 
14090 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 6e 20  the index of an 
140a0 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 74 68 65 20  entry.** in the 
140b0 70 49 74 65 72 2d 3e 61 53 65 67 5b 5d 20 61 72  pIter->aSeg[] ar
140c0 72 61 79 20 74 68 61 74 20 69 73 20 28 61 29 20  ray that is (a) 
140d0 6e 6f 74 20 61 74 20 45 4f 46 2c 20 61 6e 64 20  not at EOF, and 
140e0 28 62 29 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  (b) pointing.** 
140f0 74 6f 20 61 20 6b 65 79 20 74 68 61 74 20 69 73  to a key that is
14100 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
14110 61 6e 6f 74 68 65 72 2c 20 68 69 67 68 65 72 20  another, higher 
14120 70 72 69 6f 72 69 74 79 2c 20 0a 2a 2a 20 73 65  priority, .** se
14130 67 6d 65 6e 74 2d 69 74 65 72 61 74 6f 72 20 69  gment-iterator i
14140 6e 20 74 68 65 20 70 53 65 67 2d 3e 61 53 65 67  n the pSeg->aSeg
14150 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
14160 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74  tic int fts5Mult
14170 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 46  iIterDoCompare(F
14180 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20  ts5Iter *pIter, 
14190 69 6e 74 20 69 4f 75 74 29 7b 0a 20 20 69 6e 74  int iOut){.  int
141a0 20 69 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   i1;            
141b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
141c0 49 6e 64 65 78 20 6f 66 20 6c 65 66 74 2d 68 61  Index of left-ha
141d0 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  nd Fts5SegIter *
141e0 2f 0a 20 20 69 6e 74 20 69 32 3b 20 20 20 20 20  /.  int i2;     
141f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14200 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
14210 72 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35 53  right-hand Fts5S
14220 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  egIter */.  int 
14230 69 52 65 73 3b 0a 20 20 46 74 73 35 53 65 67 49  iRes;.  Fts5SegI
14240 74 65 72 20 2a 70 31 3b 20 20 20 20 20 20 20 20  ter *p1;        
14250 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d          /* Left-
14260 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72  hand Fts5SegIter
14270 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
14280 72 20 2a 70 32 3b 20 20 20 20 20 20 20 20 20 20  r *p2;          
14290 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 68        /* Right-h
142a0 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20  and Fts5SegIter 
142b0 2a 2f 0a 20 20 46 74 73 35 43 52 65 73 75 6c 74  */.  Fts5CResult
142c0 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d   *pRes = &pIter-
142d0 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 3b 0a 0a  >aFirst[iOut];..
142e0 20 20 61 73 73 65 72 74 28 20 69 4f 75 74 3c 70    assert( iOut<p
142f0 49 74 65 72 2d 3e 6e 53 65 67 20 26 26 20 69 4f  Iter->nSeg && iO
14300 75 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ut>0 );.  assert
14310 28 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30  ( pIter->bRev==0
14320 20 7c 7c 20 70 49 74 65 72 2d 3e 62 52 65 76 3d   || pIter->bRev=
14330 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20 69 4f 75  =1 );..  if( iOu
14340 74 3e 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2f  t>=(pIter->nSeg/
14350 32 29 20 29 7b 0a 20 20 20 20 69 31 20 3d 20 28  2) ){.    i1 = (
14360 69 4f 75 74 20 2d 20 70 49 74 65 72 2d 3e 6e 53  iOut - pIter->nS
14370 65 67 2f 32 29 20 2a 20 32 3b 0a 20 20 20 20 69  eg/2) * 2;.    i
14380 32 20 3d 20 69 31 20 2b 20 31 3b 0a 20 20 7d 65  2 = i1 + 1;.  }e
14390 6c 73 65 7b 0a 20 20 20 20 69 31 20 3d 20 70 49  lse{.    i1 = pI
143a0 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74  ter->aFirst[iOut
143b0 2a 32 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20 20  *2].iFirst;.    
143c0 69 32 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72  i2 = pIter->aFir
143d0 73 74 5b 69 4f 75 74 2a 32 2b 31 5d 2e 69 46 69  st[iOut*2+1].iFi
143e0 72 73 74 3b 0a 20 20 7d 0a 20 20 70 31 20 3d 20  rst;.  }.  p1 = 
143f0 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 31 5d  &pIter->aSeg[i1]
14400 3b 0a 20 20 70 32 20 3d 20 26 70 49 74 65 72 2d  ;.  p2 = &pIter-
14410 3e 61 53 65 67 5b 69 32 5d 3b 0a 0a 20 20 70 52  >aSeg[i2];..  pR
14420 65 73 2d 3e 62 54 65 72 6d 45 71 20 3d 20 30 3b  es->bTermEq = 0;
14430 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66  .  if( p1->pLeaf
14440 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
14450 20 2f 2a 20 49 66 20 70 31 20 69 73 20 61 74 20   /* If p1 is at 
14460 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73 20  EOF */.    iRes 
14470 3d 20 69 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  = i2;.  }else if
14480 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  ( p2->pLeaf==0 )
14490 7b 20 20 20 20 20 2f 2a 20 49 66 20 70 32 20 69  {     /* If p2 i
144a0 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20  s at EOF */.    
144b0 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 7d 65 6c  iRes = i1;.  }el
144c0 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 20  se{.    int res 
144d0 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  = fts5BufferComp
144e0 61 72 65 28 26 70 31 2d 3e 74 65 72 6d 2c 20 26  are(&p1->term, &
144f0 70 32 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20 69  p2->term);.    i
14500 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
14510 20 20 20 61 73 73 65 72 74 28 20 69 32 3e 69 31     assert( i2>i1
14520 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14530 28 20 69 32 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( i2!=0 );.     
14540 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 3d   pRes->bTermEq =
14550 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 31   1;.      if( p1
14560 2d 3e 69 52 6f 77 69 64 3d 3d 70 32 2d 3e 69 52  ->iRowid==p2->iR
14570 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
14580 70 31 2d 3e 62 44 65 6c 20 3d 20 70 32 2d 3e 62  p1->bDel = p2->b
14590 44 65 6c 3b 0a 20 20 20 20 20 20 20 20 72 65 74  Del;.        ret
145a0 75 72 6e 20 69 32 3b 0a 20 20 20 20 20 20 7d 0a  urn i2;.      }.
145b0 20 20 20 20 20 20 72 65 73 20 3d 20 28 28 70 31        res = ((p1
145c0 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69  ->iRowid > p2->i
145d0 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62  Rowid)==pIter->b
145e0 52 65 76 29 20 3f 20 2d 31 20 3a 20 2b 31 3b 0a  Rev) ? -1 : +1;.
145f0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
14600 28 20 72 65 73 21 3d 30 20 29 3b 0a 20 20 20 20  ( res!=0 );.    
14610 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20  if( res<0 ){.   
14620 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20     iRes = i1;.  
14630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
14640 52 65 73 20 3d 20 69 32 3b 0a 20 20 20 20 7d 0a  Res = i2;.    }.
14650 20 20 7d 0a 0a 20 20 70 52 65 73 2d 3e 69 46 69    }..  pRes->iFi
14660 72 73 74 20 3d 20 28 75 31 36 29 69 52 65 73 3b  rst = (u16)iRes;
14670 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
14680 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 73  /*.** Move the s
14690 65 67 2d 69 74 65 72 20 73 6f 20 74 68 61 74 20  eg-iter so that 
146a0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
146b0 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20   first rowid on 
146c0 70 61 67 65 20 69 4c 65 61 66 50 67 6e 6f 2e 0a  page iLeafPgno..
146d0 2a 2a 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f  ** It is an erro
146e0 72 20 69 66 20 6c 65 61 66 20 69 4c 65 61 66 50  r if leaf iLeafP
146f0 67 6e 6f 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  gno does not exi
14700 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 73 20 6e  st or contains n
14710 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61  o rowids..*/.sta
14720 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
14730 49 74 65 72 47 6f 74 6f 50 61 67 65 28 0a 20 20  IterGotoPage(.  
14740 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14760 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
14770 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
14780 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
14790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
147a0 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
147b0 63 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61  ce */.  int iLea
147c0 66 50 67 6e 6f 0a 29 7b 0a 20 20 61 73 73 65 72  fPgno.){.  asser
147d0 74 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74  t( iLeafPgno>pIt
147e0 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b  er->iLeafPgno );
147f0 0a 0a 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e  ..  if( iLeafPgn
14800 6f 3e 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 70  o>pIter->pSeg->p
14810 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70  gnoLast ){.    p
14820 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
14830 55 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  UPT;.  }else{.  
14840 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
14850 65 28 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65  e(pIter->pNextLe
14860 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  af);.    pIter->
14870 70 4e 65 78 74 4c 65 61 66 20 3d 20 30 3b 0a 20  pNextLeaf = 0;. 
14880 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50     pIter->iLeafP
14890 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2d  gno = iLeafPgno-
148a0 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  1;.    fts5SegIt
148b0 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49  erNextPage(p, pI
148c0 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
148d0 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
148e0 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 69 4c 65  OK || pIter->iLe
148f0 61 66 50 67 6e 6f 3d 3d 69 4c 65 61 66 50 67 6e  afPgno==iLeafPgn
14900 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d  o );..    if( p-
14910 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
14920 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66  {.      int iOff
14930 3b 0a 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20  ;.      u8 *a = 
14940 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
14950 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  .      int n = p
14960 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
14970 65 61 66 3b 0a 0a 20 20 20 20 20 20 69 4f 66 66  eaf;..      iOff
14980 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
14990 52 6f 77 69 64 4f 66 66 28 70 49 74 65 72 2d 3e  RowidOff(pIter->
149a0 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69 66  pLeaf);.      if
149b0 28 20 69 4f 66 66 3c 34 20 7c 7c 20 69 4f 66 66  ( iOff<4 || iOff
149c0 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  >=n ){.        p
149d0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
149e0 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  UPT;.      }else
149f0 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
14a00 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
14a10 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  &a[iOff], (u64*)
14a20 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
14a30 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
14a40 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
14a50 66 66 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  ff;.        fts5
14a60 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
14a70 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
14a80 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
14a90 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
14aa0 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
14ab0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
14ac0 61 72 67 75 6d 65 6e 74 20 75 6e 74 69 6c 20 69  argument until i
14ad0 74 20 69 73 20 61 74 20 6f 72 20 0a 2a 2a 20 70  t is at or .** p
14ae0 61 73 74 20 72 6f 77 69 64 20 69 46 72 6f 6d 2e  ast rowid iFrom.
14af0 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
14b00 68 65 20 76 61 6c 75 65 20 6f 66 20 69 46 72 6f  he value of iFro
14b10 6d 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  m, the iterator 
14b20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 61 64 76  is.** always adv
14b30 61 6e 63 65 64 20 61 74 20 6c 65 61 73 74 20 6f  anced at least o
14b40 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nce..*/.static v
14b50 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e  oid fts5SegIterN
14b60 65 78 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49  extFrom(.  Fts5I
14b70 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
14b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
14b90 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
14ba0 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
14bb0 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
14bc0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
14bd0 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f  or to advance */
14be0 0a 20 20 69 36 34 20 69 4d 61 74 63 68 20 20 20  .  i64 iMatch   
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c00 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 69 74     /* Advance it
14c10 65 72 61 74 6f 72 20 61 74 20 6c 65 61 73 74 20  erator at least 
14c20 74 68 69 73 20 66 61 72 20 2a 2f 0a 29 7b 0a 20  this far */.){. 
14c30 20 69 6e 74 20 62 52 65 76 20 3d 20 28 70 49 74   int bRev = (pIt
14c40 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
14c50 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
14c60 29 3b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74  );.  Fts5DlidxIt
14c70 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 70 49 74  er *pDlidx = pIt
14c80 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 69 6e  er->pDlidx;.  in
14c90 74 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49  t iLeafPgno = pI
14ca0 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a  ter->iLeafPgno;.
14cb0 20 20 69 6e 74 20 62 4d 6f 76 65 20 3d 20 31 3b    int bMove = 1;
14cc0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
14cd0 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
14ce0 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20  SEGITER_ONETERM 
14cf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
14d00 65 72 2d 3e 70 44 6c 69 64 78 20 29 3b 0a 20 20  er->pDlidx );.  
14d10 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
14d20 4c 65 61 66 20 29 3b 0a 0a 20 20 69 66 28 20 62  Leaf );..  if( b
14d30 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 77 68  Rev==0 ){.    wh
14d40 69 6c 65 28 20 21 66 74 73 35 44 6c 69 64 78 49  ile( !fts5DlidxI
14d50 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78  terEof(p, pDlidx
14d60 29 20 26 26 20 69 4d 61 74 63 68 3e 66 74 73 35  ) && iMatch>fts5
14d70 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70  DlidxIterRowid(p
14d80 44 6c 69 64 78 29 20 29 7b 0a 20 20 20 20 20 20  Dlidx) ){.      
14d90 69 4c 65 61 66 50 67 6e 6f 20 3d 20 66 74 73 35  iLeafPgno = fts5
14da0 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44  DlidxIterPgno(pD
14db0 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66 74 73  lidx);.      fts
14dc0 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70  5DlidxIterNext(p
14dd0 2c 20 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d  , pDlidx);.    }
14de0 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20  .    assert_nc( 
14df0 69 4c 65 61 66 50 67 6e 6f 3e 3d 70 49 74 65 72  iLeafPgno>=pIter
14e00 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 7c 7c 20 70  ->iLeafPgno || p
14e10 2d 3e 72 63 20 29 3b 0a 20 20 20 20 69 66 28 20  ->rc );.    if( 
14e20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d  iLeafPgno>pIter-
14e30 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  >iLeafPgno ){.  
14e40 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 47      fts5SegIterG
14e50 6f 74 6f 50 61 67 65 28 70 2c 20 70 49 74 65 72  otoPage(p, pIter
14e60 2c 20 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20  , iLeafPgno);.  
14e70 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20      bMove = 0;. 
14e80 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
14e90 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
14ea0 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b  >pNextLeaf==0 );
14eb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 4d 61  .    assert( iMa
14ec0 74 63 68 3c 70 49 74 65 72 2d 3e 69 52 6f 77 69  tch<pIter->iRowi
14ed0 64 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  d );.    while( 
14ee0 21 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f  !fts5DlidxIterEo
14ef0 66 28 70 2c 20 70 44 6c 69 64 78 29 20 26 26 20  f(p, pDlidx) && 
14f00 69 4d 61 74 63 68 3c 66 74 73 35 44 6c 69 64 78  iMatch<fts5Dlidx
14f10 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78  IterRowid(pDlidx
14f20 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44  ) ){.      fts5D
14f30 6c 69 64 78 49 74 65 72 50 72 65 76 28 70 2c 20  lidxIterPrev(p, 
14f40 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20  pDlidx);.    }. 
14f50 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 66     iLeafPgno = f
14f60 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
14f70 28 70 44 6c 69 64 78 29 3b 0a 0a 20 20 20 20 61  (pDlidx);..    a
14f80 73 73 65 72 74 28 20 66 74 73 35 44 6c 69 64 78  ssert( fts5Dlidx
14f90 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
14fa0 78 29 20 7c 7c 20 69 4c 65 61 66 50 67 6e 6f 3c  x) || iLeafPgno<
14fb0 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  =pIter->iLeafPgn
14fc0 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 4c  o );..    if( iL
14fd0 65 61 66 50 67 6e 6f 3c 70 49 74 65 72 2d 3e 69  eafPgno<pIter->i
14fe0 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20  LeafPgno ){.    
14ff0 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
15000 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2b 31  no = iLeafPgno+1
15010 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  ;.      fts5SegI
15020 74 65 72 52 65 76 65 72 73 65 4e 65 77 50 61 67  terReverseNewPag
15030 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
15040 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20 20     bMove = 0;.  
15050 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20    }.  }..  do{. 
15060 20 20 20 69 66 28 20 62 4d 6f 76 65 20 26 26 20     if( bMove && 
15070 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
15080 20 29 20 70 49 74 65 72 2d 3e 78 4e 65 78 74 28   ) pIter->xNext(
15090 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20 20  p, pIter, 0);.  
150a0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
150b0 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  af==0 ) break;. 
150c0 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20 26     if( bRev==0 &
150d0 26 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3e  & pIter->iRowid>
150e0 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b  =iMatch ) break;
150f0 0a 20 20 20 20 69 66 28 20 62 52 65 76 21 3d 30  .    if( bRev!=0
15100 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f 77 69   && pIter->iRowi
15110 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61  d<=iMatch ) brea
15120 6b 3b 0a 20 20 20 20 62 4d 6f 76 65 20 3d 20 31  k;.    bMove = 1
15130 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 2d 3e 72  ;.  }while( p->r
15140 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
15150 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  }.../*.** Free t
15160 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  he iterator obje
15170 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
15180 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
15190 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
151a0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
151b0 65 65 28 46 74 73 35 49 74 65 72 20 2a 70 49 74  ee(Fts5Iter *pIt
151c0 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72  er){.  if( pIter
151d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
151e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
151f0 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b  ter->nSeg; i++){
15200 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
15210 65 72 43 6c 65 61 72 28 26 70 49 74 65 72 2d 3e  erClear(&pIter->
15220 61 53 65 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  aSeg[i]);.    }.
15230 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
15240 65 65 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  ee(&pIter->posli
15250 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
15260 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  _free(pIter);.  
15270 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
15280 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
15290 76 61 6e 63 65 64 28 0a 20 20 46 74 73 35 49 6e  vanced(.  Fts5In
152a0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
152b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
152c0 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65  5 backend to ite
152d0 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20  rate within */. 
152e0 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
152f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15300 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
15310 75 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d 20  update aFirst[] 
15320 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69  array for */.  i
15330 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20 20 20  nt iChanged,    
15340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15350 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d 69  * Index of sub-i
15360 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64 76  terator just adv
15370 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anced */.  int i
15380 4d 69 6e 73 65 74 20 20 20 20 20 20 20 20 20 20  Minset          
15390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69             /* Mi
153a0 6e 69 6d 75 6d 20 65 6e 74 72 79 20 69 6e 20 61  nimum entry in a
153b0 46 69 72 73 74 5b 5d 20 74 6f 20 73 65 74 20 2a  First[] to set *
153c0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
153d0 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53  for(i=(pIter->nS
153e0 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b 20  eg+iChanged)/2; 
153f0 69 3e 3d 69 4d 69 6e 73 65 74 20 26 26 20 70 2d  i>=iMinset && p-
15400 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20  >rc==SQLITE_OK; 
15410 69 3d 69 2f 32 29 7b 0a 20 20 20 20 69 6e 74 20  i=i/2){.    int 
15420 69 45 71 3b 0a 20 20 20 20 69 66 28 20 28 69 45  iEq;.    if( (iE
15430 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  q = fts5MultiIte
15440 72 44 6f 43 6f 6d 70 61 72 65 28 70 49 74 65 72  rDoCompare(pIter
15450 2c 20 69 29 29 20 29 7b 0a 20 20 20 20 20 20 46  , i)) ){.      F
15460 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
15470 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
15480 69 45 71 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  iEq];.      asse
15490 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
154a0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 53  E_OK );.      pS
154b0 65 67 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53 65  eg->xNext(p, pSe
154c0 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 20 3d  g, 0);.      i =
154d0 20 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69   pIter->nSeg + i
154e0 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  Eq;.    }.  }.}.
154f0 0a 2f 2a 0a 2a 2a 20 53 75 62 2d 69 74 65 72 61  ./*.** Sub-itera
15500 74 6f 72 20 69 43 68 61 6e 67 65 64 20 6f 66 20  tor iChanged of 
15510 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 68  iterator pIter h
15520 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 64 76  as just been adv
15530 61 6e 63 65 64 2e 20 49 74 20 73 74 69 6c 6c 0a  anced. It still.
15540 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ** points to the
15550 20 73 61 6d 65 20 74 65 72 6d 20 74 68 6f 75 67   same term thoug
15560 68 20 2d 20 6a 75 73 74 20 61 20 64 69 66 66 65  h - just a diffe
15570 72 65 6e 74 20 72 6f 77 69 64 2e 20 54 68 69 73  rent rowid. This
15580 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 74 74   function.** att
15590 65 6d 70 74 73 20 74 6f 20 75 70 64 61 74 65 20  empts to update 
155a0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
155b0 74 68 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73  the pIter->aFirs
155c0 74 5b 5d 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  t[] accordingly.
155d0 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20 73  .** If it does s
155e0 6f 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  o successfully, 
155f0 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  0 is returned. O
15600 74 68 65 72 77 69 73 65 20 31 2e 0a 2a 2a 0a 2a  therwise 1..**.*
15610 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73  * If non-zero is
15620 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63   returned, the c
15630 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 61 6c  aller should cal
15640 6c 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41  l fts5MultiIterA
15650 64 76 61 6e 63 65 64 28 29 0a 2a 2a 20 6f 6e 20  dvanced().** on 
15660 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 6e 73  the iterator ins
15670 74 65 61 64 2e 20 54 68 61 74 20 66 75 6e 63 74  tead. That funct
15680 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 73 61 6d  ion does the sam
15690 65 20 61 73 20 74 68 69 73 20 6f 6e 65 2c 20 65  e as this one, e
156a0 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74  xcept.** that it
156b0 20 64 65 61 6c 73 20 77 69 74 68 20 6d 6f 72 65   deals with more
156c0 20 63 6f 6d 70 6c 69 63 61 74 65 64 20 63 61 73   complicated cas
156d0 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 20 0a  es as well..*/ .
156e0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d  static int fts5M
156f0 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52  ultiIterAdvanceR
15700 6f 77 69 64 28 0a 20 20 46 74 73 35 49 74 65 72  owid(.  Fts5Iter
15710 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
15720 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
15730 74 6f 72 20 74 6f 20 75 70 64 61 74 65 20 61 46  tor to update aF
15740 69 72 73 74 5b 5d 20 61 72 72 61 79 20 66 6f 72  irst[] array for
15750 20 2a 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e 67   */.  int iChang
15760 65 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ed,             
15770 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
15780 66 20 73 75 62 2d 69 74 65 72 61 74 6f 72 20 6a  f sub-iterator j
15790 75 73 74 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a  ust advanced */.
157a0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2a    Fts5SegIter **
157b0 70 70 46 69 72 73 74 0a 29 7b 0a 20 20 46 74 73  ppFirst.){.  Fts
157c0 35 53 65 67 49 74 65 72 20 2a 70 4e 65 77 20 3d  5SegIter *pNew =
157d0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 43   &pIter->aSeg[iC
157e0 68 61 6e 67 65 64 5d 3b 0a 0a 20 20 69 66 28 20  hanged];..  if( 
157f0 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d 3d 70 49  pNew->iRowid==pI
15800 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
15810 64 0a 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 69  d.   || (pNew->i
15820 52 6f 77 69 64 3c 70 49 74 65 72 2d 3e 69 53 77  Rowid<pIter->iSw
15830 69 74 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65  itchRowid)==pIte
15840 72 2d 3e 62 52 65 76 0a 20 20 29 7b 0a 20 20 20  r->bRev.  ){.   
15850 20 69 6e 74 20 69 3b 0a 20 20 20 20 46 74 73 35   int i;.    Fts5
15860 53 65 67 49 74 65 72 20 2a 70 4f 74 68 65 72 20  SegIter *pOther 
15870 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
15880 43 68 61 6e 67 65 64 20 5e 20 30 78 30 30 30 31  Changed ^ 0x0001
15890 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 53  ];.    pIter->iS
158a0 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70 49 74  witchRowid = pIt
158b0 65 72 2d 3e 62 52 65 76 20 3f 20 53 4d 41 4c 4c  er->bRev ? SMALL
158c0 45 53 54 5f 49 4e 54 36 34 20 3a 20 4c 41 52 47  EST_INT64 : LARG
158d0 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 20 20 66  EST_INT64;.    f
158e0 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65  or(i=(pIter->nSe
158f0 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b 20 31  g+iChanged)/2; 1
15900 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 20 20  ; i=i/2){.      
15910 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65  Fts5CResult *pRe
15920 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72  s = &pIter->aFir
15930 73 74 5b 69 5d 3b 0a 0a 20 20 20 20 20 20 61 73  st[i];..      as
15940 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 4c 65 61  sert( pNew->pLea
15950 66 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  f );.      asser
15960 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71  t( pRes->bTermEq
15970 3d 3d 30 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 70  ==0 || pOther->p
15980 4c 65 61 66 20 29 3b 0a 0a 20 20 20 20 20 20 69  Leaf );..      i
15990 66 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71  f( pRes->bTermEq
159a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
159b0 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d 3d 70 4f  pNew->iRowid==pO
159c0 74 68 65 72 2d 3e 69 52 6f 77 69 64 20 29 7b 0a  ther->iRowid ){.
159d0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
159e0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
159f0 65 20 69 66 28 20 28 70 4f 74 68 65 72 2d 3e 69  e if( (pOther->i
15a00 52 6f 77 69 64 3e 70 4e 65 77 2d 3e 69 52 6f 77  Rowid>pNew->iRow
15a10 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76  id)==pIter->bRev
15a20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49   ){.          pI
15a30 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
15a40 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69 52 6f 77  d = pOther->iRow
15a50 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  id;.          pN
15a60 65 77 20 3d 20 70 4f 74 68 65 72 3b 0a 20 20 20  ew = pOther;.   
15a70 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
15a80 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70  pOther->iRowid>p
15a90 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
15aa0 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76  id)==pIter->bRev
15ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49   ){.          pI
15ac0 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
15ad0 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69 52 6f 77  d = pOther->iRow
15ae0 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  id;.        }.  
15af0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 52 65 73      }.      pRes
15b00 2d 3e 69 46 69 72 73 74 20 3d 20 28 75 31 36 29  ->iFirst = (u16)
15b10 28 70 4e 65 77 20 2d 20 70 49 74 65 72 2d 3e 61  (pNew - pIter->a
15b20 53 65 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Seg);.      if( 
15b30 69 3d 3d 31 20 29 20 62 72 65 61 6b 3b 0a 0a 20  i==1 ) break;.. 
15b40 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 26 70       pOther = &p
15b50 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
15b60 72 2d 3e 61 46 69 72 73 74 5b 69 20 5e 20 30 78  r->aFirst[i ^ 0x
15b70 30 30 30 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  0001].iFirst ];.
15b80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70      }.  }..  *pp
15b90 46 69 72 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  First = pNew;.  
15ba0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
15bb0 2a 2a 20 53 65 74 20 74 68 65 20 70 49 74 65 72  ** Set the pIter
15bc0 2d 3e 62 45 6f 66 20 76 61 72 69 61 62 6c 65 20  ->bEof variable 
15bd0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 74 61  based on the sta
15be0 74 65 20 6f 66 20 74 68 65 20 73 75 62 2d 69 74  te of the sub-it
15bf0 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74  erators..*/.stat
15c00 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
15c10 69 49 74 65 72 53 65 74 45 6f 66 28 46 74 73 35  iIterSetEof(Fts5
15c20 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
15c30 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
15c40 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
15c50 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
15c60 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 70  1].iFirst ];.  p
15c70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20  Iter->base.bEof 
15c80 3d 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30  = pSeg->pLeaf==0
15c90 3b 0a 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74  ;.  pIter->iSwit
15ca0 63 68 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e  chRowid = pSeg->
15cb0 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iRowid;.}../*.**
15cc0 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74   Move the iterat
15cd0 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  or to the next e
15ce0 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ntry. .**.** If 
15cf0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
15d00 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
15d10 73 20 6c 65 66 74 20 69 6e 20 46 74 73 35 49 6e  s left in Fts5In
15d20 64 65 78 2e 72 63 2e 20 49 74 20 69 73 20 6e 6f  dex.rc. It is no
15d30 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64  t .** considered
15d40 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
15d50 20 69 74 65 72 61 74 6f 72 20 72 65 61 63 68 65   iterator reache
15d60 73 20 45 4f 46 2c 20 6f 72 20 69 66 20 69 74 20  s EOF, or if it 
15d70 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 0a 2a  is already at .*
15d80 2a 20 45 4f 46 20 77 68 65 6e 20 74 68 69 73 20  * EOF when this 
15d90 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
15da0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
15db0 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
15dc0 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Next(.  Fts5Inde
15dd0 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49 74 65  x *p, .  Fts5Ite
15de0 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20  r *pIter,.  int 
15df0 62 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  bFrom,          
15e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15e10 72 75 65 20 69 66 20 61 72 67 75 6d 65 6e 74 20  rue if argument 
15e20 69 46 72 6f 6d 20 69 73 20 76 61 6c 69 64 20 2a  iFrom is valid *
15e30 2f 0a 20 20 69 36 34 20 69 46 72 6f 6d 20 20 20  /.  i64 iFrom   
15e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e50 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 61      /* Advance a
15e60 74 20 6c 65 61 73 74 20 61 73 20 66 61 72 20 61  t least as far a
15e70 73 20 74 68 69 73 20 2a 2f 0a 29 7b 0a 20 20 69  s this */.){.  i
15e80 6e 74 20 62 55 73 65 46 72 6f 6d 20 3d 20 62 46  nt bUseFrom = bF
15e90 72 6f 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rom;.  assert( p
15ea0 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 3d  Iter->base.bEof=
15eb0 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  =0 );.  while( p
15ec0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
15ed0 29 7b 0a 20 20 20 20 69 6e 74 20 69 46 69 72 73  ){.    int iFirs
15ee0 74 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73  t = pIter->aFirs
15ef0 74 5b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20  t[1].iFirst;.   
15f00 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20   int bNewTerm = 
15f10 30 3b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  0;.    Fts5SegIt
15f20 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
15f30 72 2d 3e 61 53 65 67 5b 69 46 69 72 73 74 5d 3b  r->aSeg[iFirst];
15f40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
15f50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
15f60 0a 20 20 20 20 69 66 28 20 62 55 73 65 46 72 6f  .    if( bUseFro
15f70 6d 20 26 26 20 70 53 65 67 2d 3e 70 44 6c 69 64  m && pSeg->pDlid
15f80 78 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  x ){.      fts5S
15f90 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70  egIterNextFrom(p
15fa0 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d 29 3b 0a  , pSeg, iFrom);.
15fb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15fc0 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c 20   pSeg->xNext(p, 
15fd0 70 53 65 67 2c 20 26 62 4e 65 77 54 65 72 6d 29  pSeg, &bNewTerm)
15fe0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
15ff0 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20   pSeg->pLeaf==0 
16000 7c 7c 20 62 4e 65 77 54 65 72 6d 20 0a 20 20 20  || bNewTerm .   
16010 20 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74    || fts5MultiIt
16020 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70  erAdvanceRowid(p
16030 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20 26 70  Iter, iFirst, &p
16040 53 65 67 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  Seg).    ){.    
16050 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41    fts5MultiIterA
16060 64 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72  dvanced(p, pIter
16070 2c 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20  , iFirst, 1);.  
16080 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
16090 72 53 65 74 45 6f 66 28 70 49 74 65 72 29 3b 0a  rSetEof(pIter);.
160a0 20 20 20 20 20 20 70 53 65 67 20 3d 20 26 70 49        pSeg = &pI
160b0 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d  ter->aSeg[pIter-
160c0 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
160d0 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  t];.      if( pS
160e0 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72  eg->pLeaf==0 ) r
160f0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20  eturn;.    }..  
16100 20 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74    fts5AssertMult
16110 69 49 74 65 72 53 65 74 75 70 28 70 2c 20 70 49  iIterSetup(p, pI
16120 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
16130 28 20 70 53 65 67 3d 3d 26 70 49 74 65 72 2d 3e  ( pSeg==&pIter->
16140 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72  aSeg[pIter->aFir
16150 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 20 26 26  st[1].iFirst] &&
16160 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 29 3b 0a   pSeg->pLeaf );.
16170 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62      if( pIter->b
16180 53 6b 69 70 45 6d 70 74 79 3d 3d 30 20 7c 7c 20  SkipEmpty==0 || 
16190 70 53 65 67 2d 3e 6e 50 6f 73 20 29 7b 0a 20 20  pSeg->nPos ){.  
161a0 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f      pIter->xSetO
161b0 75 74 70 75 74 73 28 70 49 74 65 72 2c 20 70 53  utputs(pIter, pS
161c0 65 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  eg);.      retur
161d0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 55 73  n;.    }.    bUs
161e0 65 46 72 6f 6d 20 3d 20 30 3b 0a 20 20 7d 0a 7d  eFrom = 0;.  }.}
161f0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
16200 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 32  s5MultiIterNext2
16210 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
16220 2c 20 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  , .  Fts5Iter *p
16230 49 74 65 72 2c 0a 20 20 69 6e 74 20 2a 70 62 4e  Iter,.  int *pbN
16240 65 77 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  ewTerm          
16250 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
16260 54 72 75 65 20 69 66 20 2a 6d 69 67 68 74 2a 20  True if *might* 
16270 62 65 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29  be new term */.)
16280 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  {.  assert( pIte
16290 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 29 3b  r->bSkipEmpty );
162a0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
162b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
162c0 70 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20  pbNewTerm = 0;. 
162d0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 6e 74     do{.      int
162e0 20 69 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d   iFirst = pIter-
162f0 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
16300 74 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  t;.      Fts5Seg
16310 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
16320 74 65 72 2d 3e 61 53 65 67 5b 69 46 69 72 73 74  ter->aSeg[iFirst
16330 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65  ];.      int bNe
16340 77 54 65 72 6d 20 3d 20 30 3b 0a 0a 20 20 20 20  wTerm = 0;..    
16350 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
16360 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
16370 20 20 20 20 70 53 65 67 2d 3e 78 4e 65 78 74 28      pSeg->xNext(
16380 70 2c 20 70 53 65 67 2c 20 26 62 4e 65 77 54 65  p, pSeg, &bNewTe
16390 72 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  rm);.      if( p
163a0 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c  Seg->pLeaf==0 ||
163b0 20 62 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20   bNewTerm .     
163c0 20 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74    || fts5MultiIt
163d0 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70  erAdvanceRowid(p
163e0 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20 26 70  Iter, iFirst, &p
163f0 53 65 67 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  Seg).      ){.  
16400 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
16410 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70  terAdvanced(p, p
16420 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20 31 29  Iter, iFirst, 1)
16430 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  ;.        fts5Mu
16440 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 70 49  ltiIterSetEof(pI
16450 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  ter);.        *p
16460 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20  bNewTerm = 1;.  
16470 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
16480 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53  AssertMultiIterS
16490 65 74 75 70 28 70 2c 20 70 49 74 65 72 29 3b 0a  etup(p, pIter);.
164a0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 66 74 73  .    }while( fts
164b0 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74  5MultiIterIsEmpt
164c0 79 28 70 2c 20 70 49 74 65 72 29 20 29 3b 0a 20  y(p, pIter) );. 
164d0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
164e0 64 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  d fts5IterSetOut
164f0 70 75 74 73 5f 4e 6f 6f 70 28 46 74 73 35 49 74  puts_Noop(Fts5It
16500 65 72 20 2a 70 55 6e 75 73 65 64 31 2c 20 46 74  er *pUnused1, Ft
16510 73 35 53 65 67 49 74 65 72 20 2a 70 55 6e 75 73  s5SegIter *pUnus
16520 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
16530 41 52 41 4d 32 28 70 55 6e 75 73 65 64 31 2c 20  ARAM2(pUnused1, 
16540 70 55 6e 75 73 65 64 32 29 3b 0a 7d 0a 0a 73 74  pUnused2);.}..st
16550 61 74 69 63 20 46 74 73 35 49 74 65 72 20 2a 66  atic Fts5Iter *f
16560 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f  ts5MultiIterAllo
16570 63 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  c(.  Fts5Index *
16580 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
16590 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
165a0 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20  kend to iterate 
165b0 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  within */.  int 
165c0 6e 53 65 67 0a 29 7b 0a 20 20 46 74 73 35 49 74  nSeg.){.  Fts5It
165d0 65 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  er *pNew;.  int 
165e0 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20  nSlot;          
165f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
16600 6f 77 65 72 20 6f 66 20 74 77 6f 20 3e 3d 20 6e  ower of two >= n
16610 53 65 67 20 2a 2f 0a 0a 20 20 66 6f 72 28 6e 53  Seg */..  for(nS
16620 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65  lot=2; nSlot<nSe
16630 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32  g; nSlot=nSlot*2
16640 29 3b 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35  );.  pNew = fts5
16650 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20 20  IdxMalloc(p, .  
16660 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 49      sizeof(Fts5I
16670 74 65 72 29 20 2b 20 20 20 20 20 20 20 20 20 20  ter) +          
16680 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 20          /* pNew 
16690 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
166a0 46 74 73 35 53 65 67 49 74 65 72 29 20 2a 20 28  Fts5SegIter) * (
166b0 6e 53 6c 6f 74 2d 31 29 20 2b 20 20 20 2f 2a 20  nSlot-1) +   /* 
166c0 70 4e 65 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a  pNew->aSeg[] */.
166d0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
166e0 35 43 52 65 73 75 6c 74 29 20 2a 20 6e 53 6c 6f  5CResult) * nSlo
166f0 74 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65  t         /* pNe
16700 77 2d 3e 61 46 69 72 73 74 5b 5d 20 2a 2f 0a 20  w->aFirst[] */. 
16710 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29   );.  if( pNew )
16720 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67  {.    pNew->nSeg
16730 20 3d 20 6e 53 6c 6f 74 3b 0a 20 20 20 20 70 4e   = nSlot;.    pN
16740 65 77 2d 3e 61 46 69 72 73 74 20 3d 20 28 46 74  ew->aFirst = (Ft
16750 73 35 43 52 65 73 75 6c 74 2a 29 26 70 4e 65 77  s5CResult*)&pNew
16760 2d 3e 61 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20  ->aSeg[nSlot];. 
16770 20 20 20 70 4e 65 77 2d 3e 70 49 6e 64 65 78 20     pNew->pIndex 
16780 3d 20 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 78  = p;.    pNew->x
16790 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73  SetOutputs = fts
167a0 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
167b0 4e 6f 6f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Noop;.  }.  retu
167c0 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 73 74 61 74  rn pNew;.}..stat
167d0 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73 6c  ic void fts5Posl
167e0 69 73 74 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46  istCallback(.  F
167f0 74 73 35 49 6e 64 65 78 20 2a 70 55 6e 75 73 65  ts5Index *pUnuse
16800 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e  d, .  void *pCon
16810 74 65 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75  text, .  const u
16820 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e  8 *pChunk, int n
16830 43 68 75 6e 6b 0a 29 7b 0a 20 20 55 4e 55 53 45  Chunk.){.  UNUSE
16840 44 5f 50 41 52 41 4d 28 70 55 6e 75 73 65 64 29  D_PARAM(pUnused)
16850 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e  ;.  assert_nc( n
16860 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66  Chunk>=0 );.  if
16870 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20  ( nChunk>0 ){.  
16880 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
16890 41 70 70 65 6e 64 42 6c 6f 62 28 28 46 74 73 35  AppendBlob((Fts5
168a0 42 75 66 66 65 72 2a 29 70 43 6f 6e 74 65 78 74  Buffer*)pContext
168b0 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b  , pChunk, nChunk
168c0 29 3b 0a 20 20 7d 0a 7d 0a 0a 74 79 70 65 64 65  );.  }.}..typede
168d0 66 20 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74  f struct Poslist
168e0 43 61 6c 6c 62 61 63 6b 43 74 78 20 50 6f 73 6c  CallbackCtx Posl
168f0 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 3b 0a  istCallbackCtx;.
16900 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74 43 61  struct PoslistCa
16910 6c 6c 62 61 63 6b 43 74 78 20 7b 0a 20 20 46 74  llbackCtx {.  Ft
16920 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20  s5Buffer *pBuf; 
16930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16940 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20   Append to this 
16950 62 75 66 66 65 72 20 2a 2f 0a 20 20 46 74 73 35  buffer */.  Fts5
16960 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b  Colset *pColset;
16970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16980 65 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20  estrict matches 
16990 74 6f 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a  to this column *
169a0 2f 0a 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20  /.  int eState; 
169b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169c0 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76 65      /* See above
169d0 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20   */.};..typedef 
169e0 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74 4f 66  struct PoslistOf
169f0 66 73 65 74 73 43 74 78 20 50 6f 73 6c 69 73 74  fsetsCtx Poslist
16a00 4f 66 66 73 65 74 73 43 74 78 3b 0a 73 74 72 75  OffsetsCtx;.stru
16a10 63 74 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74  ct PoslistOffset
16a20 73 43 74 78 20 7b 0a 20 20 46 74 73 35 42 75 66  sCtx {.  Fts5Buf
16a30 66 65 72 20 2a 70 42 75 66 3b 20 20 20 20 20 20  fer *pBuf;      
16a40 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65           /* Appe
16a50 6e 64 20 74 6f 20 74 68 69 73 20 62 75 66 66 65  nd to this buffe
16a60 72 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65  r */.  Fts5Colse
16a70 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20 20  t *pColset;     
16a80 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
16a90 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74 68  ct matches to th
16aa0 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  is column */.  i
16ab0 6e 74 20 69 52 65 61 64 3b 0a 20 20 69 6e 74 20  nt iRead;.  int 
16ac0 69 57 72 69 74 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  iWrite;.};../*.*
16ad0 2a 20 54 4f 44 4f 3a 20 4d 61 6b 65 20 74 68 69  * TODO: Make thi
16ae0 73 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  s more efficient
16af0 21 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  !.*/.static int 
16b00 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54  fts5IndexColsetT
16b10 65 73 74 28 46 74 73 35 43 6f 6c 73 65 74 20 2a  est(Fts5Colset *
16b20 70 43 6f 6c 73 65 74 2c 20 69 6e 74 20 69 43 6f  pColset, int iCo
16b30 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
16b40 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 73 65  or(i=0; i<pColse
16b50 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  t->nCol; i++){. 
16b60 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74 2d 3e     if( pColset->
16b70 61 69 43 6f 6c 5b 69 5d 3d 3d 69 43 6f 6c 20 29  aiCol[i]==iCol )
16b80 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
16b90 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74   return 0;.}..st
16ba0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f  atic void fts5Po
16bb0 73 6c 69 73 74 4f 66 66 73 65 74 73 43 61 6c 6c  slistOffsetsCall
16bc0 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65  back(.  Fts5Inde
16bd0 78 20 2a 70 55 6e 75 73 65 64 2c 20 0a 20 20 76  x *pUnused, .  v
16be0 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a  oid *pContext, .
16bf0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75    const u8 *pChu
16c00 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29  nk, int nChunk.)
16c10 7b 0a 20 20 50 6f 73 6c 69 73 74 4f 66 66 73 65  {.  PoslistOffse
16c20 74 73 43 74 78 20 2a 70 43 74 78 20 3d 20 28 50  tsCtx *pCtx = (P
16c30 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78  oslistOffsetsCtx
16c40 2a 29 70 43 6f 6e 74 65 78 74 3b 0a 20 20 55 4e  *)pContext;.  UN
16c50 55 53 45 44 5f 50 41 52 41 4d 28 70 55 6e 75 73  USED_PARAM(pUnus
16c60 65 64 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63  ed);.  assert_nc
16c70 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20  ( nChunk>=0 );. 
16c80 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b   if( nChunk>0 ){
16c90 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  .    int i = 0;.
16ca0 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 43 68      while( i<nCh
16cb0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  unk ){.      int
16cc0 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 69 20 2b   iVal;.      i +
16cd0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
16ce0 32 28 26 70 43 68 75 6e 6b 5b 69 5d 2c 20 69 56  2(&pChunk[i], iV
16cf0 61 6c 29 3b 0a 20 20 20 20 20 20 69 56 61 6c 20  al);.      iVal 
16d00 2b 3d 20 70 43 74 78 2d 3e 69 52 65 61 64 20 2d  += pCtx->iRead -
16d10 20 32 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e   2;.      pCtx->
16d20 69 52 65 61 64 20 3d 20 69 56 61 6c 3b 0a 20 20  iRead = iVal;.  
16d30 20 20 20 20 69 66 28 20 66 74 73 35 49 6e 64 65      if( fts5Inde
16d40 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43 74 78  xColsetTest(pCtx
16d50 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 56 61 6c 29  ->pColset, iVal)
16d60 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
16d70 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
16d80 56 61 72 69 6e 74 28 70 43 74 78 2d 3e 70 42 75  Varint(pCtx->pBu
16d90 66 2c 20 69 56 61 6c 20 2b 20 32 20 2d 20 70 43  f, iVal + 2 - pC
16da0 74 78 2d 3e 69 57 72 69 74 65 29 3b 0a 20 20 20  tx->iWrite);.   
16db0 20 20 20 20 20 70 43 74 78 2d 3e 69 57 72 69 74       pCtx->iWrit
16dc0 65 20 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20  e = iVal;.      
16dd0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73  }.    }.  }.}..s
16de0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50  tatic void fts5P
16df0 6f 73 6c 69 73 74 46 69 6c 74 65 72 43 61 6c 6c  oslistFilterCall
16e00 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65  back(.  Fts5Inde
16e10 78 20 2a 70 55 6e 75 73 65 64 2c 0a 20 20 76 6f  x *pUnused,.  vo
16e20 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20  id *pContext, . 
16e30 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e   const u8 *pChun
16e40 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b  k, int nChunk.){
16e50 0a 20 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61  .  PoslistCallba
16e60 63 6b 43 74 78 20 2a 70 43 74 78 20 3d 20 28 50  ckCtx *pCtx = (P
16e70 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74  oslistCallbackCt
16e80 78 2a 29 70 43 6f 6e 74 65 78 74 3b 0a 20 20 55  x*)pContext;.  U
16e90 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 55 6e 75  NUSED_PARAM(pUnu
16ea0 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e  sed);.  assert_n
16eb0 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a  c( nChunk>=0 );.
16ec0 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29    if( nChunk>0 )
16ed0 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
16ee0 74 68 72 6f 75 67 68 20 74 6f 20 66 69 6e 64 20  through to find 
16ef0 74 68 65 20 66 69 72 73 74 20 76 61 72 69 6e 74  the first varint
16f00 20 77 69 74 68 20 76 61 6c 75 65 20 31 2e 20 54   with value 1. T
16f10 68 69 73 20 69 73 20 74 68 65 0a 20 20 20 20 2a  his is the.    *
16f20 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  * start of the n
16f30 65 78 74 20 63 6f 6c 75 6d 6e 73 20 68 69 74 73  ext columns hits
16f40 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 20 3d  . */.    int i =
16f50 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 53 74 61   0;.    int iSta
16f60 72 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  rt = 0;..    if(
16f70 20 70 43 74 78 2d 3e 65 53 74 61 74 65 3d 3d 32   pCtx->eState==2
16f80 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43   ){.      int iC
16f90 6f 6c 3b 0a 20 20 20 20 20 20 66 74 73 35 46 61  ol;.      fts5Fa
16fa0 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70 43  stGetVarint32(pC
16fb0 68 75 6e 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a  hunk, i, iCol);.
16fc0 20 20 20 20 20 20 69 66 28 20 66 74 73 35 49 6e        if( fts5In
16fd0 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43  dexColsetTest(pC
16fe0 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 43 6f  tx->pColset, iCo
16ff0 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  l) ){.        pC
17000 74 78 2d 3e 65 53 74 61 74 65 20 3d 20 31 3b 0a  tx->eState = 1;.
17010 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
17020 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
17030 6e 74 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 31  nt(pCtx->pBuf, 1
17040 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
17050 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53          pCtx->eS
17060 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  tate = 0;.      
17070 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 6f 20  }.    }..    do 
17080 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  {.      while( i
17090 3c 6e 43 68 75 6e 6b 20 26 26 20 70 43 68 75 6e  <nChunk && pChun
170a0 6b 5b 69 5d 21 3d 30 78 30 31 20 29 7b 0a 20 20  k[i]!=0x01 ){.  
170b0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 68        while( pCh
170c0 75 6e 6b 5b 69 5d 20 26 20 30 78 38 30 20 29 20  unk[i] & 0x80 ) 
170d0 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b  i++;.        i++
170e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
170f0 69 66 28 20 70 43 74 78 2d 3e 65 53 74 61 74 65  if( pCtx->eState
17100 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
17110 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
17120 42 6c 6f 62 28 70 43 74 78 2d 3e 70 42 75 66 2c  Blob(pCtx->pBuf,
17130 20 26 70 43 68 75 6e 6b 5b 69 53 74 61 72 74 5d   &pChunk[iStart]
17140 2c 20 69 2d 69 53 74 61 72 74 29 3b 0a 20 20 20  , i-iStart);.   
17150 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
17160 3c 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20  <nChunk ){.     
17170 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20     int iCol;.   
17180 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 3b       iStart = i;
17190 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
171a0 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 68        if( i>=nCh
171b0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
171c0 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20   pCtx->eState = 
171d0 32 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  2;.        }else
171e0 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  {.          fts5
171f0 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28  FastGetVarint32(
17200 70 43 68 75 6e 6b 2c 20 69 2c 20 69 43 6f 6c 29  pChunk, i, iCol)
17210 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 74 78  ;.          pCtx
17220 2d 3e 65 53 74 61 74 65 20 3d 20 66 74 73 35 49  ->eState = fts5I
17230 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70  ndexColsetTest(p
17240 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 43  Ctx->pColset, iC
17250 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ol);.          i
17260 66 28 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20  f( pCtx->eState 
17270 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
17280 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
17290 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d 3e 70 42  endBlob(pCtx->pB
172a0 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69 53 74 61  uf, &pChunk[iSta
172b0 72 74 5d 2c 20 69 2d 69 53 74 61 72 74 29 3b 0a  rt], i-iStart);.
172c0 20 20 20 20 20 20 20 20 20 20 20 20 69 53 74 61              iSta
172d0 72 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  rt = i;.        
172e0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
172f0 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65      }.    }while
17300 28 20 69 3c 6e 43 68 75 6e 6b 20 29 3b 0a 20 20  ( i<nChunk );.  
17310 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
17320 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74   fts5ChunkIterat
17330 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
17340 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
17350 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 62       /* Index ob
17360 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
17370 67 49 74 65 72 20 2a 70 53 65 67 2c 20 20 20 20  gIter *pSeg,    
17380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
17390 6c 69 73 74 20 6f 66 20 74 68 69 73 20 69 74 65  list of this ite
173a0 72 61 74 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20  rator */.  void 
173b0 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
173c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
173d0 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 20 66 6f  ntext pointer fo
173e0 72 20 78 43 68 75 6e 6b 20 63 61 6c 6c 62 61 63  r xChunk callbac
173f0 6b 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  k */.  void (*xC
17400 68 75 6e 6b 29 28 46 74 73 35 49 6e 64 65 78 2a  hunk)(Fts5Index*
17410 2c 20 76 6f 69 64 2a 2c 20 63 6f 6e 73 74 20 75  , void*, const u
17420 38 2a 2c 20 69 6e 74 29 0a 29 7b 0a 20 20 69 6e  8*, int).){.  in
17430 74 20 6e 52 65 6d 20 3d 20 70 53 65 67 2d 3e 6e  t nRem = pSeg->n
17440 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Pos;          /*
17450 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
17460 20 73 74 69 6c 6c 20 74 6f 20 63 6f 6d 65 20 2a   still to come *
17470 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  /.  Fts5Data *pD
17480 61 74 61 20 3d 20 30 3b 0a 20 20 75 38 20 2a 70  ata = 0;.  u8 *p
17490 43 68 75 6e 6b 20 3d 20 26 70 53 65 67 2d 3e 70  Chunk = &pSeg->p
174a0 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c  Leaf->p[pSeg->iL
174b0 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 69 6e  eafOffset];.  in
174c0 74 20 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e  t nChunk = MIN(n
174d0 52 65 6d 2c 20 70 53 65 67 2d 3e 70 4c 65 61 66  Rem, pSeg->pLeaf
174e0 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53 65 67 2d  ->szLeaf - pSeg-
174f0 3e 69 4c 65 61 66 4f 66 66 73 65 74 29 3b 0a 20  >iLeafOffset);. 
17500 20 69 6e 74 20 70 67 6e 6f 20 3d 20 70 53 65 67   int pgno = pSeg
17510 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69  ->iLeafPgno;.  i
17520 6e 74 20 70 67 6e 6f 53 61 76 65 20 3d 20 30 3b  nt pgnoSave = 0;
17530 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
17540 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 6d 77 6f  tion does notmwo
17550 72 6b 20 77 69 74 68 20 64 65 74 61 69 6c 3d 6e  rk with detail=n
17560 6f 6e 65 20 64 61 74 61 62 61 73 65 73 2e 20 2a  one databases. *
17570 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
17580 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21  Config->eDetail!
17590 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e  =FTS5_DETAIL_NON
175a0 45 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 53 65  E );..  if( (pSe
175b0 67 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  g->flags & FTS5_
175c0 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 29  SEGITER_REVERSE)
175d0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 67 6e 6f 53  ==0 ){.    pgnoS
175e0 61 76 65 20 3d 20 70 67 6e 6f 2b 31 3b 0a 20 20  ave = pgno+1;.  
175f0 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  }..  while( 1 ){
17600 0a 20 20 20 20 78 43 68 75 6e 6b 28 70 2c 20 70  .    xChunk(p, p
17610 43 74 78 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68  Ctx, pChunk, nCh
17620 75 6e 6b 29 3b 0a 20 20 20 20 6e 52 65 6d 20 2d  unk);.    nRem -
17630 3d 20 6e 43 68 75 6e 6b 3b 0a 20 20 20 20 66 74  = nChunk;.    ft
17640 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44  s5DataRelease(pD
17650 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 52  ata);.    if( nR
17660 65 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 62  em<=0 ){.      b
17670 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  reak;.    }else{
17680 0a 20 20 20 20 20 20 70 67 6e 6f 2b 2b 3b 0a 20  .      pgno++;. 
17690 20 20 20 20 20 70 44 61 74 61 20 3d 20 66 74 73       pData = fts
176a0 35 4c 65 61 66 52 65 61 64 28 70 2c 20 46 54 53  5LeafRead(p, FTS
176b0 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
176c0 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67  pSeg->pSeg->iSeg
176d0 69 64 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  id, pgno));.    
176e0 20 20 69 66 28 20 70 44 61 74 61 3d 3d 30 20 29    if( pData==0 )
176f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 43   break;.      pC
17700 68 75 6e 6b 20 3d 20 26 70 44 61 74 61 2d 3e 70  hunk = &pData->p
17710 5b 34 5d 3b 0a 20 20 20 20 20 20 6e 43 68 75 6e  [4];.      nChun
17720 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20 70 44  k = MIN(nRem, pD
17730 61 74 61 2d 3e 73 7a 4c 65 61 66 20 2d 20 34 29  ata->szLeaf - 4)
17740 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  ;.      if( pgno
17750 3d 3d 70 67 6e 6f 53 61 76 65 20 29 7b 0a 20 20  ==pgnoSave ){.  
17760 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
17770 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30  eg->pNextLeaf==0
17780 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 67   );.        pSeg
17790 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 70 44  ->pNextLeaf = pD
177a0 61 74 61 3b 0a 20 20 20 20 20 20 20 20 70 44 61  ata;.        pDa
177b0 74 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ta = 0;.      }.
177c0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
177d0 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65  ** Iterator pIte
177e0 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
177f0 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e  ts to a valid en
17800 74 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54  try (not EOF). T
17810 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
17820 61 70 70 65 6e 64 73 20 74 68 65 20 70 6f 73 69  appends the posi
17830 74 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 20 66  tion list data f
17840 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  or the current e
17850 6e 74 72 79 20 74 6f 0a 2a 2a 20 62 75 66 66 65  ntry to.** buffe
17860 72 20 70 42 75 66 2e 20 49 74 20 64 6f 65 73 20  r pBuf. It does 
17870 6e 6f 74 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  not make a copy 
17880 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d  of the position-
17890 6c 69 73 74 20 73 69 7a 65 0a 2a 2a 20 66 69 65  list size.** fie
178a0 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ld..*/.static vo
178b0 69 64 20 66 74 73 35 53 65 67 69 74 65 72 50 6f  id fts5SegiterPo
178c0 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64  slist(.  Fts5Ind
178d0 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 65 67  ex *p,.  Fts5Seg
178e0 49 74 65 72 20 2a 70 53 65 67 2c 0a 20 20 46 74  Iter *pSeg,.  Ft
178f0 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65  s5Colset *pColse
17900 74 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  t,.  Fts5Buffer 
17910 2a 70 42 75 66 0a 29 7b 0a 20 20 69 66 28 20 30  *pBuf.){.  if( 0
17920 3d 3d 66 74 73 35 42 75 66 66 65 72 47 72 6f 77  ==fts5BufferGrow
17930 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 70  (&p->rc, pBuf, p
17940 53 65 67 2d 3e 6e 50 6f 73 2b 46 54 53 35 5f 44  Seg->nPos+FTS5_D
17950 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47  ATA_ZERO_PADDING
17960 29 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ) ){.    memset(
17970 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e  &pBuf->p[pBuf->n
17980 2b 70 53 65 67 2d 3e 6e 50 6f 73 5d 2c 20 30 2c  +pSeg->nPos], 0,
17990 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f   FTS5_DATA_ZERO_
179a0 50 41 44 44 49 4e 47 29 3b 0a 20 20 20 20 69 66  PADDING);.    if
179b0 28 20 70 43 6f 6c 73 65 74 3d 3d 30 20 29 7b 0a  ( pColset==0 ){.
179c0 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49        fts5ChunkI
179d0 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20  terate(p, pSeg, 
179e0 28 76 6f 69 64 2a 29 70 42 75 66 2c 20 66 74 73  (void*)pBuf, fts
179f0 35 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b  5PoslistCallback
17a00 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
17a10 20 20 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66      if( p->pConf
17a20 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
17a30 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 7b  5_DETAIL_FULL ){
17a40 0a 20 20 20 20 20 20 20 20 50 6f 73 6c 69 73 74  .        Poslist
17a50 43 61 6c 6c 62 61 63 6b 43 74 78 20 73 43 74 78  CallbackCtx sCtx
17a60 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 70  ;.        sCtx.p
17a70 42 75 66 20 3d 20 70 42 75 66 3b 0a 20 20 20 20  Buf = pBuf;.    
17a80 20 20 20 20 73 43 74 78 2e 70 43 6f 6c 73 65 74      sCtx.pColset
17a90 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20   = pColset;.    
17aa0 20 20 20 20 73 43 74 78 2e 65 53 74 61 74 65 20      sCtx.eState 
17ab0 3d 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65  = fts5IndexColse
17ac0 74 54 65 73 74 28 70 43 6f 6c 73 65 74 2c 20 30  tTest(pColset, 0
17ad0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
17ae0 74 28 20 73 43 74 78 2e 65 53 74 61 74 65 3d 3d  t( sCtx.eState==
17af0 30 20 7c 7c 20 73 43 74 78 2e 65 53 74 61 74 65  0 || sCtx.eState
17b00 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 66  ==1 );.        f
17b10 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28  ts5ChunkIterate(
17b20 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29  p, pSeg, (void*)
17b30 26 73 43 74 78 2c 20 66 74 73 35 50 6f 73 6c 69  &sCtx, fts5Posli
17b40 73 74 46 69 6c 74 65 72 43 61 6c 6c 62 61 63 6b  stFilterCallback
17b50 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
17b60 20 20 20 20 20 20 20 20 50 6f 73 6c 69 73 74 4f          PoslistO
17b70 66 66 73 65 74 73 43 74 78 20 73 43 74 78 3b 0a  ffsetsCtx sCtx;.
17b80 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
17b90 73 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sCtx, 0, sizeof(
17ba0 73 43 74 78 29 29 3b 0a 20 20 20 20 20 20 20 20  sCtx));.        
17bb0 73 43 74 78 2e 70 42 75 66 20 3d 20 70 42 75 66  sCtx.pBuf = pBuf
17bc0 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 70  ;.        sCtx.p
17bd0 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65 74  Colset = pColset
17be0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 43 68  ;.        fts5Ch
17bf0 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53  unkIterate(p, pS
17c00 65 67 2c 20 28 76 6f 69 64 2a 29 26 73 43 74 78  eg, (void*)&sCtx
17c10 2c 20 66 74 73 35 50 6f 73 6c 69 73 74 4f 66 66  , fts5PoslistOff
17c20 73 65 74 73 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  setsCallback);. 
17c30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
17c40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 4e 2f 4f 55 54  .}../*.** IN/OUT
17c50 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70 61 29   parameter (*pa)
17c60 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 70 6f 73   points to a pos
17c70 69 74 69 6f 6e 20 6c 69 73 74 20 6e 20 62 79 74  ition list n byt
17c80 65 73 20 69 6e 20 73 69 7a 65 2e 20 49 66 0a 2a  es in size. If.*
17c90 2a 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  * the position l
17ca0 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74  ist contains ent
17cb0 72 69 65 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20  ries for column 
17cc0 69 43 6f 6c 2c 20 74 68 65 6e 20 28 2a 70 61 29  iCol, then (*pa)
17cd0 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20 70 6f   is set.** to po
17ce0 69 6e 74 20 74 6f 20 74 68 65 20 73 75 62 2d 70  int to the sub-p
17cf0 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 66 6f 72  osition-list for
17d00 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 6e 64   that column and
17d10 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
17d20 2a 20 62 79 74 65 73 20 69 6e 20 69 74 20 72 65  * bytes in it re
17d30 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74  turned. Or, if t
17d40 68 65 20 61 72 67 75 6d 65 6e 74 20 70 6f 73 69  he argument posi
17d50 74 69 6f 6e 20 6c 69 73 74 20 64 6f 65 73 20 6e  tion list does n
17d60 6f 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 6e  ot.** contain an
17d70 79 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63 6f  y entries for co
17d80 6c 75 6d 6e 20 69 43 6f 6c 2c 20 72 65 74 75 72  lumn iCol, retur
17d90 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 0..*/.static i
17da0 6e 74 20 66 74 73 35 49 6e 64 65 78 45 78 74 72  nt fts5IndexExtr
17db0 61 63 74 43 6f 6c 28 0a 20 20 63 6f 6e 73 74 20  actCol(.  const 
17dc0 75 38 20 2a 2a 70 61 2c 20 20 20 20 20 20 20 20  u8 **pa,        
17dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
17de0 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20  OUT: Pointer to 
17df0 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  poslist */.  int
17e00 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
17e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17e20 49 4e 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73 6c  IN: Size of posl
17e30 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ist in bytes */.
17e40 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20    int iCol      
17e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e60 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 65    /* Column to e
17e70 78 74 72 61 63 74 20 66 72 6f 6d 20 70 6f 73 6c  xtract from posl
17e80 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ist */.){.  int 
17e90 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20  iCurrent = 0;   
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
17eb0 6e 79 74 68 69 6e 67 20 62 65 66 6f 72 65 20 74  nything before t
17ec0 68 65 20 66 69 72 73 74 20 30 78 30 31 20 69 73  he first 0x01 is
17ed0 20 63 6f 6c 20 30 20 2a 2f 0a 20 20 63 6f 6e 73   col 0 */.  cons
17ee0 74 20 75 38 20 2a 70 20 3d 20 2a 70 61 3b 0a 20  t u8 *p = *pa;. 
17ef0 20 63 6f 6e 73 74 20 75 38 20 2a 70 45 6e 64 20   const u8 *pEnd 
17f00 3d 20 26 70 5b 6e 5d 3b 20 20 20 20 20 20 20 20  = &p[n];        
17f10 20 2f 2a 20 4f 6e 65 20 62 79 74 65 20 70 61 73   /* One byte pas
17f20 74 20 65 6e 64 20 6f 66 20 70 6f 73 69 74 69 6f  t end of positio
17f30 6e 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 77 68 69  n list */..  whi
17f40 6c 65 28 20 69 43 6f 6c 3e 69 43 75 72 72 65 6e  le( iCol>iCurren
17f50 74 20 29 7b 0a 20 20 20 20 2f 2a 20 41 64 76 61  t ){.    /* Adva
17f60 6e 63 65 20 70 6f 69 6e 74 65 72 20 70 20 75 6e  nce pointer p un
17f70 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  til it points to
17f80 20 70 45 6e 64 20 6f 72 20 61 6e 20 30 78 30 31   pEnd or an 0x01
17f90 20 62 79 74 65 20 74 68 61 74 20 69 73 0a 20 20   byte that is.  
17fa0 20 20 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f 66    ** not part of
17fb0 20 61 20 76 61 72 69 6e 74 2e 20 4e 6f 74 65 20   a varint. Note 
17fc0 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 70  that it is not p
17fd0 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 6e 65  ossible for a ne
17fe0 67 61 74 69 76 65 0a 20 20 20 20 2a 2a 20 6f 72  gative.    ** or
17ff0 20 65 78 74 72 65 6d 65 6c 79 20 6c 61 72 67 65   extremely large
18000 20 76 61 72 69 6e 74 20 74 6f 20 6f 63 63 75 72   varint to occur
18010 20 77 69 74 68 69 6e 20 61 6e 20 75 6e 63 6f 72   within an uncor
18020 72 75 70 74 65 64 20 70 6f 73 69 74 69 6f 6e 20  rupted position 
18030 0a 20 20 20 20 2a 2a 20 6c 69 73 74 2e 20 53 6f  .    ** list. So
18040 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f   the last byte o
18050 66 20 65 61 63 68 20 76 61 72 69 6e 74 20 6d 61  f each varint ma
18060 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 6f 20  y be assumed to 
18070 68 61 76 65 20 61 20 63 6c 65 61 72 0a 20 20 20  have a clear.   
18080 20 2a 2a 20 30 78 38 30 20 62 69 74 2e 20 20 2a   ** 0x80 bit.  *
18090 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70 21  /.    while( *p!
180a0 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 77  =0x01 ){.      w
180b0 68 69 6c 65 28 20 2a 70 2b 2b 20 26 20 30 78 38  hile( *p++ & 0x8
180c0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
180d0 3e 3d 70 45 6e 64 20 29 20 72 65 74 75 72 6e 20  >=pEnd ) return 
180e0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 61  0;.    }.    *pa
180f0 20 3d 20 70 2b 2b 3b 0a 20 20 20 20 69 43 75 72   = p++;.    iCur
18100 72 65 6e 74 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20  rent = *p++;.   
18110 20 69 66 28 20 69 43 75 72 72 65 6e 74 20 26 20   if( iCurrent & 
18120 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  0x80 ){.      p-
18130 2d 3b 0a 20 20 20 20 20 20 70 20 2b 3d 20 66 74  -;.      p += ft
18140 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c  s5GetVarint32(p,
18150 20 69 43 75 72 72 65 6e 74 29 3b 0a 20 20 20 20   iCurrent);.    
18160 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  }.  }.  if( iCol
18170 21 3d 69 43 75 72 72 65 6e 74 20 29 20 72 65 74  !=iCurrent ) ret
18180 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 64 76  urn 0;..  /* Adv
18190 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 70 20 75  ance pointer p u
181a0 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74  ntil it points t
181b0 6f 20 70 45 6e 64 20 6f 72 20 61 6e 20 30 78 30  o pEnd or an 0x0
181c0 31 20 62 79 74 65 20 74 68 61 74 20 69 73 0a 20  1 byte that is. 
181d0 20 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   ** not part of 
181e0 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 77 68  a varint */.  wh
181f0 69 6c 65 28 20 70 3c 70 45 6e 64 20 26 26 20 2a  ile( p<pEnd && *
18200 70 21 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 77  p!=0x01 ){.    w
18210 68 69 6c 65 28 20 2a 70 2b 2b 20 26 20 30 78 38  hile( *p++ & 0x8
18220 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  0 );.  }..  retu
18230 72 6e 20 70 20 2d 20 28 2a 70 61 29 3b 0a 7d 0a  rn p - (*pa);.}.
18240 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
18250 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c  5IndexExtractCol
18260 73 65 74 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c  set(.  int *pRc,
18270 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
18280 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20  Colset,         
18290 20 20 20 2f 2a 20 43 6f 6c 73 65 74 20 74 6f 20     /* Colset to 
182a0 66 69 6c 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 63  filter on */.  c
182b0 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 2c 20 69  onst u8 *pPos, i
182c0 6e 74 20 6e 50 6f 73 2c 20 20 20 20 20 20 20 2f  nt nPos,       /
182d0 2a 20 50 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  * Position list 
182e0 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
182f0 2a 70 42 75 66 20 20 20 20 20 20 20 20 20 20 20  *pBuf           
18300 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62       /* Output b
18310 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66  uffer */.){.  if
18320 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
18330 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  K ){.    int i;.
18340 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
18350 72 6f 28 70 42 75 66 29 3b 0a 20 20 20 20 66 6f  ro(pBuf);.    fo
18360 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 73 65 74  r(i=0; i<pColset
18370 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
18380 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53      const u8 *pS
18390 75 62 20 3d 20 70 50 6f 73 3b 0a 20 20 20 20 20  ub = pPos;.     
183a0 20 69 6e 74 20 6e 53 75 62 20 3d 20 66 74 73 35   int nSub = fts5
183b0 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28  IndexExtractCol(
183c0 26 70 53 75 62 2c 20 6e 50 6f 73 2c 20 70 43 6f  &pSub, nPos, pCo
183d0 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 29 3b  lset->aiCol[i]);
183e0 0a 20 20 20 20 20 20 69 66 28 20 6e 53 75 62 20  .      if( nSub 
183f0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
18400 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
18410 70 52 63 2c 20 70 42 75 66 2c 20 6e 53 75 62 2c  pRc, pBuf, nSub,
18420 20 70 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a   pSub);.      }.
18430 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
18440 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20 63  ** xSetOutputs c
18450 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20  allback used by 
18460 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 74 61 62 6c  detail=none tabl
18470 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
18480 69 64 20 66 74 73 35 49 74 65 72 53 65 74 4f 75  id fts5IterSetOu
18490 74 70 75 74 73 5f 4e 6f 6e 65 28 46 74 73 35 49  tputs_None(Fts5I
184a0 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35  ter *pIter, Fts5
184b0 53 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a  SegIter *pSeg){.
184c0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
184d0 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67  >pIndex->pConfig
184e0 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
184f0 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 20  DETAIL_NONE );. 
18500 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f   pIter->base.iRo
18510 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77  wid = pSeg->iRow
18520 69 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73  id;.  pIter->bas
18530 65 2e 6e 44 61 74 61 20 3d 20 70 53 65 67 2d 3e  e.nData = pSeg->
18540 6e 50 6f 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78  nPos;.}../*.** x
18550 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62  SetOutputs callb
18560 61 63 6b 20 75 73 65 64 20 62 79 20 64 65 74 61  ack used by deta
18570 69 6c 3d 66 75 6c 6c 20 61 6e 64 20 64 65 74 61  il=full and deta
18580 69 6c 3d 63 6f 6c 20 74 61 62 6c 65 73 20 77 68  il=col tables wh
18590 65 6e 20 6e 6f 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  en no.** column 
185a0 66 69 6c 74 65 72 73 20 61 72 65 20 73 70 65 63  filters are spec
185b0 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ified..*/.static
185c0 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65   void fts5IterSe
185d0 74 4f 75 74 70 75 74 73 5f 4e 6f 63 6f 6c 73 65  tOutputs_Nocolse
185e0 74 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  t(Fts5Iter *pIte
185f0 72 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  r, Fts5SegIter *
18600 70 53 65 67 29 7b 0a 20 20 70 49 74 65 72 2d 3e  pSeg){.  pIter->
18610 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53  base.iRowid = pS
18620 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70 49  eg->iRowid;.  pI
18630 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20  ter->base.nData 
18640 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 0a 20  = pSeg->nPos;.. 
18650 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
18660 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d  pIndex->pConfig-
18670 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44  >eDetail!=FTS5_D
18680 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 20 20  ETAIL_NONE );.  
18690 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
186a0 43 6f 6c 73 65 74 3d 3d 30 20 29 3b 0a 0a 20 20  Colset==0 );..  
186b0 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f  if( pSeg->iLeafO
186c0 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73  ffset+pSeg->nPos
186d0 3c 3d 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73  <=pSeg->pLeaf->s
186e0 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20  zLeaf ){.    /* 
186f0 41 6c 6c 20 64 61 74 61 20 69 73 20 73 74 6f 72  All data is stor
18700 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ed on the curren
18710 74 20 70 61 67 65 2e 20 50 6f 70 75 6c 61 74 65  t page. Populate
18720 20 74 68 65 20 6f 75 74 70 75 74 20 0a 20 20 20   the output .   
18730 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 74 6f   ** variables to
18740 20 70 6f 69 6e 74 20 69 6e 74 6f 20 74 68 65 20   point into the 
18750 62 6f 64 79 20 6f 66 20 74 68 65 20 70 61 67 65  body of the page
18760 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20   object. */.    
18770 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74  pIter->base.pDat
18780 61 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66  a = &pSeg->pLeaf
18790 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f  ->p[pSeg->iLeafO
187a0 66 66 73 65 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b  ffset];.  }else{
187b0 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  .    /* The data
187c0 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
187d0 6f 76 65 72 20 74 77 6f 20 6f 72 20 6d 6f 72 65  over two or more
187e0 20 70 61 67 65 73 2e 20 43 6f 70 79 20 69 74 20   pages. Copy it 
187f0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
18800 46 74 73 35 49 74 65 72 2e 70 6f 73 6c 69 73 74  Fts5Iter.poslist
18810 20 62 75 66 66 65 72 20 61 6e 64 20 74 68 65 6e   buffer and then
18820 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   set the output 
18830 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
18840 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  .    ** to this 
18850 62 75 66 66 65 72 2e 20 20 2a 2f 0a 20 20 20 20  buffer.  */.    
18860 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
18870 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
18880 0a 20 20 20 20 66 74 73 35 53 65 67 69 74 65 72  .    fts5Segiter
18890 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d 3e 70  Poslist(pIter->p
188a0 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 30 2c 20  Index, pSeg, 0, 
188b0 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
188c0 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73  ;.    pIter->bas
188d0 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d  e.pData = pIter-
188e0 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 7d 0a  >poslist.p;.  }.
188f0 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74  }../*.** xSetOut
18900 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73  puts callback us
18910 65 64 20 77 68 65 6e 20 74 68 65 20 46 74 73 35  ed when the Fts5
18920 43 6f 6c 73 65 74 20 6f 62 6a 65 63 74 20 68 61  Colset object ha
18930 73 20 6e 43 6f 6c 3d 3d 30 20 28 6d 61 74 63 68  s nCol==0 (match
18940 0a 2a 2a 20 61 67 61 69 6e 73 74 20 6e 6f 20 63  .** against no c
18950 6f 6c 75 6d 6e 73 20 61 74 20 61 6c 6c 29 2e 0a  olumns at all)..
18960 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
18970 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
18980 73 5f 5a 65 72 6f 43 6f 6c 73 65 74 28 46 74 73  s_ZeroColset(Fts
18990 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74  5Iter *pIter, Ft
189a0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29  s5SegIter *pSeg)
189b0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
189c0 28 70 53 65 67 29 3b 0a 20 20 70 49 74 65 72 2d  (pSeg);.  pIter-
189d0 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 30 3b  >base.nData = 0;
189e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75  .}../*.** xSetOu
189f0 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75  tputs callback u
18a00 73 65 64 20 62 79 20 64 65 74 61 69 6c 3d 63 6f  sed by detail=co
18a10 6c 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  l when there is 
18a20 61 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 0a  a column filter.
18a30 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
18a40 20 31 30 30 20 6f 72 20 6d 6f 72 65 20 63 6f 6c   100 or more col
18a50 75 6d 6e 73 2e 20 41 6c 73 6f 20 63 61 6c 6c 65  umns. Also calle
18a60 64 20 61 73 20 61 20 66 61 6c 6c 62 61 63 6b 20  d as a fallback 
18a70 66 72 6f 6d 0a 2a 2a 20 66 74 73 35 49 74 65 72  from.** fts5Iter
18a80 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 31 30  SetOutputs_Col10
18a90 30 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d  0 if the column-
18aa0 6c 69 73 74 20 73 70 61 6e 73 20 6d 6f 72 65 20  list spans more 
18ab0 74 68 61 6e 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  than one page..*
18ac0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
18ad0 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
18ae0 5f 43 6f 6c 28 46 74 73 35 49 74 65 72 20 2a 70  _Col(Fts5Iter *p
18af0 49 74 65 72 2c 20 46 74 73 35 53 65 67 49 74 65  Iter, Fts5SegIte
18b00 72 20 2a 70 53 65 67 29 7b 0a 20 20 66 74 73 35  r *pSeg){.  fts5
18b10 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65  BufferZero(&pIte
18b20 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 66  r->poslist);.  f
18b30 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
18b40 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c  t(pIter->pIndex,
18b50 20 70 53 65 67 2c 20 70 49 74 65 72 2d 3e 70 43   pSeg, pIter->pC
18b60 6f 6c 73 65 74 2c 20 26 70 49 74 65 72 2d 3e 70  olset, &pIter->p
18b70 6f 73 6c 69 73 74 29 3b 0a 20 20 70 49 74 65 72  oslist);.  pIter
18b80 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20  ->base.iRowid = 
18b90 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20  pSeg->iRowid;.  
18ba0 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74  pIter->base.pDat
18bb0 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  a = pIter->posli
18bc0 73 74 2e 70 3b 0a 20 20 70 49 74 65 72 2d 3e 62  st.p;.  pIter->b
18bd0 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 49 74 65  ase.nData = pIte
18be0 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 7d 0a  r->poslist.n;.}.
18bf0 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75  ./*.** xSetOutpu
18c00 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64  ts callback used
18c10 20 77 68 65 6e 3a 20 0a 2a 2a 0a 2a 2a 20 20 20   when: .**.**   
18c20 2a 20 64 65 74 61 69 6c 3d 63 6f 6c 2c 0a 2a 2a  * detail=col,.**
18c30 20 20 20 2a 20 74 68 65 72 65 20 69 73 20 61 20     * there is a 
18c40 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 2c 20 61  column filter, a
18c50 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 74 61  nd.**   * the ta
18c60 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 31 30 30  ble contains 100
18c70 20 6f 72 20 66 65 77 65 72 20 63 6f 6c 75 6d 6e   or fewer column
18c80 73 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 61  s. .**.** The la
18c90 73 74 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 65  st point is to e
18ca0 6e 73 75 72 65 20 61 6c 6c 20 63 6f 6c 75 6d 6e  nsure all column
18cb0 20 6e 75 6d 62 65 72 73 20 61 72 65 20 73 74 6f   numbers are sto
18cc0 72 65 64 20 61 73 20 0a 2a 2a 20 73 69 6e 67 6c  red as .** singl
18cd0 65 2d 62 79 74 65 20 76 61 72 69 6e 74 73 2e 0a  e-byte varints..
18ce0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
18cf0 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
18d00 73 5f 43 6f 6c 31 30 30 28 46 74 73 35 49 74 65  s_Col100(Fts5Ite
18d10 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65  r *pIter, Fts5Se
18d20 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 0a 20  gIter *pSeg){.. 
18d30 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
18d40 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d  pIndex->pConfig-
18d50 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44  >eDetail==FTS5_D
18d60 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20 29 3b  ETAIL_COLUMNS );
18d70 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
18d80 2d 3e 70 43 6f 6c 73 65 74 20 29 3b 0a 0a 20 20  ->pColset );..  
18d90 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f  if( pSeg->iLeafO
18da0 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73  ffset+pSeg->nPos
18db0 3e 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a  >pSeg->pLeaf->sz
18dc0 4c 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35  Leaf ){.    fts5
18dd0 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43  IterSetOutputs_C
18de0 6f 6c 28 70 49 74 65 72 2c 20 70 53 65 67 29 3b  ol(pIter, pSeg);
18df0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38  .  }else{.    u8
18e00 20 2a 61 20 3d 20 28 75 38 2a 29 26 70 53 65 67   *a = (u8*)&pSeg
18e10 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d  ->pLeaf->p[pSeg-
18e20 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20  >iLeafOffset];. 
18e30 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 28 75     u8 *pEnd = (u
18e40 38 2a 29 26 61 5b 70 53 65 67 2d 3e 6e 50 6f 73  8*)&a[pSeg->nPos
18e50 5d 3b 20 0a 20 20 20 20 69 6e 74 20 69 50 72 65  ]; .    int iPre
18e60 76 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 2a  v = 0;.    int *
18e70 61 69 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 70  aiCol = pIter->p
18e80 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 3b 0a 20  Colset->aiCol;. 
18e90 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c 45 6e 64     int *aiColEnd
18ea0 20 3d 20 26 61 69 43 6f 6c 5b 70 49 74 65 72 2d   = &aiCol[pIter-
18eb0 3e 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 5d 3b  >pColset->nCol];
18ec0 0a 0a 20 20 20 20 75 38 20 2a 61 4f 75 74 20 3d  ..    u8 *aOut =
18ed0 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
18ee0 70 3b 0a 20 20 20 20 69 6e 74 20 69 50 72 65 76  p;.    int iPrev
18ef0 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 70 49  Out = 0;..    pI
18f00 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64  ter->base.iRowid
18f10 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b   = pSeg->iRowid;
18f20 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 61 3c 70  ..    while( a<p
18f30 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 69 50 72  End ){.      iPr
18f40 65 76 20 2b 3d 20 28 69 6e 74 29 61 2b 2b 5b 30  ev += (int)a++[0
18f50 5d 20 2d 20 32 3b 0a 20 20 20 20 20 20 77 68 69  ] - 2;.      whi
18f60 6c 65 28 20 2a 61 69 43 6f 6c 3c 69 50 72 65 76  le( *aiCol<iPrev
18f70 20 29 7b 0a 20 20 20 20 20 20 20 20 61 69 43 6f   ){.        aiCo
18f80 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  l++;.        if(
18f90 20 61 69 43 6f 6c 3d 3d 61 69 43 6f 6c 45 6e 64   aiCol==aiColEnd
18fa0 20 29 20 67 6f 74 6f 20 73 65 74 6f 75 74 70 75   ) goto setoutpu
18fb0 74 73 5f 63 6f 6c 5f 6f 75 74 3b 0a 20 20 20 20  ts_col_out;.    
18fc0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 2a 61    }.      if( *a
18fd0 69 43 6f 6c 3d 3d 69 50 72 65 76 20 29 7b 0a 20  iCol==iPrev ){. 
18fe0 20 20 20 20 20 20 20 2a 61 4f 75 74 2b 2b 20 3d         *aOut++ =
18ff0 20 28 75 38 29 28 28 69 50 72 65 76 20 2d 20 69   (u8)((iPrev - i
19000 50 72 65 76 4f 75 74 29 20 2b 20 32 29 3b 0a 20  PrevOut) + 2);. 
19010 20 20 20 20 20 20 20 69 50 72 65 76 4f 75 74 20         iPrevOut 
19020 3d 20 69 50 72 65 76 3b 0a 20 20 20 20 20 20 7d  = iPrev;.      }
19030 0a 20 20 20 20 7d 0a 0a 73 65 74 6f 75 74 70 75  .    }..setoutpu
19040 74 73 5f 63 6f 6c 5f 6f 75 74 3a 0a 20 20 20 20  ts_col_out:.    
19050 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74  pIter->base.pDat
19060 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  a = pIter->posli
19070 73 74 2e 70 3b 0a 20 20 20 20 70 49 74 65 72 2d  st.p;.    pIter-
19080 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 61 4f  >base.nData = aO
19090 75 74 20 2d 20 70 49 74 65 72 2d 3e 70 6f 73 6c  ut - pIter->posl
190a0 69 73 74 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ist.p;.  }.}../*
190b0 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20  .** xSetOutputs 
190c0 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79  callback used by
190d0 20 64 65 74 61 69 6c 3d 66 75 6c 6c 20 77 68 65   detail=full whe
190e0 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6c  n there is a col
190f0 75 6d 6e 20 66 69 6c 74 65 72 2e 0a 2a 2f 0a 73  umn filter..*/.s
19100 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
19110 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 46 75  terSetOutputs_Fu
19120 6c 6c 28 46 74 73 35 49 74 65 72 20 2a 70 49 74  ll(Fts5Iter *pIt
19130 65 72 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  er, Fts5SegIter 
19140 2a 70 53 65 67 29 7b 0a 20 20 46 74 73 35 43 6f  *pSeg){.  Fts5Co
19150 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 20 3d 20  lset *pColset = 
19160 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 3b 0a  pIter->pColset;.
19170 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52    pIter->base.iR
19180 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f  owid = pSeg->iRo
19190 77 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  wid;..  assert( 
191a0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70  pIter->pIndex->p
191b0 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d  Config->eDetail=
191c0 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c  =FTS5_DETAIL_FUL
191d0 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  L );.  assert( p
191e0 43 6f 6c 73 65 74 20 29 3b 0a 0a 20 20 69 66 28  Colset );..  if(
191f0 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73   pSeg->iLeafOffs
19200 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70  et+pSeg->nPos<=p
19210 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  Seg->pLeaf->szLe
19220 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c  af ){.    /* All
19230 20 64 61 74 61 20 69 73 20 73 74 6f 72 65 64 20   data is stored 
19240 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
19250 61 67 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  age. Populate th
19260 65 20 6f 75 74 70 75 74 20 0a 20 20 20 20 2a 2a  e output .    **
19270 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 70 6f   variables to po
19280 69 6e 74 20 69 6e 74 6f 20 74 68 65 20 62 6f 64  int into the bod
19290 79 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 62  y of the page ob
192a0 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e  ject. */.    con
192b0 73 74 20 75 38 20 2a 61 20 3d 20 26 70 53 65 67  st u8 *a = &pSeg
192c0 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d  ->pLeaf->p[pSeg-
192d0 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20  >iLeafOffset];. 
192e0 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74 2d 3e     if( pColset->
192f0 6e 43 6f 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nCol==1 ){.     
19300 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61   pIter->base.nDa
19310 74 61 20 3d 20 66 74 73 35 49 6e 64 65 78 45 78  ta = fts5IndexEx
19320 74 72 61 63 74 43 6f 6c 28 26 61 2c 20 70 53 65  tractCol(&a, pSe
19330 67 2d 3e 6e 50 6f 73 2c 70 43 6f 6c 73 65 74 2d  g->nPos,pColset-
19340 3e 61 69 43 6f 6c 5b 30 5d 29 3b 0a 20 20 20 20  >aiCol[0]);.    
19350 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44    pIter->base.pD
19360 61 74 61 20 3d 20 61 3b 0a 20 20 20 20 7d 65 6c  ata = a;.    }el
19370 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 70  se{.      int *p
19380 52 63 20 3d 20 26 70 49 74 65 72 2d 3e 70 49 6e  Rc = &pIter->pIn
19390 64 65 78 2d 3e 72 63 3b 0a 20 20 20 20 20 20 66  dex->rc;.      f
193a0 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
193b0 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a  Iter->poslist);.
193c0 20 20 20 20 20 20 66 74 73 35 49 6e 64 65 78 45        fts5IndexE
193d0 78 74 72 61 63 74 43 6f 6c 73 65 74 28 70 52 63  xtractColset(pRc
193e0 2c 20 70 43 6f 6c 73 65 74 2c 20 61 2c 20 70 53  , pColset, a, pS
193f0 65 67 2d 3e 6e 50 6f 73 2c 20 26 70 49 74 65 72  eg->nPos, &pIter
19400 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  ->poslist);.    
19410 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44    pIter->base.pD
19420 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73  ata = pIter->pos
19430 6c 69 73 74 2e 70 3b 0a 20 20 20 20 20 20 70 49  list.p;.      pI
19440 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20  ter->base.nData 
19450 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  = pIter->poslist
19460 2e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  .n;.    }.  }els
19470 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 61  e{.    /* The da
19480 74 61 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ta is distribute
19490 64 20 6f 76 65 72 20 74 77 6f 20 6f 72 20 6d 6f  d over two or mo
194a0 72 65 20 70 61 67 65 73 2e 20 43 6f 70 79 20 69  re pages. Copy i
194b0 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a  t into the.    *
194c0 2a 20 46 74 73 35 49 74 65 72 2e 70 6f 73 6c 69  * Fts5Iter.posli
194d0 73 74 20 62 75 66 66 65 72 20 61 6e 64 20 74 68  st buffer and th
194e0 65 6e 20 73 65 74 20 74 68 65 20 6f 75 74 70 75  en set the outpu
194f0 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69  t pointer to poi
19500 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 69  nt.    ** to thi
19510 73 20 62 75 66 66 65 72 2e 20 20 2a 2f 0a 20 20  s buffer.  */.  
19520 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
19530 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  (&pIter->poslist
19540 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67 69 74  );.    fts5Segit
19550 65 72 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d  erPoslist(pIter-
19560 3e 70 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 70  >pIndex, pSeg, p
19570 43 6f 6c 73 65 74 2c 20 26 70 49 74 65 72 2d 3e  Colset, &pIter->
19580 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 70 49  poslist);.    pI
19590 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20  ter->base.pData 
195a0 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  = pIter->poslist
195b0 2e 70 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62  .p;.    pIter->b
195c0 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 49 74 65  ase.nData = pIte
195d0 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20  r->poslist.n;.  
195e0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
195f0 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
19600 75 74 43 62 28 69 6e 74 20 2a 70 52 63 2c 20 46  utCb(int *pRc, F
19610 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b  ts5Iter *pIter){
19620 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
19630 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
19640 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
19650 67 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  g = pIter->pInde
19660 78 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  x->pConfig;.    
19670 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65  if( pConfig->eDe
19680 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
19690 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  L_NONE ){.      
196a0 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75  pIter->xSetOutpu
196b0 74 73 20 3d 20 66 74 73 35 49 74 65 72 53 65 74  ts = fts5IterSet
196c0 4f 75 74 70 75 74 73 5f 4e 6f 6e 65 3b 0a 20 20  Outputs_None;.  
196d0 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65 20 69 66    }..    else if
196e0 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74  ( pIter->pColset
196f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 74  ==0 ){.      pIt
19700 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20  er->xSetOutputs 
19710 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  = fts5IterSetOut
19720 70 75 74 73 5f 4e 6f 63 6f 6c 73 65 74 3b 0a 20  puts_Nocolset;. 
19730 20 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65 20 69     }..    else i
19740 66 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65  f( pIter->pColse
19750 74 2d 3e 6e 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  t->nCol==0 ){.  
19760 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f      pIter->xSetO
19770 75 74 70 75 74 73 20 3d 20 66 74 73 35 49 74 65  utputs = fts5Ite
19780 72 53 65 74 4f 75 74 70 75 74 73 5f 5a 65 72 6f  rSetOutputs_Zero
19790 43 6f 6c 73 65 74 3b 0a 20 20 20 20 7d 0a 0a 20  Colset;.    }.. 
197a0 20 20 20 65 6c 73 65 20 69 66 28 20 70 43 6f 6e     else if( pCon
197b0 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54  fig->eDetail==FT
197c0 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29  S5_DETAIL_FULL )
197d0 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78  {.      pIter->x
197e0 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73  SetOutputs = fts
197f0 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
19800 46 75 6c 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Full;.    }..   
19810 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73   else{.      ass
19820 65 72 74 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44  ert( pConfig->eD
19830 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41  etail==FTS5_DETA
19840 49 4c 5f 43 4f 4c 55 4d 4e 53 20 29 3b 0a 20 20  IL_COLUMNS );.  
19850 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d      if( pConfig-
19860 3e 6e 43 6f 6c 3c 3d 31 30 30 20 29 7b 0a 20 20  >nCol<=100 ){.  
19870 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65        pIter->xSe
19880 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35 49  tOutputs = fts5I
19890 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f  terSetOutputs_Co
198a0 6c 31 30 30 3b 0a 20 20 20 20 20 20 20 20 73 71  l100;.        sq
198b0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
198c0 69 7a 65 28 70 52 63 2c 20 26 70 49 74 65 72 2d  ize(pRc, &pIter-
198d0 3e 70 6f 73 6c 69 73 74 2c 20 70 43 6f 6e 66 69  >poslist, pConfi
198e0 67 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  g->nCol);.      
198f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
19900 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74  Iter->xSetOutput
19910 73 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f  s = fts5IterSetO
19920 75 74 70 75 74 73 5f 43 6f 6c 3b 0a 20 20 20 20  utputs_Col;.    
19930 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
19940 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
19950 20 61 20 6e 65 77 20 46 74 73 35 49 74 65 72 20   a new Fts5Iter 
19960 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
19970 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69 6c  e new object wil
19980 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65  l be used to ite
19990 72 61 74 65 20 74 68 72 6f 75 67 68 20 64 61 74  rate through dat
199a0 61 20 69 6e 20 73 74 72 75 63 74 75 72 65 20 70  a in structure p
199b0 53 74 72 75 63 74 2e 0a 2a 2a 20 49 66 20 69 4c  Struct..** If iL
199c0 65 76 65 6c 20 69 73 20 2d 76 65 2c 20 74 68 65  evel is -ve, the
199d0 6e 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 61 6c  n all data in al
199e0 6c 20 73 65 67 6d 65 6e 74 73 20 69 73 20 6d 65  l segments is me
199f0 72 67 65 64 2e 20 4f 72 2c 20 69 66 20 69 4c 65  rged. Or, if iLe
19a00 76 65 6c 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 6f  vel.** is zero o
19a10 72 20 67 72 65 61 74 65 72 2c 20 64 61 74 61 20  r greater, data 
19a20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 6e  from the first n
19a30 53 65 67 6d 65 6e 74 20 73 65 67 6d 65 6e 74 73  Segment segments
19a40 20 6f 6e 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c   on level iLevel
19a50 0a 2a 2a 20 69 73 20 6d 65 72 67 65 64 2e 0a 2a  .** is merged..*
19a60 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f  *.** The iterato
19a70 72 20 69 6e 69 74 69 61 6c 6c 79 20 70 6f 69 6e  r initially poin
19a80 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
19a90 74 65 72 6d 2f 72 6f 77 69 64 20 65 6e 74 72 79  term/rowid entry
19aa0 20 69 6e 20 74 68 65 20 0a 2a 2a 20 69 74 65 72   in the .** iter
19ab0 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ated data..*/.st
19ac0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
19ad0 6c 74 69 49 74 65 72 4e 65 77 28 0a 20 20 46 74  ltiIterNew(.  Ft
19ae0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
19af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19b00 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f   FTS5 backend to
19b10 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20   iterate within 
19b20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
19b30 72 65 20 2a 70 53 74 72 75 63 74 2c 20 20 20 20  re *pStruct,    
19b40 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75 72       /* Structur
19b50 65 20 6f 66 20 73 70 65 63 69 66 69 63 20 69 6e  e of specific in
19b60 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  dex */.  int fla
19b70 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
19b80 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
19b90 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 58 58 20  INDEX_QUERY_XXX 
19ba0 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 43  flags */.  Fts5C
19bb0 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20  olset *pColset, 
19bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
19bd0 6c 73 65 74 20 74 6f 20 66 69 6c 74 65 72 20 6f  lset to filter o
19be0 6e 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20  n (or NULL) */. 
19bf0 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
19c00 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20  , int nTerm,    
19c10 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b   /* Term to seek
19c20 20 74 6f 20 28 6f 72 20 4e 55 4c 4c 2f 30 29 20   to (or NULL/0) 
19c30 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c  */.  int iLevel,
19c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c50 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f       /* Level to
19c60 20 69 74 65 72 61 74 65 20 28 2d 31 20 66 6f 72   iterate (-1 for
19c70 20 61 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e   all) */.  int n
19c80 53 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 20 20  Segment,        
19c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19ca0 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
19cb0 20 74 6f 20 6d 65 72 67 65 20 28 69 4c 65 76 65   to merge (iLeve
19cc0 6c 3e 3d 30 29 20 2a 2f 0a 20 20 46 74 73 35 49  l>=0) */.  Fts5I
19cd0 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20 20 20  ter **ppOut     
19ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
19cf0 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  w object */.){. 
19d00 20 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b 20 20   int nSeg = 0;  
19d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65   /* Number of se
19d30 67 6d 65 6e 74 2d 69 74 65 72 73 20 69 6e 20 75  gment-iters in u
19d40 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 74 65  se */.  int iIte
19d50 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
19d60 20 20 20 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20          /* */.  
19d70 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20 20 20  int iSeg;       
19d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d90 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
19da0 74 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65  te through segme
19db0 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  nts */.  Fts5Str
19dc0 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
19dd0 6c 3b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  l;.  Fts5Iter *p
19de0 4e 65 77 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  New;..  assert( 
19df0 28 70 54 65 72 6d 3d 3d 30 20 26 26 20 6e 54 65  (pTerm==0 && nTe
19e00 72 6d 3d 3d 30 29 20 7c 7c 20 69 4c 65 76 65 6c  rm==0) || iLevel
19e10 3c 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  <0 );..  /* Allo
19e20 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
19e30 68 65 20 6e 65 77 20 6d 75 6c 74 69 2d 73 65 67  he new multi-seg
19e40 2d 69 74 65 72 61 74 6f 72 2e 20 2a 2f 0a 20 20  -iterator. */.  
19e50 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
19e60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
19e70 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20  iLevel<0 ){.    
19e80 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
19e90 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73  t->nSegment==fts
19ea0 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
19eb0 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29  egments(pStruct)
19ec0 20 29 3b 0a 20 20 20 20 20 20 6e 53 65 67 20 3d   );.      nSeg =
19ed0 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
19ee0 6e 74 3b 0a 20 20 20 20 20 20 6e 53 65 67 20 2b  nt;.      nSeg +
19ef0 3d 20 28 70 2d 3e 70 48 61 73 68 20 3f 20 31 20  = (p->pHash ? 1 
19f00 3a 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  : 0);.    }else{
19f10 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20 4d 49  .      nSeg = MI
19f20 4e 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  N(pStruct->aLeve
19f30 6c 5b 69 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c 20  l[iLevel].nSeg, 
19f40 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 7d  nSegment);.    }
19f50 0a 20 20 7d 0a 20 20 2a 70 70 4f 75 74 20 3d 20  .  }.  *ppOut = 
19f60 70 4e 65 77 20 3d 20 66 74 73 35 4d 75 6c 74 69  pNew = fts5Multi
19f70 49 74 65 72 41 6c 6c 6f 63 28 70 2c 20 6e 53 65  IterAlloc(p, nSe
19f80 67 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d  g);.  if( pNew==
19f90 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4e  0 ) return;.  pN
19fa0 65 77 2d 3e 62 52 65 76 20 3d 20 28 30 21 3d 28  ew->bRev = (0!=(
19fb0 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
19fc0 58 5f 51 55 45 52 59 5f 44 45 53 43 29 29 3b 0a  X_QUERY_DESC));.
19fd0 20 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70    pNew->bSkipEmp
19fe0 74 79 20 3d 20 28 30 21 3d 28 66 6c 61 67 73 20  ty = (0!=(flags 
19ff0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
1a000 59 5f 53 4b 49 50 45 4d 50 54 59 29 29 3b 0a 20  Y_SKIPEMPTY));. 
1a010 20 70 4e 65 77 2d 3e 70 43 6f 6c 73 65 74 20 3d   pNew->pColset =
1a020 20 70 43 6f 6c 73 65 74 3b 0a 20 20 69 66 28 20   pColset;.  if( 
1a030 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
1a040 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55  EX_QUERY_NOOUTPU
1a050 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73  T)==0 ){.    fts
1a060 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 43 62  5IterSetOutputCb
1a070 28 26 70 2d 3e 72 63 2c 20 70 4e 65 77 29 3b 0a  (&p->rc, pNew);.
1a080 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
1a090 6c 69 7a 65 20 65 61 63 68 20 6f 66 20 74 68 65  lize each of the
1a0a0 20 63 6f 6d 70 6f 6e 65 6e 74 20 73 65 67 6d 65   component segme
1a0b0 6e 74 20 69 74 65 72 61 74 6f 72 73 2e 20 2a 2f  nt iterators. */
1a0c0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1a0d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1a0e0 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20  f( iLevel<0 ){. 
1a0f0 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
1a100 72 65 4c 65 76 65 6c 20 2a 70 45 6e 64 20 3d 20  reLevel *pEnd = 
1a110 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
1a120 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  [pStruct->nLevel
1a130 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ];.      if( p->
1a140 70 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20  pHash ){.       
1a150 20 2f 2a 20 41 64 64 20 61 20 73 65 67 6d 65 6e   /* Add a segmen
1a160 74 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 74  t iterator for t
1a170 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
1a180 6e 74 73 20 6f 66 20 74 68 65 20 68 61 73 68 20  nts of the hash 
1a190 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  table. */.      
1a1a0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
1a1b0 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53  Iter = &pNew->aS
1a1c0 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20  eg[iIter++];.   
1a1d0 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
1a1e0 48 61 73 68 49 6e 69 74 28 70 2c 20 70 54 65 72  HashInit(p, pTer
1a1f0 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c  m, nTerm, flags,
1a200 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   pIter);.      }
1a210 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 76 6c 3d  .      for(pLvl=
1a220 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
1a230 5b 30 5d 3b 20 70 4c 76 6c 3c 70 45 6e 64 3b 20  [0]; pLvl<pEnd; 
1a240 70 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pLvl++){.       
1a250 20 66 6f 72 28 69 53 65 67 3d 70 4c 76 6c 2d 3e   for(iSeg=pLvl->
1a260 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b  nSeg-1; iSeg>=0;
1a270 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20   iSeg--){.      
1a280 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
1a290 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
1a2a0 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65   &pLvl->aSeg[iSe
1a2b0 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 46 74  g];.          Ft
1a2c0 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
1a2d0 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69   = &pNew->aSeg[i
1a2e0 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20  Iter++];.       
1a2f0 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
1a300 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
1a310 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28 70  ts5SegIterInit(p
1a320 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a  , pSeg, pIter);.
1a330 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1a340 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
1a350 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74  5SegIterSeekInit
1a360 28 70 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d  (p, pTerm, nTerm
1a370 2c 20 66 6c 61 67 73 2c 20 70 53 65 67 2c 20 70  , flags, pSeg, p
1a380 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Iter);.         
1a390 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1a3a0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1a3b0 20 20 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53        pLvl = &pS
1a3c0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
1a3d0 65 76 65 6c 5d 3b 0a 20 20 20 20 20 20 66 6f 72  evel];.      for
1a3e0 28 69 53 65 67 3d 6e 53 65 67 2d 31 3b 20 69 53  (iSeg=nSeg-1; iS
1a3f0 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a  eg>=0; iSeg--){.
1a400 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
1a410 74 65 72 49 6e 69 74 28 70 2c 20 26 70 4c 76 6c  terInit(p, &pLvl
1a420 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2c 20 26 70  ->aSeg[iSeg], &p
1a430 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b  New->aSeg[iIter+
1a440 2b 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +]);.      }.   
1a450 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69   }.    assert( i
1a460 49 74 65 72 3d 3d 6e 53 65 67 20 29 3b 0a 20 20  Iter==nSeg );.  
1a470 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  }..  /* If the a
1a480 62 6f 76 65 20 77 61 73 20 73 75 63 63 65 73 73  bove was success
1a490 66 75 6c 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e  ful, each compon
1a4a0 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 6e 6f  ent iterators no
1a4b0 77 20 70 6f 69 6e 74 73 20 0a 20 20 2a 2a 20 74  w points .  ** t
1a4c0 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
1a4d0 79 20 69 6e 20 69 74 73 20 73 65 67 6d 65 6e 74  y in its segment
1a4e0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
1a4f0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 0a 20  nitialize the . 
1a500 20 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72   ** aFirst[] arr
1a510 61 79 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  ay. Or, if an er
1a520 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
1a530 2c 20 66 72 65 65 20 74 68 65 20 69 74 65 72 61  , free the itera
1a540 74 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20  tor.  ** object 
1a550 61 6e 64 20 73 65 74 20 74 68 65 20 6f 75 74 70  and set the outp
1a560 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e  ut variable to N
1a570 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ULL.  */.  if( p
1a580 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1a590 29 7b 0a 20 20 20 20 66 6f 72 28 69 49 74 65 72  ){.    for(iIter
1a5a0 3d 70 4e 65 77 2d 3e 6e 53 65 67 2d 31 3b 20 69  =pNew->nSeg-1; i
1a5b0 49 74 65 72 3e 30 3b 20 69 49 74 65 72 2d 2d 29  Iter>0; iIter--)
1a5c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 45 71 3b  {.      int iEq;
1a5d0 0a 20 20 20 20 20 20 69 66 28 20 28 69 45 71 20  .      if( (iEq 
1a5e0 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44  = fts5MultiIterD
1a5f0 6f 43 6f 6d 70 61 72 65 28 70 4e 65 77 2c 20 69  oCompare(pNew, i
1a600 49 74 65 72 29 29 20 29 7b 0a 20 20 20 20 20 20  Iter)) ){.      
1a610 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
1a620 53 65 67 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65  Seg = &pNew->aSe
1a630 67 5b 69 45 71 5d 3b 0a 20 20 20 20 20 20 20 20  g[iEq];.        
1a640 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1a650 45 5f 4f 4b 20 29 20 70 53 65 67 2d 3e 78 4e 65  E_OK ) pSeg->xNe
1a660 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29 3b 0a  xt(p, pSeg, 0);.
1a670 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
1a680 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c  iIterAdvanced(p,
1a690 20 70 4e 65 77 2c 20 69 45 71 2c 20 69 49 74 65   pNew, iEq, iIte
1a6a0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
1a6b0 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  }.    fts5MultiI
1a6c0 74 65 72 53 65 74 45 6f 66 28 70 4e 65 77 29 3b  terSetEof(pNew);
1a6d0 0a 20 20 20 20 66 74 73 35 41 73 73 65 72 74 4d  .    fts5AssertM
1a6e0 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 70 2c  ultiIterSetup(p,
1a6f0 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28   pNew);..    if(
1a700 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74   pNew->bSkipEmpt
1a710 79 20 26 26 20 66 74 73 35 4d 75 6c 74 69 49 74  y && fts5MultiIt
1a720 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70 4e 65  erIsEmpty(p, pNe
1a730 77 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  w) ){.      fts5
1a740 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
1a750 20 70 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20   pNew, 0, 0);.  
1a760 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 65 77    }else if( pNew
1a770 2d 3e 62 61 73 65 2e 62 45 6f 66 3d 3d 30 20 29  ->base.bEof==0 )
1a780 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  {.      Fts5SegI
1a790 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 4e 65  ter *pSeg = &pNe
1a7a0 77 2d 3e 61 53 65 67 5b 70 4e 65 77 2d 3e 61 46  w->aSeg[pNew->aF
1a7b0 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b  irst[1].iFirst];
1a7c0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 53 65  .      pNew->xSe
1a7d0 74 4f 75 74 70 75 74 73 28 70 4e 65 77 2c 20 70  tOutputs(pNew, p
1a7e0 53 65 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  Seg);.    }..  }
1a7f0 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 4d 75  else{.    fts5Mu
1a800 6c 74 69 49 74 65 72 46 72 65 65 28 70 4e 65 77  ltiIterFree(pNew
1a810 29 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20  );.    *ppOut = 
1a820 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
1a830 43 72 65 61 74 65 20 61 6e 20 46 74 73 35 49 74  Create an Fts5It
1a840 65 72 20 74 68 61 74 20 69 74 65 72 61 74 65 73  er that iterates
1a850 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 6f 63   through the doc
1a860 6c 69 73 74 20 70 72 6f 76 69 64 65 64 0a 2a 2a  list provided.**
1a870 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
1a880 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
1a890 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
1a8a0 69 49 74 65 72 4e 65 77 32 28 0a 20 20 46 74 73  iIterNew2(.  Fts
1a8b0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a8d0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20  FTS5 backend to 
1a8e0 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a  iterate within *
1a8f0 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  /.  Fts5Data *pD
1a900 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
1a910 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 74      /* Doclist t
1a920 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
1a930 68 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63  h */.  int bDesc
1a940 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a950 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
1a960 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f  or descending ro
1a970 77 69 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 46  wid order */.  F
1a980 74 73 35 49 74 65 72 20 2a 2a 70 70 4f 75 74 20  ts5Iter **ppOut 
1a990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a9a0 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a  * New object */.
1a9b0 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  ){.  Fts5Iter *p
1a9c0 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 66 74  New;.  pNew = ft
1a9d0 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63  s5MultiIterAlloc
1a9e0 28 70 2c 20 32 29 3b 0a 20 20 69 66 28 20 70 4e  (p, 2);.  if( pN
1a9f0 65 77 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65  ew ){.    Fts5Se
1aa00 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26  gIter *pIter = &
1aa10 70 4e 65 77 2d 3e 61 53 65 67 5b 31 5d 3b 0a 0a  pNew->aSeg[1];..
1aa20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73      pIter->flags
1aa30 20 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   = FTS5_SEGITER_
1aa40 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28  ONETERM;.    if(
1aa50 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 3e 30   pData->szLeaf>0
1aa60 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
1aa70 3e 70 4c 65 61 66 20 3d 20 70 44 61 74 61 3b 0a  >pLeaf = pData;.
1aa80 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
1aa90 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47  afOffset = fts5G
1aaa0 65 74 56 61 72 69 6e 74 28 70 44 61 74 61 2d 3e  etVarint(pData->
1aab0 70 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  p, (u64*)&pIter-
1aac0 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  >iRowid);.      
1aad0 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
1aae0 6c 69 73 74 20 3d 20 70 44 61 74 61 2d 3e 6e 6e  list = pData->nn
1aaf0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 46  ;.      pNew->aF
1ab00 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 3d  irst[1].iFirst =
1ab10 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44   1;.      if( bD
1ab20 65 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70  esc ){.        p
1ab30 4e 65 77 2d 3e 62 52 65 76 20 3d 20 31 3b 0a 20  New->bRev = 1;. 
1ab40 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c         pIter->fl
1ab50 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49  ags |= FTS5_SEGI
1ab60 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20  TER_REVERSE;.   
1ab70 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
1ab80 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28  ReverseInitPage(
1ab90 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
1aba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1abb0 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
1abc0 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
1abd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44 61       }.      pDa
1abe0 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ta = 0;.    }els
1abf0 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 62  e{.      pNew->b
1ac00 61 73 65 2e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  ase.bEof = 1;.  
1ac10 20 20 7d 0a 20 20 20 20 66 74 73 35 53 65 67 49    }.    fts5SegI
1ac20 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20 70 49  terSetNext(p, pI
1ac30 74 65 72 29 3b 0a 0a 20 20 20 20 2a 70 70 4f 75  ter);..    *ppOu
1ac40 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20  t = pNew;.  }.. 
1ac50 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
1ac60 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pData);.}../*.*
1ac70 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1ac80 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
1ac90 20 61 74 20 45 4f 46 20 6f 72 20 69 66 20 61 6e   at EOF or if an
1aca0 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
1acb0 72 65 64 2e 20 0a 2a 2a 20 46 61 6c 73 65 20 6f  red. .** False o
1acc0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
1acd0 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74  tic int fts5Mult
1ace0 69 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64  iIterEof(Fts5Ind
1acf0 65 78 20 2a 70 2c 20 46 74 73 35 49 74 65 72 20  ex *p, Fts5Iter 
1ad00 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72  *pIter){.  asser
1ad10 74 28 20 70 2d 3e 72 63 20 0a 20 20 20 20 20 20  t( p->rc .      
1ad20 7c 7c 20 28 70 49 74 65 72 2d 3e 61 53 65 67 5b  || (pIter->aSeg[
1ad30 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
1ad40 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66  ].iFirst ].pLeaf
1ad50 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62 61 73  ==0)==pIter->bas
1ad60 65 2e 62 45 6f 66 20 0a 20 20 29 3b 0a 20 20 72  e.bEof .  );.  r
1ad70 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20  eturn (p->rc || 
1ad80 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66  pIter->base.bEof
1ad90 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1ada0 72 6e 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  rn the rowid of 
1adb0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
1adc0 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
1add0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  ently points.** 
1ade0 74 6f 2e 20 49 66 20 74 68 65 20 69 74 65 72 61  to. If the itera
1adf0 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f  tor points to EO
1ae00 46 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  F when this func
1ae10 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
1ae20 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 61 72  he.** results ar
1ae30 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  e undefined..*/.
1ae40 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35 4d  static i64 fts5M
1ae50 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 46 74  ultiIterRowid(Ft
1ae60 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  s5Iter *pIter){.
1ae70 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
1ae80 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
1ae90 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
1aea0 2e 70 4c 65 61 66 20 29 3b 0a 20 20 72 65 74 75  .pLeaf );.  retu
1aeb0 72 6e 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  rn pIter->aSeg[ 
1aec0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
1aed0 2e 69 46 69 72 73 74 20 5d 2e 69 52 6f 77 69 64  .iFirst ].iRowid
1aee0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
1aef0 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20  the iterator to 
1af00 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 61  the next entry a
1af10 74 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  t or following i
1af20 4d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  Match..*/.static
1af30 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
1af40 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46  terNextFrom(.  F
1af50 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1af60 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c  Fts5Iter *pIter,
1af70 20 0a 20 20 69 36 34 20 69 4d 61 74 63 68 0a 29   .  i64 iMatch.)
1af80 7b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  {.  while( 1 ){.
1af90 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a      i64 iRowid;.
1afa0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
1afb0 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20  rNext(p, pIter, 
1afc0 31 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 20 20  1, iMatch);.    
1afd0 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65  if( fts5MultiIte
1afe0 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29  rEof(p, pIter) )
1aff0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 52 6f 77   break;.    iRow
1b000 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  id = fts5MultiIt
1b010 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a  erRowid(pIter);.
1b020 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62      if( pIter->b
1b030 52 65 76 3d 3d 30 20 26 26 20 69 52 6f 77 69 64  Rev==0 && iRowid
1b040 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b  >=iMatch ) break
1b050 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
1b060 3e 62 52 65 76 21 3d 30 20 26 26 20 69 52 6f 77  >bRev!=0 && iRow
1b070 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65  id<=iMatch ) bre
1b080 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ak;.  }.}../*.**
1b090 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1b0a0 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  r to a buffer co
1b0b0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 72  ntaining the ter
1b0c0 6d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  m associated wit
1b0d0 68 20 74 68 65 20 0a 2a 2a 20 65 6e 74 72 79 20  h the .** entry 
1b0e0 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f  that the iterato
1b0f0 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
1b100 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  ts to..*/.static
1b110 20 63 6f 6e 73 74 20 75 38 20 2a 66 74 73 35 4d   const u8 *fts5M
1b120 75 6c 74 69 49 74 65 72 54 65 72 6d 28 46 74 73  ultiIterTerm(Fts
1b130 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e  5Iter *pIter, in
1b140 74 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35 53 65  t *pn){.  Fts5Se
1b150 67 49 74 65 72 20 2a 70 20 3d 20 26 70 49 74 65  gIter *p = &pIte
1b160 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
1b170 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
1b180 20 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d 3e 74   ];.  *pn = p->t
1b190 65 72 6d 2e 6e 3b 0a 20 20 72 65 74 75 72 6e 20  erm.n;.  return 
1b1a0 70 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a 2f 2a  p->term.p;.}../*
1b1b0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
1b1c0 65 77 20 73 65 67 6d 65 6e 74 2d 69 64 20 66 6f  ew segment-id fo
1b1d0 72 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  r the structure 
1b1e0 70 53 74 72 75 63 74 2e 20 54 68 65 20 6e 65 77  pStruct. The new
1b1f0 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 69 64 20 6d   segment.** id m
1b200 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 31  ust be between 1
1b210 20 61 6e 64 20 36 35 33 33 35 20 69 6e 63 6c 75   and 65335 inclu
1b220 73 69 76 65 2c 20 61 6e 64 20 6d 75 73 74 20 6e  sive, and must n
1b230 6f 74 20 62 65 20 75 73 65 64 20 62 79 20 0a 2a  ot be used by .*
1b240 2a 20 61 6e 79 20 63 75 72 72 65 6e 74 6c 79 20  * any currently 
1b250 65 78 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74  existing segment
1b260 2e 20 49 66 20 61 20 66 72 65 65 20 73 65 67 6d  . If a free segm
1b270 65 6e 74 20 69 64 20 63 61 6e 6e 6f 74 20 62 65  ent id cannot be
1b280 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54   found,.** SQLIT
1b290 45 5f 46 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  E_FULL is return
1b2a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
1b2b0 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
1b2c0 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
1b2d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
1b2e0 6f 2d 6f 70 2e 20 30 20 69 73 20 0a 2a 2a 20 72  o-op. 0 is .** r
1b2f0 65 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20  eturned in this 
1b300 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
1b310 69 6e 74 20 66 74 73 35 41 6c 6c 6f 63 61 74 65  int fts5Allocate
1b320 53 65 67 69 64 28 46 74 73 35 49 6e 64 65 78 20  Segid(Fts5Index 
1b330 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74 75 72  *p, Fts5Structur
1b340 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
1b350 6e 74 20 69 53 65 67 69 64 20 3d 20 30 3b 0a 0a  nt iSegid = 0;..
1b360 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1b370 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1b380 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ( pStruct->nSegm
1b390 65 6e 74 3e 3d 46 54 53 35 5f 4d 41 58 5f 53 45  ent>=FTS5_MAX_SE
1b3a0 47 4d 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 70  GMENT ){.      p
1b3b0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55  ->rc = SQLITE_FU
1b3c0 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  LL;.    }else{. 
1b3d0 20 20 20 20 20 2f 2a 20 46 54 53 35 5f 4d 41 58       /* FTS5_MAX
1b3e0 5f 53 45 47 4d 45 4e 54 20 69 73 20 63 75 72 72  _SEGMENT is curr
1b3f0 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 61 73  ently defined as
1b400 20 32 30 30 30 2e 20 53 6f 20 74 68 65 20 66 6f   2000. So the fo
1b410 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a  llowing.      **
1b420 20 61 72 72 61 79 20 69 73 20 36 33 20 65 6c 65   array is 63 ele
1b430 6d 65 6e 74 73 2c 20 6f 72 20 32 35 32 20 62 79  ments, or 252 by
1b440 74 65 73 2c 20 69 6e 20 73 69 7a 65 2e 20 20 2a  tes, in size.  *
1b450 2f 0a 20 20 20 20 20 20 75 33 32 20 61 55 73 65  /.      u32 aUse
1b460 64 5b 28 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d  d[(FTS5_MAX_SEGM
1b470 45 4e 54 2b 33 31 29 20 2f 20 33 32 5d 3b 0a 20  ENT+31) / 32];. 
1b480 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69       int iLvl, i
1b490 53 65 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Seg;.      int i
1b4a0 3b 0a 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b  ;.      u32 mask
1b4b0 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61  ;.      memset(a
1b4c0 55 73 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Used, 0, sizeof(
1b4d0 61 55 73 65 64 29 29 3b 0a 20 20 20 20 20 20 66  aUsed));.      f
1b4e0 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
1b4f0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
1b500 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
1b510 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
1b520 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  eg<pStruct->aLev
1b530 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69  el[iLvl].nSeg; i
1b540 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
1b550 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53 74 72    int iId = pStr
1b560 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
1b570 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65  ].aSeg[iSeg].iSe
1b580 67 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 69  gid;.          i
1b590 66 28 20 69 49 64 3c 3d 46 54 53 35 5f 4d 41 58  f( iId<=FTS5_MAX
1b5a0 5f 53 45 47 4d 45 4e 54 20 26 26 20 69 49 64 3e  _SEGMENT && iId>
1b5b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1b5c0 20 61 55 73 65 64 5b 28 69 49 64 2d 31 29 20 2f   aUsed[(iId-1) /
1b5d0 20 33 32 5d 20 7c 3d 20 28 75 33 32 29 31 20 3c   32] |= (u32)1 <
1b5e0 3c 20 28 28 69 49 64 2d 31 29 20 25 20 33 32 29  < ((iId-1) % 32)
1b5f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1b600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1b610 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1b620 61 55 73 65 64 5b 69 5d 3d 3d 30 78 46 46 46 46  aUsed[i]==0xFFFF
1b630 46 46 46 46 3b 20 69 2b 2b 29 3b 0a 20 20 20 20  FFFF; i++);.    
1b640 20 20 6d 61 73 6b 20 3d 20 61 55 73 65 64 5b 69    mask = aUsed[i
1b650 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65  ];.      for(iSe
1b660 67 69 64 3d 30 3b 20 6d 61 73 6b 20 26 20 28 28  gid=0; mask & ((
1b670 75 33 32 29 31 20 3c 3c 20 69 53 65 67 69 64 29  u32)1 << iSegid)
1b680 3b 20 69 53 65 67 69 64 2b 2b 29 3b 0a 20 20 20  ; iSegid++);.   
1b690 20 20 20 69 53 65 67 69 64 20 2b 3d 20 31 20 2b     iSegid += 1 +
1b6a0 20 69 2a 33 32 3b 0a 0a 23 69 66 64 65 66 20 53   i*32;..#ifdef S
1b6b0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
1b6c0 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
1b6d0 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
1b6e0 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
1b6f0 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b       for(iSeg=0;
1b700 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61   iSeg<pStruct->a
1b710 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
1b720 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
1b730 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
1b740 69 53 65 67 69 64 21 3d 70 53 74 72 75 63 74 2d  iSegid!=pStruct-
1b750 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53  >aLevel[iLvl].aS
1b760 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 20  eg[iSeg].iSegid 
1b770 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1b780 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
1b790 74 5f 6e 63 28 20 69 53 65 67 69 64 3e 30 20 26  t_nc( iSegid>0 &
1b7a0 26 20 69 53 65 67 69 64 3c 3d 46 54 53 35 5f 4d  & iSegid<=FTS5_M
1b7b0 41 58 5f 53 45 47 4d 45 4e 54 20 29 3b 0a 0a 20  AX_SEGMENT );.. 
1b7c0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 73       {.        s
1b7d0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64  qlite3_stmt *pId
1b7e0 78 53 65 6c 65 63 74 20 3d 20 66 74 73 35 49 64  xSelect = fts5Id
1b7f0 78 53 65 6c 65 63 74 53 74 6d 74 28 70 29 3b 0a  xSelectStmt(p);.
1b800 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
1b810 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b820 20 20 20 20 20 20 20 20 20 20 75 38 20 61 42 6c            u8 aBl
1b830 6f 62 5b 32 5d 20 3d 20 7b 30 78 66 66 2c 20 30  ob[2] = {0xff, 0
1b840 78 66 66 7d 3b 0a 20 20 20 20 20 20 20 20 20 20  xff};.          
1b850 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
1b860 28 70 49 64 78 53 65 6c 65 63 74 2c 20 31 2c 20  (pIdxSelect, 1, 
1b870 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20  iSegid);.       
1b880 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
1b890 62 6c 6f 62 28 70 49 64 78 53 65 6c 65 63 74 2c  blob(pIdxSelect,
1b8a0 20 32 2c 20 61 42 6c 6f 62 2c 20 32 2c 20 53 51   2, aBlob, 2, SQ
1b8b0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
1b8c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e          assert_n
1b8d0 63 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  c( sqlite3_step(
1b8e0 70 49 64 78 53 65 6c 65 63 74 29 21 3d 53 51 4c  pIdxSelect)!=SQL
1b8f0 49 54 45 5f 52 4f 57 20 29 3b 0a 20 20 20 20 20  ITE_ROW );.     
1b900 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
1b910 69 74 65 33 5f 72 65 73 65 74 28 70 49 64 78 53  ite3_reset(pIdxS
1b920 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
1b930 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e    sqlite3_bind_n
1b940 75 6c 6c 28 70 49 64 78 53 65 6c 65 63 74 2c 20  ull(pIdxSelect, 
1b950 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  2);.        }.  
1b960 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1b970 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
1b980 20 69 53 65 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a   iSegid;.}../*.*
1b990 2a 20 44 69 73 63 61 72 64 20 61 6c 6c 20 64 61  * Discard all da
1b9a0 74 61 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63  ta currently cac
1b9b0 68 65 64 20 69 6e 20 74 68 65 20 68 61 73 68 2d  hed in the hash-
1b9c0 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tables..*/.stati
1b9d0 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
1b9e0 44 69 73 63 61 72 64 44 61 74 61 28 46 74 73 35  DiscardData(Fts5
1b9f0 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61 73 73  Index *p){.  ass
1ba00 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20 7c 7c  ert( p->pHash ||
1ba10 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
1ba20 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
1ba30 70 48 61 73 68 20 29 7b 0a 20 20 20 20 73 71 6c  pHash ){.    sql
1ba40 69 74 65 33 46 74 73 35 48 61 73 68 43 6c 65 61  ite3Fts5HashClea
1ba50 72 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20  r(p->pHash);.   
1ba60 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
1ba70 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
1ba80 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
1ba90 7a 65 20 6f 66 20 74 68 65 20 70 72 65 66 69 78  ze of the prefix
1baa0 2c 20 69 6e 20 62 79 74 65 73 2c 20 74 68 61 74  , in bytes, that
1bab0 20 62 75 66 66 65 72 20 0a 2a 2a 20 28 70 4e 65   buffer .** (pNe
1bac0 77 2f 3c 6c 65 6e 67 74 68 2d 75 6e 6b 6e 6f 77  w/<length-unknow
1bad0 6e 3e 29 20 73 68 61 72 65 73 20 77 69 74 68 20  n>) shares with 
1bae0 62 75 66 66 65 72 20 28 70 4f 6c 64 2f 6e 4f 6c  buffer (pOld/nOl
1baf0 64 29 2e 0a 2a 2a 0a 2a 2a 20 42 75 66 66 65 72  d)..**.** Buffer
1bb00 20 28 70 4e 65 77 2f 3c 6c 65 6e 67 74 68 2d 75   (pNew/<length-u
1bb10 6e 6b 6e 6f 77 6e 3e 29 20 69 73 20 67 75 61 72  nknown>) is guar
1bb20 61 6e 74 65 65 64 20 74 6f 20 62 65 20 67 72 65  anteed to be gre
1bb30 61 74 65 72 20 0a 2a 2a 20 74 68 61 6e 20 62 75  ater .** than bu
1bb40 66 66 65 72 20 28 70 4f 6c 64 2f 6e 4f 6c 64 29  ffer (pOld/nOld)
1bb50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bb60 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65  fts5PrefixCompre
1bb70 73 73 28 69 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e  ss(int nOld, con
1bb80 73 74 20 75 38 20 2a 70 4f 6c 64 2c 20 63 6f 6e  st u8 *pOld, con
1bb90 73 74 20 75 38 20 2a 70 4e 65 77 29 7b 0a 20 20  st u8 *pNew){.  
1bba0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1bbb0 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
1bbc0 20 20 20 20 69 66 28 20 70 4f 6c 64 5b 69 5d 21      if( pOld[i]!
1bbd0 3d 70 4e 65 77 5b 69 5d 20 29 20 62 72 65 61 6b  =pNew[i] ) break
1bbe0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
1bbf0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1bc00 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 43   fts5WriteDlidxC
1bc10 6c 65 61 72 28 0a 20 20 46 74 73 35 49 6e 64 65  lear(.  Fts5Inde
1bc20 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
1bc30 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
1bc40 0a 20 20 69 6e 74 20 62 46 6c 75 73 68 20 20 20  .  int bFlush   
1bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc60 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 77     /* If true, w
1bc70 72 69 74 65 20 64 6c 69 64 78 20 74 6f 20 64 69  rite dlidx to di
1bc80 73 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  sk */.){.  int i
1bc90 3b 0a 20 20 61 73 73 65 72 74 28 20 62 46 6c 75  ;.  assert( bFlu
1bca0 73 68 3d 3d 30 20 7c 7c 20 28 70 57 72 69 74 65  sh==0 || (pWrite
1bcb0 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20 70  r->nDlidx>0 && p
1bcc0 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30  Writer->aDlidx[0
1bcd0 5d 2e 62 75 66 2e 6e 3e 30 29 20 29 3b 0a 20 20  ].buf.n>0) );.  
1bce0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69 74  for(i=0; i<pWrit
1bcf0 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b 29  er->nDlidx; i++)
1bd00 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 57  {.    Fts5DlidxW
1bd10 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  riter *pDlidx = 
1bd20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78  &pWriter->aDlidx
1bd30 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 6c  [i];.    if( pDl
1bd40 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 20  idx->buf.n==0 ) 
1bd50 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62  break;.    if( b
1bd60 46 6c 75 73 68 20 29 7b 0a 20 20 20 20 20 20 61  Flush ){.      a
1bd70 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 70  ssert( pDlidx->p
1bd80 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  gno!=0 );.      
1bd90 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c  fts5DataWrite(p,
1bda0 20 0a 20 20 20 20 20 20 20 20 20 20 46 54 53 35   .          FTS5
1bdb0 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 57 72  _DLIDX_ROWID(pWr
1bdc0 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c  iter->iSegid, i,
1bdd0 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a   pDlidx->pgno),.
1bde0 20 20 20 20 20 20 20 20 20 20 70 44 6c 69 64 78            pDlidx
1bdf0 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d  ->buf.p, pDlidx-
1be00 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a  >buf.n.      );.
1be10 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1be20 33 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28  3Fts5BufferZero(
1be30 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20  &pDlidx->buf);. 
1be40 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76     pDlidx->bPrev
1be50 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Valid = 0;.  }.}
1be60 0a 0a 2f 2a 0a 2a 2a 20 47 72 6f 77 20 74 68 65  ../*.** Grow the
1be70 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
1be80 5b 5d 20 61 72 72 61 79 20 74 6f 20 61 74 20 6c  [] array to at l
1be90 65 61 73 74 20 6e 4c 76 6c 20 65 6c 65 6d 65 6e  east nLvl elemen
1bea0 74 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 41  ts in size..** A
1beb0 6e 79 20 6e 65 77 20 61 72 72 61 79 20 65 6c 65  ny new array ele
1bec0 6d 65 6e 74 73 20 61 72 65 20 7a 65 72 6f 65 64  ments are zeroed
1bed0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1bee0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
1bef0 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 47   fts5WriteDlidxG
1bf00 72 6f 77 28 0a 20 20 46 74 73 35 49 6e 64 65 78  row(.  Fts5Index
1bf10 20 2a 70 2c 0a 20 20 46 74 73 35 53 65 67 57 72   *p,.  Fts5SegWr
1bf20 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20  iter *pWriter,. 
1bf30 20 69 6e 74 20 6e 4c 76 6c 0a 29 7b 0a 20 20 69   int nLvl.){.  i
1bf40 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1bf50 5f 4f 4b 20 26 26 20 6e 4c 76 6c 3e 3d 70 57 72  _OK && nLvl>=pWr
1bf60 69 74 65 72 2d 3e 6e 44 6c 69 64 78 20 29 7b 0a  iter->nDlidx ){.
1bf70 20 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69      Fts5DlidxWri
1bf80 74 65 72 20 2a 61 44 6c 69 64 78 20 3d 20 28 46  ter *aDlidx = (F
1bf90 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 2a 29  ts5DlidxWriter*)
1bfa0 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36  sqlite3_realloc6
1bfb0 34 28 0a 20 20 20 20 20 20 20 20 70 57 72 69 74  4(.        pWrit
1bfc0 65 72 2d 3e 61 44 6c 69 64 78 2c 20 73 69 7a 65  er->aDlidx, size
1bfd0 6f 66 28 46 74 73 35 44 6c 69 64 78 57 72 69 74  of(Fts5DlidxWrit
1bfe0 65 72 29 20 2a 20 6e 4c 76 6c 0a 20 20 20 20 29  er) * nLvl.    )
1bff0 3b 0a 20 20 20 20 69 66 28 20 61 44 6c 69 64 78  ;.    if( aDlidx
1c000 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
1c010 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1c020 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
1c030 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
1c040 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
1c050 57 72 69 74 65 72 29 20 2a 20 28 6e 4c 76 6c 20  Writer) * (nLvl 
1c060 2d 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64  - pWriter->nDlid
1c070 78 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  x);.      memset
1c080 28 26 61 44 6c 69 64 78 5b 70 57 72 69 74 65 72  (&aDlidx[pWriter
1c090 2d 3e 6e 44 6c 69 64 78 5d 2c 20 30 2c 20 6e 42  ->nDlidx], 0, nB
1c0a0 79 74 65 29 3b 0a 20 20 20 20 20 20 70 57 72 69  yte);.      pWri
1c0b0 74 65 72 2d 3e 61 44 6c 69 64 78 20 3d 20 61 44  ter->aDlidx = aD
1c0c0 6c 69 64 78 3b 0a 20 20 20 20 20 20 70 57 72 69  lidx;.      pWri
1c0d0 74 65 72 2d 3e 6e 44 6c 69 64 78 20 3d 20 6e 4c  ter->nDlidx = nL
1c0e0 76 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  vl;.    }.  }.  
1c0f0 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
1c100 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  ./*.** If the cu
1c110 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e  rrent doclist-in
1c120 64 65 78 20 61 63 63 75 6d 75 6c 61 74 69 6e 67  dex accumulating
1c130 20 69 6e 20 70 57 72 69 74 65 72 2d 3e 61 44 6c   in pWriter->aDl
1c140 69 64 78 5b 5d 20 69 73 20 6c 61 72 67 65 0a 2a  idx[] is large.*
1c150 2a 20 65 6e 6f 75 67 68 2c 20 66 6c 75 73 68 20  * enough, flush 
1c160 69 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 72  it to disk and r
1c170 65 74 75 72 6e 20 31 2e 20 4f 74 68 65 72 77 69  eturn 1. Otherwi
1c180 73 65 20 64 69 73 63 61 72 64 20 69 74 20 61 6e  se discard it an
1c190 64 20 72 65 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f  d return.** zero
1c1a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c1b0 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 44 6c  fts5WriteFlushDl
1c1c0 69 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70  idx(Fts5Index *p
1c1d0 2c 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20  , Fts5SegWriter 
1c1e0 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 69 6e 74  *pWriter){.  int
1c1f0 20 62 46 6c 61 67 20 3d 20 30 3b 0a 0a 20 20 2f   bFlag = 0;..  /
1c200 2a 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20  * If there were 
1c210 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53  FTS5_MIN_DLIDX_S
1c220 49 5a 45 20 6f 72 20 6d 6f 72 65 20 65 6d 70 74  IZE or more empt
1c230 79 20 6c 65 61 66 20 70 61 67 65 73 20 77 72 69  y leaf pages wri
1c240 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
1c250 20 64 61 74 61 62 61 73 65 2c 20 61 6c 73 6f 20   database, also 
1c260 77 72 69 74 65 20 74 68 65 20 64 6f 63 6c 69 73  write the doclis
1c270 74 2d 69 6e 64 65 78 20 74 6f 20 64 69 73 6b 2e  t-index to disk.
1c280 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74    */.  if( pWrit
1c290 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75  er->aDlidx[0].bu
1c2a0 66 2e 6e 3e 30 20 26 26 20 70 57 72 69 74 65 72  f.n>0 && pWriter
1c2b0 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54 53 35 5f 4d  ->nEmpty>=FTS5_M
1c2c0 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 29 7b  IN_DLIDX_SIZE ){
1c2d0 0a 20 20 20 20 62 46 6c 61 67 20 3d 20 31 3b 0a  .    bFlag = 1;.
1c2e0 20 20 7d 0a 20 20 66 74 73 35 57 72 69 74 65 44    }.  fts5WriteD
1c2f0 6c 69 64 78 43 6c 65 61 72 28 70 2c 20 70 57 72  lidxClear(p, pWr
1c300 69 74 65 72 2c 20 62 46 6c 61 67 29 3b 0a 20 20  iter, bFlag);.  
1c310 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20  pWriter->nEmpty 
1c320 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 62 46  = 0;.  return bF
1c330 6c 61 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  lag;.}../*.** Th
1c340 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1c350 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 70  alled whenever p
1c360 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65  rocessing of the
1c370 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65   doclist for the
1c380 20 0a 2a 2a 20 6c 61 73 74 20 74 65 72 6d 20 6f   .** last term o
1c390 6e 20 6c 65 61 66 20 70 61 67 65 20 28 70 57 72  n leaf page (pWr
1c3a0 69 74 65 72 2d 3e 69 42 74 50 61 67 65 29 20 69  iter->iBtPage) i
1c3b0 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20 0a 2a 2a  s completed. .**
1c3c0 0a 2a 2a 20 54 68 65 20 64 6f 63 6c 69 73 74 2d  .** The doclist-
1c3d0 69 6e 64 65 78 20 66 6f 72 20 74 68 61 74 20 74  index for that t
1c3e0 65 72 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79  erm is currently
1c3f0 20 73 74 6f 72 65 64 20 69 6e 2d 6d 65 6d 6f 72   stored in-memor
1c400 79 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20  y within the.** 
1c410 46 74 73 35 53 65 67 57 72 69 74 65 72 2e 61 44  Fts5SegWriter.aD
1c420 6c 69 64 78 5b 5d 20 61 72 72 61 79 2e 20 49 66  lidx[] array. If
1c430 20 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f   it is large eno
1c440 75 67 68 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ugh, this functi
1c450 6f 6e 0a 2a 2a 20 77 72 69 74 65 73 20 69 74 20  on.** writes it 
1c460 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 4f 72 2c  out to disk. Or,
1c470 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 73 6d   if it is too sm
1c480 61 6c 6c 20 74 6f 20 62 6f 74 68 65 72 20 77 69  all to bother wi
1c490 74 68 2c 20 64 69 73 63 61 72 64 73 0a 2a 2a 20  th, discards.** 
1c4a0 69 74 2e 0a 2a 2a 0a 2a 2a 20 46 74 73 35 53 65  it..**.** Fts5Se
1c4b0 67 57 72 69 74 65 72 2e 62 74 74 65 72 6d 20 63  gWriter.btterm c
1c4c0 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
1c4d0 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
1c4e0 20 6f 6e 20 70 61 67 65 20 69 42 74 50 61 67 65   on page iBtPage
1c4f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1c500 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 42   fts5WriteFlushB
1c510 74 72 65 65 28 46 74 73 35 49 6e 64 65 78 20 2a  tree(Fts5Index *
1c520 70 2c 20 46 74 73 35 53 65 67 57 72 69 74 65 72  p, Fts5SegWriter
1c530 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 69 6e   *pWriter){.  in
1c540 74 20 62 46 6c 61 67 3b 0a 0a 20 20 61 73 73 65  t bFlag;..  asse
1c550 72 74 28 20 70 57 72 69 74 65 72 2d 3e 69 42 74  rt( pWriter->iBt
1c560 50 61 67 65 20 7c 7c 20 70 57 72 69 74 65 72 2d  Page || pWriter-
1c570 3e 6e 45 6d 70 74 79 3d 3d 30 20 29 3b 0a 20 20  >nEmpty==0 );.  
1c580 69 66 28 20 70 57 72 69 74 65 72 2d 3e 69 42 74  if( pWriter->iBt
1c590 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Page==0 ) return
1c5a0 3b 0a 20 20 62 46 6c 61 67 20 3d 20 66 74 73 35  ;.  bFlag = fts5
1c5b0 57 72 69 74 65 46 6c 75 73 68 44 6c 69 64 78 28  WriteFlushDlidx(
1c5c0 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 0a 20 20  p, pWriter);..  
1c5d0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1c5e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73  E_OK ){.    cons
1c5f0 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 70 57 72  t char *z = (pWr
1c600 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e 6e 3e 30  iter->btterm.n>0
1c610 3f 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 57  ?(const char*)pW
1c620 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e 70 3a  riter->btterm.p:
1c630 22 22 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  "");.    /* The 
1c640 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 73 20 61 6c  following was al
1c650 72 65 61 64 79 20 64 6f 6e 65 20 69 6e 20 66 74  ready done in ft
1c660 73 35 57 72 69 74 65 49 6e 69 74 28 29 3a 20 2a  s5WriteInit(): *
1c670 2f 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  /.    /* sqlite3
1c680 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64  _bind_int(p->pId
1c690 78 57 72 69 74 65 72 2c 20 31 2c 20 70 57 72 69  xWriter, 1, pWri
1c6a0 74 65 72 2d 3e 69 53 65 67 69 64 29 3b 20 2a 2f  ter->iSegid); */
1c6b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
1c6c0 64 5f 62 6c 6f 62 28 70 2d 3e 70 49 64 78 57 72  d_blob(p->pIdxWr
1c6d0 69 74 65 72 2c 20 32 2c 20 7a 2c 20 70 57 72 69  iter, 2, z, pWri
1c6e0 74 65 72 2d 3e 62 74 74 65 72 6d 2e 6e 2c 20 53  ter->btterm.n, S
1c6f0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
1c700 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
1c710 69 6e 74 36 34 28 70 2d 3e 70 49 64 78 57 72 69  int64(p->pIdxWri
1c720 74 65 72 2c 20 33 2c 20 62 46 6c 61 67 20 2b 20  ter, 3, bFlag + 
1c730 28 28 69 36 34 29 70 57 72 69 74 65 72 2d 3e 69  ((i64)pWriter->i
1c740 42 74 50 61 67 65 3c 3c 31 29 29 3b 0a 20 20 20  BtPage<<1));.   
1c750 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d   sqlite3_step(p-
1c760 3e 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20  >pIdxWriter);.  
1c770 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1c780 33 5f 72 65 73 65 74 28 70 2d 3e 70 49 64 78 57  3_reset(p->pIdxW
1c790 72 69 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69  riter);.    sqli
1c7a0 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 2d  te3_bind_null(p-
1c7b0 3e 70 49 64 78 57 72 69 74 65 72 2c 20 32 29 3b  >pIdxWriter, 2);
1c7c0 0a 20 20 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e  .  }.  pWriter->
1c7d0 69 42 74 50 61 67 65 20 3d 20 30 3b 0a 7d 0a 0a  iBtPage = 0;.}..
1c7e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61  /*.** This is ca
1c7f0 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
1c800 63 68 20 6c 65 61 66 20 70 61 67 65 20 65 78 63  ch leaf page exc
1c810 65 70 74 20 74 68 65 20 66 69 72 73 74 20 74 68  ept the first th
1c820 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61  at contains.** a
1c830 74 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d  t least one term
1c840 2e 20 41 72 67 75 6d 65 6e 74 20 28 6e 54 65 72  . Argument (nTer
1c850 6d 2f 70 54 65 72 6d 29 20 69 73 20 74 68 65 20  m/pTerm) is the 
1c860 73 70 6c 69 74 2d 6b 65 79 20 2d 20 61 20 74 65  split-key - a te
1c870 72 6d 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61  rm that.** is la
1c880 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 74 65  rger than all te
1c890 72 6d 73 20 77 72 69 74 74 65 6e 20 74 6f 20 65  rms written to e
1c8a0 61 72 6c 69 65 72 20 6c 65 61 76 65 73 2c 20 61  arlier leaves, a
1c8b0 6e 64 20 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a  nd equal to or.*
1c8c0 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  * smaller than t
1c8d0 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e  he first term on
1c8e0 20 74 68 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a   the new leaf..*
1c8f0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1c900 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
1c910 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69  r code is left i
1c920 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20  n Fts5Index.rc. 
1c930 49 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68  If an error.** h
1c940 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
1c950 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
1c960 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1c970 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
1c980 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c990 66 74 73 35 57 72 69 74 65 42 74 72 65 65 54 65  fts5WriteBtreeTe
1c9a0 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  rm(.  Fts5Index 
1c9b0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1c9c0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
1c9d0 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
1c9e0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1c9f0 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20  *pWriter,       
1ca00 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65    /* Writer obje
1ca10 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72  ct */.  int nTer
1ca20 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65  m, const u8 *pTe
1ca30 72 6d 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74  rm      /* First
1ca40 20 74 65 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67   term on new pag
1ca50 65 20 2a 2f 0a 29 7b 0a 20 20 66 74 73 35 57 72  e */.){.  fts5Wr
1ca60 69 74 65 46 6c 75 73 68 42 74 72 65 65 28 70 2c  iteFlushBtree(p,
1ca70 20 70 57 72 69 74 65 72 29 3b 0a 20 20 69 66 28   pWriter);.  if(
1ca80 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1ca90 4b 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66  K ){.    fts5Buf
1caa0 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26  ferSet(&p->rc, &
1cab0 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2c  pWriter->btterm,
1cac0 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a   nTerm, pTerm);.
1cad0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74      pWriter->iBt
1cae0 50 61 67 65 20 3d 20 70 57 72 69 74 65 72 2d 3e  Page = pWriter->
1caf0 77 72 69 74 65 72 2e 70 67 6e 6f 3b 0a 20 20 7d  writer.pgno;.  }
1cb00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1cb10 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1cb20 64 20 77 68 65 6e 20 66 6c 75 73 68 69 6e 67 20  d when flushing 
1cb30 61 20 6c 65 61 66 20 70 61 67 65 20 74 68 61 74  a leaf page that
1cb40 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20   contains no.** 
1cb50 74 65 72 6d 73 20 61 74 20 61 6c 6c 20 74 6f 20  terms at all to 
1cb60 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  disk..*/.static 
1cb70 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74  void fts5WriteBt
1cb80 72 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74 73  reeNoTerm(.  Fts
1cb90 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
1cba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cbb0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
1cbc0 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
1cbd0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20  Writer *pWriter 
1cbe0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1cbf0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  er object */.){.
1cc00 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 65    /* If there we
1cc10 72 65 20 6e 6f 20 72 6f 77 69 64 73 20 6f 6e 20  re no rowids on 
1cc20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 65 69  the leaf page ei
1cc30 74 68 65 72 20 61 6e 64 20 74 68 65 20 64 6f 63  ther and the doc
1cc40 6c 69 73 74 2d 69 6e 64 65 78 0a 20 20 2a 2a 20  list-index.  ** 
1cc50 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1cc60 20 73 74 61 72 74 65 64 2c 20 61 70 70 65 6e 64   started, append
1cc70 20 61 6e 20 30 78 30 30 20 62 79 74 65 20 74 6f   an 0x00 byte to
1cc80 20 69 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70   it.  */.  if( p
1cc90 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
1cca0 77 69 64 49 6e 50 61 67 65 20 26 26 20 70 57 72  widInPage && pWr
1ccb0 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e  iter->aDlidx[0].
1ccc0 62 75 66 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 46  buf.n>0 ){.    F
1ccd0 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a  ts5DlidxWriter *
1cce0 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65  pDlidx = &pWrite
1ccf0 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 3b 0a 20 20  r->aDlidx[0];.  
1cd00 20 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78    assert( pDlidx
1cd10 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 29 3b 0a  ->bPrevValid );.
1cd20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
1cd30 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1cd40 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
1cd50 78 2d 3e 62 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  x->buf, 0);.  }.
1cd60 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
1cd70 74 68 65 20 22 6e 75 6d 62 65 72 20 6f 66 20 73  the "number of s
1cd80 65 71 75 65 6e 74 69 61 6c 20 6c 65 61 76 65 73  equential leaves
1cd90 20 77 69 74 68 6f 75 74 20 61 20 74 65 72 6d 22   without a term"
1cda0 20 63 6f 75 6e 74 65 72 2e 20 2a 2f 0a 20 20 70   counter. */.  p
1cdb0 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 2b 2b  Writer->nEmpty++
1cdc0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36 34 20  ;.}..static i64 
1cdd0 66 74 73 35 44 6c 69 64 78 45 78 74 72 61 63 74  fts5DlidxExtract
1cde0 46 69 72 73 74 52 6f 77 69 64 28 46 74 73 35 42  FirstRowid(Fts5B
1cdf0 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20  uffer *pBuf){.  
1ce00 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 69 6e  i64 iRowid;.  in
1ce10 74 20 69 4f 66 66 3b 0a 0a 20 20 69 4f 66 66 20  t iOff;..  iOff 
1ce20 3d 20 31 20 2b 20 66 74 73 35 47 65 74 56 61 72  = 1 + fts5GetVar
1ce30 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 31 5d 2c  int(&pBuf->p[1],
1ce40 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b   (u64*)&iRowid);
1ce50 0a 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  .  fts5GetVarint
1ce60 28 26 70 42 75 66 2d 3e 70 5b 69 4f 66 66 5d 2c  (&pBuf->p[iOff],
1ce70 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b   (u64*)&iRowid);
1ce80 0a 20 20 72 65 74 75 72 6e 20 69 52 6f 77 69 64  .  return iRowid
1ce90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64  ;.}../*.** Rowid
1cea0 20 69 52 6f 77 69 64 20 68 61 73 20 6a 75 73 74   iRowid has just
1ceb0 20 62 65 65 6e 20 61 70 70 65 6e 64 65 64 20 74   been appended t
1cec0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  o the current le
1ced0 61 66 20 70 61 67 65 2e 20 49 74 20 69 73 20 74  af page. It is t
1cee0 68 65 0a 2a 2a 20 66 69 72 73 74 20 6f 6e 20 74  he.** first on t
1cef0 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75  he page. This fu
1cf00 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61  nction appends a
1cf10 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e  n appropriate en
1cf20 74 72 79 20 74 6f 20 74 68 65 20 63 75 72 72 65  try to the curre
1cf30 6e 74 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e  nt.** doclist-in
1cf40 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
1cf50 6f 69 64 20 66 74 73 35 57 72 69 74 65 44 6c 69  oid fts5WriteDli
1cf60 64 78 41 70 70 65 6e 64 28 0a 20 20 46 74 73 35  dxAppend(.  Fts5
1cf70 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
1cf80 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1cf90 74 65 72 2c 20 0a 20 20 69 36 34 20 69 52 6f 77  ter, .  i64 iRow
1cfa0 69 64 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  id.){.  int i;. 
1cfb0 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a   int bDone = 0;.
1cfc0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72  .  for(i=0; p->r
1cfd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1cfe0 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a  bDone==0; i++){.
1cff0 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20      i64 iVal;.  
1d000 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65    Fts5DlidxWrite
1d010 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72  r *pDlidx = &pWr
1d020 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b  iter->aDlidx[i];
1d030 0a 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64 78  ..    if( pDlidx
1d040 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e  ->buf.n>=p->pCon
1d050 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20  fig->pgsz ){.   
1d060 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e     /* The curren
1d070 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  t doclist-index 
1d080 70 61 67 65 20 69 73 20 66 75 6c 6c 2e 20 57 72  page is full. Wr
1d090 69 74 65 20 69 74 20 74 6f 20 64 69 73 6b 20 61  ite it to disk a
1d0a0 6e 64 20 70 75 73 68 0a 20 20 20 20 20 20 2a 2a  nd push.      **
1d0b0 20 61 20 63 6f 70 79 20 6f 66 20 69 52 6f 77 69   a copy of iRowi
1d0c0 64 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65  d (which will be
1d0d0 63 6f 6d 65 20 74 68 65 20 66 69 72 73 74 20 72  come the first r
1d0e0 6f 77 69 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  owid on the next
1d0f0 0a 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73  .      ** doclis
1d100 74 2d 69 6e 64 65 78 20 6c 65 61 66 20 70 61 67  t-index leaf pag
1d110 65 29 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6e  e) up into the n
1d120 65 78 74 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ext level of the
1d130 20 62 2d 74 72 65 65 20 0a 20 20 20 20 20 20 2a   b-tree .      *
1d140 2a 20 68 69 65 72 61 72 63 68 79 2e 20 49 66 20  * hierarchy. If 
1d150 74 68 65 20 6e 6f 64 65 20 62 65 69 6e 67 20 66  the node being f
1d160 6c 75 73 68 65 64 20 69 73 20 63 75 72 72 65 6e  lushed is curren
1d170 74 6c 79 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64  tly the root nod
1d180 65 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f  e,.      ** also
1d190 20 70 75 73 68 20 69 74 73 20 66 69 72 73 74 20   push its first 
1d1a0 72 6f 77 69 64 20 75 70 77 61 72 64 73 2e 20 2a  rowid upwards. *
1d1b0 2f 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e  /.      pDlidx->
1d1c0 62 75 66 2e 70 5b 30 5d 20 3d 20 30 78 30 31 3b  buf.p[0] = 0x01;
1d1d0 20 20 20 20 2f 2a 20 4e 6f 74 20 74 68 65 20 72      /* Not the r
1d1e0 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20  oot node */.    
1d1f0 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
1d200 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46 54  p, .          FT
1d210 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70  S5_DLIDX_ROWID(p
1d220 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  Writer->iSegid, 
1d230 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29  i, pDlidx->pgno)
1d240 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 6c 69  ,.          pDli
1d250 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64  dx->buf.p, pDlid
1d260 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20 29  x->buf.n.      )
1d270 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  ;.      fts5Writ
1d280 65 44 6c 69 64 78 47 72 6f 77 28 70 2c 20 70 57  eDlidxGrow(p, pW
1d290 72 69 74 65 72 2c 20 69 2b 32 29 3b 0a 20 20 20  riter, i+2);.   
1d2a0 20 20 20 70 44 6c 69 64 78 20 3d 20 26 70 57 72     pDlidx = &pWr
1d2b0 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b  iter->aDlidx[i];
1d2c0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
1d2d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1d2e0 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2e 6e 3d 3d  Dlidx[1].buf.n==
1d2f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  0 ){.        i64
1d300 20 69 46 69 72 73 74 20 3d 20 66 74 73 35 44 6c   iFirst = fts5Dl
1d310 69 64 78 45 78 74 72 61 63 74 46 69 72 73 74 52  idxExtractFirstR
1d320 6f 77 69 64 28 26 70 44 6c 69 64 78 2d 3e 62 75  owid(&pDlidx->bu
1d330 66 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  f);..        /* 
1d340 54 68 69 73 20 77 61 73 20 74 68 65 20 72 6f 6f  This was the roo
1d350 74 20 6e 6f 64 65 2e 20 50 75 73 68 20 69 74 73  t node. Push its
1d360 20 66 69 72 73 74 20 72 6f 77 69 64 20 75 70 20   first rowid up 
1d370 74 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2e  to the new root.
1d380 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 44 6c 69   */.        pDli
1d390 64 78 5b 31 5d 2e 70 67 6e 6f 20 3d 20 70 44 6c  dx[1].pgno = pDl
1d3a0 69 64 78 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20  idx->pgno;.     
1d3b0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1d3c0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1d3d0 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
1d3e0 5b 31 5d 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20  [1].buf, 0);.   
1d3f0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1d400 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1d410 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69  nt(&p->rc, &pDli
1d420 64 78 5b 31 5d 2e 62 75 66 2c 20 70 44 6c 69 64  dx[1].buf, pDlid
1d430 78 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  x->pgno);.      
1d440 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1d450 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1d460 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b  &p->rc, &pDlidx[
1d470 31 5d 2e 62 75 66 2c 20 69 46 69 72 73 74 29 3b  1].buf, iFirst);
1d480 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b  .        pDlidx[
1d490 31 5d 2e 62 50 72 65 76 56 61 6c 69 64 20 3d 20  1].bPrevValid = 
1d4a0 31 3b 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64  1;.        pDlid
1d4b0 78 5b 31 5d 2e 69 50 72 65 76 20 3d 20 69 46 69  x[1].iPrev = iFi
1d4c0 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  rst;.      }..  
1d4d0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
1d4e0 75 66 66 65 72 5a 65 72 6f 28 26 70 44 6c 69 64  ufferZero(&pDlid
1d4f0 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20 20 70  x->buf);.      p
1d500 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69  Dlidx->bPrevVali
1d510 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 6c  d = 0;.      pDl
1d520 69 64 78 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20  idx->pgno++;.   
1d530 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 44   }else{.      bD
1d540 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  one = 1;.    }..
1d550 20 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e      if( pDlidx->
1d560 62 50 72 65 76 56 61 6c 69 64 20 29 7b 0a 20 20  bPrevValid ){.  
1d570 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69      iVal = iRowi
1d580 64 20 2d 20 70 44 6c 69 64 78 2d 3e 69 50 72 65  d - pDlidx->iPre
1d590 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  v;.    }else{.  
1d5a0 20 20 20 20 69 36 34 20 69 50 67 6e 6f 20 3d 20      i64 iPgno = 
1d5b0 28 69 3d 3d 30 20 3f 20 70 57 72 69 74 65 72 2d  (i==0 ? pWriter-
1d5c0 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3a 20 70  >writer.pgno : p
1d5d0 44 6c 69 64 78 5b 2d 31 5d 2e 70 67 6e 6f 29 3b  Dlidx[-1].pgno);
1d5e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1d5f0 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20  Dlidx->buf.n==0 
1d600 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d610 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
1d620 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1d630 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 21 62 44  pDlidx->buf, !bD
1d640 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  one);.      sqli
1d650 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
1d660 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1d670 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20  , &pDlidx->buf, 
1d680 69 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 56  iPgno);.      iV
1d690 61 6c 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20  al = iRowid;.   
1d6a0 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46   }..    sqlite3F
1d6b0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1d6c0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
1d6d0 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69 56 61 6c  Dlidx->buf, iVal
1d6e0 29 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 62  );.    pDlidx->b
1d6f0 50 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20  PrevValid = 1;. 
1d700 20 20 20 70 44 6c 69 64 78 2d 3e 69 50 72 65 76     pDlidx->iPrev
1d710 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 7d   = iRowid;.  }.}
1d720 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1d730 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
1d740 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
1d750 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
1d760 72 69 74 65 72 29 7b 0a 20 20 73 74 61 74 69 63  riter){.  static
1d770 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d   const u8 zero[]
1d780 20 3d 20 7b 20 30 78 30 30 2c 20 30 78 30 30 2c   = { 0x00, 0x00,
1d790 20 30 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20   0x00, 0x00 };. 
1d7a0 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
1d7b0 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65  *pPage = &pWrite
1d7c0 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69 36 34  r->writer;.  i64
1d7d0 20 69 52 6f 77 69 64 3b 0a 0a 20 20 61 73 73 65   iRowid;..  asse
1d7e0 72 74 28 20 28 70 50 61 67 65 2d 3e 70 67 69 64  rt( (pPage->pgid
1d7f0 78 2e 6e 3d 3d 30 29 3d 3d 28 70 57 72 69 74 65  x.n==0)==(pWrite
1d800 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  r->bFirstTermInP
1d810 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  age) );..  /* Se
1d820 74 20 74 68 65 20 73 7a 4c 65 61 66 20 68 65 61  t the szLeaf hea
1d830 64 65 72 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  der field. */.  
1d840 61 73 73 65 72 74 28 20 30 3d 3d 66 74 73 35 47  assert( 0==fts5G
1d850 65 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75  etU16(&pPage->bu
1d860 66 2e 70 5b 32 5d 29 20 29 3b 0a 20 20 66 74 73  f.p[2]) );.  fts
1d870 35 50 75 74 55 31 36 28 26 70 50 61 67 65 2d 3e  5PutU16(&pPage->
1d880 62 75 66 2e 70 5b 32 5d 2c 20 28 75 31 36 29 70  buf.p[2], (u16)p
1d890 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20  Page->buf.n);.. 
1d8a0 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46   if( pWriter->bF
1d8b0 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29  irstTermInPage )
1d8c0 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 74 65 72 6d  {.    /* No term
1d8d0 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20   was written to 
1d8e0 74 68 69 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20  this page. */.  
1d8f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1d900 3e 70 67 69 64 78 2e 6e 3d 3d 30 20 29 3b 0a 20  >pgidx.n==0 );. 
1d910 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72 65     fts5WriteBtre
1d920 65 4e 6f 54 65 72 6d 28 70 2c 20 70 57 72 69 74  eNoTerm(p, pWrit
1d930 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
1d940 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
1d950 70 67 69 64 78 20 74 6f 20 74 68 65 20 70 61 67  pgidx to the pag
1d960 65 20 62 75 66 66 65 72 2e 20 53 65 74 20 74 68  e buffer. Set th
1d970 65 20 73 7a 4c 65 61 66 20 68 65 61 64 65 72 20  e szLeaf header 
1d980 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20 20 66 74  field. */.    ft
1d990 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1d9a0 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  ob(&p->rc, &pPag
1d9b0 65 2d 3e 62 75 66 2c 20 70 50 61 67 65 2d 3e 70  e->buf, pPage->p
1d9c0 67 69 64 78 2e 6e 2c 20 70 50 61 67 65 2d 3e 70  gidx.n, pPage->p
1d9d0 67 69 64 78 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20  gidx.p);.  }..  
1d9e0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
1d9f0 65 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 2a 2f  e out to disk */
1da00 0a 20 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35  .  iRowid = FTS5
1da10 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
1da20 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  Writer->iSegid, 
1da30 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
1da40 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c  fts5DataWrite(p,
1da50 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65 2d 3e   iRowid, pPage->
1da60 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75  buf.p, pPage->bu
1da70 66 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  f.n);..  /* Init
1da80 69 61 6c 69 7a 65 20 74 68 65 20 6e 65 78 74 20  ialize the next 
1da90 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42  page. */.  fts5B
1daa0 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65  ufferZero(&pPage
1dab0 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42 75  ->buf);.  fts5Bu
1dac0 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d  fferZero(&pPage-
1dad0 3e 70 67 69 64 78 29 3b 0a 20 20 66 74 73 35 42  >pgidx);.  fts5B
1dae0 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
1daf0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1db00 62 75 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20  buf, 4, zero);. 
1db10 20 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69   pPage->iPrevPgi
1db20 64 78 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d  dx = 0;.  pPage-
1db30 3e 70 67 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 49  >pgno++;..  /* I
1db40 6e 63 72 65 61 73 65 20 74 68 65 20 6c 65 61 76  ncrease the leav
1db50 65 73 20 77 72 69 74 74 65 6e 20 63 6f 75 6e 74  es written count
1db60 65 72 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d  er */.  pWriter-
1db70 3e 6e 4c 65 61 66 57 72 69 74 74 65 6e 2b 2b 3b  >nLeafWritten++;
1db80 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6c  ..  /* The new l
1db90 65 61 66 20 68 6f 6c 64 73 20 6e 6f 20 74 65 72  eaf holds no ter
1dba0 6d 73 20 6f 72 20 72 6f 77 69 64 73 20 2a 2f 0a  ms or rowids */.
1dbb0 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
1dbc0 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b  tTermInPage = 1;
1dbd0 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  .  pWriter->bFir
1dbe0 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20  stRowidInPage = 
1dbf0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  1;.}../*.** Appe
1dc00 6e 64 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54  nd term pTerm/nT
1dc10 65 72 6d 20 74 6f 20 74 68 65 20 73 65 67 6d 65  erm to the segme
1dc20 6e 74 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  nt being written
1dc30 20 62 79 20 74 68 65 20 77 72 69 74 65 72 20 70   by the writer p
1dc40 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
1dc50 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
1dc60 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1dc70 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74  or occurs, set t
1dc80 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  he Fts5Index.rc 
1dc90 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61  error code. If a
1dca0 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20  n error has .** 
1dcb0 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
1dcc0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1dcd0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
1dce0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
1dcf0 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 0a  riteAppendTerm(.
1dd00 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1dd10 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1dd20 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74   *pWriter,.  int
1dd30 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38   nTerm, const u8
1dd40 20 2a 70 54 65 72 6d 20 0a 29 7b 0a 20 20 69 6e   *pTerm .){.  in
1dd50 74 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20  t nPrefix;      
1dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dd70 20 42 79 74 65 73 20 6f 66 20 70 72 65 66 69 78   Bytes of prefix
1dd80 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 66 6f 72   compression for
1dd90 20 74 65 72 6d 20 2a 2f 0a 20 20 46 74 73 35 50   term */.  Fts5P
1dda0 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65  ageWriter *pPage
1ddb0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69   = &pWriter->wri
1ddc0 74 65 72 3b 0a 20 20 46 74 73 35 42 75 66 66 65  ter;.  Fts5Buffe
1ddd0 72 20 2a 70 50 67 69 64 78 20 3d 20 26 70 57 72  r *pPgidx = &pWr
1dde0 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69  iter->writer.pgi
1ddf0 64 78 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d  dx;.  int nMin =
1de00 20 4d 49 4e 28 70 50 61 67 65 2d 3e 74 65 72 6d   MIN(pPage->term
1de10 2e 6e 2c 20 6e 54 65 72 6d 29 3b 0a 0a 20 20 61  .n, nTerm);..  a
1de20 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
1de30 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73  LITE_OK );.  ass
1de40 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e  ert( pPage->buf.
1de50 6e 3e 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=4 );.  assert
1de60 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34  ( pPage->buf.n>4
1de70 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62 46 69   || pWriter->bFi
1de80 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 3b  rstTermInPage );
1de90 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
1dea0 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20  rrent leaf page 
1deb0 69 73 20 66 75 6c 6c 2c 20 66 6c 75 73 68 20 69  is full, flush i
1dec0 74 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20  t to disk. */.  
1ded0 69 66 28 20 28 70 50 61 67 65 2d 3e 62 75 66 2e  if( (pPage->buf.
1dee0 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20  n + pPgidx->n + 
1def0 6e 54 65 72 6d 20 2b 20 32 29 3e 3d 70 2d 3e 70  nTerm + 2)>=p->p
1df00 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a  Config->pgsz ){.
1df10 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62      if( pPage->b
1df20 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20  uf.n>4 ){.      
1df30 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
1df40 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  af(p, pWriter);.
1df50 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21        if( p->rc!
1df60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1df70 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  urn;.    }.    f
1df80 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70  ts5BufferGrow(&p
1df90 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
1dfa0 66 2c 20 6e 54 65 72 6d 2b 46 54 53 35 5f 44 41  f, nTerm+FTS5_DA
1dfb0 54 41 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 7d  TA_PADDING);.  }
1dfc0 0a 20 20 0a 20 20 2f 2a 20 54 4f 44 4f 31 3a 20  .  .  /* TODO1: 
1dfd0 55 70 64 61 74 69 6e 67 20 70 67 69 64 78 20 68  Updating pgidx h
1dfe0 65 72 65 2e 20 2a 2f 0a 20 20 70 50 67 69 64 78  ere. */.  pPgidx
1dff0 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
1e000 73 35 50 75 74 56 61 72 69 6e 74 28 0a 20 20 20  s5PutVarint(.   
1e010 20 20 20 26 70 50 67 69 64 78 2d 3e 70 5b 70 50     &pPgidx->p[pP
1e020 67 69 64 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d  gidx->n], pPage-
1e030 3e 62 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e  >buf.n - pPage->
1e040 69 50 72 65 76 50 67 69 64 78 0a 20 20 29 3b 0a  iPrevPgidx.  );.
1e050 20 20 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67    pPage->iPrevPg
1e060 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 62 75 66  idx = pPage->buf
1e070 2e 6e 3b 0a 23 69 66 20 30 0a 20 20 66 74 73 35  .n;.#if 0.  fts5
1e080 50 75 74 55 31 36 28 26 70 50 67 69 64 78 2d 3e  PutU16(&pPgidx->
1e090 70 5b 70 50 67 69 64 78 2d 3e 6e 5d 2c 20 70 50  p[pPgidx->n], pP
1e0a0 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 70  age->buf.n);.  p
1e0b0 50 67 69 64 78 2d 3e 6e 20 2b 3d 20 32 3b 0a 23  Pgidx->n += 2;.#
1e0c0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 57 72  endif..  if( pWr
1e0d0 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d  iter->bFirstTerm
1e0e0 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 6e 50  InPage ){.    nP
1e0f0 72 65 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 69  refix = 0;.    i
1e100 66 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d  f( pPage->pgno!=
1e110 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  1 ){.      /* Th
1e120 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
1e130 74 65 72 6d 20 6f 6e 20 61 20 6c 65 61 66 20 74  term on a leaf t
1e140 68 61 74 20 69 73 20 6e 6f 74 20 74 68 65 20 6c  hat is not the l
1e150 65 66 74 6d 6f 73 74 20 6c 65 61 66 20 69 6e 0a  eftmost leaf in.
1e160 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 67        ** the seg
1e170 6d 65 6e 74 20 62 2d 74 72 65 65 2e 20 49 6e 20  ment b-tree. In 
1e180 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
1e190 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 64 64  necessary to add
1e1a0 20 61 20 74 65 72 6d 20 74 6f 0a 20 20 20 20 20   a term to.     
1e1b0 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 68   ** the b-tree h
1e1c0 69 65 72 61 72 63 68 79 20 74 68 61 74 20 69 73  ierarchy that is
1e1d0 20 28 61 29 20 6c 61 72 67 65 72 20 74 68 61 6e   (a) larger than
1e1e0 20 74 68 65 20 6c 61 72 67 65 73 74 20 74 65 72   the largest ter
1e1f0 6d 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  m .      ** alre
1e200 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ady written to t
1e210 68 65 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 28  he segment and (
1e220 62 29 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  b) smaller than 
1e230 6f 72 20 65 71 75 61 6c 20 74 6f 0a 20 20 20 20  or equal to.    
1e240 20 20 2a 2a 20 74 68 69 73 20 74 65 72 6d 2e 20    ** this term. 
1e250 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1e260 61 20 70 72 65 66 69 78 20 6f 66 20 28 70 54 65  a prefix of (pTe
1e270 72 6d 2f 6e 54 65 72 6d 29 20 74 68 61 74 20 69  rm/nTerm) that i
1e280 73 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 62  s one.      ** b
1e290 79 74 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20  yte longer than 
1e2a0 74 68 65 20 6c 6f 6e 67 65 73 74 20 70 72 65 66  the longest pref
1e2b0 69 78 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  ix (pTerm/nTerm)
1e2c0 20 73 68 61 72 65 73 20 77 69 74 68 20 74 68 65   shares with the
1e2d0 0a 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f  .      ** previo
1e2e0 75 73 20 74 65 72 6d 2e 20 0a 20 20 20 20 20 20  us term. .      
1e2f0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 73 75 61  **.      ** Usua
1e300 6c 6c 79 2c 20 74 68 65 20 70 72 65 76 69 6f 75  lly, the previou
1e310 73 20 74 65 72 6d 20 69 73 20 61 76 61 69 6c 61  s term is availa
1e320 62 6c 65 20 69 6e 20 70 50 61 67 65 2d 3e 74 65  ble in pPage->te
1e330 72 6d 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f  rm. The exceptio
1e340 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 69 66  n.      ** is if
1e350 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1e360 73 74 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20  st term written 
1e370 69 6e 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  in an incrementa
1e380 6c 2d 6d 65 72 67 65 20 73 74 65 70 2e 0a 20 20  l-merge step..  
1e390 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
1e3a0 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73  ase the previous
1e3b0 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 76 61   term is not ava
1e3c0 69 6c 61 62 6c 65 2c 20 73 6f 20 6a 75 73 74 20  ilable, so just 
1e3d0 77 72 69 74 65 20 61 0a 20 20 20 20 20 20 2a 2a  write a.      **
1e3e0 20 63 6f 70 79 20 6f 66 20 28 70 54 65 72 6d 2f   copy of (pTerm/
1e3f0 6e 54 65 72 6d 29 20 69 6e 74 6f 20 74 68 65 20  nTerm) into the 
1e400 70 61 72 65 6e 74 20 6e 6f 64 65 2e 20 54 68 69  parent node. Thi
1e410 73 20 69 73 20 73 6c 69 67 68 74 6c 79 0a 20 20  s is slightly.  
1e420 20 20 20 20 2a 2a 20 69 6e 65 66 66 69 63 69 65      ** inefficie
1e430 6e 74 2c 20 62 75 74 20 73 74 69 6c 6c 20 63 6f  nt, but still co
1e440 72 72 65 63 74 2e 20 20 2a 2f 0a 20 20 20 20 20  rrect.  */.     
1e450 20 69 6e 74 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a   int n = nTerm;.
1e460 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
1e470 3e 74 65 72 6d 2e 6e 20 29 7b 0a 20 20 20 20 20  >term.n ){.     
1e480 20 20 20 6e 20 3d 20 31 20 2b 20 66 74 73 35 50     n = 1 + fts5P
1e490 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 6e 4d  refixCompress(nM
1e4a0 69 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e  in, pPage->term.
1e4b0 70 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  p, pTerm);.     
1e4c0 20 7d 0a 20 20 20 20 20 20 66 74 73 35 57 72 69   }.      fts5Wri
1e4d0 74 65 42 74 72 65 65 54 65 72 6d 28 70 2c 20 70  teBtreeTerm(p, p
1e4e0 57 72 69 74 65 72 2c 20 6e 2c 20 70 54 65 72 6d  Writer, n, pTerm
1e4f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
1e500 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1e510 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 70 50  return;.      pP
1e520 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  age = &pWriter->
1e530 77 72 69 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20  writer;.    }.  
1e540 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 65 66  }else{.    nPref
1e550 69 78 20 3d 20 66 74 73 35 50 72 65 66 69 78 43  ix = fts5PrefixC
1e560 6f 6d 70 72 65 73 73 28 6e 4d 69 6e 2c 20 70 50  ompress(nMin, pP
1e570 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 70 54 65  age->term.p, pTe
1e580 72 6d 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  rm);.    fts5Buf
1e590 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1e5a0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1e5b0 62 75 66 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20  buf, nPrefix);. 
1e5c0 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20   }..  /* Append 
1e5d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1e5e0 74 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61 2c  tes of new data,
1e5f0 20 74 68 65 6e 20 74 68 65 20 74 65 72 6d 20 64   then the term d
1e600 61 74 61 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20  ata itself.  ** 
1e610 74 6f 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  to the page. */.
1e620 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1e630 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1e640 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54   &pPage->buf, nT
1e650 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 29 3b 0a  erm - nPrefix);.
1e660 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1e670 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
1e680 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72  pPage->buf, nTer
1e690 6d 20 2d 20 6e 50 72 65 66 69 78 2c 20 26 70 54  m - nPrefix, &pT
1e6a0 65 72 6d 5b 6e 50 72 65 66 69 78 5d 29 3b 0a 0a  erm[nPrefix]);..
1e6b0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
1e6c0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 2e 74  Fts5PageWriter.t
1e6d0 65 72 6d 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  erm field. */.  
1e6e0 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
1e6f0 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 74 65  ->rc, &pPage->te
1e700 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  rm, nTerm, pTerm
1e710 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46  );.  pWriter->bF
1e720 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d  irstTermInPage =
1e730 20 30 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e   0;..  pWriter->
1e740 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
1e750 65 20 3d 20 30 3b 0a 20 20 70 57 72 69 74 65 72  e = 0;.  pWriter
1e760 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  ->bFirstRowidInD
1e770 6f 63 6c 69 73 74 20 3d 20 31 3b 0a 0a 20 20 61  oclist = 1;..  a
1e780 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20  ssert( p->rc || 
1e790 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78  (pWriter->nDlidx
1e7a0 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61  >0 && pWriter->a
1e7b0 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3d 3d  Dlidx[0].buf.n==
1e7c0 30 29 20 29 3b 0a 20 20 70 57 72 69 74 65 72 2d  0) );.  pWriter-
1e7d0 3e 61 44 6c 69 64 78 5b 30 5d 2e 70 67 6e 6f 20  >aDlidx[0].pgno 
1e7e0 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 7d  = pPage->pgno;.}
1e7f0 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
1e800 20 72 6f 77 69 64 20 61 6e 64 20 70 6f 73 69 74   rowid and posit
1e810 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69  ion-list size fi
1e820 65 6c 64 20 74 6f 20 74 68 65 20 77 72 69 74 65  eld to the write
1e830 72 73 20 6f 75 74 70 75 74 2e 20 0a 2a 2f 0a 73  rs output. .*/.s
1e840 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
1e850 72 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28  riteAppendRowid(
1e860 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1e870 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
1e880 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 36  r *pWriter,.  i6
1e890 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69 66  4 iRowid.){.  if
1e8a0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1e8b0 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50 61  OK ){.    Fts5Pa
1e8c0 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20  geWriter *pPage 
1e8d0 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  = &pWriter->writ
1e8e0 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 50  er;..    if( (pP
1e8f0 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61  age->buf.n + pPa
1e900 67 65 2d 3e 70 67 69 64 78 2e 6e 29 3e 3d 70 2d  ge->pgidx.n)>=p-
1e910 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29  >pConfig->pgsz )
1e920 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  {.      fts5Writ
1e930 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57  eFlushLeaf(p, pW
1e940 72 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  riter);.    }.. 
1e950 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
1e960 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74   to be the first
1e970 20 72 6f 77 69 64 20 77 72 69 74 74 65 6e 20 74   rowid written t
1e980 6f 20 74 68 65 20 70 61 67 65 2c 20 73 65 74 20  o the page, set 
1e990 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 6f 77 69  the .    ** rowi
1e9a0 64 2d 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  d-pointer in the
1e9b0 20 70 61 67 65 2d 68 65 61 64 65 72 2e 20 41 6c   page-header. Al
1e9c0 73 6f 20 61 70 70 65 6e 64 20 61 20 76 61 6c 75  so append a valu
1e9d0 65 20 74 6f 20 74 68 65 20 64 6c 69 64 78 0a 20  e to the dlidx. 
1e9e0 20 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 69 6e     ** buffer, in
1e9f0 20 63 61 73 65 20 61 20 64 6f 63 6c 69 73 74 2d   case a doclist-
1ea00 69 6e 64 65 78 20 69 73 20 72 65 71 75 69 72 65  index is require
1ea10 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  d.  */.    if( p
1ea20 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
1ea30 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20  widInPage ){.   
1ea40 20 20 20 66 74 73 35 50 75 74 55 31 36 28 70 50     fts5PutU16(pP
1ea50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 28 75 31 36  age->buf.p, (u16
1ea60 29 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a  )pPage->buf.n);.
1ea70 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 44        fts5WriteD
1ea80 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20 70 57  lidxAppend(p, pW
1ea90 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a  riter, iRowid);.
1eaa0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 72      }..    /* Wr
1eab0 69 74 65 20 74 68 65 20 72 6f 77 69 64 2e 20 2a  ite the rowid. *
1eac0 2f 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65  /.    if( pWrite
1ead0 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
1eae0 44 6f 63 6c 69 73 74 20 7c 7c 20 70 57 72 69 74  Doclist || pWrit
1eaf0 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
1eb00 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66  nPage ){.      f
1eb10 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1eb20 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
1eb30 50 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69  Page->buf, iRowi
1eb40 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
1eb50 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
1eb60 70 2d 3e 72 63 20 7c 7c 20 69 52 6f 77 69 64 3e  p->rc || iRowid>
1eb70 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f  pWriter->iPrevRo
1eb80 77 69 64 20 29 3b 0a 20 20 20 20 20 20 66 74 73  wid );.      fts
1eb90 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1eba0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  int(&p->rc, &pPa
1ebb0 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 20  ge->buf, iRowid 
1ebc0 2d 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76  - pWriter->iPrev
1ebd0 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Rowid);.    }.  
1ebe0 20 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76    pWriter->iPrev
1ebf0 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
1ec00 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69      pWriter->bFi
1ec10 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73  rstRowidInDoclis
1ec20 74 20 3d 20 30 3b 0a 20 20 20 20 70 57 72 69 74  t = 0;.    pWrit
1ec30 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
1ec40 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  nPage = 0;.  }.}
1ec50 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1ec60 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73  s5WriteAppendPos
1ec70 6c 69 73 74 44 61 74 61 28 0a 20 20 46 74 73 35  listData(.  Fts5
1ec80 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
1ec90 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1eca0 74 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  ter, .  const u8
1ecb0 20 2a 61 44 61 74 61 2c 20 0a 20 20 69 6e 74 20   *aData, .  int 
1ecc0 6e 44 61 74 61 0a 29 7b 0a 20 20 46 74 73 35 50  nData.){.  Fts5P
1ecd0 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65  ageWriter *pPage
1ece0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69   = &pWriter->wri
1ecf0 74 65 72 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  ter;.  const u8 
1ed00 2a 61 20 3d 20 61 44 61 74 61 3b 0a 20 20 69 6e  *a = aData;.  in
1ed10 74 20 6e 20 3d 20 6e 44 61 74 61 3b 0a 20 20 0a  t n = nData;.  .
1ed20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f    assert( p->pCo
1ed30 6e 66 69 67 2d 3e 70 67 73 7a 3e 30 20 29 3b 0a  nfig->pgsz>0 );.
1ed40 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
1ed50 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20  SQLITE_OK .     
1ed60 26 26 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e  && (pPage->buf.n
1ed70 20 2b 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e   + pPage->pgidx.
1ed80 6e 20 2b 20 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66  n + n)>=p->pConf
1ed90 69 67 2d 3e 70 67 73 7a 20 0a 20 20 29 7b 0a 20  ig->pgsz .  ){. 
1eda0 20 20 20 69 6e 74 20 6e 52 65 71 20 3d 20 70 2d     int nReq = p-
1edb0 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2d  >pConfig->pgsz -
1edc0 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2d 20   pPage->buf.n - 
1edd0 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3b 0a  pPage->pgidx.n;.
1ede0 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
1edf0 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 43  0;.    while( nC
1ee00 6f 70 79 3c 6e 52 65 71 20 29 7b 0a 20 20 20 20  opy<nReq ){.    
1ee10 20 20 69 36 34 20 64 75 6d 6d 79 3b 0a 20 20 20    i64 dummy;.   
1ee20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 66 74 73 35     nCopy += fts5
1ee30 47 65 74 56 61 72 69 6e 74 28 26 61 5b 6e 43 6f  GetVarint(&a[nCo
1ee40 70 79 5d 2c 20 28 75 36 34 2a 29 26 64 75 6d 6d  py], (u64*)&dumm
1ee50 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  y);.    }.    ft
1ee60 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1ee70 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  ob(&p->rc, &pPag
1ee80 65 2d 3e 62 75 66 2c 20 6e 43 6f 70 79 2c 20 61  e->buf, nCopy, a
1ee90 29 3b 0a 20 20 20 20 61 20 2b 3d 20 6e 43 6f 70  );.    a += nCop
1eea0 79 3b 0a 20 20 20 20 6e 20 2d 3d 20 6e 43 6f 70  y;.    n -= nCop
1eeb0 79 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  y;.    fts5Write
1eec0 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
1eed0 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  iter);.  }.  if(
1eee0 20 6e 3e 30 20 29 7b 0a 20 20 20 20 66 74 73 35   n>0 ){.    fts5
1eef0 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1ef00 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
1ef10 3e 62 75 66 2c 20 6e 2c 20 61 29 3b 0a 20 20 7d  >buf, n, a);.  }
1ef20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
1ef30 61 6e 79 20 64 61 74 61 20 63 61 63 68 65 64 20  any data cached 
1ef40 62 79 20 74 68 65 20 77 72 69 74 65 72 20 6f 62  by the writer ob
1ef50 6a 65 63 74 20 74 6f 20 74 68 65 20 64 61 74 61  ject to the data
1ef60 62 61 73 65 2e 20 46 72 65 65 20 61 6e 79 0a 2a  base. Free any.*
1ef70 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73  * allocations as
1ef80 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1ef90 65 20 77 72 69 74 65 72 2e 0a 2a 2f 0a 73 74 61  e writer..*/.sta
1efa0 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
1efb0 74 65 46 69 6e 69 73 68 28 0a 20 20 46 74 73 35  teFinish(.  Fts5
1efc0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
1efd0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1efe0 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ter,         /* 
1eff0 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f  Writer object */
1f000 0a 20 20 69 6e 74 20 2a 70 6e 4c 65 61 66 20 20  .  int *pnLeaf  
1f010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f020 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65     /* OUT: Numbe
1f030 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20  r of leaf pages 
1f040 69 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a  in b-tree */.){.
1f050 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 50    int i;.  Fts5P
1f060 61 67 65 57 72 69 74 65 72 20 2a 70 4c 65 61 66  ageWriter *pLeaf
1f070 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69   = &pWriter->wri
1f080 74 65 72 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ter;.  if( p->rc
1f090 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f0a0 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 61 66     assert( pLeaf
1f0b0 2d 3e 70 67 6e 6f 3e 3d 31 20 29 3b 0a 20 20 20  ->pgno>=1 );.   
1f0c0 20 69 66 28 20 70 4c 65 61 66 2d 3e 62 75 66 2e   if( pLeaf->buf.
1f0d0 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 66 74 73  n>4 ){.      fts
1f0e0 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
1f0f0 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
1f100 20 7d 0a 20 20 20 20 2a 70 6e 4c 65 61 66 20 3d   }.    *pnLeaf =
1f110 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 2d 31 3b 0a   pLeaf->pgno-1;.
1f120 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 70      if( pLeaf->p
1f130 67 6e 6f 3e 31 20 29 7b 0a 20 20 20 20 20 20 66  gno>1 ){.      f
1f140 74 73 35 57 72 69 74 65 46 6c 75 73 68 42 74 72  ts5WriteFlushBtr
1f150 65 65 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  ee(p, pWriter);.
1f160 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35      }.  }.  fts5
1f170 42 75 66 66 65 72 46 72 65 65 28 26 70 4c 65 61  BufferFree(&pLea
1f180 66 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35  f->term);.  fts5
1f190 42 75 66 66 65 72 46 72 65 65 28 26 70 4c 65 61  BufferFree(&pLea
1f1a0 66 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42  f->buf);.  fts5B
1f1b0 75 66 66 65 72 46 72 65 65 28 26 70 4c 65 61 66  ufferFree(&pLeaf
1f1c0 2d 3e 70 67 69 64 78 29 3b 0a 20 20 66 74 73 35  ->pgidx);.  fts5
1f1d0 42 75 66 66 65 72 46 72 65 65 28 26 70 57 72 69  BufferFree(&pWri
1f1e0 74 65 72 2d 3e 62 74 74 65 72 6d 29 3b 0a 0a 20  ter->btterm);.. 
1f1f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69   for(i=0; i<pWri
1f200 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b  ter->nDlidx; i++
1f210 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
1f220 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 57  s5BufferFree(&pW
1f230 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d  riter->aDlidx[i]
1f240 2e 62 75 66 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  .buf);.  }.  sql
1f250 69 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65  ite3_free(pWrite
1f260 72 2d 3e 61 44 6c 69 64 78 29 3b 0a 7d 0a 0a 73  r->aDlidx);.}..s
1f270 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
1f280 72 69 74 65 49 6e 69 74 28 0a 20 20 46 74 73 35  riteInit(.  Fts5
1f290 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
1f2a0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1f2b0 74 65 72 2c 20 0a 20 20 69 6e 74 20 69 53 65 67  ter, .  int iSeg
1f2c0 69 64 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  id.){.  const in
1f2d0 74 20 6e 42 75 66 66 65 72 20 3d 20 70 2d 3e 70  t nBuffer = p->p
1f2e0 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2b 20 46  Config->pgsz + F
1f2f0 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
1f300 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 57 72 69  ;..  memset(pWri
1f310 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ter, 0, sizeof(F
1f320 74 73 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a  ts5SegWriter));.
1f330 20 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69    pWriter->iSegi
1f340 64 20 3d 20 69 53 65 67 69 64 3b 0a 0a 20 20 66  d = iSegid;..  f
1f350 74 73 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f  ts5WriteDlidxGro
1f360 77 28 70 2c 20 70 57 72 69 74 65 72 2c 20 31 29  w(p, pWriter, 1)
1f370 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 77 72 69  ;.  pWriter->wri
1f380 74 65 72 2e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20  ter.pgno = 1;.  
1f390 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
1f3a0 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20  ermInPage = 1;. 
1f3b0 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67   pWriter->iBtPag
1f3c0 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74  e = 1;..  assert
1f3d0 28 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65  ( pWriter->write
1f3e0 72 2e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20  r.buf.n==0 );.  
1f3f0 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72 2d  assert( pWriter-
1f400 3e 77 72 69 74 65 72 2e 70 67 69 64 78 2e 6e 3d  >writer.pgidx.n=
1f410 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 47 72 6f 77  =0 );..  /* Grow
1f420 20 74 68 65 20 74 77 6f 20 62 75 66 66 65 72 73   the two buffers
1f430 20 74 6f 20 70 67 73 7a 20 2b 20 70 61 64 64 69   to pgsz + paddi
1f440 6e 67 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ng bytes in size
1f450 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 74  . */.  sqlite3Ft
1f460 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d  s5BufferSize(&p-
1f470 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 77  >rc, &pWriter->w
1f480 72 69 74 65 72 2e 70 67 69 64 78 2c 20 6e 42 75  riter.pgidx, nBu
1f490 66 66 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ffer);.  sqlite3
1f4a0 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26  Fts5BufferSize(&
1f4b0 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d  p->rc, &pWriter-
1f4c0 3e 77 72 69 74 65 72 2e 62 75 66 2c 20 6e 42 75  >writer.buf, nBu
1f4d0 66 66 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ffer);..  if( p-
1f4e0 3e 70 49 64 78 57 72 69 74 65 72 3d 3d 30 20 29  >pIdxWriter==0 )
1f4f0 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  {.    Fts5Config
1f500 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
1f510 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35  Config;.    fts5
1f520 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74  IndexPrepareStmt
1f530 28 70 2c 20 26 70 2d 3e 70 49 64 78 57 72 69 74  (p, &p->pIdxWrit
1f540 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  er, sqlite3_mpri
1f550 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
1f560 49 4e 53 45 52 54 20 49 4e 54 4f 20 27 25 71 27  INSERT INTO '%q'
1f570 2e 27 25 71 5f 69 64 78 27 28 73 65 67 69 64 2c  .'%q_idx'(segid,
1f580 74 65 72 6d 2c 70 67 6e 6f 29 20 56 41 4c 55 45  term,pgno) VALUE
1f590 53 28 3f 2c 3f 2c 3f 29 22 2c 20 0a 20 20 20 20  S(?,?,?)", .    
1f5a0 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a        pConfig->z
1f5b0 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61  Db, pConfig->zNa
1f5c0 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 0a  me.    ));.  }..
1f5d0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1f5e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
1f5f0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1f600 34 2d 62 79 74 65 20 6c 65 61 66 2d 70 61 67 65  4-byte leaf-page
1f610 20 68 65 61 64 65 72 20 74 6f 20 30 78 30 30 2e   header to 0x00.
1f620 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   */.    memset(p
1f630 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62  Writer->writer.b
1f640 75 66 2e 70 2c 20 30 2c 20 34 29 3b 0a 20 20 20  uf.p, 0, 4);.   
1f650 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72   pWriter->writer
1f660 2e 62 75 66 2e 6e 20 3d 20 34 3b 0a 0a 20 20 20  .buf.n = 4;..   
1f670 20 2f 2a 20 42 69 6e 64 20 74 68 65 20 63 75 72   /* Bind the cur
1f680 72 65 6e 74 20 6f 75 74 70 75 74 20 73 65 67 6d  rent output segm
1f690 65 6e 74 20 69 64 20 74 6f 20 74 68 65 20 69 6e  ent id to the in
1f6a0 64 65 78 2d 77 72 69 74 65 72 2e 20 54 68 69 73  dex-writer. This
1f6b0 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 6f 70   is an.    ** op
1f6c0 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 76 65 72 20  timization over 
1f6d0 62 69 6e 64 69 6e 67 20 74 68 65 20 73 61 6d 65  binding the same
1f6e0 20 76 61 6c 75 65 20 6f 76 65 72 20 61 6e 64 20   value over and 
1f6f0 6f 76 65 72 20 61 73 20 72 6f 77 73 20 61 72 65  over as rows are
1f700 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 65 64  .    ** inserted
1f710 20 69 6e 74 6f 20 25 5f 69 64 78 20 62 79 20 74   into %_idx by t
1f720 68 65 20 63 75 72 72 65 6e 74 20 77 72 69 74 65  he current write
1f730 72 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  r.  */.    sqlit
1f740 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70  e3_bind_int(p->p
1f750 49 64 78 57 72 69 74 65 72 2c 20 31 2c 20 70 57  IdxWriter, 1, pW
1f760 72 69 74 65 72 2d 3e 69 53 65 67 69 64 29 3b 0a  riter->iSegid);.
1f770 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65    }.}../*.** Ite
1f780 72 61 74 6f 72 20 70 49 74 65 72 20 77 61 73 20  rator pIter was 
1f790 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
1f7a0 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 70 75  through the inpu
1f7b0 74 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 6f 6e  t segments of on
1f7c0 20 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74   an.** increment
1f7d0 61 6c 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69  al merge operati
1f7e0 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  on. This functio
1f7f0 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 66 20 74  n is called if t
1f800 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a  he incremental.*
1f810 2a 20 6d 65 72 67 65 20 73 74 65 70 20 68 61 73  * merge step has
1f820 20 66 69 6e 69 73 68 65 64 20 62 75 74 20 74 68   finished but th
1f830 65 20 69 6e 70 75 74 20 68 61 73 20 6e 6f 74 20  e input has not 
1f840 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20  been completely 
1f850 65 78 68 61 75 73 74 65 64 2e 0a 2a 2f 0a 73 74  exhausted..*/.st
1f860 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 72  atic void fts5Tr
1f870 69 6d 53 65 67 6d 65 6e 74 73 28 46 74 73 35 49  imSegments(Fts5I
1f880 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49 74 65  ndex *p, Fts5Ite
1f890 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
1f8a0 20 69 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72   i;.  Fts5Buffer
1f8b0 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26   buf;.  memset(&
1f8c0 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  buf, 0, sizeof(F
1f8d0 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 66  ts5Buffer));.  f
1f8e0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
1f8f0 3e 6e 53 65 67 20 26 26 20 70 2d 3e 72 63 3d 3d  >nSeg && p->rc==
1f900 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
1f910 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72  .    Fts5SegIter
1f920 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
1f930 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 69 66  >aSeg[i];.    if
1f940 28 20 70 53 65 67 2d 3e 70 53 65 67 3d 3d 30 20  ( pSeg->pSeg==0 
1f950 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f  ){.      /* no-o
1f960 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69  p */.    }else i
1f970 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d  f( pSeg->pLeaf==
1f980 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c  0 ){.      /* Al
1f990 6c 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 69 73  l keys from this
1f9a0 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 20 68   input segment h
1f9b0 61 76 65 20 62 65 65 6e 20 74 72 61 6e 73 66 65  ave been transfe
1f9c0 72 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75  red to the outpu
1f9d0 74 2e 0a 20 20 20 20 20 20 2a 2a 20 53 65 74 20  t..      ** Set 
1f9e0 62 6f 74 68 20 74 68 65 20 66 69 72 73 74 20 61  both the first a
1f9f0 6e 64 20 6c 61 73 74 20 70 61 67 65 2d 6e 75 6d  nd last page-num
1fa00 62 65 72 73 20 74 6f 20 30 20 74 6f 20 69 6e 64  bers to 0 to ind
1fa10 69 63 61 74 65 20 74 68 61 74 20 74 68 65 0a 20  icate that the. 
1fa20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20       ** segment 
1fa30 69 73 20 6e 6f 77 20 65 6d 70 74 79 2e 20 2a 2f  is now empty. */
1fa40 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65  .      pSeg->pSe
1fa50 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b  g->pgnoLast = 0;
1fa60 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65  .      pSeg->pSe
1fa70 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 30  g->pgnoFirst = 0
1fa80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1fa90 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 53     int iOff = pS
1faa0 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66  eg->iTermLeafOff
1fab0 73 65 74 3b 20 20 20 20 20 2f 2a 20 4f 66 66 73  set;     /* Offs
1fac0 65 74 20 6f 6e 20 6e 65 77 20 66 69 72 73 74 20  et on new first 
1fad0 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20  leaf page */.   
1fae0 20 20 20 69 36 34 20 69 4c 65 61 66 52 6f 77 69     i64 iLeafRowi
1faf0 64 3b 0a 20 20 20 20 20 20 46 74 73 35 44 61 74  d;.      Fts5Dat
1fb00 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 20 20  a *pData;.      
1fb10 69 6e 74 20 69 49 64 20 3d 20 70 53 65 67 2d 3e  int iId = pSeg->
1fb20 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20  pSeg->iSegid;.  
1fb30 20 20 20 20 75 38 20 61 48 64 72 5b 34 5d 20 3d      u8 aHdr[4] =
1fb40 20 7b 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78   {0x00, 0x00, 0x
1fb50 30 30 2c 20 30 78 30 30 7d 3b 0a 0a 20 20 20 20  00, 0x00};..    
1fb60 20 20 69 4c 65 61 66 52 6f 77 69 64 20 3d 20 46    iLeafRowid = F
1fb70 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
1fb80 44 28 69 49 64 2c 20 70 53 65 67 2d 3e 69 54 65  D(iId, pSeg->iTe
1fb90 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20  rmLeafPgno);.   
1fba0 20 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 4c     pData = fts5L
1fbb0 65 61 66 52 65 61 64 28 70 2c 20 69 4c 65 61 66  eafRead(p, iLeaf
1fbc0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66  Rowid);.      if
1fbd0 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20  ( pData ){.     
1fbe0 20 20 20 69 66 28 20 69 4f 66 66 3e 70 44 61 74     if( iOff>pDat
1fbf0 61 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  a->szLeaf ){.   
1fc00 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
1fc10 61 6e 20 6f 63 63 75 72 20 69 66 20 74 68 65 20  an occur if the 
1fc20 70 61 67 65 73 20 74 68 61 74 20 74 68 65 20 73  pages that the s
1fc30 65 67 6d 65 6e 74 73 20 6f 63 63 75 70 79 20 6f  egments occupy o
1fc40 76 65 72 6c 61 70 20 2d 20 69 66 0a 20 20 20 20  verlap - if.    
1fc50 20 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c        ** a singl
1fc60 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
1fc70 61 73 73 69 67 6e 65 64 20 74 6f 20 6d 6f 72 65  assigned to more
1fc80 20 74 68 61 6e 20 6f 6e 65 20 73 65 67 6d 65 6e   than one segmen
1fc90 74 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20  t. In.          
1fca0 2a 2a 20 74 68 69 73 20 63 61 73 65 20 61 20 70  ** this case a p
1fcb0 72 69 6f 72 20 69 74 65 72 61 74 69 6f 6e 20 6f  rior iteration o
1fcc0 66 20 74 68 69 73 20 6c 6f 6f 70 20 6d 61 79 20  f this loop may 
1fcd0 68 61 76 65 20 63 6f 72 72 75 70 74 65 64 20 74  have corrupted t
1fce0 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
1fcf0 73 65 67 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c  segment currentl
1fd00 79 20 62 65 69 6e 67 20 74 72 69 6d 6d 65 64 2e  y being trimmed.
1fd10 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70    */.          p
1fd20 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
1fd30 55 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  UPT;.        }el
1fd40 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74  se{.          ft
1fd50 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 62 75  s5BufferZero(&bu
1fd60 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  f);.          ft
1fd70 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d  s5BufferGrow(&p-
1fd80 3e 72 63 2c 20 26 62 75 66 2c 20 70 44 61 74 61  >rc, &buf, pData
1fd90 2d 3e 6e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  ->nn);.         
1fda0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1fdb0 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62  dBlob(&p->rc, &b
1fdc0 75 66 2c 20 73 69 7a 65 6f 66 28 61 48 64 72 29  uf, sizeof(aHdr)
1fdd0 2c 20 61 48 64 72 29 3b 0a 20 20 20 20 20 20 20  , aHdr);.       
1fde0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1fdf0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1fe00 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65  , &buf, pSeg->te
1fe10 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  rm.n);.         
1fe20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1fe30 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62  dBlob(&p->rc, &b
1fe40 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e  uf, pSeg->term.n
1fe50 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 29 3b  , pSeg->term.p);
1fe60 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42  .          fts5B
1fe70 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
1fe80 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44  &p->rc, &buf, pD
1fe90 61 74 61 2d 3e 73 7a 4c 65 61 66 2d 69 4f 66 66  ata->szLeaf-iOff
1fea0 2c 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d  ,&pData->p[iOff]
1feb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1fec0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1fed0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1fee0 20 2f 2a 20 53 65 74 20 74 68 65 20 73 7a 4c 65   /* Set the szLe
1fef0 61 66 20 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20  af field */.    
1ff00 20 20 20 20 20 20 20 20 66 74 73 35 50 75 74 55          fts5PutU
1ff10 31 36 28 26 62 75 66 2e 70 5b 32 5d 2c 20 28 75  16(&buf.p[2], (u
1ff20 31 36 29 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20  16)buf.n);.     
1ff30 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1ff40 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20    /* Set up the 
1ff50 6e 65 77 20 70 61 67 65 2d 69 6e 64 65 78 20 61  new page-index a
1ff60 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  rray */.        
1ff70 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1ff80 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1ff90 20 26 62 75 66 2c 20 34 29 3b 0a 20 20 20 20 20   &buf, 4);.     
1ffa0 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 69       if( pSeg->i
1ffb0 4c 65 61 66 50 67 6e 6f 3d 3d 70 53 65 67 2d 3e  LeafPgno==pSeg->
1ffc0 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 0a 20  iTermLeafPgno . 
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
1ffe0 70 53 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  pSeg->iEndofDocl
1fff0 69 73 74 3c 70 44 61 74 61 2d 3e 73 7a 4c 65 61  ist<pData->szLea
20000 66 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  f .            )
20010 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
20020 74 20 6e 44 69 66 66 20 3d 20 70 44 61 74 61 2d  t nDiff = pData-
20030 3e 73 7a 4c 65 61 66 20 2d 20 70 53 65 67 2d 3e  >szLeaf - pSeg->
20040 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b 0a 20  iEndofDoclist;. 
20050 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
20060 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
20070 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
20080 62 75 66 2e 6e 20 2d 20 31 20 2d 20 6e 44 69 66  buf.n - 1 - nDif
20090 66 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 20 20  f - 4);.        
200a0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
200b0 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
200c0 20 26 62 75 66 2c 20 0a 20 20 20 20 20 20 20 20   &buf, .        
200d0 20 20 20 20 20 20 20 20 70 44 61 74 61 2d 3e 6e          pData->n
200e0 6e 20 2d 20 70 53 65 67 2d 3e 69 50 67 69 64 78  n - pSeg->iPgidx
200f0 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b 70  Off, &pData->p[p
20100 53 65 67 2d 3e 69 50 67 69 64 78 4f 66 66 5d 0a  Seg->iPgidxOff].
20110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20120 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  );.          }..
20130 20 20 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e            pSeg->
20140 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
20150 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61  = pSeg->iTermLea
20160 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  fPgno;.         
20170 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28   fts5DataDelete(
20180 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  p, FTS5_SEGMENT_
20190 52 4f 57 49 44 28 69 49 64 2c 20 31 29 2c 20 69  ROWID(iId, 1), i
201a0 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20  LeafRowid);.    
201b0 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72        fts5DataWr
201c0 69 74 65 28 70 2c 20 69 4c 65 61 66 52 6f 77 69  ite(p, iLeafRowi
201d0 64 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29  d, buf.p, buf.n)
201e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
201f0 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
20200 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20  ase(pData);.    
20210 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
20220 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
20230 62 75 66 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  buf);.}..static 
20240 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 43 68  void fts5MergeCh
20250 75 6e 6b 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46  unkCallback(.  F
20260 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
20270 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 63  void *pCtx, .  c
20280 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c  onst u8 *pChunk,
20290 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20   int nChunk.){. 
202a0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
202b0 70 57 72 69 74 65 72 20 3d 20 28 46 74 73 35 53  pWriter = (Fts5S
202c0 65 67 57 72 69 74 65 72 2a 29 70 43 74 78 3b 0a  egWriter*)pCtx;.
202d0 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e    fts5WriteAppen
202e0 64 50 6f 73 6c 69 73 74 44 61 74 61 28 70 2c 20  dPoslistData(p, 
202f0 70 57 72 69 74 65 72 2c 20 70 43 68 75 6e 6b 2c  pWriter, pChunk,
20300 20 6e 43 68 75 6e 6b 29 3b 0a 7d 0a 0a 2f 2a 0a   nChunk);.}../*.
20310 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  **.*/.static voi
20320 64 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65  d fts5IndexMerge
20330 4c 65 76 65 6c 28 0a 20 20 46 74 73 35 49 6e 64  Level(.  Fts5Ind
20340 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
20350 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
20360 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
20370 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
20380 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20  re **ppStruct,  
20390 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
203a0 53 74 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65  Stucture of inde
203b0 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c  x */.  int iLvl,
203c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203d0 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20         /* Level 
203e0 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 66 72  to read input fr
203f0 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52  om */.  int *pnR
20400 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
20410 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
20420 20 75 70 20 74 6f 20 74 68 69 73 20 6d 61 6e 79   up to this many
20430 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20 2a   output leaves *
20440 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  /.){.  Fts5Struc
20450 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
20460 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73  *ppStruct;.  Fts
20470 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
20480 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74  *pLvl = &pStruct
20490 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
204a0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
204b0 65 76 65 6c 20 2a 70 4c 76 6c 4f 75 74 3b 0a 20  evel *pLvlOut;. 
204c0 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
204d0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 49   = 0;       /* I
204e0 74 65 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20  terator to read 
204f0 69 6e 70 75 74 20 64 61 74 61 20 2a 2f 0a 20 20  input data */.  
20500 69 6e 74 20 6e 52 65 6d 20 3d 20 70 6e 52 65 6d  int nRem = pnRem
20510 20 3f 20 2a 70 6e 52 65 6d 20 3a 20 30 3b 20 20   ? *pnRem : 0;  
20520 2f 2a 20 4f 75 74 70 75 74 20 6c 65 61 66 20 70  /* Output leaf p
20530 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69  ages left to wri
20540 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70  te */.  int nInp
20550 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
20560 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20570 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65  r of input segme
20580 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  nts */.  Fts5Seg
20590 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 20  Writer writer;  
205a0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
205b0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  er object */.  F
205c0 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
205d0 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f  ent *pSeg;     /
205e0 2a 20 4f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  * Output segment
205f0 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
20600 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 62 4f 6c   term;.  int bOl
20610 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  dest;           
20620 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
20630 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 73   if the output s
20640 65 67 6d 65 6e 74 20 69 73 20 74 68 65 20 6f 6c  egment is the ol
20650 64 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44  dest */.  int eD
20660 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66  etail = p->pConf
20670 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 63  ig->eDetail;.  c
20680 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
20690 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
206a0 5f 4e 4f 4f 55 54 50 55 54 3b 0a 20 20 69 6e 74  _NOOUTPUT;.  int
206b0 20 62 54 65 72 6d 57 72 69 74 74 65 6e 20 3d 20   bTermWritten = 
206c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
206d0 54 72 75 65 20 69 66 20 63 75 72 72 65 6e 74 20  True if current 
206e0 74 65 72 6d 20 61 6c 72 65 61 64 79 20 6f 75 74  term already out
206f0 70 75 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  put */..  assert
20700 28 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ( iLvl<pStruct->
20710 6e 4c 65 76 65 6c 20 29 3b 0a 20 20 61 73 73 65  nLevel );.  asse
20720 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  rt( pLvl->nMerge
20730 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a  <=pLvl->nSeg );.
20740 0a 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65  .  memset(&write
20750 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  r, 0, sizeof(Fts
20760 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20  5SegWriter));.  
20770 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c  memset(&term, 0,
20780 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
20790 65 72 29 29 3b 0a 20 20 69 66 28 20 70 4c 76 6c  er));.  if( pLvl
207a0 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20  ->nMerge ){.    
207b0 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75  pLvlOut = &pStru
207c0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b  ct->aLevel[iLvl+
207d0 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
207e0 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3e 30 20  pLvlOut->nSeg>0 
207f0 29 3b 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d 20  );.    nInput = 
20800 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20  pLvl->nMerge;.  
20810 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75    pSeg = &pLvlOu
20820 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d  t->aSeg[pLvlOut-
20830 3e 6e 53 65 67 2d 31 5d 3b 0a 0a 20 20 20 20 66  >nSeg-1];..    f
20840 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20  ts5WriteInit(p, 
20850 26 77 72 69 74 65 72 2c 20 70 53 65 67 2d 3e 69  &writer, pSeg->i
20860 53 65 67 69 64 29 3b 0a 20 20 20 20 77 72 69 74  Segid);.    writ
20870 65 72 2e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d  er.writer.pgno =
20880 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b   pSeg->pgnoLast+
20890 31 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 69 42  1;.    writer.iB
208a0 74 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  tPage = 0;.  }el
208b0 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67  se{.    int iSeg
208c0 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74  id = fts5Allocat
208d0 65 53 65 67 69 64 28 70 2c 20 70 53 74 72 75 63  eSegid(p, pStruc
208e0 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65  t);..    /* Exte
208f0 6e 64 20 74 68 65 20 46 74 73 35 53 74 72 75 63  nd the Fts5Struc
20900 74 75 72 65 20 6f 62 6a 65 63 74 20 61 73 20 72  ture object as r
20910 65 71 75 69 72 65 64 20 74 6f 20 65 6e 73 75 72  equired to ensur
20920 65 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  e the output.   
20930 20 2a 2a 20 73 65 67 6d 65 6e 74 20 65 78 69 73   ** segment exis
20940 74 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  ts. */.    if( i
20950 4c 76 6c 3d 3d 70 53 74 72 75 63 74 2d 3e 6e 4c  Lvl==pStruct->nL
20960 65 76 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20  evel-1 ){.      
20970 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64  fts5StructureAdd
20980 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 70  Level(&p->rc, pp
20990 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70  Struct);.      p
209a0 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
209b0 63 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  ct;.    }.    ft
209c0 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e  s5StructureExten
209d0 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70  dLevel(&p->rc, p
209e0 53 74 72 75 63 74 2c 20 69 4c 76 6c 2b 31 2c 20  Struct, iLvl+1, 
209f0 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  1, 0);.    if( p
20a00 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->rc ) return;. 
20a10 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75     pLvl = &pStru
20a20 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
20a30 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20  ;.    pLvlOut = 
20a40 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
20a50 5b 69 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66  [iLvl+1];..    f
20a60 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20  ts5WriteInit(p, 
20a70 26 77 72 69 74 65 72 2c 20 69 53 65 67 69 64 29  &writer, iSegid)
20a80 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  ;..    /* Add th
20a90 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 74 6f  e new segment to
20aa0 20 74 68 65 20 6f 75 74 70 75 74 20 6c 65 76 65   the output leve
20ab0 6c 20 2a 2f 0a 20 20 20 20 70 53 65 67 20 3d 20  l */.    pSeg = 
20ac0 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70  &pLvlOut->aSeg[p
20ad0 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20  LvlOut->nSeg];. 
20ae0 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67     pLvlOut->nSeg
20af0 2b 2b 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70 67  ++;.    pSeg->pg
20b00 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20  noFirst = 1;.   
20b10 20 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20   pSeg->iSegid = 
20b20 69 53 65 67 69 64 3b 0a 20 20 20 20 70 53 74 72  iSegid;.    pStr
20b30 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b  uct->nSegment++;
20b40 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 69 6e  ..    /* Read in
20b50 70 75 74 20 66 72 6f 6d 20 61 6c 6c 20 73 65 67  put from all seg
20b60 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70  ments in the inp
20b70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ut level */.    
20b80 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e  nInput = pLvl->n
20b90 53 65 67 3b 0a 20 20 7d 0a 20 20 62 4f 6c 64 65  Seg;.  }.  bOlde
20ba0 73 74 20 3d 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e  st = (pLvlOut->n
20bb0 53 65 67 3d 3d 31 20 26 26 20 70 53 74 72 75 63  Seg==1 && pStruc
20bc0 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b  t->nLevel==iLvl+
20bd0 32 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  2);..  assert( i
20be0 4c 76 6c 3e 3d 30 20 29 3b 0a 20 20 66 6f 72 28  Lvl>=0 );.  for(
20bf0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
20c00 28 70 2c 20 70 53 74 72 75 63 74 2c 20 66 6c 61  (p, pStruct, fla
20c10 67 73 2c 20 30 2c 20 30 2c 20 30 2c 20 69 4c 76  gs, 0, 0, 0, iLv
20c20 6c 2c 20 6e 49 6e 70 75 74 2c 20 26 70 49 74 65  l, nInput, &pIte
20c30 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  r);.      fts5Mu
20c40 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49  ltiIterEof(p, pI
20c50 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66  ter)==0;.      f
20c60 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
20c70 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29  (p, pIter, 0, 0)
20c80 0a 20 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65  .  ){.    Fts5Se
20c90 67 49 74 65 72 20 2a 70 53 65 67 49 74 65 72 20  gIter *pSegIter 
20ca0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  = &pIter->aSeg[ 
20cb0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
20cc0 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 69  .iFirst ];.    i
20cd0 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20 20  nt nPos;        
20ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20cf0 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
20d00 7a 65 20 66 69 65 6c 64 20 76 61 6c 75 65 20 2a  ze field value *
20d10 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b  /.    int nTerm;
20d20 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  .    const u8 *p
20d30 54 65 72 6d 3b 0a 0a 20 20 20 20 70 54 65 72 6d  Term;..    pTerm
20d40 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
20d50 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 54 65  Term(pIter, &nTe
20d60 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 6e 54 65  rm);.    if( nTe
20d70 72 6d 21 3d 74 65 72 6d 2e 6e 20 7c 7c 20 66 74  rm!=term.n || ft
20d80 73 35 4d 65 6d 63 6d 70 28 70 54 65 72 6d 2c 20  s5Memcmp(pTerm, 
20d90 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 29 20 29  term.p, nTerm) )
20da0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 6e 52 65  {.      if( pnRe
20db0 6d 20 26 26 20 77 72 69 74 65 72 2e 6e 4c 65 61  m && writer.nLea
20dc0 66 57 72 69 74 74 65 6e 3e 6e 52 65 6d 20 29 7b  fWritten>nRem ){
20dd0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
20de0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
20df0 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
20e00 72 63 2c 20 26 74 65 72 6d 2c 20 6e 54 65 72 6d  rc, &term, nTerm
20e10 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
20e20 62 54 65 72 6d 57 72 69 74 74 65 6e 20 3d 30 3b  bTermWritten =0;
20e30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
20e40 68 65 63 6b 20 66 6f 72 20 6b 65 79 20 61 6e 6e  heck for key ann
20e50 69 68 69 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  ihilation. */.  
20e60 20 20 69 66 28 20 70 53 65 67 49 74 65 72 2d 3e    if( pSegIter->
20e70 6e 50 6f 73 3d 3d 30 20 26 26 20 28 62 4f 6c 64  nPos==0 && (bOld
20e80 65 73 74 20 7c 7c 20 70 53 65 67 49 74 65 72 2d  est || pSegIter-
20e90 3e 62 44 65 6c 3d 3d 30 29 20 29 20 63 6f 6e 74  >bDel==0) ) cont
20ea0 69 6e 75 65 3b 0a 0a 20 20 20 20 69 66 28 20 70  inue;..    if( p
20eb0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
20ec0 26 26 20 62 54 65 72 6d 57 72 69 74 74 65 6e 3d  && bTermWritten=
20ed0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
20ee0 68 69 73 20 69 73 20 61 20 6e 65 77 20 74 65 72  his is a new ter
20ef0 6d 2e 20 41 70 70 65 6e 64 20 61 20 74 65 72 6d  m. Append a term
20f00 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 73   to the output s
20f10 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  egment. */.     
20f20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64   fts5WriteAppend
20f30 54 65 72 6d 28 70 2c 20 26 77 72 69 74 65 72 2c  Term(p, &writer,
20f40 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a   nTerm, pTerm);.
20f50 20 20 20 20 20 20 62 54 65 72 6d 57 72 69 74 74        bTermWritt
20f60 65 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  en = 1;.    }.. 
20f70 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65     /* Append the
20f80 20 72 6f 77 69 64 20 74 6f 20 74 68 65 20 6f 75   rowid to the ou
20f90 74 70 75 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 57  tput */.    /* W
20fa0 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20  RITEPOSLISTSIZE 
20fb0 2a 2f 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  */.    fts5Write
20fc0 41 70 70 65 6e 64 52 6f 77 69 64 28 70 2c 20 26  AppendRowid(p, &
20fd0 77 72 69 74 65 72 2c 20 66 74 73 35 4d 75 6c 74  writer, fts5Mult
20fe0 69 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72  iIterRowid(pIter
20ff0 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 44 65  ));..    if( eDe
21000 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
21010 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  L_NONE ){.      
21020 69 66 28 20 70 53 65 67 49 74 65 72 2d 3e 62 44  if( pSegIter->bD
21030 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  el ){.        ft
21040 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
21050 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77 72  rint(&p->rc, &wr
21060 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66 2c  iter.writer.buf,
21070 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
21080 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 3e   pSegIter->nPos>
21090 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  0 ){.          f
210a0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
210b0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77  arint(&p->rc, &w
210c0 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66  riter.writer.buf
210d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
210e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
210f0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 70 70 65  e{.      /* Appe
21100 6e 64 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d  nd the position-
21110 6c 69 73 74 20 64 61 74 61 20 74 6f 20 74 68 65  list data to the
21120 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 20   output */.     
21130 20 6e 50 6f 73 20 3d 20 70 53 65 67 49 74 65 72   nPos = pSegIter
21140 2d 3e 6e 50 6f 73 2a 32 20 2b 20 70 53 65 67 49  ->nPos*2 + pSegI
21150 74 65 72 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20  ter->bDel;.     
21160 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
21170 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
21180 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62  &writer.writer.b
21190 75 66 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20  uf, nPos);.     
211a0 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74   fts5ChunkIterat
211b0 65 28 70 2c 20 70 53 65 67 49 74 65 72 2c 20 28  e(p, pSegIter, (
211c0 76 6f 69 64 2a 29 26 77 72 69 74 65 72 2c 20 66  void*)&writer, f
211d0 74 73 35 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c  ts5MergeChunkCal
211e0 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  lback);.    }.  
211f0 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68  }..  /* Flush th
21200 65 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65  e last leaf page
21210 20 74 6f 20 64 69 73 6b 2e 20 53 65 74 20 74 68   to disk. Set th
21220 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  e output segment
21230 20 62 2d 74 72 65 65 20 68 65 69 67 68 74 0a 20   b-tree height. 
21240 20 2a 2a 20 61 6e 64 20 6c 61 73 74 20 6c 65 61   ** and last lea
21250 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 74  f page number at
21260 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20   the same time. 
21270 20 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65 46   */.  fts5WriteF
21280 69 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65 72  inish(p, &writer
21290 2c 20 26 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  , &pSeg->pgnoLas
212a0 74 29 3b 0a 0a 20 20 69 66 28 20 66 74 73 35 4d  t);..  if( fts5M
212b0 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70  ultiIterEof(p, p
212c0 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74  Iter) ){.    int
212d0 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f   i;..    /* Remo
212e0 76 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74  ve the redundant
212f0 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74   segments from t
21300 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  he %_data table 
21310 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
21320 69 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a  i<nInput; i++){.
21330 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
21340 6d 6f 76 65 53 65 67 6d 65 6e 74 28 70 2c 20 70  moveSegment(p, p
21350 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69 53 65  Lvl->aSeg[i].iSe
21360 67 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  gid);.    }..   
21370 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72   /* Remove the r
21380 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74  edundant segment
21390 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74  s from the input
213a0 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66   level */.    if
213b0 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e 49  ( pLvl->nSeg!=nI
213c0 6e 70 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  nput ){.      in
213d0 74 20 6e 4d 6f 76 65 20 3d 20 28 70 4c 76 6c 2d  t nMove = (pLvl-
213e0 3e 6e 53 65 67 20 2d 20 6e 49 6e 70 75 74 29 20  >nSeg - nInput) 
213f0 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
21400 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a  uctureSegment);.
21410 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 4c        memmove(pL
21420 76 6c 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d  vl->aSeg, &pLvl-
21430 3e 61 53 65 67 5b 6e 49 6e 70 75 74 5d 2c 20 6e  >aSeg[nInput], n
21440 4d 6f 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Move);.    }.   
21450 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
21460 6e 74 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20  nt -= nInput;.  
21470 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20    pLvl->nSeg -= 
21480 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c  nInput;.    pLvl
21490 2d 3e 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20  ->nMerge = 0;.  
214a0 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f    if( pSeg->pgno
214b0 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Last==0 ){.     
214c0 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d   pLvlOut->nSeg--
214d0 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d  ;.      pStruct-
214e0 3e 6e 53 65 67 6d 65 6e 74 2d 2d 3b 0a 20 20 20  >nSegment--;.   
214f0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
21500 61 73 73 65 72 74 28 20 70 53 65 67 2d 3e 70 67  assert( pSeg->pg
21510 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a 20 20 20 20  noLast>0 );.    
21520 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73  fts5TrimSegments
21530 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
21540 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e  pLvl->nMerge = n
21550 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20 20 66 74  Input;.  }..  ft
21560 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
21570 70 49 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75  pIter);.  fts5Bu
21580 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b  fferFree(&term);
21590 0a 20 20 69 66 28 20 70 6e 52 65 6d 20 29 20 2a  .  if( pnRem ) *
215a0 70 6e 52 65 6d 20 2d 3d 20 77 72 69 74 65 72 2e  pnRem -= writer.
215b0 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b 0a 7d 0a  nLeafWritten;.}.
215c0 0a 2f 2a 0a 2a 2a 20 44 6f 20 75 70 20 74 6f 20  ./*.** Do up to 
215d0 6e 50 67 20 70 61 67 65 73 20 6f 66 20 61 75 74  nPg pages of aut
215e0 6f 6d 65 72 67 65 20 77 6f 72 6b 20 6f 6e 20 74  omerge work on t
215f0 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  he index..**.** 
21600 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
21610 6e 79 20 63 68 61 6e 67 65 73 20 77 65 72 65 20  ny changes were 
21620 61 63 74 75 61 6c 6c 79 20 6d 61 64 65 2c 20 6f  actually made, o
21630 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
21640 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
21650 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28   fts5IndexMerge(
21660 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
21670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21680 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
21690 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
216a0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
216b0 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f  pStruct,       /
216c0 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e  * IN/OUT: Curren
216d0 74 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69  t structure of i
216e0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  ndex */.  int nP
216f0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
21700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
21710 65 73 20 6f 66 20 77 6f 72 6b 20 74 6f 20 64 6f  es of work to do
21720 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 20   */.  int nMin  
21730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21740 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d        /* Minimum
21750 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
21760 6e 74 73 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a  nts to merge */.
21770 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20  ){.  int nRem = 
21780 6e 50 67 3b 0a 20 20 69 6e 74 20 62 52 65 74 20  nPg;.  int bRet 
21790 3d 20 30 3b 0a 20 20 46 74 73 35 53 74 72 75 63  = 0;.  Fts5Struc
217a0 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
217b0 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 77 68 69  *ppStruct;.  whi
217c0 6c 65 28 20 6e 52 65 6d 3e 30 20 26 26 20 70 2d  le( nRem>0 && p-
217d0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
217e0 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20  {.    int iLvl; 
217f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21800 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20    /* To iterate 
21810 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a  through levels *
21820 2f 0a 20 20 20 20 69 6e 74 20 69 42 65 73 74 4c  /.    int iBestL
21830 76 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  vl = 0;         
21840 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 66 65 72    /* Level offer
21850 69 6e 67 20 74 68 65 20 6d 6f 73 74 20 69 6e 70  ing the most inp
21860 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  ut segments */. 
21870 20 20 20 69 6e 74 20 6e 42 65 73 74 20 3d 20 30     int nBest = 0
21880 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
21890 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75  * Number of inpu
218a0 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 62 65  t segments on be
218b0 73 74 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20 20  st level */..   
218c0 20 2f 2a 20 53 65 74 20 69 42 65 73 74 4c 76 6c   /* Set iBestLvl
218d0 20 74 6f 20 74 68 65 20 6c 65 76 65 6c 20 74 6f   to the level to
218e0 20 72 65 61 64 20 69 6e 70 75 74 20 73 65 67 6d   read input segm
218f0 65 6e 74 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20  ents from. */.  
21900 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
21910 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20  t->nLevel>0 );. 
21920 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69     for(iLvl=0; i
21930 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
21940 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
21950 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
21960 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26  eLevel *pLvl = &
21970 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
21980 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28  iLvl];.      if(
21990 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b   pLvl->nMerge ){
219a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76  .        if( pLv
219b0 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65 73 74 20  l->nMerge>nBest 
219c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 42 65  ){.          iBe
219d0 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20  stLvl = iLvl;.  
219e0 20 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20          nBest = 
219f0 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20  pLvl->nMerge;.  
21a00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21a10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
21a20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e       if( pLvl->n
21a30 53 65 67 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20  Seg>nBest ){.   
21a40 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76       nBest = pLv
21a50 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20 20 20 20 20  l->nSeg;.       
21a60 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c   iBestLvl = iLvl
21a70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21a80 0a 20 20 20 20 2f 2a 20 49 66 20 6e 42 65 73 74  .    /* If nBest
21a90 20 69 73 20 73 74 69 6c 6c 20 30 2c 20 74 68 65   is still 0, the
21aa0 6e 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74  n the index must
21ab0 20 62 65 20 65 6d 70 74 79 2e 20 2a 2f 0a 23 69   be empty. */.#i
21ac0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
21ad0 47 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30  G.    for(iLvl=0
21ae0 3b 20 6e 42 65 73 74 3d 3d 30 20 26 26 20 69 4c  ; nBest==0 && iL
21af0 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
21b00 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
21b10 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75     assert( pStru
21b20 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
21b30 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a 20 20 20 20  .nSeg==0 );.    
21b40 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66  }.#endif..    if
21b50 28 20 6e 42 65 73 74 3c 6e 4d 69 6e 20 26 26 20  ( nBest<nMin && 
21b60 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
21b70 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65  iBestLvl].nMerge
21b80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65  ==0 ){.      bre
21b90 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 52  ak;.    }.    bR
21ba0 65 74 20 3d 20 31 3b 0a 20 20 20 20 66 74 73 35  et = 1;.    fts5
21bb0 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28  IndexMergeLevel(
21bc0 70 2c 20 26 70 53 74 72 75 63 74 2c 20 69 42 65  p, &pStruct, iBe
21bd0 73 74 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20  stLvl, &nRem);. 
21be0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
21bf0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 74 72 75  LITE_OK && pStru
21c00 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74  ct->aLevel[iBest
21c10 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29  Lvl].nMerge==0 )
21c20 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75  {.      fts5Stru
21c30 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20  cturePromote(p, 
21c40 69 42 65 73 74 4c 76 6c 2b 31 2c 20 70 53 74 72  iBestLvl+1, pStr
21c50 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  uct);.    }.  }.
21c60 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53    *ppStruct = pS
21c70 74 72 75 63 74 3b 0a 20 20 72 65 74 75 72 6e 20  truct;.  return 
21c80 62 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  bRet;.}../*.** A
21c90 20 74 6f 74 61 6c 20 6f 66 20 6e 4c 65 61 66 20   total of nLeaf 
21ca0 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 64 61  leaf pages of da
21cb0 74 61 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ta has just been
21cc0 20 66 6c 75 73 68 65 64 20 74 6f 20 61 20 6c 65   flushed to a le
21cd0 76 65 6c 2d 30 0a 2a 2a 20 73 65 67 6d 65 6e 74  vel-0.** segment
21ce0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
21cf0 75 70 64 61 74 65 73 20 74 68 65 20 77 72 69 74  updates the writ
21d00 65 2d 63 6f 75 6e 74 65 72 20 61 63 63 6f 72 64  e-counter accord
21d10 69 6e 67 6c 79 20 61 6e 64 2c 20 69 66 0a 2a 2a  ingly and, if.**
21d20 20 6e 65 63 65 73 73 61 72 79 2c 20 70 65 72 66   necessary, perf
21d30 6f 72 6d 73 20 69 6e 63 72 65 6d 65 6e 74 61 6c  orms incremental
21d40 20 6d 65 72 67 65 20 77 6f 72 6b 2e 0a 2a 2a 0a   merge work..**.
21d50 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
21d60 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46  ccurs, set the F
21d70 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f  ts5Index.rc erro
21d80 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72  r code. If an er
21d90 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65  ror has .** alre
21da0 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
21db0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
21dc0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
21dd0 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
21de0 41 75 74 6f 6d 65 72 67 65 28 0a 20 20 46 74 73  Automerge(.  Fts
21df0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
21e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21e10 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
21e20 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
21e30 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63  ucture **ppStruc
21e40 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f  t,       /* IN/O
21e50 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75  UT: Current stru
21e60 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a  cture of index *
21e70 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 20 20 20  /.  int nLeaf   
21e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
21ea0 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20 6a   output leaves j
21eb0 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29  ust written */.)
21ec0 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
21ed0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70  QLITE_OK && p->p
21ee0 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72  Config->nAutomer
21ef0 67 65 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35  ge>0 ){.    Fts5
21f00 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
21f10 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
21f20 20 20 20 20 75 36 34 20 6e 57 72 69 74 65 3b 20      u64 nWrite; 
21f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f40 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c    /* Initial val
21f50 75 65 20 6f 66 20 77 72 69 74 65 2d 63 6f 75 6e  ue of write-coun
21f60 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
21f70 57 6f 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Work;           
21f80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
21f90 65 72 20 6f 66 20 77 6f 72 6b 2d 71 75 61 6e 74  er of work-quant
21fa0 61 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a  a to perform */.
21fb0 20 20 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20      int nRem;   
21fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fd0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
21fe0 65 61 66 20 70 61 67 65 73 20 6c 65 66 74 20 74  eaf pages left t
21ff0 6f 20 77 72 69 74 65 20 2a 2f 0a 0a 20 20 20 20  o write */..    
22000 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 77 72  /* Update the wr
22010 69 74 65 2d 63 6f 75 6e 74 65 72 2e 20 57 68 69  ite-counter. Whi
22020 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 20 73 65 74  le doing so, set
22030 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20 20 20 6e   nWork. */.    n
22040 57 72 69 74 65 20 3d 20 70 53 74 72 75 63 74 2d  Write = pStruct-
22050 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a  >nWriteCounter;.
22060 20 20 20 20 6e 57 6f 72 6b 20 3d 20 28 69 6e 74      nWork = (int
22070 29 28 28 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65  )(((nWrite + nLe
22080 61 66 29 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e  af) / p->nWorkUn
22090 69 74 29 20 2d 20 28 6e 57 72 69 74 65 20 2f 20  it) - (nWrite / 
220a0 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 29 3b 0a  p->nWorkUnit));.
220b0 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 57 72      pStruct->nWr
220c0 69 74 65 43 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c  iteCounter += nL
220d0 65 61 66 3b 0a 20 20 20 20 6e 52 65 6d 20 3d 20  eaf;.    nRem = 
220e0 28 69 6e 74 29 28 70 2d 3e 6e 57 6f 72 6b 55 6e  (int)(p->nWorkUn
220f0 69 74 20 2a 20 6e 57 6f 72 6b 20 2a 20 70 53 74  it * nWork * pSt
22100 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 0a  ruct->nLevel);..
22110 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72      fts5IndexMer
22120 67 65 28 70 2c 20 70 70 53 74 72 75 63 74 2c 20  ge(p, ppStruct, 
22130 6e 52 65 6d 2c 20 70 2d 3e 70 43 6f 6e 66 69 67  nRem, p->pConfig
22140 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 29 3b 0a 20  ->nAutomerge);. 
22150 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
22160 64 20 66 74 73 35 49 6e 64 65 78 43 72 69 73 69  d fts5IndexCrisi
22170 73 6d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e  smerge(.  Fts5In
22180 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
22190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
221a0 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
221b0 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
221c0 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 20 20  ure **ppStruct  
221d0 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
221e0 20 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75   Current structu
221f0 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 29  re of index */.)
22200 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43  {.  const int nC
22210 72 69 73 69 73 20 3d 20 70 2d 3e 70 43 6f 6e 66  risis = p->pConf
22220 69 67 2d 3e 6e 43 72 69 73 69 73 4d 65 72 67 65  ig->nCrisisMerge
22230 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
22240 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70  e *pStruct = *pp
22250 53 74 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 4c  Struct;.  int iL
22260 76 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  vl = 0;..  asser
22270 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  t( p->rc!=SQLITE
22280 5f 4f 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e  _OK || pStruct->
22290 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20 77 68  nLevel>0 );.  wh
222a0 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
222b0 54 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74  TE_OK && pStruct
222c0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
222d0 53 65 67 3e 3d 6e 43 72 69 73 69 73 20 29 7b 0a  Seg>=nCrisis ){.
222e0 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72      fts5IndexMer
222f0 67 65 4c 65 76 65 6c 28 70 2c 20 26 70 53 74 72  geLevel(p, &pStr
22300 75 63 74 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a 20  uct, iLvl, 0);. 
22310 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
22320 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
22330 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 28  Struct->nLevel>(
22340 69 4c 76 6c 2b 31 29 20 29 3b 0a 20 20 20 20 66  iLvl+1) );.    f
22350 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d  ts5StructureProm
22360 6f 74 65 28 70 2c 20 69 4c 76 6c 2b 31 2c 20 70  ote(p, iLvl+1, p
22370 53 74 72 75 63 74 29 3b 0a 20 20 20 20 69 4c 76  Struct);.    iLv
22380 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 53 74  l++;.  }.  *ppSt
22390 72 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a  ruct = pStruct;.
223a0 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
223b0 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 46 74  s5IndexReturn(Ft
223c0 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69  s5Index *p){.  i
223d0 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20  nt rc = p->rc;. 
223e0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
223f0 4f 4b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  OK;.  return rc;
22400 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  .}..typedef stru
22410 63 74 20 46 74 73 35 46 6c 75 73 68 43 74 78 20  ct Fts5FlushCtx 
22420 46 74 73 35 46 6c 75 73 68 43 74 78 3b 0a 73 74  Fts5FlushCtx;.st
22430 72 75 63 74 20 46 74 73 35 46 6c 75 73 68 43 74  ruct Fts5FlushCt
22440 78 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20  x {.  Fts5Index 
22450 2a 70 49 64 78 3b 0a 20 20 46 74 73 35 53 65 67  *pIdx;.  Fts5Seg
22460 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 0a  Writer writer; .
22470 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72  };../*.** Buffer
22480 20 61 42 75 66 5b 5d 20 63 6f 6e 74 61 69 6e 73   aBuf[] contains
22490 20 61 20 6c 69 73 74 20 6f 66 20 76 61 72 69 6e   a list of varin
224a0 74 73 2c 20 61 6c 6c 20 73 6d 61 6c 6c 20 65 6e  ts, all small en
224b0 6f 75 67 68 20 74 6f 20 66 69 74 0a 2a 2a 20 69  ough to fit.** i
224c0 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
224d0 65 72 2e 20 52 65 74 75 72 6e 20 74 68 65 20 73  er. Return the s
224e0 69 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67 65  ize of the large
224f0 73 74 20 70 72 65 66 69 78 20 6f 66 20 74 68 69  st prefix of thi
22500 73 20 0a 2a 2a 20 6c 69 73 74 20 6e 4d 61 78 20  s .** list nMax 
22510 62 79 74 65 73 20 6f 72 20 6c 65 73 73 20 69 6e  bytes or less in
22520 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
22530 20 69 6e 74 20 66 74 73 35 50 6f 73 6c 69 73 74   int fts5Poslist
22540 50 72 65 66 69 78 28 63 6f 6e 73 74 20 75 38 20  Prefix(const u8 
22550 2a 61 42 75 66 2c 20 69 6e 74 20 6e 4d 61 78 29  *aBuf, int nMax)
22560 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 75  {.  int ret;.  u
22570 33 32 20 64 75 6d 6d 79 3b 0a 20 20 72 65 74 20  32 dummy;.  ret 
22580 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
22590 32 28 61 42 75 66 2c 20 64 75 6d 6d 79 29 3b 0a  2(aBuf, dummy);.
225a0 20 20 69 66 28 20 72 65 74 3c 6e 4d 61 78 20 29    if( ret<nMax )
225b0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29  {.    while( 1 )
225c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20  {.      int i = 
225d0 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
225e0 26 61 42 75 66 5b 72 65 74 5d 2c 20 64 75 6d 6d  &aBuf[ret], dumm
225f0 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 72  y);.      if( (r
22600 65 74 20 2b 20 69 29 20 3e 20 6e 4d 61 78 20 29  et + i) > nMax )
22610 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 72 65   break;.      re
22620 74 20 2b 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20  t += i;.    }.  
22630 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
22640 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 74  }../*.** Flush t
22650 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69  he contents of i
22660 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
22670 62 6c 65 20 69 48 61 73 68 20 74 6f 20 61 20 6e  ble iHash to a n
22680 65 77 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20 73  ew level-0 .** s
22690 65 67 6d 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 20  egment on disk. 
226a0 41 6c 73 6f 20 75 70 64 61 74 65 20 74 68 65 20  Also update the 
226b0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 73 74  corresponding st
226c0 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e 0a  ructure record..
226d0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
226e0 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68  r occurs, set th
226f0 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65  e Fts5Index.rc e
22700 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e  rror code. If an
22710 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61   error has .** a
22720 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
22730 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
22740 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
22750 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 46 6c  atic void fts5Fl
22760 75 73 68 4f 6e 65 48 61 73 68 28 46 74 73 35 49  ushOneHash(Fts5I
22770 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35  ndex *p){.  Fts5
22780 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 70 2d  Hash *pHash = p-
22790 3e 70 48 61 73 68 3b 0a 20 20 46 74 73 35 53 74  >pHash;.  Fts5St
227a0 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
227b0 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a  ;.  int iSegid;.
227c0 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d    int pgnoLast =
227d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
227e0 20 20 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66      /* Last leaf
227f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20   page number in 
22800 73 65 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  segment */..  /*
22810 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72 65   Obtain a refere
22820 6e 63 65 20 74 6f 20 74 68 65 20 69 6e 64 65 78  nce to the index
22830 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
22840 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65  llocate a new se
22850 67 6d 65 6e 74 2d 69 64 0a 20 20 2a 2a 20 66 6f  gment-id.  ** fo
22860 72 20 74 68 65 20 6e 65 77 20 6c 65 76 65 6c 2d  r the new level-
22870 30 20 73 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a 20  0 segment.  */. 
22880 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53   pStruct = fts5S
22890 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
228a0 0a 20 20 69 53 65 67 69 64 20 3d 20 66 74 73 35  .  iSegid = fts5
228b0 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c  AllocateSegid(p,
228c0 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73   pStruct);.  fts
228d0 35 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69  5StructureInvali
228e0 64 61 74 65 28 70 29 3b 0a 0a 20 20 69 66 28 20  date(p);..  if( 
228f0 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20 63 6f  iSegid ){.    co
22900 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70  nst int pgsz = p
22910 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3b  ->pConfig->pgsz;
22920 0a 20 20 20 20 69 6e 74 20 65 44 65 74 61 69 6c  .    int eDetail
22930 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65   = p->pConfig->e
22940 44 65 74 61 69 6c 3b 0a 20 20 20 20 46 74 73 35  Detail;.    Fts5
22950 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
22960 20 2a 70 53 65 67 3b 20 20 20 2f 2a 20 4e 65 77   *pSeg;   /* New
22970 20 73 65 67 6d 65 6e 74 20 77 69 74 68 69 6e 20   segment within 
22980 70 53 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 46  pStruct */.    F
22990 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b  ts5Buffer *pBuf;
229a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
229b0 42 75 66 66 65 72 20 69 6e 20 77 68 69 63 68 20  Buffer in which 
229c0 74 6f 20 61 73 73 65 6d 62 6c 65 20 6c 65 61 66  to assemble leaf
229d0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 46 74 73   page */.    Fts
229e0 35 42 75 66 66 65 72 20 2a 70 50 67 69 64 78 3b  5Buffer *pPgidx;
229f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
22a00 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f  ffer in which to
22a10 20 61 73 73 65 6d 62 6c 65 20 70 67 69 64 78 20   assemble pgidx 
22a20 2a 2f 0a 0a 20 20 20 20 46 74 73 35 53 65 67 57  */..    Fts5SegW
22a30 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a 20 20  riter writer;.  
22a40 20 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28    fts5WriteInit(
22a50 70 2c 20 26 77 72 69 74 65 72 2c 20 69 53 65 67  p, &writer, iSeg
22a60 69 64 29 3b 0a 0a 20 20 20 20 70 42 75 66 20 3d  id);..    pBuf =
22a70 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e   &writer.writer.
22a80 62 75 66 3b 0a 20 20 20 20 70 50 67 69 64 78 20  buf;.    pPgidx 
22a90 3d 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72  = &writer.writer
22aa0 2e 70 67 69 64 78 3b 0a 0a 20 20 20 20 2f 2a 20  .pgidx;..    /* 
22ab0 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 29 20  fts5WriteInit() 
22ac0 73 68 6f 75 6c 64 20 68 61 76 65 20 69 6e 69 74  should have init
22ad0 69 61 6c 69 7a 65 64 20 74 68 65 20 62 75 66 66  ialized the buff
22ae0 65 72 73 20 74 6f 20 28 6d 6f 73 74 20 6c 69 6b  ers to (most lik
22af0 65 6c 79 29 0a 20 20 20 20 2a 2a 20 74 68 65 20  ely).    ** the 
22b00 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65  maximum space re
22b10 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 61  quired. */.    a
22b20 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20  ssert( p->rc || 
22b30 70 42 75 66 2d 3e 6e 53 70 61 63 65 3e 3d 28 70  pBuf->nSpace>=(p
22b40 67 73 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f  gsz + FTS5_DATA_
22b50 50 41 44 44 49 4e 47 29 20 29 3b 0a 20 20 20 20  PADDING) );.    
22b60 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c  assert( p->rc ||
22b70 20 70 50 67 69 64 78 2d 3e 6e 53 70 61 63 65 3e   pPgidx->nSpace>
22b80 3d 28 70 67 73 7a 20 2b 20 46 54 53 35 5f 44 41  =(pgsz + FTS5_DA
22b90 54 41 5f 50 41 44 44 49 4e 47 29 20 29 3b 0a 0a  TA_PADDING) );..
22ba0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 73 63 61      /* Begin sca
22bb0 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 68 61  nning through ha
22bc0 73 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  sh table entries
22bd0 2e 20 54 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73  . This loop runs
22be0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 0a 20   once for each. 
22bf0 20 20 20 2a 2a 20 74 65 72 6d 2f 64 6f 63 6c 69     ** term/docli
22c00 73 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  st currently sto
22c10 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 68  red within the h
22c20 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  ash table. */.  
22c30 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
22c40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22c50 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46  p->rc = sqlite3F
22c60 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69 74 28  ts5HashScanInit(
22c70 70 48 61 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20  pHash, 0, 0);.  
22c80 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70    }.    while( p
22c90 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
22ca0 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73  && 0==sqlite3Fts
22cb0 35 48 61 73 68 53 63 61 6e 45 6f 66 28 70 48 61  5HashScanEof(pHa
22cc0 73 68 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  sh) ){.      con
22cd0 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20  st char *zTerm; 
22ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
22cf0 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65  er containing te
22d00 72 6d 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  rm */.      cons
22d10 74 20 75 38 20 2a 70 44 6f 63 6c 69 73 74 3b 20  t u8 *pDoclist; 
22d20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
22d30 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 66 6f  er to doclist fo
22d40 72 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20  r this term */. 
22d50 20 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73       int nDoclis
22d60 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
22d70 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c   /* Size of docl
22d80 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ist in bytes */.
22d90 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  .      /* Write 
22da0 74 68 65 20 74 65 72 6d 20 66 6f 72 20 74 68 69  the term for thi
22db0 73 20 65 6e 74 72 79 20 74 6f 20 64 69 73 6b 2e  s entry to disk.
22dc0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
22dd0 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74  3Fts5HashScanEnt
22de0 72 79 28 70 48 61 73 68 2c 20 26 7a 54 65 72 6d  ry(pHash, &zTerm
22df0 2c 20 26 70 44 6f 63 6c 69 73 74 2c 20 26 6e 44  , &pDoclist, &nD
22e00 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 66  oclist);.      f
22e10 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65  ts5WriteAppendTe
22e20 72 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20 28  rm(p, &writer, (
22e30 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d  int)strlen(zTerm
22e40 29 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54  ), (const u8*)zT
22e50 65 72 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  erm);.      if( 
22e60 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
22e70 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20   ) break;..     
22e80 20 61 73 73 65 72 74 28 20 77 72 69 74 65 72 2e   assert( writer.
22e90 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
22ea0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  e==0 );.      if
22eb0 28 20 70 67 73 7a 3e 3d 28 70 42 75 66 2d 3e 6e  ( pgsz>=(pBuf->n
22ec0 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e   + pPgidx->n + n
22ed0 44 6f 63 6c 69 73 74 20 2b 20 31 29 20 29 7b 0a  Doclist + 1) ){.
22ee0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
22ef0 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69  ntire doclist wi
22f00 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75  ll fit on the cu
22f10 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20  rrent leaf. */. 
22f20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
22f30 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
22f40 70 42 75 66 2c 20 70 44 6f 63 6c 69 73 74 2c 20  pBuf, pDoclist, 
22f50 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20  nDoclist);.     
22f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22f70 69 36 34 20 69 52 6f 77 69 64 20 3d 20 30 3b 0a  i64 iRowid = 0;.
22f80 20 20 20 20 20 20 20 20 69 36 34 20 69 44 65 6c          i64 iDel
22f90 74 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ta = 0;.        
22fa0 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20  int iOff = 0;.. 
22fb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e         /* The en
22fc0 74 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c  tire doclist wil
22fd0 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69  l not fit on thi
22fe0 73 20 6c 65 61 66 2e 20 54 68 65 20 66 6f 6c 6c  s leaf. The foll
22ff0 6f 77 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a  owing .        *
23000 2a 20 6c 6f 6f 70 20 69 74 65 72 61 74 65 73 20  * loop iterates 
23010 74 68 72 6f 75 67 68 20 74 68 65 20 70 6f 73 6c  through the posl
23020 69 73 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75  ists that make u
23030 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20  p the current . 
23040 20 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73         ** doclis
23050 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77  t.  */.        w
23060 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
23070 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 6e  ITE_OK && iOff<n
23080 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20  Doclist ){.     
23090 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
230a0 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 6f 63  5GetVarint(&pDoc
230b0 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 28 75 36 34  list[iOff], (u64
230c0 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
230d0 20 20 20 20 20 20 69 52 6f 77 69 64 20 2b 3d 20        iRowid += 
230e0 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20  iDelta;.        
230f0 20 20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28    .          if(
23100 20 77 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f   writer.bFirstRo
23110 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20  widInPage ){.   
23120 20 20 20 20 20 20 20 20 20 66 74 73 35 50 75 74           fts5Put
23130 55 31 36 28 26 70 42 75 66 2d 3e 70 5b 30 5d 2c  U16(&pBuf->p[0],
23140 20 28 75 31 36 29 70 42 75 66 2d 3e 6e 29 3b 20   (u16)pBuf->n); 
23150 20 20 2f 2a 20 66 69 72 73 74 20 72 6f 77 69 64    /* first rowid
23160 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20 20   on page */.    
23170 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20          pBuf->n 
23180 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75  += sqlite3Fts5Pu
23190 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70  tVarint(&pBuf->p
231a0 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 52 6f 77 69  [pBuf->n], iRowi
231b0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
231c0 77 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77  writer.bFirstRow
231d0 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  idInPage = 0;.  
231e0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 57 72            fts5Wr
231f0 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70  iteDlidxAppend(p
23200 2c 20 26 77 72 69 74 65 72 2c 20 69 52 6f 77 69  , &writer, iRowi
23210 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  d);.          }e
23220 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
23230 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69   pBuf->n += sqli
23240 74 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74  te3Fts5PutVarint
23250 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e  (&pBuf->p[pBuf->
23260 6e 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20 20  n], iDelta);.   
23270 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23280 20 20 20 61 73 73 65 72 74 28 20 70 42 75 66 2d     assert( pBuf-
23290 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65  >n<=pBuf->nSpace
232a0 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69   );..          i
232b0 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  f( eDetail==FTS5
232c0 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a  _DETAIL_NONE ){.
232d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
232e0 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20 26 26  iOff<nDoclist &&
232f0 20 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3d   pDoclist[iOff]=
23300 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
23310 20 20 20 20 70 42 75 66 2d 3e 70 5b 70 42 75 66      pBuf->p[pBuf
23320 2d 3e 6e 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20  ->n++] = 0;.    
23330 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b            iOff++
23340 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23350 69 66 28 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73  if( iOff<nDoclis
23360 74 20 26 26 20 70 44 6f 63 6c 69 73 74 5b 69 4f  t && pDoclist[iO
23370 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ff]==0 ){.      
23380 20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e            pBuf->
23390 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 30  p[pBuf->n++] = 0
233a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
233b0 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20    iOff++;.      
233c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
233d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
233e0 20 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e      if( (pBuf->n
233f0 20 2b 20 70 50 67 69 64 78 2d 3e 6e 29 3e 3d 70   + pPgidx->n)>=p
23400 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  gsz ){.         
23410 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c       fts5WriteFl
23420 75 73 68 4c 65 61 66 28 70 2c 20 26 77 72 69 74  ushLeaf(p, &writ
23430 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
23440 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
23450 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
23460 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20  int bDummy;.    
23470 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73          int nPos
23480 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
23490 74 20 6e 43 6f 70 79 20 3d 20 66 74 73 35 47 65  t nCopy = fts5Ge
234a0 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 70 44  tPoslistSize(&pD
234b0 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 26 6e  oclist[iOff], &n
234c0 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20  Pos, &bDummy);. 
234d0 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79             nCopy
234e0 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20   += nPos;.      
234f0 20 20 20 20 20 20 69 66 28 20 28 70 42 75 66 2d        if( (pBuf-
23500 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b  >n + pPgidx->n +
23510 20 6e 43 6f 70 79 29 20 3c 3d 20 70 67 73 7a 20   nCopy) <= pgsz 
23520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
23530 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70   /* The entire p
23540 6f 73 6c 69 73 74 20 77 69 6c 6c 20 66 69 74 20  oslist will fit 
23550 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  on the current l
23560 65 61 66 2e 20 53 6f 20 63 6f 70 79 0a 20 20 20  eaf. So copy.   
23570 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
23580 20 69 6e 20 6f 6e 65 20 67 6f 2e 20 2a 2f 0a 20   in one go. */. 
23590 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73               fts
235a0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
235b0 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 44 6f  dBlob(pBuf, &pDo
235c0 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 6e 43 6f  clist[iOff], nCo
235d0 70 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  py);.           
235e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
235f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74        /* The ent
23600 69 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c  ire poslist will
23610 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73   not fit on this
23620 20 6c 65 61 66 2e 20 53 6f 20 69 74 20 6e 65 65   leaf. So it nee
23630 64 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ds.             
23640 20 2a 2a 20 74 6f 20 62 65 20 62 72 6f 6b 65 6e   ** to be broken
23650 20 69 6e 74 6f 20 73 65 63 74 69 6f 6e 73 2e 20   into sections. 
23660 54 68 65 20 6f 6e 6c 79 20 71 75 61 6c 69 66 69  The only qualifi
23670 63 61 74 69 6f 6e 20 62 65 69 6e 67 0a 20 20 20  cation being.   
23680 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
23690 61 74 20 65 61 63 68 20 76 61 72 69 6e 74 20 6d  at each varint m
236a0 75 73 74 20 62 65 20 73 74 6f 72 65 64 20 63 6f  ust be stored co
236b0 6e 74 69 67 75 6f 75 73 6c 79 2e 20 20 2a 2f 0a  ntiguously.  */.
236c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
236d0 6e 73 74 20 75 38 20 2a 70 50 6f 73 6c 69 73 74  nst u8 *pPoslist
236e0 20 3d 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66   = &pDoclist[iOf
236f0 66 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f];.            
23700 20 20 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b 0a    int iPos = 0;.
23710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
23720 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
23730 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23740 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70           int nSp
23750 61 63 65 20 3d 20 70 67 73 7a 20 2d 20 70 42 75  ace = pgsz - pBu
23760 66 2d 3e 6e 20 2d 20 70 50 67 69 64 78 2d 3e 6e  f->n - pPgidx->n
23770 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23780 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20    int n = 0;.   
23790 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
237a0 20 28 6e 43 6f 70 79 20 2d 20 69 50 6f 73 29 3c   (nCopy - iPos)<
237b0 3d 6e 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  =nSpace ){.     
237c0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d               n =
237d0 20 6e 43 6f 70 79 20 2d 20 69 50 6f 73 3b 0a 20   nCopy - iPos;. 
237e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
237f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23800 20 20 20 20 20 20 20 20 6e 20 3d 20 66 74 73 35          n = fts5
23810 50 6f 73 6c 69 73 74 50 72 65 66 69 78 28 26 70  PoslistPrefix(&p
23820 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e  Poslist[iPos], n
23830 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20  Space);.        
23840 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23850 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
23860 28 20 6e 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  ( n>0 );.       
23870 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
23880 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
23890 62 28 70 42 75 66 2c 20 26 70 50 6f 73 6c 69 73  b(pBuf, &pPoslis
238a0 74 5b 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20 20 20  t[iPos], n);.   
238b0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 6f               iPo
238c0 73 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  s += n;.        
238d0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 42 75          if( (pBu
238e0 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e  f->n + pPgidx->n
238f0 29 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20 20  )>=pgsz ){.     
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73               fts
23910 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
23920 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20  p, &writer);.   
23930 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
23940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
23950 66 28 20 69 50 6f 73 3e 3d 6e 43 6f 70 79 20 29  f( iPos>=nCopy )
23960 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
23970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23980 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23990 20 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70 79 3b    iOff += nCopy;
239a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
239b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
239c0 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 32 3a 20        /* TODO2: 
239d0 44 6f 63 6c 69 73 74 20 74 65 72 6d 69 6e 61 74  Doclist terminat
239e0 6f 72 20 77 72 69 74 74 65 6e 20 68 65 72 65 2e  or written here.
239f0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 70 42 75   */.      /* pBu
23a00 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20  f->p[pBuf->n++] 
23a10 3d 20 27 5c 30 27 3b 20 2a 2f 0a 20 20 20 20 20  = '\0'; */.     
23a20 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e   assert( pBuf->n
23a30 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29  <=pBuf->nSpace )
23a40 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
23a50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 73  c==SQLITE_OK ) s
23a60 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
23a70 61 6e 4e 65 78 74 28 70 48 61 73 68 29 3b 0a 20  anNext(pHash);. 
23a80 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
23a90 46 74 73 35 48 61 73 68 43 6c 65 61 72 28 70 48  Fts5HashClear(pH
23aa0 61 73 68 29 3b 0a 20 20 20 20 66 74 73 35 57 72  ash);.    fts5Wr
23ab0 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72  iteFinish(p, &wr
23ac0 69 74 65 72 2c 20 26 70 67 6e 6f 4c 61 73 74 29  iter, &pgnoLast)
23ad0 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;..    /* Update
23ae0 20 74 68 65 20 46 74 73 35 53 74 72 75 63 74 75   the Fts5Structu
23af0 72 65 2e 20 49 74 20 69 73 20 77 72 69 74 74 65  re. It is writte
23b00 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61  n back to the da
23b10 74 61 62 61 73 65 20 62 79 20 74 68 65 0a 20 20  tabase by the.  
23b20 20 20 2a 2a 20 66 74 73 35 53 74 72 75 63 74 75    ** fts5Structu
23b30 72 65 52 65 6c 65 61 73 65 28 29 20 63 61 6c 6c  reRelease() call
23b40 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20   below.  */.    
23b50 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  if( pStruct->nLe
23b60 76 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  vel==0 ){.      
23b70 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64  fts5StructureAdd
23b80 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 26 70  Level(&p->rc, &p
23b90 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20  Struct);.    }. 
23ba0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
23bb0 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e  ExtendLevel(&p->
23bc0 72 63 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20  rc, pStruct, 0, 
23bd0 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  1, 0);.    if( p
23be0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
23bf0 29 7b 0a 20 20 20 20 20 20 70 53 65 67 20 3d 20  ){.      pSeg = 
23c00 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
23c10 5b 30 5d 2e 61 53 65 67 5b 20 70 53 74 72 75 63  [0].aSeg[ pStruc
23c20 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65  t->aLevel[0].nSe
23c30 67 2b 2b 20 5d 3b 0a 20 20 20 20 20 20 70 53 65  g++ ];.      pSe
23c40 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67  g->iSegid = iSeg
23c50 69 64 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e  id;.      pSeg->
23c60 70 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20  pgnoFirst = 1;. 
23c70 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 4c       pSeg->pgnoL
23c80 61 73 74 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a  ast = pgnoLast;.
23c90 20 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e        pStruct->n
23ca0 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d  Segment++;.    }
23cb0 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
23cc0 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 30 2c 20  rePromote(p, 0, 
23cd0 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 0a 20  pStruct);.  }.. 
23ce0 20 66 74 73 35 49 6e 64 65 78 41 75 74 6f 6d 65   fts5IndexAutome
23cf0 72 67 65 28 70 2c 20 26 70 53 74 72 75 63 74 2c  rge(p, &pStruct,
23d00 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 66 74   pgnoLast);.  ft
23d10 73 35 49 6e 64 65 78 43 72 69 73 69 73 6d 65 72  s5IndexCrisismer
23d20 67 65 28 70 2c 20 26 70 53 74 72 75 63 74 29 3b  ge(p, &pStruct);
23d30 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
23d40 57 72 69 74 65 28 70 2c 20 70 53 74 72 75 63 74  Write(p, pStruct
23d50 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  );.  fts5Structu
23d60 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
23d70 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75  t);.}../*.** Flu
23d80 73 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72  sh any data stor
23d90 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ed in the in-mem
23da0 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20  ory hash tables 
23db0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
23dc0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
23dd0 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 46  fts5IndexFlush(F
23de0 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
23df0 2f 2a 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20  /* Unless it is 
23e00 65 6d 70 74 79 2c 20 66 6c 75 73 68 20 74 68 65  empty, flush the
23e10 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64   hash table to d
23e20 69 73 6b 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  isk */.  if( p->
23e30 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 29 7b 0a  nPendingData ){.
23e40 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
23e50 48 61 73 68 20 29 3b 0a 20 20 20 20 70 2d 3e 6e  Hash );.    p->n
23e60 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b  PendingData = 0;
23e70 0a 20 20 20 20 66 74 73 35 46 6c 75 73 68 4f 6e  .    fts5FlushOn
23e80 65 48 61 73 68 28 70 29 3b 0a 20 20 7d 0a 7d 0a  eHash(p);.  }.}.
23e90 0a 73 74 61 74 69 63 20 46 74 73 35 53 74 72 75  .static Fts5Stru
23ea0 63 74 75 72 65 20 2a 66 74 73 35 49 6e 64 65 78  cture *fts5Index
23eb0 4f 70 74 69 6d 69 7a 65 53 74 72 75 63 74 28 0a  OptimizeStruct(.
23ec0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
23ed0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
23ee0 20 2a 70 53 74 72 75 63 74 0a 29 7b 0a 20 20 46   *pStruct.){.  F
23ef0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 4e  ts5Structure *pN
23f00 65 77 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ew = 0;.  sqlite
23f10 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 3d 20  3_int64 nByte = 
23f20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
23f30 74 75 72 65 29 3b 0a 20 20 69 6e 74 20 6e 53 65  ture);.  int nSe
23f40 67 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 53 65  g = pStruct->nSe
23f50 67 6d 65 6e 74 3b 0a 20 20 69 6e 74 20 69 3b 0a  gment;.  int i;.
23f60 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
23f70 20 69 66 20 74 68 69 73 20 73 74 72 75 63 74 75   if this structu
23f80 72 65 20 72 65 71 75 69 72 65 73 20 6f 70 74 69  re requires opti
23f90 6d 69 7a 61 74 69 6f 6e 2e 20 41 20 73 74 72 75  mization. A stru
23fa0 63 74 75 72 65 20 64 6f 65 73 0a 20 20 2a 2a 20  cture does.  ** 
23fb0 6e 6f 74 20 72 65 71 75 69 72 65 20 6f 70 74 69  not require opti
23fc0 6d 69 7a 61 74 69 6f 6e 20 69 66 20 65 69 74 68  mization if eith
23fd0 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 2b  er:.  **.  **  +
23fe0 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   it consists of 
23ff0 66 65 77 65 72 20 74 68 61 6e 20 74 77 6f 20 73  fewer than two s
24000 65 67 6d 65 6e 74 73 2c 20 6f 72 20 0a 20 20 2a  egments, or .  *
24010 2a 20 20 2b 20 61 6c 6c 20 73 65 67 6d 65 6e 74  *  + all segment
24020 73 20 61 72 65 20 6f 6e 20 74 68 65 20 73 61 6d  s are on the sam
24030 65 20 6c 65 76 65 6c 2c 20 6f 72 0a 20 20 2a 2a  e level, or.  **
24040 20 20 2b 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73    + all segments
24050 20 65 78 63 65 70 74 20 6f 6e 65 20 61 72 65 20   except one are 
24060 63 75 72 72 65 6e 74 6c 79 20 69 6e 70 75 74 73  currently inputs
24070 20 74 6f 20 61 20 6d 65 72 67 65 20 6f 70 65 72   to a merge oper
24080 61 74 69 6f 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ation..  **.  **
24090 20 49 6e 20 74 68 65 20 66 69 72 73 74 20 63 61   In the first ca
240a0 73 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  se, return NULL.
240b0 20 49 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20   In the second, 
240c0 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  increment the re
240d0 66 2d 63 6f 75 6e 74 0a 20 20 2a 2a 20 6f 6e 20  f-count.  ** on 
240e0 2a 70 53 74 72 75 63 74 20 61 6e 64 20 72 65 74  *pStruct and ret
240f0 75 72 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68  urn a copy of th
24100 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e  e pointer to it.
24110 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 53 65 67  .  */.  if( nSeg
24120 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  <2 ) return 0;. 
24130 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 74 72   for(i=0; i<pStr
24140 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b  uct->nLevel; i++
24150 29 7b 0a 20 20 20 20 69 6e 74 20 6e 54 68 69 73  ){.    int nThis
24160 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76   = pStruct->aLev
24170 65 6c 5b 69 5d 2e 6e 53 65 67 3b 0a 20 20 20 20  el[i].nSeg;.    
24180 69 66 28 20 6e 54 68 69 73 3d 3d 6e 53 65 67 20  if( nThis==nSeg 
24190 7c 7c 20 28 6e 54 68 69 73 3d 3d 6e 53 65 67 2d  || (nThis==nSeg-
241a0 31 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c  1 && pStruct->aL
241b0 65 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 3d 3d  evel[i].nMerge==
241c0 6e 54 68 69 73 29 20 29 7b 0a 20 20 20 20 20 20  nThis) ){.      
241d0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 66  fts5StructureRef
241e0 28 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20  (pStruct);.     
241f0 20 72 65 74 75 72 6e 20 70 53 74 72 75 63 74 3b   return pStruct;
24200 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
24210 74 28 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  t( pStruct->aLev
24220 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 3c 3d 6e 54  el[i].nMerge<=nT
24230 68 69 73 20 29 3b 0a 20 20 7d 0a 0a 20 20 6e 42  his );.  }..  nB
24240 79 74 65 20 2b 3d 20 28 70 53 74 72 75 63 74 2d  yte += (pStruct-
24250 3e 6e 4c 65 76 65 6c 2b 31 29 20 2a 20 73 69 7a  >nLevel+1) * siz
24260 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
24270 65 4c 65 76 65 6c 29 3b 0a 20 20 70 4e 65 77 20  eLevel);.  pNew 
24280 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65  = (Fts5Structure
24290 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
242a0 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20  locZero(&p->rc, 
242b0 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70  nByte);..  if( p
242c0 4e 65 77 20 29 7b 0a 20 20 20 20 46 74 73 35 53  New ){.    Fts5S
242d0 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
242e0 4c 76 6c 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  Lvl;.    nByte =
242f0 20 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46   nSeg * sizeof(F
24300 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
24310 65 6e 74 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ent);.    pNew->
24320 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74  nLevel = pStruct
24330 2d 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20 20  ->nLevel+1;.    
24340 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pNew->nRef = 1;.
24350 20 20 20 20 70 4e 65 77 2d 3e 6e 57 72 69 74 65      pNew->nWrite
24360 43 6f 75 6e 74 65 72 20 3d 20 70 53 74 72 75 63  Counter = pStruc
24370 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  t->nWriteCounter
24380 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 4e  ;.    pLvl = &pN
24390 65 77 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75  ew->aLevel[pStru
243a0 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20  ct->nLevel];.   
243b0 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46   pLvl->aSeg = (F
243c0 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
243d0 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35  ent*)sqlite3Fts5
243e0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72  MallocZero(&p->r
243f0 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  c, nByte);.    i
24400 66 28 20 70 4c 76 6c 2d 3e 61 53 65 67 20 29 7b  f( pLvl->aSeg ){
24410 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c  .      int iLvl,
24420 20 69 53 65 67 3b 0a 20 20 20 20 20 20 69 6e 74   iSeg;.      int
24430 20 69 53 65 67 4f 75 74 20 3d 20 30 3b 0a 20 20   iSegOut = 0;.  
24440 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74      /* Iterate t
24450 68 72 6f 75 67 68 20 61 6c 6c 20 73 65 67 6d 65  hrough all segme
24460 6e 74 73 2c 20 66 72 6f 6d 20 6f 6c 64 65 73 74  nts, from oldest
24470 20 74 6f 20 6e 65 77 65 73 74 2e 20 41 64 64 20   to newest. Add 
24480 74 68 65 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a  them to.      **
24490 20 74 68 65 20 6e 65 77 20 46 74 73 35 4c 65 76   the new Fts5Lev
244a0 65 6c 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61  el object so tha
244b0 74 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 30 5d 20  t pLvl->aSeg[0] 
244c0 69 73 20 74 68 65 20 6f 6c 64 65 73 74 0a 20 20  is the oldest.  
244d0 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69      ** segment i
244e0 6e 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63  n the data struc
244f0 74 75 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ture.  */.      
24500 66 6f 72 28 69 4c 76 6c 3d 70 53 74 72 75 63 74  for(iLvl=pStruct
24510 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 4c 76 6c  ->nLevel-1; iLvl
24520 3e 3d 30 3b 20 69 4c 76 6c 2d 2d 29 7b 0a 20 20  >=0; iLvl--){.  
24530 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30        for(iSeg=0
24540 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e  ; iSeg<pStruct->
24550 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
24560 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20  g; iSeg++){.    
24570 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67        pLvl->aSeg
24580 5b 69 53 65 67 4f 75 74 5d 20 3d 20 70 53 74 72  [iSegOut] = pStr
24590 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
245a0 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20  ].aSeg[iSeg];.  
245b0 20 20 20 20 20 20 20 20 69 53 65 67 4f 75 74 2b          iSegOut+
245c0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
245d0 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
245e0 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 70 4c 76 6c  >nSegment = pLvl
245f0 2d 3e 6e 53 65 67 20 3d 20 6e 53 65 67 3b 0a 20  ->nSeg = nSeg;. 
24600 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24610 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
24620 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d  w);.      pNew =
24630 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
24640 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
24650 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
24660 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65 28 46 74  IndexOptimize(Ft
24670 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46  s5Index *p){.  F
24680 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
24690 74 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72  truct;.  Fts5Str
246a0 75 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30  ucture *pNew = 0
246b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
246c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
246d0 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73  .  fts5IndexFlus
246e0 68 28 70 29 3b 0a 20 20 70 53 74 72 75 63 74 20  h(p);.  pStruct 
246f0 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
24700 65 61 64 28 70 29 3b 0a 20 20 66 74 73 35 53 74  ead(p);.  fts5St
24710 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74  ructureInvalidat
24720 65 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 53 74  e(p);..  if( pSt
24730 72 75 63 74 20 29 7b 0a 20 20 20 20 70 4e 65 77  ruct ){.    pNew
24740 20 3d 20 66 74 73 35 49 6e 64 65 78 4f 70 74 69   = fts5IndexOpti
24750 6d 69 7a 65 53 74 72 75 63 74 28 70 2c 20 70 53  mizeStruct(p, pS
24760 74 72 75 63 74 29 3b 0a 20 20 7d 0a 20 20 66 74  truct);.  }.  ft
24770 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
24780 73 65 28 70 53 74 72 75 63 74 29 3b 0a 0a 20 20  se(pStruct);..  
24790 61 73 73 65 72 74 28 20 70 4e 65 77 3d 3d 30 20  assert( pNew==0 
247a0 7c 7c 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e  || pNew->nSegmen
247b0 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  t>0 );.  if( pNe
247c0 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76  w ){.    int iLv
247d0 6c 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  l;.    for(iLvl=
247e0 30 3b 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b  0; pNew->aLevel[
247f0 69 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69  iLvl].nSeg==0; i
24800 4c 76 6c 2b 2b 29 7b 7d 0a 20 20 20 20 77 68 69  Lvl++){}.    whi
24810 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
24820 45 5f 4f 4b 20 26 26 20 70 4e 65 77 2d 3e 61 4c  E_OK && pNew->aL
24830 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e  evel[iLvl].nSeg>
24840 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  0 ){.      int n
24850 52 65 6d 20 3d 20 46 54 53 35 5f 4f 50 54 5f 57  Rem = FTS5_OPT_W
24860 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 20 20  ORK_UNIT;.      
24870 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65  fts5IndexMergeLe
24880 76 65 6c 28 70 2c 20 26 70 4e 65 77 2c 20 69 4c  vel(p, &pNew, iL
24890 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20  vl, &nRem);.    
248a0 7d 0a 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  }..    fts5Struc
248b0 74 75 72 65 57 72 69 74 65 28 70 2c 20 70 4e 65  tureWrite(p, pNe
248c0 77 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75  w);.    fts5Stru
248d0 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 4e 65  ctureRelease(pNe
248e0 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  w);.  }..  retur
248f0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
24900 6e 28 70 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n(p); .}../*.** 
24910 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74  This is called t
24920 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
24930 73 70 65 63 69 61 6c 20 22 56 41 4c 55 45 53 28  special "VALUES(
24940 27 6d 65 72 67 65 27 2c 20 24 6e 4d 65 72 67 65  'merge', $nMerge
24950 29 22 0a 2a 2a 20 49 4e 53 45 52 54 20 63 6f 6d  )".** INSERT com
24960 6d 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mand..*/.int sql
24970 69 74 65 33 46 74 73 35 49 6e 64 65 78 4d 65 72  ite3Fts5IndexMer
24980 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ge(Fts5Index *p,
24990 20 69 6e 74 20 6e 4d 65 72 67 65 29 7b 0a 20 20   int nMerge){.  
249a0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
249b0 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
249c0 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20  uctureRead(p);. 
249d0 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a   if( pStruct ){.
249e0 20 20 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70      int nMin = p
249f0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 55 73 65 72  ->pConfig->nUser
24a00 6d 65 72 67 65 3b 0a 20 20 20 20 66 74 73 35 53  merge;.    fts5S
24a10 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61  tructureInvalida
24a20 74 65 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6e  te(p);.    if( n
24a30 4d 65 72 67 65 3c 30 20 29 7b 0a 20 20 20 20 20  Merge<0 ){.     
24a40 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
24a50 70 4e 65 77 20 3d 20 66 74 73 35 49 6e 64 65 78  pNew = fts5Index
24a60 4f 70 74 69 6d 69 7a 65 53 74 72 75 63 74 28 70  OptimizeStruct(p
24a70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20  , pStruct);.    
24a80 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
24a90 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
24aa0 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 20 3d  .      pStruct =
24ab0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4d 69   pNew;.      nMi
24ac0 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 6e 4d 65  n = 2;.      nMe
24ad0 72 67 65 20 3d 20 6e 4d 65 72 67 65 2a 2d 31 3b  rge = nMerge*-1;
24ae0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
24af0 53 74 72 75 63 74 20 26 26 20 70 53 74 72 75 63  Struct && pStruc
24b00 74 2d 3e 6e 4c 65 76 65 6c 20 29 7b 0a 20 20 20  t->nLevel ){.   
24b10 20 20 20 69 66 28 20 66 74 73 35 49 6e 64 65 78     if( fts5Index
24b20 4d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63  Merge(p, &pStruc
24b30 74 2c 20 6e 4d 65 72 67 65 2c 20 6e 4d 69 6e 29  t, nMerge, nMin)
24b40 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
24b50 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70  StructureWrite(p
24b60 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20  , pStruct);.    
24b70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74    }.    }.    ft
24b80 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
24b90 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 7d  se(pStruct);.  }
24ba0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
24bb0 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
24bc0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
24bd0 35 41 70 70 65 6e 64 52 6f 77 69 64 28 0a 20 20  5AppendRowid(.  
24be0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20  Fts5Index *p,.  
24bf0 69 36 34 20 69 44 65 6c 74 61 2c 0a 20 20 46 74  i64 iDelta,.  Ft
24c00 73 35 49 74 65 72 20 2a 70 55 6e 75 73 65 64 2c  s5Iter *pUnused,
24c10 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
24c20 42 75 66 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Buf.){.  UNUSED_
24c30 50 41 52 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a  PARAM(pUnused);.
24c40 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
24c50 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
24c60 20 70 42 75 66 2c 20 69 44 65 6c 74 61 29 3b 0a   pBuf, iDelta);.
24c70 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
24c80 74 73 35 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  ts5AppendPoslist
24c90 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
24ca0 2c 0a 20 20 69 36 34 20 69 44 65 6c 74 61 2c 0a  ,.  i64 iDelta,.
24cb0 20 20 46 74 73 35 49 74 65 72 20 2a 70 4d 75 6c    Fts5Iter *pMul
24cc0 74 69 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72  ti,.  Fts5Buffer
24cd0 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20   *pBuf.){.  int 
24ce0 6e 44 61 74 61 20 3d 20 70 4d 75 6c 74 69 2d 3e  nData = pMulti->
24cf0 62 61 73 65 2e 6e 44 61 74 61 3b 0a 20 20 61 73  base.nData;.  as
24d00 73 65 72 74 28 20 6e 44 61 74 61 3e 30 20 29 3b  sert( nData>0 );
24d10 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
24d20 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 66 74  LITE_OK && 0==ft
24d30 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d  s5BufferGrow(&p-
24d40 3e 72 63 2c 20 70 42 75 66 2c 20 6e 44 61 74 61  >rc, pBuf, nData
24d50 2b 39 2b 39 29 20 29 7b 0a 20 20 20 20 66 74 73  +9+9) ){.    fts
24d60 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
24d70 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69 44  dVarint(pBuf, iD
24d80 65 6c 74 61 29 3b 0a 20 20 20 20 66 74 73 35 42  elta);.    fts5B
24d90 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
24da0 61 72 69 6e 74 28 70 42 75 66 2c 20 6e 44 61 74  arint(pBuf, nDat
24db0 61 2a 32 29 3b 0a 20 20 20 20 66 74 73 35 42 75  a*2);.    fts5Bu
24dc0 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
24dd0 6f 62 28 70 42 75 66 2c 20 70 4d 75 6c 74 69 2d  ob(pBuf, pMulti-
24de0 3e 62 61 73 65 2e 70 44 61 74 61 2c 20 6e 44 61  >base.pData, nDa
24df0 74 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 73 74 61  ta);.  }.}...sta
24e00 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63  tic void fts5Doc
24e10 6c 69 73 74 49 74 65 72 4e 65 78 74 28 46 74 73  listIterNext(Fts
24e20 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49  5DoclistIter *pI
24e30 74 65 72 29 7b 0a 20 20 75 38 20 2a 70 20 3d 20  ter){.  u8 *p = 
24e40 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20  pIter->aPoslist 
24e50 2b 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 2b  + pIter->nSize +
24e60 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74   pIter->nPoslist
24e70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ;..  assert( pIt
24e80 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 29 3b 0a  er->aPoslist );.
24e90 20 20 69 66 28 20 70 3e 3d 70 49 74 65 72 2d 3e    if( p>=pIter->
24ea0 61 45 6f 66 20 29 7b 0a 20 20 20 20 70 49 74 65  aEof ){.    pIte
24eb0 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b  r->aPoslist = 0;
24ec0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36  .  }else{.    i6
24ed0 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 70  4 iDelta;..    p
24ee0 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
24ef0 74 28 70 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  t(p, (u64*)&iDel
24f00 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ta);.    pIter->
24f10 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61  iRowid += iDelta
24f20 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 70  ;..    /* Read p
24f30 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a  osition list siz
24f40 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 5b 30  e */.    if( p[0
24f50 5d 20 26 20 30 78 38 30 20 29 7b 0a 20 20 20 20  ] & 0x80 ){.    
24f60 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20    int nPos;.    
24f70 20 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d    pIter->nSize =
24f80 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
24f90 28 70 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20  (p, nPos);.     
24fa0 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74   pIter->nPoslist
24fb0 20 3d 20 28 6e 50 6f 73 3e 3e 31 29 3b 0a 20 20   = (nPos>>1);.  
24fc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
24fd0 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d  Iter->nPoslist =
24fe0 20 28 28 69 6e 74 29 28 70 5b 30 5d 29 29 20 3e   ((int)(p[0])) >
24ff0 3e 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 72  > 1;.      pIter
25000 2d 3e 6e 53 69 7a 65 20 3d 20 31 3b 0a 20 20 20  ->nSize = 1;.   
25010 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 61   }..    pIter->a
25020 50 6f 73 6c 69 73 74 20 3d 20 70 3b 0a 20 20 7d  Poslist = p;.  }
25030 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
25040 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49  fts5DoclistIterI
25050 6e 69 74 28 0a 20 20 46 74 73 35 42 75 66 66 65  nit(.  Fts5Buffe
25060 72 20 2a 70 42 75 66 2c 20 0a 20 20 46 74 73 35  r *pBuf, .  Fts5
25070 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74  DoclistIter *pIt
25080 65 72 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70  er.){.  memset(p
25090 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
250a0 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65  *pIter));.  pIte
250b0 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70 42  r->aPoslist = pB
250c0 75 66 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e  uf->p;.  pIter->
250d0 61 45 6f 66 20 3d 20 26 70 42 75 66 2d 3e 70 5b  aEof = &pBuf->p[
250e0 70 42 75 66 2d 3e 6e 5d 3b 0a 20 20 66 74 73 35  pBuf->n];.  fts5
250f0 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
25100 70 49 74 65 72 29 3b 0a 7d 0a 0a 23 69 66 20 30  pIter);.}..#if 0
25110 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
25120 64 6f 63 6c 69 73 74 20 74 6f 20 62 75 66 66 65  doclist to buffe
25130 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68  r pBuf..**.** Th
25140 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
25150 6d 65 73 20 74 68 61 74 20 73 70 61 63 65 20 77  mes that space w
25160 69 74 68 69 6e 20 74 68 65 20 62 75 66 66 65 72  ithin the buffer
25170 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
25180 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  n.** allocated..
25190 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
251a0 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
251b0 63 69 64 28 0a 20 20 46 74 73 35 42 75 66 66 65  cid(.  Fts5Buffe
251c0 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  r *pBuf,        
251d0 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
251e0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
251f0 20 20 69 36 34 20 2a 70 69 4c 61 73 74 52 6f 77    i64 *piLastRow
25200 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
25210 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65    /* IN/OUT: Pre
25220 76 69 6f 75 73 20 72 6f 77 69 64 20 77 72 69 74  vious rowid writ
25230 74 65 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ten (if any) */.
25240 20 20 69 36 34 20 69 52 6f 77 69 64 20 20 20 20    i64 iRowid    
25250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25260 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61 70    /* Rowid to ap
25270 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  pend */.){.  ass
25280 65 72 74 28 20 70 42 75 66 2d 3e 6e 21 3d 30 20  ert( pBuf->n!=0 
25290 7c 7c 20 28 2a 70 69 4c 61 73 74 52 6f 77 69 64  || (*piLastRowid
252a0 29 3d 3d 30 20 29 3b 0a 20 20 66 74 73 35 42 75  )==0 );.  fts5Bu
252b0 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
252c0 72 69 6e 74 28 70 42 75 66 2c 20 69 52 6f 77 69  rint(pBuf, iRowi
252d0 64 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77 69 64  d - *piLastRowid
252e0 29 3b 0a 20 20 2a 70 69 4c 61 73 74 52 6f 77 69  );.  *piLastRowi
252f0 64 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 23 65  d = iRowid;.}.#e
25300 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 66 74  ndif..#define ft
25310 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
25320 69 64 28 70 42 75 66 2c 20 69 4c 61 73 74 52 6f  id(pBuf, iLastRo
25330 77 69 64 2c 20 69 52 6f 77 69 64 29 20 7b 20 20  wid, iRowid) {  
25340 20 20 20 20 20 5c 0a 20 20 61 73 73 65 72 74 28       \.  assert(
25350 20 28 70 42 75 66 29 2d 3e 6e 21 3d 30 20 7c 7c   (pBuf)->n!=0 ||
25360 20 28 69 4c 61 73 74 52 6f 77 69 64 29 3d 3d 30   (iLastRowid)==0
25370 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
25380 20 20 20 20 20 20 5c 0a 20 20 66 74 73 35 42 75        \.  fts5Bu
25390 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
253a0 72 69 6e 74 28 28 70 42 75 66 29 2c 20 28 69 52  rint((pBuf), (iR
253b0 6f 77 69 64 29 20 2d 20 28 69 4c 61 73 74 52 6f  owid) - (iLastRo
253c0 77 69 64 29 29 3b 20 5c 0a 20 20 28 69 4c 61 73  wid)); \.  (iLas
253d0 74 52 6f 77 69 64 29 20 3d 20 28 69 52 6f 77 69  tRowid) = (iRowi
253e0 64 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d);             
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25400 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a          \.}../*.
25410 2a 2a 20 53 77 61 70 20 74 68 65 20 63 6f 6e 74  ** Swap the cont
25420 65 6e 74 73 20 6f 66 20 62 75 66 66 65 72 20 2a  ents of buffer *
25430 70 31 20 77 69 74 68 20 74 68 61 74 20 6f 66 20  p1 with that of 
25440 2a 70 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  *p2..*/.static v
25450 6f 69 64 20 66 74 73 35 42 75 66 66 65 72 53 77  oid fts5BufferSw
25460 61 70 28 46 74 73 35 42 75 66 66 65 72 20 2a 70  ap(Fts5Buffer *p
25470 31 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  1, Fts5Buffer *p
25480 32 29 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72  2){.  Fts5Buffer
25490 20 74 6d 70 20 3d 20 2a 70 31 3b 0a 20 20 2a 70   tmp = *p1;.  *p
254a0 31 20 3d 20 2a 70 32 3b 0a 20 20 2a 70 32 20 3d  1 = *p2;.  *p2 =
254b0 20 74 6d 70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   tmp;.}..static 
254c0 76 6f 69 64 20 66 74 73 35 4e 65 78 74 52 6f 77  void fts5NextRow
254d0 69 64 28 46 74 73 35 42 75 66 66 65 72 20 2a 70  id(Fts5Buffer *p
254e0 42 75 66 2c 20 69 6e 74 20 2a 70 69 4f 66 66 2c  Buf, int *piOff,
254f0 20 69 36 34 20 2a 70 69 52 6f 77 69 64 29 7b 0a   i64 *piRowid){.
25500 20 20 69 6e 74 20 69 20 3d 20 2a 70 69 4f 66 66    int i = *piOff
25510 3b 0a 20 20 69 66 28 20 69 3e 3d 70 42 75 66 2d  ;.  if( i>=pBuf-
25520 3e 6e 20 29 7b 0a 20 20 20 20 2a 70 69 4f 66 66  >n ){.    *piOff
25530 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
25540 20 20 20 20 75 36 34 20 69 56 61 6c 3b 0a 20 20      u64 iVal;.  
25550 20 20 2a 70 69 4f 66 66 20 3d 20 69 20 2b 20 73    *piOff = i + s
25560 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
25570 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69 5d 2c  int(&pBuf->p[i],
25580 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 2a 70 69   &iVal);.    *pi
25590 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20  Rowid += iVal;. 
255a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
255b0 20 69 73 20 74 68 65 20 65 71 75 69 76 61 6c 65   is the equivale
255c0 6e 74 20 6f 66 20 66 74 73 35 4d 65 72 67 65 50  nt of fts5MergeP
255d0 72 65 66 69 78 4c 69 73 74 73 28 29 20 66 6f 72  refixLists() for
255e0 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 6d 6f 64   detail=none mod
255f0 65 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63 61  e..** In this ca
25600 73 65 20 74 68 65 20 62 75 66 66 65 72 73 20 63  se the buffers c
25610 6f 6e 73 69 73 74 20 6f 66 20 61 20 64 65 6c 74  onsist of a delt
25620 61 2d 65 6e 63 6f 64 65 64 20 6c 69 73 74 20 6f  a-encoded list o
25630 66 20 72 6f 77 69 64 73 20 6f 6e 6c 79 2e 0a 2a  f rowids only..*
25640 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
25650 73 35 4d 65 72 67 65 52 6f 77 69 64 4c 69 73 74  s5MergeRowidList
25660 73 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  s(.  Fts5Index *
25670 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
25680 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
25690 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
256a0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c   Fts5Buffer *p1,
256b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256c0 20 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20 74   /* First list t
256d0 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73  o merge */.  Fts
256e0 35 42 75 66 66 65 72 20 2a 70 32 20 20 20 20 20  5Buffer *p2     
256f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25700 53 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d  Second list to m
25710 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  erge */.){.  int
25720 20 69 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   i1 = 0;.  int i
25730 32 20 3d 20 30 3b 0a 20 20 69 36 34 20 69 52 6f  2 = 0;.  i64 iRo
25740 77 69 64 31 20 3d 20 30 3b 0a 20 20 69 36 34 20  wid1 = 0;.  i64 
25750 69 52 6f 77 69 64 32 20 3d 20 30 3b 0a 20 20 69  iRowid2 = 0;.  i
25760 36 34 20 69 4f 75 74 20 3d 20 30 3b 0a 0a 20 20  64 iOut = 0;..  
25770 46 74 73 35 42 75 66 66 65 72 20 6f 75 74 3b 0a  Fts5Buffer out;.
25780 20 20 6d 65 6d 73 65 74 28 26 6f 75 74 2c 20 30    memset(&out, 0
25790 2c 20 73 69 7a 65 6f 66 28 6f 75 74 29 29 3b 0a  , sizeof(out));.
257a0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
257b0 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20  ferSize(&p->rc, 
257c0 26 6f 75 74 2c 20 70 31 2d 3e 6e 20 2b 20 70 32  &out, p1->n + p2
257d0 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  ->n);.  if( p->r
257e0 63 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 66  c ) return;..  f
257f0 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70 31 2c  ts5NextRowid(p1,
25800 20 26 69 31 2c 20 26 69 52 6f 77 69 64 31 29 3b   &i1, &iRowid1);
25810 0a 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64  .  fts5NextRowid
25820 28 70 32 2c 20 26 69 32 2c 20 26 69 52 6f 77 69  (p2, &i2, &iRowi
25830 64 32 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 31  d2);.  while( i1
25840 3e 3d 30 20 7c 7c 20 69 32 3e 3d 30 20 29 7b 0a  >=0 || i2>=0 ){.
25850 20 20 20 20 69 66 28 20 69 31 3e 3d 30 20 26 26      if( i1>=0 &&
25860 20 28 69 32 3c 30 20 7c 7c 20 69 52 6f 77 69 64   (i2<0 || iRowid
25870 31 3c 69 52 6f 77 69 64 32 29 20 29 7b 0a 20 20  1<iRowid2) ){.  
25880 20 20 20 20 61 73 73 65 72 74 28 20 69 4f 75 74      assert( iOut
25890 3d 3d 30 20 7c 7c 20 69 52 6f 77 69 64 31 3e 69  ==0 || iRowid1>i
258a0 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 66 74 73  Out );.      fts
258b0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
258c0 64 56 61 72 69 6e 74 28 26 6f 75 74 2c 20 69 52  dVarint(&out, iR
258d0 6f 77 69 64 31 20 2d 20 69 4f 75 74 29 3b 0a 20  owid1 - iOut);. 
258e0 20 20 20 20 20 69 4f 75 74 20 3d 20 69 52 6f 77       iOut = iRow
258f0 69 64 31 3b 0a 20 20 20 20 20 20 66 74 73 35 4e  id1;.      fts5N
25900 65 78 74 52 6f 77 69 64 28 70 31 2c 20 26 69 31  extRowid(p1, &i1
25910 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a 20 20 20  , &iRowid1);.   
25920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
25930 73 65 72 74 28 20 69 4f 75 74 3d 3d 30 20 7c 7c  sert( iOut==0 ||
25940 20 69 52 6f 77 69 64 32 3e 69 4f 75 74 20 29 3b   iRowid2>iOut );
25950 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
25960 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
25970 74 28 26 6f 75 74 2c 20 69 52 6f 77 69 64 32 20  t(&out, iRowid2 
25980 2d 20 69 4f 75 74 29 3b 0a 20 20 20 20 20 20 69  - iOut);.      i
25990 4f 75 74 20 3d 20 69 52 6f 77 69 64 32 3b 0a 20  Out = iRowid2;. 
259a0 20 20 20 20 20 69 66 28 20 69 31 3e 3d 30 20 26       if( i1>=0 &
259b0 26 20 69 52 6f 77 69 64 31 3d 3d 69 52 6f 77 69  & iRowid1==iRowi
259c0 64 32 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  d2 ){.        ft
259d0 73 35 4e 65 78 74 52 6f 77 69 64 28 70 31 2c 20  s5NextRowid(p1, 
259e0 26 69 31 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a  &i1, &iRowid1);.
259f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
25a00 73 35 4e 65 78 74 52 6f 77 69 64 28 70 32 2c 20  s5NextRowid(p2, 
25a10 26 69 32 2c 20 26 69 52 6f 77 69 64 32 29 3b 0a  &i2, &iRowid2);.
25a20 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73      }.  }..  fts
25a30 35 42 75 66 66 65 72 53 77 61 70 28 26 6f 75 74  5BufferSwap(&out
25a40 2c 20 70 31 29 3b 0a 20 20 66 74 73 35 42 75 66  , p1);.  fts5Buf
25a50 66 65 72 46 72 65 65 28 26 6f 75 74 29 3b 0a 7d  ferFree(&out);.}
25a60 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 73 20  ../*.** Buffers 
25a70 70 31 20 61 6e 64 20 70 32 20 63 6f 6e 74 61 69  p1 and p2 contai
25a80 6e 20 64 6f 63 6c 69 73 74 73 2e 20 54 68 69 73  n doclists. This
25a90 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65 73   function merges
25aa0 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   the content.** 
25ab0 6f 66 20 74 68 65 20 74 77 6f 20 64 6f 63 6c 69  of the two docli
25ac0 73 74 73 20 74 6f 67 65 74 68 65 72 20 61 6e 64  sts together and
25ad0 20 73 65 74 73 20 62 75 66 66 65 72 20 70 31 20   sets buffer p1 
25ae0 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 62 65  to the result be
25af0 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e  fore.** returnin
25b00 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  g..**.** If an e
25b10 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
25b20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65  error code is le
25b30 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 66 20  ft in p->rc. If 
25b40 61 6e 20 65 72 72 6f 72 20 68 61 73 0a 2a 2a 20  an error has.** 
25b50 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
25b60 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
25b70 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
25b80 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
25b90 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 28  ergePrefixLists(
25ba0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
25bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bc0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
25bd0 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
25be0 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20 20  ts5Buffer *p1,  
25bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25c00 2a 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f 20  * First list to 
25c10 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35 42  merge */.  Fts5B
25c20 75 66 66 65 72 20 2a 70 32 20 20 20 20 20 20 20  uffer *p2       
25c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
25c40 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65 72  cond list to mer
25c50 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  ge */.){.  if( p
25c60 32 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34 20  2->n ){.    i64 
25c70 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a  iLastRowid = 0;.
25c80 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49      Fts5DoclistI
25c90 74 65 72 20 69 31 3b 0a 20 20 20 20 46 74 73 35  ter i1;.    Fts5
25ca0 44 6f 63 6c 69 73 74 49 74 65 72 20 69 32 3b 0a  DoclistIter i2;.
25cb0 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 6f      Fts5Buffer o
25cc0 75 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a  ut = {0, 0, 0};.
25cd0 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 74      Fts5Buffer t
25ce0 6d 70 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a  mp = {0, 0, 0};.
25cf0 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  .    /* The maxi
25d00 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20  mum size of the 
25d10 6f 75 74 70 75 74 20 69 73 20 65 71 75 61 6c 20  output is equal 
25d20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  to the sum of th
25d30 65 20 74 77 6f 20 0a 20 20 20 20 2a 2a 20 69 6e  e two .    ** in
25d40 70 75 74 20 73 69 7a 65 73 20 2b 20 31 20 76 61  put sizes + 1 va
25d50 72 69 6e 74 20 28 39 20 62 79 74 65 73 29 2e 20  rint (9 bytes). 
25d60 54 68 65 20 65 78 74 72 61 20 76 61 72 69 6e 74  The extra varint
25d70 20 69 73 20 62 65 63 61 75 73 65 20 69 66 20 74   is because if t
25d80 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20  he.    ** first 
25d90 72 6f 77 69 64 20 69 6e 20 6f 6e 65 20 69 6e 70  rowid in one inp
25da0 75 74 20 69 73 20 61 20 6c 61 72 67 65 20 6e 65  ut is a large ne
25db0 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2c 20 61  gative number, a
25dc0 6e 64 20 74 68 65 20 66 69 72 73 74 20 69 6e 0a  nd the first in.
25dd0 20 20 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72      ** the other
25de0 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20   a non-negative 
25df0 6e 75 6d 62 65 72 2c 20 74 68 65 20 64 65 6c 74  number, the delt
25e00 61 20 66 6f 72 20 74 68 65 20 6e 6f 6e 2d 6e 65  a for the non-ne
25e10 67 61 74 69 76 65 0a 20 20 20 20 2a 2a 20 6e 75  gative.    ** nu
25e20 6d 62 65 72 20 77 69 6c 6c 20 62 65 20 6c 61 72  mber will be lar
25e30 67 65 72 20 6f 6e 20 64 69 73 6b 20 74 68 61 6e  ger on disk than
25e40 20 74 68 65 20 6c 69 74 65 72 61 6c 20 69 6e 74   the literal int
25e50 65 67 65 72 20 76 61 6c 75 65 0a 20 20 20 20 2a  eger value.    *
25e60 2a 20 77 61 73 2e 20 20 2a 2f 0a 20 20 20 20 69  * was.  */.    i
25e70 66 28 20 73 71 6c 69 74 65 33 46 74 73 35 42 75  f( sqlite3Fts5Bu
25e80 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c  fferSize(&p->rc,
25e90 20 26 6f 75 74 2c 20 70 31 2d 3e 6e 20 2b 20 70   &out, p1->n + p
25ea0 32 2d 3e 6e 20 2b 20 39 29 20 29 20 72 65 74 75  2->n + 9) ) retu
25eb0 72 6e 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c  rn;.    fts5Docl
25ec0 69 73 74 49 74 65 72 49 6e 69 74 28 70 31 2c 20  istIterInit(p1, 
25ed0 26 69 31 29 3b 0a 20 20 20 20 66 74 73 35 44 6f  &i1);.    fts5Do
25ee0 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70 32  clistIterInit(p2
25ef0 2c 20 26 69 32 29 3b 0a 0a 20 20 20 20 77 68 69  , &i2);..    whi
25f00 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69  le( 1 ){.      i
25f10 66 28 20 69 31 2e 69 52 6f 77 69 64 3c 69 32 2e  f( i1.iRowid<i2.
25f20 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  iRowid ){.      
25f30 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20    /* Copy entry 
25f40 66 72 6f 6d 20 69 31 20 2a 2f 0a 20 20 20 20 20  from i1 */.     
25f50 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65     fts5MergeAppe
25f60 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c  ndDocid(&out, iL
25f70 61 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52 6f  astRowid, i1.iRo
25f80 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74  wid);.        ft
25f90 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
25fa0 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 31 2e  ndBlob(&out, i1.
25fb0 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f  aPoslist, i1.nPo
25fc0 73 6c 69 73 74 2b 69 31 2e 6e 53 69 7a 65 29 3b  slist+i1.nSize);
25fd0 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63  .        fts5Doc
25fe0 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 31  listIterNext(&i1
25ff0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
26000 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 29 20  1.aPoslist==0 ) 
26010 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
26020 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 69 32       else if( i2
26030 2e 69 52 6f 77 69 64 21 3d 69 31 2e 69 52 6f 77  .iRowid!=i1.iRow
26040 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  id ){.        /*
26050 20 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d   Copy entry from
26060 20 69 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 66   i2 */.        f
26070 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
26080 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52  cid(&out, iLastR
26090 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29  owid, i2.iRowid)
260a0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
260b0 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
260c0 6f 62 28 26 6f 75 74 2c 20 69 32 2e 61 50 6f 73  ob(&out, i2.aPos
260d0 6c 69 73 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73  list, i2.nPoslis
260e0 74 2b 69 32 2e 6e 53 69 7a 65 29 3b 0a 20 20 20  t+i2.nSize);.   
260f0 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74       fts5Doclist
26100 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20  IterNext(&i2);. 
26110 20 20 20 20 20 20 20 69 66 28 20 69 32 2e 61 50         if( i2.aP
26120 6f 73 6c 69 73 74 3d 3d 30 20 29 20 62 72 65 61  oslist==0 ) brea
26130 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
26140 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f   else{.        /
26150 2a 20 4d 65 72 67 65 20 74 68 65 20 74 77 6f 20  * Merge the two 
26160 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 2e 20  position lists. 
26170 2a 2f 20 0a 20 20 20 20 20 20 20 20 69 36 34 20  */ .        i64 
26180 69 50 6f 73 31 20 3d 20 30 3b 0a 20 20 20 20 20  iPos1 = 0;.     
26190 20 20 20 69 36 34 20 69 50 6f 73 32 20 3d 20 30     i64 iPos2 = 0
261a0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  ;.        int iO
261b0 66 66 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ff1 = 0;.       
261c0 20 69 6e 74 20 69 4f 66 66 32 20 3d 20 30 3b 0a   int iOff2 = 0;.
261d0 20 20 20 20 20 20 20 20 75 38 20 2a 61 31 20 3d          u8 *a1 =
261e0 20 26 69 31 2e 61 50 6f 73 6c 69 73 74 5b 69 31   &i1.aPoslist[i1
261f0 2e 6e 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20  .nSize];.       
26200 20 75 38 20 2a 61 32 20 3d 20 26 69 32 2e 61 50   u8 *a2 = &i2.aP
26210 6f 73 6c 69 73 74 5b 69 32 2e 6e 53 69 7a 65 5d  oslist[i2.nSize]
26220 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  ;.        int nC
26230 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 75 38 20  opy;.        u8 
26240 2a 61 43 6f 70 79 3b 0a 0a 20 20 20 20 20 20 20  *aCopy;..       
26250 20 69 36 34 20 69 50 72 65 76 20 3d 20 30 3b 0a   i64 iPrev = 0;.
26260 20 20 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c          Fts5Posl
26270 69 73 74 57 72 69 74 65 72 20 77 72 69 74 65 72  istWriter writer
26280 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
26290 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a  (&writer, 0, siz
262a0 65 6f 66 28 77 72 69 74 65 72 29 29 3b 0a 0a 20  eof(writer));.. 
262b0 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65         fts5Merge
262c0 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74  AppendDocid(&out
262d0 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32  , iLastRowid, i2
262e0 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  .iRowid);.      
262f0 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
26300 28 26 74 6d 70 29 3b 0a 20 20 20 20 20 20 20 20  (&tmp);.        
26310 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
26320 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 74  rSize(&p->rc, &t
26330 6d 70 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 20  mp, i1.nPoslist 
26340 2b 20 69 32 2e 6e 50 6f 73 6c 69 73 74 29 3b 0a  + i2.nPoslist);.
26350 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
26360 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  c ) break;..    
26370 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
26380 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61 31 2c  oslistNext64(a1,
26390 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69   i1.nPoslist, &i
263a0 4f 66 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20  Off1, &iPos1);. 
263b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
263c0 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28  s5PoslistNext64(
263d0 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c  a2, i2.nPoslist,
263e0 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73 32 29   &iOff2, &iPos2)
263f0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
26400 28 20 69 50 6f 73 31 3e 3d 30 20 26 26 20 69 50  ( iPos1>=0 && iP
26410 6f 73 32 3e 3d 30 20 29 3b 0a 0a 20 20 20 20 20  os2>=0 );..     
26420 20 20 20 69 66 28 20 69 50 6f 73 31 3c 69 50 6f     if( iPos1<iPo
26430 73 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s2 ){.          
26440 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
26450 73 74 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d  stSafeAppend(&tm
26460 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73 31  p, &iPrev, iPos1
26470 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
26480 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e  ite3Fts5PoslistN
26490 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f  ext64(a1, i1.nPo
264a0 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 20 26  slist, &iOff1, &
264b0 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20  iPos1);.        
264c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
264d0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
264e0 69 73 74 53 61 66 65 41 70 70 65 6e 64 28 26 74  istSafeAppend(&t
264f0 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73  mp, &iPrev, iPos
26500 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  2);.          sq
26510 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
26520 4e 65 78 74 36 34 28 61 32 2c 20 69 32 2e 6e 50  Next64(a2, i2.nP
26530 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 32 2c 20  oslist, &iOff2, 
26540 26 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20  &iPos2);.       
26550 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
26560 69 50 6f 73 31 3e 3d 30 20 26 26 20 69 50 6f 73  iPos1>=0 && iPos
26570 32 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  2>=0 ){.        
26580 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
26590 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
265a0 6f 73 31 3c 69 50 6f 73 32 20 29 7b 0a 20 20 20  os1<iPos2 ){.   
265b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
265c0 50 6f 73 31 21 3d 69 50 72 65 76 20 29 7b 0a 20  Pos1!=iPrev ){. 
265d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
265e0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
265f0 74 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70  tSafeAppend(&tmp
26600 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73 31 29  , &iPrev, iPos1)
26610 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26620 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
26630 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
26640 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31 2e  stNext64(a1, i1.
26650 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31  nPoslist, &iOff1
26660 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20  , &iPos1);.     
26670 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f           if( iPo
26680 73 31 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  s1<0 ) break;.  
26690 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
266a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
266b0 73 73 65 72 74 28 20 69 50 6f 73 32 21 3d 69 50  ssert( iPos2!=iP
266c0 72 65 76 20 29 3b 0a 20 20 20 20 20 20 20 20 20  rev );.         
266d0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
266e0 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e  PoslistSafeAppen
266f0 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20  d(&tmp, &iPrev, 
26700 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20  iPos2);.        
26710 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
26720 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61  5PoslistNext64(a
26730 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20  2, i2.nPoslist, 
26740 26 69 4f 66 66 32 2c 20 26 69 50 6f 73 32 29 3b  &iOff2, &iPos2);
26750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
26760 66 28 20 69 50 6f 73 32 3c 30 20 29 20 62 72 65  f( iPos2<0 ) bre
26770 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
26780 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
26790 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
267a0 20 69 66 28 20 69 50 6f 73 31 3e 3d 30 20 29 7b   if( iPos1>=0 ){
267b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
267c0 50 6f 73 31 21 3d 69 50 72 65 76 20 29 7b 0a 20  Pos1!=iPrev ){. 
267d0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
267e0 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66  e3Fts5PoslistSaf
267f0 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69  eAppend(&tmp, &i
26800 50 72 65 76 2c 20 69 50 6f 73 31 29 3b 0a 20 20  Prev, iPos1);.  
26810 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26820 20 20 20 20 61 43 6f 70 79 20 3d 20 26 61 31 5b      aCopy = &a1[
26830 69 4f 66 66 31 5d 3b 0a 20 20 20 20 20 20 20 20  iOff1];.        
26840 20 20 6e 43 6f 70 79 20 3d 20 69 31 2e 6e 50 6f    nCopy = i1.nPo
26850 73 6c 69 73 74 20 2d 20 69 4f 66 66 31 3b 0a 20  slist - iOff1;. 
26860 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
26870 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26880 69 50 6f 73 32 3e 3d 30 20 26 26 20 69 50 6f 73  iPos2>=0 && iPos
26890 32 21 3d 69 50 72 65 76 20 29 3b 0a 20 20 20 20  2!=iPrev );.    
268a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
268b0 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65  5PoslistSafeAppe
268c0 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c  nd(&tmp, &iPrev,
268d0 20 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20   iPos2);.       
268e0 20 20 20 61 43 6f 70 79 20 3d 20 26 61 32 5b 69     aCopy = &a2[i
268f0 4f 66 66 32 5d 3b 0a 20 20 20 20 20 20 20 20 20  Off2];.         
26900 20 6e 43 6f 70 79 20 3d 20 69 32 2e 6e 50 6f 73   nCopy = i2.nPos
26910 6c 69 73 74 20 2d 20 69 4f 66 66 32 3b 0a 20 20  list - iOff2;.  
26920 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26930 69 66 28 20 6e 43 6f 70 79 3e 30 20 29 7b 0a 20  if( nCopy>0 ){. 
26940 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
26950 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
26960 62 28 26 74 6d 70 2c 20 61 43 6f 70 79 2c 20 6e  b(&tmp, aCopy, n
26970 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  Copy);.        }
26980 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49  ..        /* WRI
26990 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f  TEPOSLISTSIZE */
269a0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
269b0 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
269c0 69 6e 74 28 26 6f 75 74 2c 20 74 6d 70 2e 6e 20  int(&out, tmp.n 
269d0 2a 20 32 29 3b 0a 20 20 20 20 20 20 20 20 66 74  * 2);.        ft
269e0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
269f0 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 74 6d 70  ndBlob(&out, tmp
26a00 2e 70 2c 20 74 6d 70 2e 6e 29 3b 0a 20 20 20 20  .p, tmp.n);.    
26a10 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
26a20 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20  terNext(&i1);.  
26a30 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73        fts5Doclis
26a40 74 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a  tIterNext(&i2);.
26a50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26a60 6f 75 74 2e 6e 3c 3d 28 70 31 2d 3e 6e 2b 70 32  out.n<=(p1->n+p2
26a70 2d 3e 6e 2b 39 29 20 29 3b 0a 20 20 20 20 20 20  ->n+9) );.      
26a80 20 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73    if( i1.aPoslis
26a90 74 3d 3d 30 20 7c 7c 20 69 32 2e 61 50 6f 73 6c  t==0 || i2.aPosl
26aa0 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ist==0 ) break;.
26ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
26ac0 20 20 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69     if( i1.aPosli
26ad0 73 74 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  st ){.      fts5
26ae0 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64  MergeAppendDocid
26af0 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69  (&out, iLastRowi
26b00 64 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20  d, i1.iRowid);. 
26b10 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
26b20 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f  afeAppendBlob(&o
26b30 75 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c  ut, i1.aPoslist,
26b40 20 69 31 2e 61 45 6f 66 20 2d 20 69 31 2e 61 50   i1.aEof - i1.aP
26b50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  oslist);.    }. 
26b60 20 20 20 65 6c 73 65 20 69 66 28 20 69 32 2e 61     else if( i2.a
26b70 50 6f 73 6c 69 73 74 20 29 7b 0a 20 20 20 20 20  Poslist ){.     
26b80 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64   fts5MergeAppend
26b90 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73  Docid(&out, iLas
26ba0 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69  tRowid, i2.iRowi
26bb0 64 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  d);.      fts5Bu
26bc0 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
26bd0 6f 62 28 26 6f 75 74 2c 20 69 32 2e 61 50 6f 73  ob(&out, i2.aPos
26be0 6c 69 73 74 2c 20 69 32 2e 61 45 6f 66 20 2d 20  list, i2.aEof - 
26bf0 69 32 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20  i2.aPoslist);.  
26c00 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
26c10 6f 75 74 2e 6e 3c 3d 28 70 31 2d 3e 6e 2b 70 32  out.n<=(p1->n+p2
26c20 2d 3e 6e 2b 39 29 20 29 3b 0a 0a 20 20 20 20 66  ->n+9) );..    f
26c30 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
26c40 3e 72 63 2c 20 70 31 2c 20 6f 75 74 2e 6e 2c 20  >rc, p1, out.n, 
26c50 6f 75 74 2e 70 29 3b 0a 20 20 20 20 66 74 73 35  out.p);.    fts5
26c60 42 75 66 66 65 72 46 72 65 65 28 26 74 6d 70 29  BufferFree(&tmp)
26c70 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
26c80 46 72 65 65 28 26 6f 75 74 29 3b 0a 20 20 7d 0a  Free(&out);.  }.
26c90 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
26ca0 74 73 35 53 65 74 75 70 50 72 65 66 69 78 49 74  ts5SetupPrefixIt
26cb0 65 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  er(.  Fts5Index 
26cc0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
26cd0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
26ce0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
26cf0 20 69 6e 74 20 62 44 65 73 63 2c 20 20 20 20 20   int bDesc,     
26d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d10 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 22 4f 52   /* True for "OR
26d20 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53  DER BY rowid DES
26d30 43 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  C" */.  const u8
26d40 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20   *pToken,       
26d50 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
26d60 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65  r containing pre
26d70 66 69 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a  fix to match */.
26d80 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20    int nToken,   
26d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26da0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
26db0 66 65 72 20 70 54 6f 6b 65 6e 20 69 6e 20 62 79  fer pToken in by
26dc0 74 65 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c  tes */.  Fts5Col
26dd0 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20  set *pColset,   
26de0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
26df0 72 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20  rict matches to 
26e00 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f  these columns */
26e10 0a 20 20 46 74 73 35 49 74 65 72 20 2a 2a 70 70  .  Fts5Iter **pp
26e20 49 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a  Iter          /*
26e30 20 4f 55 54 3a 20 4e 65 77 20 69 74 65 72 61 74   OUT: New iterat
26e40 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53  or */.){.  Fts5S
26e50 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
26e60 74 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  t;.  Fts5Buffer 
26e70 2a 61 42 75 66 3b 0a 20 20 63 6f 6e 73 74 20 69  *aBuf;.  const i
26e80 6e 74 20 6e 42 75 66 20 3d 20 33 32 3b 0a 0a 20  nt nBuf = 32;.. 
26e90 20 76 6f 69 64 20 28 2a 78 4d 65 72 67 65 29 28   void (*xMerge)(
26ea0 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35  Fts5Index*, Fts5
26eb0 42 75 66 66 65 72 2a 2c 20 46 74 73 35 42 75 66  Buffer*, Fts5Buf
26ec0 66 65 72 2a 29 3b 0a 20 20 76 6f 69 64 20 28 2a  fer*);.  void (*
26ed0 78 41 70 70 65 6e 64 29 28 46 74 73 35 49 6e 64  xAppend)(Fts5Ind
26ee0 65 78 2a 2c 20 69 36 34 2c 20 46 74 73 35 49 74  ex*, i64, Fts5It
26ef0 65 72 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a  er*, Fts5Buffer*
26f00 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e  );.  if( p->pCon
26f10 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54  fig->eDetail==FT
26f20 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29  S5_DETAIL_NONE )
26f30 7b 0a 20 20 20 20 78 4d 65 72 67 65 20 3d 20 66  {.    xMerge = f
26f40 74 73 35 4d 65 72 67 65 52 6f 77 69 64 4c 69 73  ts5MergeRowidLis
26f50 74 73 3b 0a 20 20 20 20 78 41 70 70 65 6e 64 20  ts;.    xAppend 
26f60 3d 20 66 74 73 35 41 70 70 65 6e 64 52 6f 77 69  = fts5AppendRowi
26f70 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
26f80 78 4d 65 72 67 65 20 3d 20 66 74 73 35 4d 65 72  xMerge = fts5Mer
26f90 67 65 50 72 65 66 69 78 4c 69 73 74 73 3b 0a 20  gePrefixLists;. 
26fa0 20 20 20 78 41 70 70 65 6e 64 20 3d 20 66 74 73     xAppend = fts
26fb0 35 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 3b 0a  5AppendPoslist;.
26fc0 20 20 7d 0a 0a 20 20 61 42 75 66 20 3d 20 28 46    }..  aBuf = (F
26fd0 74 73 35 42 75 66 66 65 72 2a 29 66 74 73 35 49  ts5Buffer*)fts5I
26fe0 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65  dxMalloc(p, size
26ff0 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 2a 6e  of(Fts5Buffer)*n
27000 42 75 66 29 3b 0a 20 20 70 53 74 72 75 63 74 20  Buf);.  pStruct 
27010 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
27020 65 61 64 28 70 29 3b 0a 0a 20 20 69 66 28 20 61  ead(p);..  if( a
27030 42 75 66 20 26 26 20 70 53 74 72 75 63 74 20 29  Buf && pStruct )
27040 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
27050 66 6c 61 67 73 20 3d 20 46 54 53 35 49 4e 44 45  flags = FTS5INDE
27060 58 5f 51 55 45 52 59 5f 53 43 41 4e 20 0a 20 20  X_QUERY_SCAN .  
27070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27080 20 20 7c 20 46 54 53 35 49 4e 44 45 58 5f 51 55    | FTS5INDEX_QU
27090 45 52 59 5f 53 4b 49 50 45 4d 50 54 59 20 0a 20  ERY_SKIPEMPTY . 
270a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270b0 20 20 20 7c 20 46 54 53 35 49 4e 44 45 58 5f 51     | FTS5INDEX_Q
270c0 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54 3b 0a 20  UERY_NOOUTPUT;. 
270d0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 36     int i;.    i6
270e0 34 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30  4 iLastRowid = 0
270f0 3b 0a 20 20 20 20 46 74 73 35 49 74 65 72 20 2a  ;.    Fts5Iter *
27100 70 31 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 49  p1 = 0;     /* I
27110 74 65 72 61 74 6f 72 20 75 73 65 64 20 74 6f 20  terator used to 
27120 67 61 74 68 65 72 20 64 61 74 61 20 66 72 6f 6d  gather data from
27130 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 46 74   index */.    Ft
27140 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20  s5Data *pData;. 
27150 20 20 20 46 74 73 35 42 75 66 66 65 72 20 64 6f     Fts5Buffer do
27160 63 6c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 62  clist;.    int b
27170 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 0a 20 20  NewTerm = 1;..  
27180 20 20 6d 65 6d 73 65 74 28 26 64 6f 63 6c 69 73    memset(&doclis
27190 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 6f 63  t, 0, sizeof(doc
271a0 6c 69 73 74 29 29 3b 0a 20 20 20 20 66 74 73 35  list));.    fts5
271b0 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20  MultiIterNew(p, 
271c0 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73 2c 20  pStruct, flags, 
271d0 70 43 6f 6c 73 65 74 2c 20 70 54 6f 6b 65 6e 2c  pColset, pToken,
271e0 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20   nToken, -1, 0, 
271f0 26 70 31 29 3b 0a 20 20 20 20 66 74 73 35 49 74  &p1);.    fts5It
27200 65 72 53 65 74 4f 75 74 70 75 74 43 62 28 26 70  erSetOutputCb(&p
27210 2d 3e 72 63 2c 20 70 31 29 3b 0a 20 20 20 20 66  ->rc, p1);.    f
27220 6f 72 28 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 20  or( /* no-op */ 
27230 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  ;.        fts5Mu
27240 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 31  ltiIterEof(p, p1
27250 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 66 74  )==0;.        ft
27260 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 32  s5MultiIterNext2
27270 28 70 2c 20 70 31 2c 20 26 62 4e 65 77 54 65 72  (p, p1, &bNewTer
27280 6d 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  m).    ){.      
27290 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
272a0 67 20 3d 20 26 70 31 2d 3e 61 53 65 67 5b 20 70  g = &p1->aSeg[ p
272b0 31 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  1->aFirst[1].iFi
272c0 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 69 6e 74  rst ];.      int
272d0 20 6e 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e 74   nTerm = pSeg->t
272e0 65 72 6d 2e 6e 3b 0a 20 20 20 20 20 20 63 6f 6e  erm.n;.      con
272f0 73 74 20 75 38 20 2a 70 54 65 72 6d 20 3d 20 70  st u8 *pTerm = p
27300 53 65 67 2d 3e 74 65 72 6d 2e 70 3b 0a 20 20 20  Seg->term.p;.   
27310 20 20 20 70 31 2d 3e 78 53 65 74 4f 75 74 70 75     p1->xSetOutpu
27320 74 73 28 70 31 2c 20 70 53 65 67 29 3b 0a 0a 20  ts(p1, pSeg);.. 
27330 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
27340 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70  memcmp(pToken, p
27350 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e  Term, MIN(nToken
27360 2c 20 6e 54 65 72 6d 29 29 3c 3d 30 20 29 3b 0a  , nTerm))<=0 );.
27370 20 20 20 20 20 20 69 66 28 20 62 4e 65 77 54 65        if( bNewTe
27380 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rm ){.        if
27390 28 20 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e 20 7c  ( nTerm<nToken |
273a0 7c 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c  | memcmp(pToken,
273b0 20 70 54 65 72 6d 2c 20 6e 54 6f 6b 65 6e 29 20   pTerm, nToken) 
273c0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
273d0 0a 0a 20 20 20 20 20 20 69 66 28 20 70 31 2d 3e  ..      if( p1->
273e0 62 61 73 65 2e 6e 44 61 74 61 3d 3d 30 20 29 20  base.nData==0 ) 
273f0 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20  continue;..     
27400 20 69 66 28 20 70 31 2d 3e 62 61 73 65 2e 69 52   if( p1->base.iR
27410 6f 77 69 64 3c 3d 69 4c 61 73 74 52 6f 77 69 64  owid<=iLastRowid
27420 20 26 26 20 64 6f 63 6c 69 73 74 2e 6e 3e 30 20   && doclist.n>0 
27430 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
27440 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  =0; p->rc==SQLIT
27450 45 5f 4f 4b 20 26 26 20 64 6f 63 6c 69 73 74 2e  E_OK && doclist.
27460 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
27470 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 42 75     assert( i<nBu
27480 66 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  f );.          i
27490 66 28 20 61 42 75 66 5b 69 5d 2e 6e 3d 3d 30 20  f( aBuf[i].n==0 
274a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
274b0 74 73 35 42 75 66 66 65 72 53 77 61 70 28 26 64  ts5BufferSwap(&d
274c0 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d  oclist, &aBuf[i]
274d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
274e0 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 64  ts5BufferZero(&d
274f0 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  oclist);.       
27500 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27510 20 20 20 20 20 20 78 4d 65 72 67 65 28 70 2c 20        xMerge(p, 
27520 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b  &doclist, &aBuf[
27530 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
27540 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
27550 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20  &aBuf[i]);.     
27560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
27570 0a 20 20 20 20 20 20 20 20 69 4c 61 73 74 52 6f  .        iLastRo
27580 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  wid = 0;.      }
27590 0a 0a 20 20 20 20 20 20 78 41 70 70 65 6e 64 28  ..      xAppend(
275a0 70 2c 20 70 31 2d 3e 62 61 73 65 2e 69 52 6f 77  p, p1->base.iRow
275b0 69 64 2d 69 4c 61 73 74 52 6f 77 69 64 2c 20 70  id-iLastRowid, p
275c0 31 2c 20 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20  1, &doclist);.  
275d0 20 20 20 20 69 4c 61 73 74 52 6f 77 69 64 20 3d      iLastRowid =
275e0 20 70 31 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64   p1->base.iRowid
275f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
27600 28 69 3d 30 3b 20 69 3c 6e 42 75 66 3b 20 69 2b  (i=0; i<nBuf; i+
27610 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
27620 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
27630 7b 0a 20 20 20 20 20 20 20 20 78 4d 65 72 67 65  {.        xMerge
27640 28 70 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26 61  (p, &doclist, &a
27650 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  Buf[i]);.      }
27660 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
27670 72 46 72 65 65 28 26 61 42 75 66 5b 69 5d 29 3b  rFree(&aBuf[i]);
27680 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d  .    }.    fts5M
27690 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 31 29  ultiIterFree(p1)
276a0 3b 0a 0a 20 20 20 20 70 44 61 74 61 20 3d 20 66  ;..    pData = f
276b0 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
276c0 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29  sizeof(Fts5Data)
276d0 2b 64 6f 63 6c 69 73 74 2e 6e 2b 46 54 53 35 5f  +doclist.n+FTS5_
276e0 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e  DATA_ZERO_PADDIN
276f0 47 29 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74  G);.    if( pDat
27700 61 20 29 7b 0a 20 20 20 20 20 20 70 44 61 74 61  a ){.      pData
27710 2d 3e 70 20 3d 20 28 75 38 2a 29 26 70 44 61 74  ->p = (u8*)&pDat
27720 61 5b 31 5d 3b 0a 20 20 20 20 20 20 70 44 61 74  a[1];.      pDat
27730 61 2d 3e 6e 6e 20 3d 20 70 44 61 74 61 2d 3e 73  a->nn = pData->s
27740 7a 4c 65 61 66 20 3d 20 64 6f 63 6c 69 73 74 2e  zLeaf = doclist.
27750 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64 6f 63  n;.      if( doc
27760 6c 69 73 74 2e 6e 20 29 20 6d 65 6d 63 70 79 28  list.n ) memcpy(
27770 70 44 61 74 61 2d 3e 70 2c 20 64 6f 63 6c 69 73  pData->p, doclis
27780 74 2e 70 2c 20 64 6f 63 6c 69 73 74 2e 6e 29 3b  t.p, doclist.n);
27790 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
277a0 49 74 65 72 4e 65 77 32 28 70 2c 20 70 44 61 74  IterNew2(p, pDat
277b0 61 2c 20 62 44 65 73 63 2c 20 70 70 49 74 65 72  a, bDesc, ppIter
277c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
277d0 35 42 75 66 66 65 72 46 72 65 65 28 26 64 6f 63  5BufferFree(&doc
277e0 6c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 66 74  list);.  }..  ft
277f0 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
27800 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 73  se(pStruct);.  s
27810 71 6c 69 74 65 33 5f 66 72 65 65 28 61 42 75 66  qlite3_free(aBuf
27820 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64  );.}.../*.** Ind
27830 69 63 61 74 65 20 74 68 61 74 20 61 6c 6c 20 73  icate that all s
27840 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
27850 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  to sqlite3Fts5In
27860 64 65 78 57 72 69 74 65 28 29 20 70 65 72 74 61  dexWrite() perta
27870 69 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 6f 63  in.** to the doc
27880 75 6d 65 6e 74 20 77 69 74 68 20 72 6f 77 69 64  ument with rowid
27890 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20   iRowid..*/.int 
278a0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
278b0 42 65 67 69 6e 57 72 69 74 65 28 46 74 73 35 49  BeginWrite(Fts5I
278c0 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62 44 65  ndex *p, int bDe
278d0 6c 65 74 65 2c 20 69 36 34 20 69 52 6f 77 69 64  lete, i64 iRowid
278e0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
278f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
27900 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
27910 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 69  the hash table i
27920 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72  f it has not alr
27930 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
27940 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ted */.  if( p->
27950 70 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20  pHash==0 ){.    
27960 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46  p->rc = sqlite3F
27970 74 73 35 48 61 73 68 4e 65 77 28 70 2d 3e 70 43  ts5HashNew(p->pC
27980 6f 6e 66 69 67 2c 20 26 70 2d 3e 70 48 61 73 68  onfig, &p->pHash
27990 2c 20 26 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61  , &p->nPendingDa
279a0 74 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ta);.  }..  /* F
279b0 6c 75 73 68 20 74 68 65 20 68 61 73 68 20 74 61  lush the hash ta
279c0 62 6c 65 20 74 6f 20 64 69 73 6b 20 69 66 20 72  ble to disk if r
279d0 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 66 28  equired */.  if(
279e0 20 69 52 6f 77 69 64 3c 70 2d 3e 69 57 72 69 74   iRowid<p->iWrit
279f0 65 52 6f 77 69 64 20 0a 20 20 20 7c 7c 20 28 69  eRowid .   || (i
27a00 52 6f 77 69 64 3d 3d 70 2d 3e 69 57 72 69 74 65  Rowid==p->iWrite
27a10 52 6f 77 69 64 20 26 26 20 70 2d 3e 62 44 65 6c  Rowid && p->bDel
27a20 65 74 65 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 70  ete==0).   || (p
27a30 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3e  ->nPendingData >
27a40 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 48 61   p->pConfig->nHa
27a50 73 68 53 69 7a 65 29 20 0a 20 20 29 7b 0a 20 20  shSize) .  ){.  
27a60 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68    fts5IndexFlush
27a70 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69  (p);.  }..  p->i
27a80 57 72 69 74 65 52 6f 77 69 64 20 3d 20 69 52 6f  WriteRowid = iRo
27a90 77 69 64 3b 0a 20 20 70 2d 3e 62 44 65 6c 65 74  wid;.  p->bDelet
27aa0 65 20 3d 20 62 44 65 6c 65 74 65 3b 0a 20 20 72  e = bDelete;.  r
27ab0 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
27ac0 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
27ad0 2a 2a 20 43 6f 6d 6d 69 74 20 64 61 74 61 20 74  ** Commit data t
27ae0 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  o disk..*/.int s
27af0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53  qlite3Fts5IndexS
27b00 79 6e 63 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ync(Fts5Index *p
27b10 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
27b20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
27b30 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73  .  fts5IndexFlus
27b40 68 28 70 29 3b 0a 20 20 66 74 73 35 43 6c 6f 73  h(p);.  fts5Clos
27b50 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 72 65  eReader(p);.  re
27b60 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
27b70 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn(p);.}../*.*
27b80 2a 20 44 69 73 63 61 72 64 20 61 6e 79 20 64 61  * Discard any da
27b90 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
27ba0 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
27bb0 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77  tables. Do not w
27bc0 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68  rite it.** to th
27bd0 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69  e database. Addi
27be0 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65  tionally, assume
27bf0 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
27c00 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74 61  ts of the %_data
27c10 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68 61  .** table may ha
27c20 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64 69  ve changed on di
27c30 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65  sk. So any in-me
27c40 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20 25  mory caches of %
27c50 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64  _data .** record
27c60 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c 69  s must be invali
27c70 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  dated..*/.int sq
27c80 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 6f  lite3Fts5IndexRo
27c90 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64 65 78  llback(Fts5Index
27ca0 20 2a 70 29 7b 0a 20 20 66 74 73 35 43 6c 6f 73   *p){.  fts5Clos
27cb0 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 66 74  eReader(p);.  ft
27cc0 73 35 49 6e 64 65 78 44 69 73 63 61 72 64 44 61  s5IndexDiscardDa
27cd0 74 61 28 70 29 3b 0a 20 20 66 74 73 35 53 74 72  ta(p);.  fts5Str
27ce0 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65  uctureInvalidate
27cf0 28 70 29 3b 0a 20 20 2f 2a 20 61 73 73 65 72 74  (p);.  /* assert
27d00 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
27d10 4f 4b 20 29 3b 20 2a 2f 0a 20 20 72 65 74 75 72  OK ); */.  retur
27d20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
27d30 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61  /*.** The %_data
27d40 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65   table is comple
27d50 74 65 6c 79 20 65 6d 70 74 79 20 77 68 65 6e 20  tely empty when 
27d60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
27d70 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 0a 2a 2a   called. This.**
27d80 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61   function popula
27d90 74 65 73 20 69 74 20 77 69 74 68 20 74 68 65 20  tes it with the 
27da0 69 6e 69 74 69 61 6c 20 73 74 72 75 63 74 75 72  initial structur
27db0 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61  e objects for ea
27dc0 63 68 20 69 6e 64 65 78 2c 0a 2a 2a 20 61 6e 64  ch index,.** and
27dd0 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 65 72   the initial ver
27de0 73 69 6f 6e 20 6f 66 20 74 68 65 20 22 61 76 65  sion of the "ave
27df0 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 28 61  rages" record (a
27e00 20 7a 65 72 6f 2d 62 79 74 65 20 62 6c 6f 62 29   zero-byte blob)
27e10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27e20 46 74 73 35 49 6e 64 65 78 52 65 69 6e 69 74 28  Fts5IndexReinit(
27e30 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
27e40 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 73   Fts5Structure s
27e50 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
27e60 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a  eInvalidate(p);.
27e70 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20    memset(&s, 0, 
27e80 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
27e90 74 75 72 65 29 29 3b 0a 20 20 66 74 73 35 44 61  ture));.  fts5Da
27ea0 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f  taWrite(p, FTS5_
27eb0 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c 20  AVERAGES_ROWID, 
27ec0 28 63 6f 6e 73 74 20 75 38 2a 29 22 22 2c 20 30  (const u8*)"", 0
27ed0 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  );.  fts5Structu
27ee0 72 65 57 72 69 74 65 28 70 2c 20 26 73 29 3b 0a  reWrite(p, &s);.
27ef0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
27f00 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
27f10 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
27f20 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c   Fts5Index handl
27f30 65 2e 20 49 66 20 74 68 65 20 62 43 72 65 61 74  e. If the bCreat
27f40 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72  e argument is tr
27f50 75 65 2c 20 63 72 65 61 74 65 0a 2a 2a 20 61 6e  ue, create.** an
27f60 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  d initialize the
27f70 20 75 6e 64 65 72 6c 79 69 6e 67 20 25 5f 64 61   underlying %_da
27f80 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ta table..**.** 
27f90 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
27fa0 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20  et *pp to point 
27fb0 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  to the new objec
27fc0 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  t and return SQL
27fd0 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72  ITE_OK..** Other
27fe0 77 69 73 65 2c 20 73 65 74 20 2a 70 70 20 74 6f  wise, set *pp to
27ff0 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e   NULL and return
28000 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
28010 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   code..*/.int sq
28020 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70  lite3Fts5IndexOp
28030 65 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  en(.  Fts5Config
28040 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20 69 6e   *pConfig, .  in
28050 74 20 62 43 72 65 61 74 65 2c 20 0a 20 20 46 74  t bCreate, .  Ft
28060 73 35 49 6e 64 65 78 20 2a 2a 70 70 2c 0a 20 20  s5Index **pp,.  
28070 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
28080 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
28090 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 49 6e 64 65  E_OK;.  Fts5Inde
280a0 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  x *p;           
280b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f          /* New o
280c0 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a 70 70 20  bject */..  *pp 
280d0 3d 20 70 20 3d 20 28 46 74 73 35 49 6e 64 65 78  = p = (Fts5Index
280e0 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
280f0 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a  locZero(&rc, siz
28100 65 6f 66 28 46 74 73 35 49 6e 64 65 78 29 29 3b  eof(Fts5Index));
28110 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
28120 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 70  E_OK ){.    p->p
28130 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69 67  Config = pConfig
28140 3b 0a 20 20 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e  ;.    p->nWorkUn
28150 69 74 20 3d 20 46 54 53 35 5f 57 4f 52 4b 5f 55  it = FTS5_WORK_U
28160 4e 49 54 3b 0a 20 20 20 20 70 2d 3e 7a 44 61 74  NIT;.    p->zDat
28170 61 54 62 6c 20 3d 20 73 71 6c 69 74 65 33 46 74  aTbl = sqlite3Ft
28180 73 35 4d 70 72 69 6e 74 66 28 26 72 63 2c 20 22  s5Mprintf(&rc, "
28190 25 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e 66 69  %s_data", pConfi
281a0 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  g->zName);.    i
281b0 66 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 26  f( p->zDataTbl &
281c0 26 20 62 43 72 65 61 74 65 20 29 7b 0a 20 20 20  & bCreate ){.   
281d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
281e0 74 73 35 43 72 65 61 74 65 54 61 62 6c 65 28 0a  ts5CreateTable(.
281f0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69            pConfi
28200 67 2c 20 22 64 61 74 61 22 2c 20 22 69 64 20 49  g, "data", "id I
28210 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
28220 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 22 2c  EY, block BLOB",
28230 20 30 2c 20 70 7a 45 72 72 0a 20 20 20 20 20 20   0, pzErr.      
28240 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
28250 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28260 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28270 65 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c  e3Fts5CreateTabl
28280 65 28 70 43 6f 6e 66 69 67 2c 20 22 69 64 78 22  e(pConfig, "idx"
28290 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
282a0 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 6e  segid, term, pgn
282b0 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 73  o, PRIMARY KEY(s
282c0 65 67 69 64 2c 20 74 65 72 6d 29 22 2c 20 0a 20  egid, term)", . 
282d0 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 70 7a             1, pz
282e0 45 72 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  Err.        );. 
282f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
28300 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28310 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
28320 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52  qlite3Fts5IndexR
28330 65 69 6e 69 74 28 70 29 3b 0a 20 20 20 20 20 20  einit(p);.      
28340 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  }.    }.  }..  a
28350 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
28360 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  E_OK || p->rc==S
28370 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
28380 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( rc ){.    sqli
28390 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73  te3Fts5IndexClos
283a0 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20  e(p);.    *pp = 
283b0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
283c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
283d0 73 65 20 61 20 68 61 6e 64 6c 65 20 6f 70 65 6e  se a handle open
283e0 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
283f0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
28400 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 29 2e  Fts5IndexOpen().
28410 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
28420 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 46 74  ts5IndexClose(Ft
28430 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69  s5Index *p){.  i
28440 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
28450 4b 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  K;.  if( p ){.  
28460 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65    assert( p->pRe
28470 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 66  ader==0 );.    f
28480 74 73 35 53 74 72 75 63 74 75 72 65 49 6e 76 61  ts5StructureInva
28490 6c 69 64 61 74 65 28 70 29 3b 0a 20 20 20 20 73  lidate(p);.    s
284a0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
284b0 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p->pWriter);.   
284c0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
284d0 65 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a  e(p->pDeleter);.
284e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
284f0 6c 69 7a 65 28 70 2d 3e 70 49 64 78 57 72 69 74  lize(p->pIdxWrit
28500 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
28510 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64  _finalize(p->pId
28520 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 73  xDeleter);.    s
28530 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
28540 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29 3b 0a  p->pIdxSelect);.
28550 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
28560 6c 69 7a 65 28 70 2d 3e 70 44 61 74 61 56 65 72  lize(p->pDataVer
28570 73 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  sion);.    sqlit
28580 65 33 46 74 73 35 48 61 73 68 46 72 65 65 28 70  e3Fts5HashFree(p
28590 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 73 71  ->pHash);.    sq
285a0 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 44  lite3_free(p->zD
285b0 61 74 61 54 62 6c 29 3b 0a 20 20 20 20 73 71 6c  ataTbl);.    sql
285c0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
285d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
285e0 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
285f0 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62   p points to a b
28600 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
28610 20 75 74 66 2d 38 20 74 65 78 74 20 74 68 61 74   utf-8 text that
28620 20 69 73 20 6e 20 62 79 74 65 73 20 69 6e 20 0a   is n bytes in .
28630 2a 2a 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20  ** size. Return 
28640 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
28650 74 65 73 20 69 6e 20 74 68 65 20 6e 43 68 61 72  tes in the nChar
28660 20 63 68 61 72 61 63 74 65 72 20 70 72 65 66 69   character prefi
28670 78 20 6f 66 20 74 68 65 0a 2a 2a 20 62 75 66 66  x of the.** buff
28680 65 72 2c 20 6f 72 20 30 20 69 66 20 74 68 65 72  er, or 0 if ther
28690 65 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20  e are less than 
286a0 6e 43 68 61 72 20 63 68 61 72 61 63 74 65 72 73  nChar characters
286b0 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a 69 6e   in total..*/.in
286c0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
286d0 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c  exCharlenToBytel
286e0 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
286f0 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6e 42 79 74   *p, .  int nByt
28700 65 2c 20 0a 20 20 69 6e 74 20 6e 43 68 61 72 0a  e, .  int nChar.
28710 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  ){.  int n = 0;.
28720 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
28730 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b  =0; i<nChar; i++
28740 29 7b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 6e 42  ){.    if( n>=nB
28750 79 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  yte ) return 0; 
28760 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 6f       /* Input co
28770 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74 68 61  ntains fewer tha
28780 6e 20 6e 43 68 61 72 20 63 68 61 72 73 20 2a 2f  n nChar chars */
28790 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e  .    if( (unsign
287a0 65 64 20 63 68 61 72 29 70 5b 6e 2b 2b 5d 3e 3d  ed char)p[n++]>=
287b0 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68  0xc0 ){.      wh
287c0 69 6c 65 28 20 28 70 5b 6e 5d 20 26 20 30 78 63  ile( (p[n] & 0xc
287d0 30 29 3d 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  0)==0x80 ){.    
287e0 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 20      n++;.       
287f0 20 69 66 28 20 6e 3e 3d 6e 42 79 74 65 20 29 20   if( n>=nByte ) 
28800 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
28810 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
28820 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 49  n n;.}../*.** pI
28830 6e 20 69 73 20 61 20 55 54 46 2d 38 20 65 6e 63  n is a UTF-8 enc
28840 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 6e 49 6e  oded string, nIn
28850 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
28860 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
28870 72 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f 64 65 20  r of.** unicode 
28880 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
28890 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  e string..*/.sta
288a0 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65  tic int fts5Inde
288b0 78 43 68 61 72 6c 65 6e 28 63 6f 6e 73 74 20 63  xCharlen(const c
288c0 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e 49  har *pIn, int nI
288d0 6e 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 20  n){.  int nChar 
288e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
288f0 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
28900 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 29 7b 0a  while( i<nIn ){.
28910 20 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65      if( (unsigne
28920 64 20 63 68 61 72 29 70 49 6e 5b 69 2b 2b 5d 3e  d char)pIn[i++]>
28930 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77  =0xc0 ){.      w
28940 68 69 6c 65 28 20 69 3c 6e 49 6e 20 26 26 20 28  hile( i<nIn && (
28950 70 49 6e 5b 69 5d 20 26 20 30 78 63 30 29 3d 3d  pIn[i] & 0xc0)==
28960 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20  0x80 ) i++;.    
28970 7d 0a 20 20 20 20 6e 43 68 61 72 2b 2b 3b 0a 20  }.    nChar++;. 
28980 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 61   }.  return nCha
28990 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  r;.}../*.** Inse
289a0 72 74 20 6f 72 20 72 65 6d 6f 76 65 20 64 61 74  rt or remove dat
289b0 61 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  a to or from the
289c0 20 69 6e 64 65 78 2e 20 45 61 63 68 20 74 69 6d   index. Each tim
289d0 65 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 73 20  e a document is 
289e0 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f 72 20  .** added to or 
289f0 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
28a00 20 69 6e 64 65 78 2c 20 74 68 69 73 20 66 75 6e   index, this fun
28a10 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
28a20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 74  one or more.** t
28a30 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  imes..**.** For 
28a40 61 6e 20 69 6e 73 65 72 74 2c 20 69 74 20 6d 75  an insert, it mu
28a50 73 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  st be called onc
28a60 65 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e  e for each token
28a70 20 69 6e 20 74 68 65 20 6e 65 77 20 64 6f 63 75   in the new docu
28a80 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ment..** If the 
28a90 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 64  operation is a d
28aa0 65 6c 65 74 65 2c 20 69 74 20 6d 75 73 74 20 62  elete, it must b
28ab0 65 20 63 61 6c 6c 65 64 20 28 61 74 20 6c 65 61  e called (at lea
28ac0 73 74 29 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  st) once for eac
28ad0 68 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f 6b 65  h.** unique toke
28ae0 6e 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e  n in the documen
28af0 74 20 77 69 74 68 20 61 6e 20 69 43 6f 6c 20 76  t with an iCol v
28b00 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20 7a  alue less than z
28b10 65 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a 2a 2a  ero. The iPos.**
28b20 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 67 6e   argument is ign
28b30 6f 72 65 64 20 66 6f 72 20 61 20 64 65 6c 65 74  ored for a delet
28b40 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
28b50 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28  3Fts5IndexWrite(
28b60 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
28b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b80 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77     /* Index to w
28b90 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  rite to */.  int
28ba0 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   iCol,          
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28bc0 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70  Column token app
28bd0 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20  ears in (-ve -> 
28be0 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74  delete) */.  int
28bf0 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20   iPos,          
28c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28c10 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65  Position of toke
28c20 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20  n within column 
28c30 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
28c40 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f  *pToken, int nTo
28c50 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f  ken  /* Token to
28c60 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74   add or remove t
28c70 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20  o or from index 
28c80 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
28c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ca0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
28cb0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
28cc0 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  gh indexes */.  
28cd0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
28ce0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
28cf0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
28d00 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  /.  Fts5Config *
28d10 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
28d20 6e 66 69 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  nfig;..  assert(
28d30 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
28d40 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  K );.  assert( (
28d50 69 43 6f 6c 3c 30 29 3d 3d 70 2d 3e 62 44 65 6c  iCol<0)==p->bDel
28d60 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64  ete );..  /* Add
28d70 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 74 68   the entry to th
28d80 65 20 6d 61 69 6e 20 74 65 72 6d 73 20 69 6e 64  e main terms ind
28d90 65 78 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ex. */.  rc = sq
28da0 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69  lite3Fts5HashWri
28db0 74 65 28 0a 20 20 20 20 20 20 70 2d 3e 70 48 61  te(.      p->pHa
28dc0 73 68 2c 20 70 2d 3e 69 57 72 69 74 65 52 6f 77  sh, p->iWriteRow
28dd0 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20  id, iCol, iPos, 
28de0 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58  FTS5_MAIN_PREFIX
28df0 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , pToken, nToken
28e00 0a 20 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  .  );..  for(i=0
28e10 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  ; i<pConfig->nPr
28e20 65 66 69 78 20 26 26 20 72 63 3d 3d 53 51 4c 49  efix && rc==SQLI
28e30 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
28e40 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 68 61 72   const int nChar
28e50 20 3d 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65   = pConfig->aPre
28e60 66 69 78 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  fix[i];.    int 
28e70 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 46  nByte = sqlite3F
28e80 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54  ts5IndexCharlenT
28e90 6f 42 79 74 65 6c 65 6e 28 70 54 6f 6b 65 6e 2c  oBytelen(pToken,
28ea0 20 6e 54 6f 6b 65 6e 2c 20 6e 43 68 61 72 29 3b   nToken, nChar);
28eb0 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29  .    if( nByte )
28ec0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
28ed0 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74  ite3Fts5HashWrit
28ee0 65 28 70 2d 3e 70 48 61 73 68 2c 20 0a 20 20 20  e(p->pHash, .   
28ef0 20 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65         p->iWrite
28f00 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f  Rowid, iCol, iPo
28f10 73 2c 20 28 63 68 61 72 29 28 46 54 53 35 5f 4d  s, (char)(FTS5_M
28f20 41 49 4e 5f 50 52 45 46 49 58 2b 69 2b 31 29 2c  AIN_PREFIX+i+1),
28f30 20 70 54 6f 6b 65 6e 2c 0a 20 20 20 20 20 20 20   pToken,.       
28f40 20 20 20 6e 42 79 74 65 0a 20 20 20 20 20 20 29     nByte.      )
28f50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
28f60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
28f70 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 69 74  ** Open a new it
28f80 65 72 61 74 6f 72 20 74 6f 20 69 74 65 72 61 74  erator to iterat
28f90 65 20 74 68 6f 75 67 68 20 61 6c 6c 20 72 6f 77  e though all row
28fa0 69 64 20 74 68 61 74 20 6d 61 74 63 68 20 74 68  id that match th
28fb0 65 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  e .** specified 
28fc0 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70  token or token p
28fd0 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71  refix..*/.int sq
28fe0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75  lite3Fts5IndexQu
28ff0 65 72 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ery(.  Fts5Index
29000 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
29010 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e         /* FTS in
29020 64 65 78 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a  dex to query */.
29030 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
29040 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e  oken, int nToken
29050 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70  , /* Token (or p
29060 72 65 66 69 78 29 20 74 6f 20 71 75 65 72 79 20  refix) to query 
29070 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  for */.  int fla
29080 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
29090 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
290a0 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 51 55   of FTS5INDEX_QU
290b0 45 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20  ERY_X flags */. 
290c0 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
290d0 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  lset,           
290e0 20 2f 2a 20 4d 61 74 63 68 20 74 68 65 73 65 20   /* Match these 
290f0 63 6f 6c 75 6d 6e 73 20 6f 6e 6c 79 20 2a 2f 0a  columns only */.
29100 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
29110 2a 2a 70 70 49 74 65 72 20 20 20 20 20 20 20 20  **ppIter        
29120 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74    /* OUT: New it
29130 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  erator object */
29140 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  .){.  Fts5Config
29150 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
29160 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35 49 74  Config;.  Fts5It
29170 65 72 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  er *pRet = 0;.  
29180 46 74 73 35 42 75 66 66 65 72 20 62 75 66 20 3d  Fts5Buffer buf =
29190 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 2f   {0, 0, 0};..  /
291a0 2a 20 49 66 20 74 68 65 20 51 55 45 52 59 5f 53  * If the QUERY_S
291b0 43 41 4e 20 66 6c 61 67 20 69 73 20 73 65 74 2c  CAN flag is set,
291c0 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73   all other flags
291d0 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 2e 20   must be clear. 
291e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
291f0 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
29200 51 55 45 52 59 5f 53 43 41 4e 29 3d 3d 30 20 7c  QUERY_SCAN)==0 |
29210 7c 20 66 6c 61 67 73 3d 3d 46 54 53 35 49 4e 44  | flags==FTS5IND
29220 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20 29 3b  EX_QUERY_SCAN );
29230 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ..  if( sqlite3F
29240 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70  ts5BufferSize(&p
29250 2d 3e 72 63 2c 20 26 62 75 66 2c 20 6e 54 6f 6b  ->rc, &buf, nTok
29260 65 6e 2b 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  en+1)==0 ){.    
29270 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 20 20 20  int iIdx = 0;   
29280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29290 20 49 6e 64 65 78 20 74 6f 20 73 65 61 72 63 68   Index to search
292a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b   */.    if( nTok
292b0 65 6e 20 29 20 6d 65 6d 63 70 79 28 26 62 75 66  en ) memcpy(&buf
292c0 2e 70 5b 31 5d 2c 20 70 54 6f 6b 65 6e 2c 20 6e  .p[1], pToken, n
292d0 54 6f 6b 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20  Token);..    /* 
292e0 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
292f0 20 69 6e 64 65 78 20 74 6f 20 73 65 61 72 63 68   index to search
29300 20 61 6e 64 20 73 65 74 20 69 49 64 78 20 61 63   and set iIdx ac
29310 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 74 68  cordingly. If th
29320 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 70  is.    ** is a p
29330 72 65 66 69 78 20 71 75 65 72 79 20 66 6f 72 20  refix query for 
29340 77 68 69 63 68 20 74 68 65 72 65 20 69 73 20 6e  which there is n
29350 6f 20 70 72 65 66 69 78 20 69 6e 64 65 78 2c 20  o prefix index, 
29360 73 65 74 20 69 49 64 78 20 74 6f 0a 20 20 20 20  set iIdx to.    
29370 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
29380 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
29390 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
293a0 74 20 74 68 65 20 71 75 65 72 79 20 77 69 6c 6c  t the query will
293b0 20 62 65 0a 20 20 20 20 2a 2a 20 73 61 74 69 73   be.    ** satis
293c0 66 69 65 64 20 62 79 20 73 63 61 6e 6e 69 6e 67  fied by scanning
293d0 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20   multiple terms 
293e0 69 6e 20 74 68 65 20 6d 61 69 6e 20 69 6e 64 65  in the main inde
293f0 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
29400 20 49 66 20 74 68 65 20 51 55 45 52 59 5f 54 45   If the QUERY_TE
29410 53 54 5f 4e 4f 49 44 58 20 66 6c 61 67 20 77 61  ST_NOIDX flag wa
29420 73 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65  s specified, the
29430 6e 20 74 68 69 73 20 6d 75 73 74 20 62 65 20 61  n this must be a
29440 0a 20 20 20 20 2a 2a 20 70 72 65 66 69 78 2d 71  .    ** prefix-q
29450 75 65 72 79 2e 20 49 6e 73 74 65 61 64 20 6f 66  uery. Instead of
29460 20 75 73 69 6e 67 20 61 20 70 72 65 66 69 78 2d   using a prefix-
29470 69 6e 64 65 78 20 28 69 66 20 6f 6e 65 20 65 78  index (if one ex
29480 69 73 74 73 29 2c 20 0a 20 20 20 20 2a 2a 20 65  ists), .    ** e
29490 76 61 6c 75 61 74 65 20 74 68 65 20 70 72 65 66  valuate the pref
294a0 69 78 20 71 75 65 72 79 20 75 73 69 6e 67 20 74  ix query using t
294b0 68 65 20 6d 61 69 6e 20 46 54 53 20 69 6e 64 65  he main FTS inde
294c0 78 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 0a  x. This is used.
294d0 20 20 20 20 2a 2a 20 66 6f 72 20 69 6e 74 65 72      ** for inter
294e0 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b  nal sanity check
294f0 69 6e 67 20 62 79 20 74 68 65 20 69 6e 74 65 67  ing by the integ
29500 72 69 74 79 2d 63 68 65 63 6b 20 69 6e 20 64 65  rity-check in de
29510 62 75 67 20 0a 20 20 20 20 2a 2a 20 6d 6f 64 65  bug .    ** mode
29520 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 23 69 66 64 65   only.  */.#ifde
29530 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
29540 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e     if( pConfig->
29550 62 50 72 65 66 69 78 49 6e 64 65 78 3d 3d 30 20  bPrefixIndex==0 
29560 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35  || (flags & FTS5
29570 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54  INDEX_QUERY_TEST
29580 5f 4e 4f 49 44 58 29 20 29 7b 0a 20 20 20 20 20  _NOIDX) ){.     
29590 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 20 26   assert( flags &
295a0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
295b0 5f 50 52 45 46 49 58 20 29 3b 0a 20 20 20 20 20  _PREFIX );.     
295c0 20 69 49 64 78 20 3d 20 31 2b 70 43 6f 6e 66 69   iIdx = 1+pConfi
295d0 67 2d 3e 6e 50 72 65 66 69 78 3b 0a 20 20 20 20  g->nPrefix;.    
295e0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
295f0 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53   if( flags & FTS
29600 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45  5INDEX_QUERY_PRE
29610 46 49 58 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  FIX ){.      int
29620 20 6e 43 68 61 72 20 3d 20 66 74 73 35 49 6e 64   nChar = fts5Ind
29630 65 78 43 68 61 72 6c 65 6e 28 70 54 6f 6b 65 6e  exCharlen(pToken
29640 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  , nToken);.     
29650 20 66 6f 72 28 69 49 64 78 3d 31 3b 20 69 49 64   for(iIdx=1; iId
29660 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65  x<=pConfig->nPre
29670 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20  fix; iIdx++){.  
29680 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69        if( pConfi
29690 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64 78 2d  g->aPrefix[iIdx-
296a0 31 5d 3d 3d 6e 43 68 61 72 20 29 20 62 72 65 61  1]==nChar ) brea
296b0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
296c0 0a 0a 20 20 20 20 69 66 28 20 69 49 64 78 3c 3d  ..    if( iIdx<=
296d0 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
296e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 74 72   ){.      /* Str
296f0 61 69 67 68 74 20 69 6e 64 65 78 20 6c 6f 6f 6b  aight index look
29700 75 70 20 2a 2f 0a 20 20 20 20 20 20 46 74 73 35  up */.      Fts5
29710 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
29720 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  ct = fts5Structu
29730 72 65 52 65 61 64 28 70 29 3b 0a 20 20 20 20 20  reRead(p);.     
29740 20 62 75 66 2e 70 5b 30 5d 20 3d 20 28 75 38 29   buf.p[0] = (u8)
29750 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49  (FTS5_MAIN_PREFI
29760 58 20 2b 20 69 49 64 78 29 3b 0a 20 20 20 20 20  X + iIdx);.     
29770 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a   if( pStruct ){.
29780 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
29790 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72  iIterNew(p, pStr
297a0 75 63 74 2c 20 66 6c 61 67 73 20 7c 20 46 54 53  uct, flags | FTS
297b0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b 49  5INDEX_QUERY_SKI
297c0 50 45 4d 50 54 59 2c 20 0a 20 20 20 20 20 20 20  PEMPTY, .       
297d0 20 20 20 20 20 70 43 6f 6c 73 65 74 2c 20 62 75       pColset, bu
297e0 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20 2d  f.p, nToken+1, -
297f0 31 2c 20 30 2c 20 26 70 52 65 74 0a 20 20 20 20  1, 0, &pRet.    
29800 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 66      );.        f
29810 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
29820 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
29830 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
29840 0a 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 6d  .      /* Scan m
29850 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69 6e  ultiple terms in
29860 20 74 68 65 20 6d 61 69 6e 20 69 6e 64 65 78 20   the main index 
29870 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65  */.      int bDe
29880 73 63 20 3d 20 28 66 6c 61 67 73 20 26 20 46 54  sc = (flags & FT
29890 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
298a0 53 43 29 21 3d 30 3b 0a 20 20 20 20 20 20 62 75  SC)!=0;.      bu
298b0 66 2e 70 5b 30 5d 20 3d 20 46 54 53 35 5f 4d 41  f.p[0] = FTS5_MA
298c0 49 4e 5f 50 52 45 46 49 58 3b 0a 20 20 20 20 20  IN_PREFIX;.     
298d0 20 66 74 73 35 53 65 74 75 70 50 72 65 66 69 78   fts5SetupPrefix
298e0 49 74 65 72 28 70 2c 20 62 44 65 73 63 2c 20 62  Iter(p, bDesc, b
298f0 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20  uf.p, nToken+1, 
29900 70 43 6f 6c 73 65 74 2c 20 26 70 52 65 74 29 3b  pColset, &pRet);
29910 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
29920 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
29930 7c 7c 20 70 52 65 74 2d 3e 70 43 6f 6c 73 65 74  || pRet->pColset
29940 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 74 73  ==0 );.      fts
29950 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 43 62  5IterSetOutputCb
29960 28 26 70 2d 3e 72 63 2c 20 70 52 65 74 29 3b 0a  (&p->rc, pRet);.
29970 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
29980 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29990 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
299a0 72 20 2a 70 53 65 67 20 3d 20 26 70 52 65 74 2d  r *pSeg = &pRet-
299b0 3e 61 53 65 67 5b 70 52 65 74 2d 3e 61 46 69 72  >aSeg[pRet->aFir
299c0 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20  st[1].iFirst];. 
299d0 20 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d         if( pSeg-
299e0 3e 70 4c 65 61 66 20 29 20 70 52 65 74 2d 3e 78  >pLeaf ) pRet->x
299f0 53 65 74 4f 75 74 70 75 74 73 28 70 52 65 74 2c  SetOutputs(pRet,
29a00 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a   pSeg);.      }.
29a10 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
29a20 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71  ->rc ){.      sq
29a30 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f  lite3Fts5IterClo
29a40 73 65 28 28 46 74 73 35 49 6e 64 65 78 49 74 65  se((Fts5IndexIte
29a50 72 2a 29 70 52 65 74 29 3b 0a 20 20 20 20 20 20  r*)pRet);.      
29a60 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRet = 0;.      
29a70 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
29a80 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a  p);.    }..    *
29a90 70 70 49 74 65 72 20 3d 20 28 46 74 73 35 49 6e  ppIter = (Fts5In
29aa0 64 65 78 49 74 65 72 2a 29 70 52 65 74 3b 0a 20  dexIter*)pRet;. 
29ab0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
29ac0 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a  fferFree(&buf);.
29ad0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73    }.  return fts
29ae0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
29af0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
29b00 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74 65   true if the ite
29b10 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
29b20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
29b30 74 20 69 73 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a  t is at EOF..*/.
29b40 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68  /*.** Move to th
29b50 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20  e next matching 
29b60 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73  rowid. .*/.int s
29b70 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
29b80 78 74 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  xt(Fts5IndexIter
29b90 20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b 0a 20   *pIndexIter){. 
29ba0 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
29bb0 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29 70 49   = (Fts5Iter*)pI
29bc0 6e 64 65 78 49 74 65 72 3b 0a 20 20 61 73 73 65  ndexIter;.  asse
29bd0 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  rt( pIter->pInde
29be0 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  x->rc==SQLITE_OK
29bf0 20 29 3b 0a 20 20 66 74 73 35 4d 75 6c 74 69 49   );.  fts5MultiI
29c00 74 65 72 4e 65 78 74 28 70 49 74 65 72 2d 3e 70  terNext(pIter->p
29c10 49 6e 64 65 78 2c 20 70 49 74 65 72 2c 20 30 2c  Index, pIter, 0,
29c20 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74   0);.  return ft
29c30 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49  s5IndexReturn(pI
29c40 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a  ter->pIndex);.}.
29c50 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74  ./*.** Move to t
29c60 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67  he next matching
29c70 20 74 65 72 6d 2f 72 6f 77 69 64 2e 20 55 73 65   term/rowid. Use
29c80 64 20 62 79 20 74 68 65 20 66 74 73 35 76 6f 63  d by the fts5voc
29c90 61 62 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 69 6e  ab module..*/.in
29ca0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  t sqlite3Fts5Ite
29cb0 72 4e 65 78 74 53 63 61 6e 28 46 74 73 35 49 6e  rNextScan(Fts5In
29cc0 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65 78 49  dexIter *pIndexI
29cd0 74 65 72 29 7b 0a 20 20 46 74 73 35 49 74 65 72  ter){.  Fts5Iter
29ce0 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73 35 49   *pIter = (Fts5I
29cf0 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72 3b  ter*)pIndexIter;
29d00 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 20  .  Fts5Index *p 
29d10 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b  = pIter->pIndex;
29d20 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
29d30 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53  r->pIndex->rc==S
29d40 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 66  QLITE_OK );..  f
29d50 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
29d60 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29  (p, pIter, 0, 0)
29d70 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
29d80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29d90 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
29da0 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
29db0 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
29dc0 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20  1].iFirst ];.   
29dd0 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66   if( pSeg->pLeaf
29de0 20 26 26 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70   && pSeg->term.p
29df0 5b 30 5d 21 3d 46 54 53 35 5f 4d 41 49 4e 5f 50  [0]!=FTS5_MAIN_P
29e00 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20 66  REFIX ){.      f
29e10 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
29e20 53 65 67 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  Seg->pLeaf);.   
29e30 20 20 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 3d     pSeg->pLeaf =
29e40 20 30 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   0;.      pIter-
29e50 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20 31 3b 0a  >base.bEof = 1;.
29e60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
29e70 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
29e80 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  urn(pIter->pInde
29e90 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  x);.}../*.** Mov
29ea0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61  e to the next ma
29eb0 74 63 68 69 6e 67 20 72 6f 77 69 64 20 74 68 61  tching rowid tha
29ec0 74 20 6f 63 63 75 72 73 20 61 74 20 6f 72 20 61  t occurs at or a
29ed0 66 74 65 72 20 69 4d 61 74 63 68 2e 20 54 68 65  fter iMatch. The
29ee0 0a 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  .** definition o
29ef0 66 20 22 61 74 20 6f 72 20 61 66 74 65 72 22 20  f "at or after" 
29f00 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
29f10 65 72 20 74 68 69 73 20 69 74 65 72 61 74 6f 72  er this iterator
29f20 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 69 6e 20   iterates.** in 
29f30 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 64 65 73  ascending or des
29f40 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72  cending rowid or
29f50 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  der..*/.int sqli
29f60 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 46  te3Fts5IterNextF
29f70 72 6f 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65  rom(Fts5IndexIte
29f80 72 20 2a 70 49 6e 64 65 78 49 74 65 72 2c 20 69  r *pIndexIter, i
29f90 36 34 20 69 4d 61 74 63 68 29 7b 0a 20 20 46 74  64 iMatch){.  Ft
29fa0 73 35 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  s5Iter *pIter = 
29fb0 28 46 74 73 35 49 74 65 72 2a 29 70 49 6e 64 65  (Fts5Iter*)pInde
29fc0 78 49 74 65 72 3b 0a 20 20 66 74 73 35 4d 75 6c  xIter;.  fts5Mul
29fd0 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70  tiIterNextFrom(p
29fe0 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49  Iter->pIndex, pI
29ff0 74 65 72 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20  ter, iMatch);.  
2a000 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
2a010 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49  Return(pIter->pI
2a020 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndex);.}../*.** 
2a030 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
2a040 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 63 6f 6e 73  nt term..*/.cons
2a050 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 46  t char *sqlite3F
2a060 74 73 35 49 74 65 72 54 65 72 6d 28 46 74 73 35  ts5IterTerm(Fts5
2a070 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65  IndexIter *pInde
2a080 78 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b  xIter, int *pn){
2a090 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73  .  int n;.  cons
2a0a0 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e  t char *z = (con
2a0b0 73 74 20 63 68 61 72 2a 29 66 74 73 35 4d 75 6c  st char*)fts5Mul
2a0c0 74 69 49 74 65 72 54 65 72 6d 28 28 46 74 73 35  tiIterTerm((Fts5
2a0d0 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72  Iter*)pIndexIter
2a0e0 2c 20 26 6e 29 3b 0a 20 20 2a 70 6e 20 3d 20 6e  , &n);.  *pn = n
2a0f0 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 26 7a 5b  -1;.  return &z[
2a100 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  1];.}../*.** Clo
2a110 73 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20 6f  se an iterator o
2a120 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  pened by an earl
2a130 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ier call to sqli
2a140 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72  te3Fts5IndexQuer
2a150 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  y()..*/.void sql
2a160 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73  ite3Fts5IterClos
2a170 65 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  e(Fts5IndexIter 
2a180 2a 70 49 6e 64 65 78 49 74 65 72 29 7b 0a 20 20  *pIndexIter){.  
2a190 69 66 28 20 70 49 6e 64 65 78 49 74 65 72 20 29  if( pIndexIter )
2a1a0 7b 0a 20 20 20 20 46 74 73 35 49 74 65 72 20 2a  {.    Fts5Iter *
2a1b0 70 49 74 65 72 20 3d 20 28 46 74 73 35 49 74 65  pIter = (Fts5Ite
2a1c0 72 2a 29 70 49 6e 64 65 78 49 74 65 72 3b 0a 20  r*)pIndexIter;. 
2a1d0 20 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49     Fts5Index *pI
2a1e0 6e 64 65 78 20 3d 20 70 49 74 65 72 2d 3e 70 49  ndex = pIter->pI
2a1f0 6e 64 65 78 3b 0a 20 20 20 20 66 74 73 35 4d 75  ndex;.    fts5Mu
2a200 6c 74 69 49 74 65 72 46 72 65 65 28 70 49 74 65  ltiIterFree(pIte
2a210 72 29 3b 0a 20 20 20 20 66 74 73 35 43 6c 6f 73  r);.    fts5Clos
2a220 65 52 65 61 64 65 72 28 70 49 6e 64 65 78 29 3b  eReader(pIndex);
2a230 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2a240 61 64 20 61 6e 64 20 64 65 63 6f 64 65 20 74 68  ad and decode th
2a250 65 20 22 61 76 65 72 61 67 65 73 22 20 72 65 63  e "averages" rec
2a260 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ord from the dat
2a270 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 50 61  abase. .**.** Pa
2a280 72 61 6d 65 74 65 72 20 61 6e 53 69 7a 65 20 6d  rameter anSize m
2a290 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  ust point to an 
2a2a0 61 72 72 61 79 20 6f 66 20 73 69 7a 65 20 6e 43  array of size nC
2a2b0 6f 6c 2c 20 77 68 65 72 65 20 6e 43 6f 6c 20 69  ol, where nCol i
2a2c0 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  s.** the number 
2a2d0 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65 64 20  of user defined 
2a2e0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 46  columns in the F
2a2f0 54 53 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  TS table..*/.int
2a300 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2a310 78 47 65 74 41 76 65 72 61 67 65 73 28 46 74 73  xGetAverages(Fts
2a320 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 2a  5Index *p, i64 *
2a330 70 6e 52 6f 77 2c 20 69 36 34 20 2a 61 6e 53 69  pnRow, i64 *anSi
2a340 7a 65 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20  ze){.  int nCol 
2a350 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43  = p->pConfig->nC
2a360 6f 6c 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  ol;.  Fts5Data *
2a370 70 44 61 74 61 3b 0a 0a 20 20 2a 70 6e 52 6f 77  pData;..  *pnRow
2a380 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 61   = 0;.  memset(a
2a390 6e 53 69 7a 65 2c 20 30 2c 20 73 69 7a 65 6f 66  nSize, 0, sizeof
2a3a0 28 69 36 34 29 20 2a 20 6e 43 6f 6c 29 3b 0a 20  (i64) * nCol);. 
2a3b0 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74   pData = fts5Dat
2a3c0 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 41 56  aRead(p, FTS5_AV
2a3d0 45 52 41 47 45 53 5f 52 4f 57 49 44 29 3b 0a 20  ERAGES_ROWID);. 
2a3e0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
2a3f0 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 2d 3e  TE_OK && pData->
2a400 6e 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20  nn ){.    int i 
2a410 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  = 0;.    int iCo
2a420 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74 73 35  l;.    i += fts5
2a430 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61  GetVarint(&pData
2a440 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29 70 6e  ->p[i], (u64*)pn
2a450 52 6f 77 29 3b 0a 20 20 20 20 66 6f 72 28 69 43  Row);.    for(iC
2a460 6f 6c 3d 30 3b 20 69 3c 70 44 61 74 61 2d 3e 6e  ol=0; i<pData->n
2a470 6e 20 26 26 20 69 43 6f 6c 3c 6e 43 6f 6c 3b 20  n && iCol<nCol; 
2a480 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69  iCol++){.      i
2a490 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
2a4a0 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d 2c 20  t(&pData->p[i], 
2a4b0 28 75 36 34 2a 29 26 61 6e 53 69 7a 65 5b 69 43  (u64*)&anSize[iC
2a4c0 6f 6c 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ol]);.    }.  }.
2a4d0 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
2a4e0 73 65 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74  se(pData);.  ret
2a4f0 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
2a500 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn(p);.}../*.**
2a510 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 75 72   Replace the cur
2a520 72 65 6e 74 20 22 61 76 65 72 61 67 65 73 22 20  rent "averages" 
2a530 72 65 63 6f 72 64 20 77 69 74 68 20 74 68 65 20  record with the 
2a540 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2a550 62 75 66 66 65 72 20 0a 2a 2a 20 73 75 70 70 6c  buffer .** suppl
2a560 69 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  ied as the secon
2a570 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  d argument..*/.i
2a580 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
2a590 64 65 78 53 65 74 41 76 65 72 61 67 65 73 28 46  dexSetAverages(F
2a5a0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 63 6f 6e  ts5Index *p, con
2a5b0 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e  st u8 *pData, in
2a5c0 74 20 6e 44 61 74 61 29 7b 0a 20 20 61 73 73 65  t nData){.  asse
2a5d0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
2a5e0 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 44 61  E_OK );.  fts5Da
2a5f0 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f  taWrite(p, FTS5_
2a600 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c 20  AVERAGES_ROWID, 
2a610 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20  pData, nData);. 
2a620 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
2a630 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
2a640 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2a650 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
2a660 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f 64 75  blocks this modu
2a670 6c 65 20 68 61 73 20 72 65 61 64 20 66 72 6f 6d  le has read from
2a680 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74   the %_data.** t
2a690 61 62 6c 65 20 73 69 6e 63 65 20 69 74 20 77 61  able since it wa
2a6a0 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e  s created..*/.in
2a6b0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
2a6c0 65 78 52 65 61 64 73 28 46 74 73 35 49 6e 64 65  exReads(Fts5Inde
2a6d0 78 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  x *p){.  return 
2a6e0 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a  p->nRead;.}../*.
2a6f0 2a 2a 20 53 65 74 20 74 68 65 20 33 32 2d 62 69  ** Set the 32-bi
2a700 74 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 73  t cookie value s
2a710 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61  tored at the sta
2a720 72 74 20 6f 66 20 61 6c 6c 20 73 74 72 75 63 74  rt of all struct
2a730 75 72 65 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20  ure .** records 
2a740 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73  to the value pas
2a750 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
2a760 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
2a770 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
2a780 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
2a790 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
2a7a0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
2a7b0 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e  error.** occurs.
2a7c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
2a7d0 74 73 35 49 6e 64 65 78 53 65 74 43 6f 6f 6b 69  ts5IndexSetCooki
2a7e0 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
2a7f0 69 6e 74 20 69 4e 65 77 29 7b 0a 20 20 69 6e 74  int iNew){.  int
2a800 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a820 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2a830 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67   */.  Fts5Config
2a840 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
2a850 43 6f 6e 66 69 67 3b 20 20 20 20 2f 2a 20 43 6f  Config;    /* Co
2a860 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65  nfiguration obje
2a870 63 74 20 2a 2f 0a 20 20 75 38 20 61 43 6f 6f 6b  ct */.  u8 aCook
2a880 69 65 5b 34 5d 3b 20 20 20 20 20 20 20 20 20 20  ie[4];          
2a890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a8a0 42 69 6e 61 72 79 20 72 65 70 72 65 73 65 6e 74  Binary represent
2a8b0 61 74 69 6f 6e 20 6f 66 20 69 4e 65 77 20 2a 2f  ation of iNew */
2a8c0 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
2a8d0 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 0a 20 20 61  *pBlob = 0;..  a
2a8e0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
2a8f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c  LITE_OK );.  sql
2a900 69 74 65 33 46 74 73 35 50 75 74 33 32 28 61 43  ite3Fts5Put32(aC
2a910 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b 0a 0a 20  ookie, iNew);.. 
2a920 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
2a930 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67 2d  ob_open(pConfig-
2a940 3e 64 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44  >db, pConfig->zD
2a950 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  b, p->zDataTbl, 
2a960 0a 20 20 20 20 20 20 22 62 6c 6f 63 6b 22 2c 20  .      "block", 
2a970 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
2a980 4f 57 49 44 2c 20 31 2c 20 26 70 42 6c 6f 62 0a  OWID, 1, &pBlob.
2a990 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53    );.  if( rc==S
2a9a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a9b0 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69  sqlite3_blob_wri
2a9c0 74 65 28 70 42 6c 6f 62 2c 20 61 43 6f 6f 6b 69  te(pBlob, aCooki
2a9d0 65 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 72 63  e, 4, 0);.    rc
2a9e0 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
2a9f0 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b 0a 20 20  close(pBlob);.  
2aa00 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2aa10 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  }..int sqlite3Ft
2aa20 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e 66 69  s5IndexLoadConfi
2aa30 67 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  g(Fts5Index *p){
2aa40 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
2aa50 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 70 53 74   *pStruct;.  pSt
2aa60 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
2aa70 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 66  tureRead(p);.  f
2aa80 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
2aa90 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
2aaa0 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
2aab0 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f  Return(p);.}.../
2aac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aaf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab00 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
2ab10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab50 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68  ****.** Below th
2ab60 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65 20  is point is the 
2ab70 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
2ab80 66 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d  f the integrity-
2ab90 63 68 65 63 6b 20 0a 2a 2a 20 66 75 6e 63 74 69  check .** functi
2aba0 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a 0a 2f 2a 0a  onality..*/../*.
2abb0 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69 6d 70  ** Return a simp
2abc0 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75  le checksum valu
2abd0 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 61  e based on the a
2abe0 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36 34  rguments..*/.u64
2abf0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2ac00 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20 69  xEntryCksum(.  i
2ac10 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20 69 6e  64 iRowid, .  in
2ac20 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20 69  t iCol, .  int i
2ac30 50 6f 73 2c 20 0a 20 20 69 6e 74 20 69 49 64 78  Pos, .  int iIdx
2ac40 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
2ac50 70 54 65 72 6d 2c 0a 20 20 69 6e 74 20 6e 54 65  pTerm,.  int nTe
2ac60 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  rm.){.  int i;. 
2ac70 20 75 36 34 20 72 65 74 20 3d 20 69 52 6f 77 69   u64 ret = iRowi
2ac80 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74  d;.  ret += (ret
2ac90 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20 20 72  <<3) + iCol;.  r
2aca0 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b  et += (ret<<3) +
2acb0 20 69 50 6f 73 3b 0a 20 20 69 66 28 20 69 49 64   iPos;.  if( iId
2acc0 78 3e 3d 30 20 29 20 72 65 74 20 2b 3d 20 28 72  x>=0 ) ret += (r
2acd0 65 74 3c 3c 33 29 20 2b 20 28 46 54 53 35 5f 4d  et<<3) + (FTS5_M
2ace0 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69 49 64  AIN_PREFIX + iId
2acf0 78 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  x);.  for(i=0; i
2ad00 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72 65 74  <nTerm; i++) ret
2ad10 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 70   += (ret<<3) + p
2ad20 54 65 72 6d 5b 69 5d 3b 0a 20 20 72 65 74 75 72  Term[i];.  retur
2ad30 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66  n ret;.}..#ifdef
2ad40 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
2ad50 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2ad60 6e 20 69 73 20 70 75 72 65 6c 79 20 61 6e 20 69  n is purely an i
2ad70 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20 49 74  nternal test. It
2ad80 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69   does not contri
2ad90 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53 20  bute to .** FTS 
2ada0 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20 6f  functionality, o
2adb0 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74 65 67  r even the integ
2adc0 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20 61  rity-check, in a
2add0 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e  ny way..**.** In
2ade0 73 74 65 61 64 2c 20 69 74 20 74 65 73 74 73 20  stead, it tests 
2adf0 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 73 65  that the same se
2ae00 74 20 6f 66 20 70 67 6e 6f 2f 72 6f 77 69 64 20  t of pgno/rowid 
2ae10 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65  combinations are
2ae20 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 72 65 67   .** visited reg
2ae30 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
2ae40 65 72 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  er the doclist-i
2ae50 6e 64 65 78 20 69 64 65 6e 74 69 66 69 65 64 20  ndex identified 
2ae60 62 79 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2a  by parameters.**
2ae70 20 69 53 65 67 69 64 2f 69 4c 65 61 66 20 69 73   iSegid/iLeaf is
2ae80 20 69 74 65 72 61 74 65 64 20 69 6e 20 66 6f 72   iterated in for
2ae90 77 61 72 64 73 20 6f 72 20 72 65 76 65 72 73 65  wards or reverse
2aea0 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
2aeb0 63 20 76 6f 69 64 20 66 74 73 35 54 65 73 74 44  c void fts5TestD
2aec0 6c 69 64 78 52 65 76 65 72 73 65 28 0a 20 20 46  lidxReverse(.  F
2aed0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
2aee0 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20 20  int iSegid,     
2aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af00 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 74 6f  /* Segment id to
2af10 20 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   load from */.  
2af20 69 6e 74 20 69 4c 65 61 66 20 20 20 20 20 20 20  int iLeaf       
2af30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af40 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73 74 2d  /* Load doclist-
2af50 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20 6c  index for this l
2af60 65 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  eaf */.){.  Fts5
2af70 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64  DlidxIter *pDlid
2af80 78 20 3d 20 30 3b 0a 20 20 75 36 34 20 63 6b 73  x = 0;.  u64 cks
2af90 75 6d 31 20 3d 20 31 33 3b 0a 20 20 75 36 34 20  um1 = 13;.  u64 
2afa0 63 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a 20 20  cksum2 = 13;..  
2afb0 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44  for(pDlidx=fts5D
2afc0 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20  lidxIterInit(p, 
2afd0 30 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66  0, iSegid, iLeaf
2afe0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  );.      fts5Dli
2aff0 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
2b000 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66  idx)==0;.      f
2b010 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
2b020 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 29 7b  (p, pDlidx).  ){
2b030 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20  .    i64 iRowid 
2b040 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 52  = fts5DlidxIterR
2b050 6f 77 69 64 28 70 44 6c 69 64 78 29 3b 0a 20 20  owid(pDlidx);.  
2b060 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73    int pgno = fts
2b070 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
2b080 44 6c 69 64 78 29 3b 0a 20 20 20 20 61 73 73 65  Dlidx);.    asse
2b090 72 74 28 20 70 67 6e 6f 3e 69 4c 65 61 66 20 29  rt( pgno>iLeaf )
2b0a0 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 2b 3d 20  ;.    cksum1 += 
2b0b0 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34 29 70  iRowid + ((i64)p
2b0c0 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20 20  gno<<32);.  }.  
2b0d0 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
2b0e0 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44 6c  e(pDlidx);.  pDl
2b0f0 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  idx = 0;..  for(
2b100 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78  pDlidx=fts5Dlidx
2b110 49 74 65 72 49 6e 69 74 28 70 2c 20 31 2c 20 69  IterInit(p, 1, i
2b120 53 65 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a 20  Segid, iLeaf);. 
2b130 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
2b140 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
2b150 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 44  ==0;.      fts5D
2b160 6c 69 64 78 49 74 65 72 50 72 65 76 28 70 2c 20  lidxIterPrev(p, 
2b170 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20 20  pDlidx).  ){.   
2b180 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74   i64 iRowid = ft
2b190 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64  s5DlidxIterRowid
2b1a0 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 69 6e  (pDlidx);.    in
2b1b0 74 20 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69  t pgno = fts5Dli
2b1c0 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
2b1d0 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  x);.    assert( 
2b1e0 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
2b1f0 6f 28 70 44 6c 69 64 78 29 3e 69 4c 65 61 66 20  o(pDlidx)>iLeaf 
2b200 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32 20 2b 3d  );.    cksum2 +=
2b210 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34 29   iRowid + ((i64)
2b220 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20  pgno<<32);.  }. 
2b230 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
2b240 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44  ee(pDlidx);.  pD
2b250 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 69 66 28  lidx = 0;..  if(
2b260 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
2b270 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d 63 6b 73  K && cksum1!=cks
2b280 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  um2 ) p->rc = FT
2b290 53 35 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 0a 73  S5_CORRUPT;.}..s
2b2a0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 51 75  tatic int fts5Qu
2b2b0 65 72 79 43 6b 73 75 6d 28 0a 20 20 46 74 73 35  eryCksum(.  Fts5
2b2c0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
2b2d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2b2e0 74 73 35 20 69 6e 64 65 78 20 6f 62 6a 65 63 74  ts5 index object
2b2f0 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a   */.  int iIdx,.
2b300 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c    const char *z,
2b310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b320 20 20 2f 2a 20 49 6e 64 65 78 20 6b 65 79 20 74    /* Index key t
2b330 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20  o query for */. 
2b340 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
2b350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b360 20 2f 2a 20 53 69 7a 65 20 6f 66 20 69 6e 64 65   /* Size of inde
2b370 78 20 6b 65 79 20 69 6e 20 62 79 74 65 73 20 2a  x key in bytes *
2b380 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
2b390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3a0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
2b3b0 20 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 20   Fts5IndexQuery 
2b3c0 2a 2f 0a 20 20 75 36 34 20 2a 70 43 6b 73 75 6d  */.  u64 *pCksum
2b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3e0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
2b3f0 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 2a  Checksum value *
2b400 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 74 61  /.){.  int eDeta
2b410 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  il = p->pConfig-
2b420 3e 65 44 65 74 61 69 6c 3b 0a 20 20 75 36 34 20  >eDetail;.  u64 
2b430 63 6b 73 75 6d 20 3d 20 2a 70 43 6b 73 75 6d 3b  cksum = *pCksum;
2b440 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
2b450 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20 20 69   *pIter = 0;.  i
2b460 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46  nt rc = sqlite3F
2b470 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 70 2c  ts5IndexQuery(p,
2b480 20 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c 20 30 2c   z, n, flags, 0,
2b490 20 26 70 49 74 65 72 29 3b 0a 0a 20 20 77 68 69   &pIter);..  whi
2b4a0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
2b4b0 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46  K && 0==sqlite3F
2b4c0 74 73 35 49 74 65 72 45 6f 66 28 70 49 74 65 72  ts5IterEof(pIter
2b4d0 29 20 29 7b 0a 20 20 20 20 69 36 34 20 72 6f 77  ) ){.    i64 row
2b4e0 69 64 20 3d 20 70 49 74 65 72 2d 3e 69 52 6f 77  id = pIter->iRow
2b4f0 69 64 3b 0a 0a 20 20 20 20 69 66 28 20 65 44 65  id;..    if( eDe
2b500 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
2b510 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  L_NONE ){.      
2b520 63 6b 73 75 6d 20 5e 3d 20 73 71 6c 69 74 65 33  cksum ^= sqlite3
2b530 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b  Fts5IndexEntryCk
2b540 73 75 6d 28 72 6f 77 69 64 2c 20 30 2c 20 30 2c  sum(rowid, 0, 0,
2b550 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20   iIdx, z, n);.  
2b560 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46    }else{.      F
2b570 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
2b580 20 73 52 65 61 64 65 72 3b 0a 20 20 20 20 20 20   sReader;.      
2b590 66 6f 72 28 73 71 6c 69 74 65 33 46 74 73 35 50  for(sqlite3Fts5P
2b5a0 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74  oslistReaderInit
2b5b0 28 70 49 74 65 72 2d 3e 70 44 61 74 61 2c 20 70  (pIter->pData, p
2b5c0 49 74 65 72 2d 3e 6e 44 61 74 61 2c 20 26 73 52  Iter->nData, &sR
2b5d0 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 20 20  eader);.        
2b5e0 20 20 73 52 65 61 64 65 72 2e 62 45 6f 66 3d 3d    sReader.bEof==
2b5f0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  0;.          sql
2b600 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52  ite3Fts5PoslistR
2b610 65 61 64 65 72 4e 65 78 74 28 26 73 52 65 61 64  eaderNext(&sRead
2b620 65 72 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  er).      ){.   
2b630 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
2b640 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28  FTS5_POS2COLUMN(
2b650 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a 20  sReader.iPos);. 
2b660 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20         int iOff 
2b670 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45  = FTS5_POS2OFFSE
2b680 54 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b  T(sReader.iPos);
2b690 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 5e  .        cksum ^
2b6a0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
2b6b0 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f 77  exEntryCksum(row
2b6c0 69 64 2c 20 69 43 6f 6c 2c 20 69 4f 66 66 2c 20  id, iCol, iOff, 
2b6d0 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  iIdx, z, n);.   
2b6e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2b6f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b700 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2b710 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
2b720 78 74 28 70 49 74 65 72 29 3b 0a 20 20 20 20 7d  xt(pIter);.    }
2b730 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74  .  }.  sqlite3Ft
2b740 73 35 49 74 65 72 43 6c 6f 73 65 28 70 49 74 65  s5IterClose(pIte
2b750 72 29 3b 0a 0a 20 20 2a 70 43 6b 73 75 6d 20 3d  r);..  *pCksum =
2b760 20 63 6b 73 75 6d 3b 0a 20 20 72 65 74 75 72 6e   cksum;.  return
2b770 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
2b780 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2b790 61 6c 73 6f 20 70 75 72 65 6c 79 20 61 6e 20 69  also purely an i
2b7a0 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20 49 74  nternal test. It
2b7b0 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69   does not contri
2b7c0 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53 20  bute to .** FTS 
2b7d0 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20 6f  functionality, o
2b7e0 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74 65 67  r even the integ
2b7f0 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20 61  rity-check, in a
2b800 6e 79 20 77 61 79 2e 0a 2a 2f 0a 73 74 61 74 69  ny way..*/.stati
2b810 63 20 76 6f 69 64 20 66 74 73 35 54 65 73 74 54  c void fts5TestT
2b820 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  erm(.  Fts5Index
2b830 20 2a 70 2c 20 0a 20 20 46 74 73 35 42 75 66 66   *p, .  Fts5Buff
2b840 65 72 20 2a 70 50 72 65 76 2c 20 20 20 20 20 20  er *pPrev,      
2b850 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
2b860 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20 20 63 6f  ous term */.  co
2b870 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
2b880 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a   n,           /*
2b890 20 50 6f 73 73 69 62 6c 79 20 6e 65 77 20 74 65   Possibly new te
2b8a0 72 6d 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20  rm to test */.  
2b8b0 75 36 34 20 65 78 70 65 63 74 65 64 2c 0a 20 20  u64 expected,.  
2b8c0 75 36 34 20 2a 70 43 6b 73 75 6d 0a 29 7b 0a 20  u64 *pCksum.){. 
2b8d0 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b   int rc = p->rc;
2b8e0 0a 20 20 69 66 28 20 70 50 72 65 76 2d 3e 6e 3d  .  if( pPrev->n=
2b8f0 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75  =0 ){.    fts5Bu
2b900 66 66 65 72 53 65 74 28 26 72 63 2c 20 70 50 72  fferSet(&rc, pPr
2b910 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75 38  ev, n, (const u8
2b920 2a 29 7a 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20  *)z);.  }else.  
2b930 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b940 4b 20 26 26 20 28 70 50 72 65 76 2d 3e 6e 21 3d  K && (pPrev->n!=
2b950 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 50 72 65  n || memcmp(pPre
2b960 76 2d 3e 70 2c 20 7a 2c 20 6e 29 29 20 29 7b 0a  v->p, z, n)) ){.
2b970 20 20 20 20 75 36 34 20 63 6b 73 75 6d 33 20 3d      u64 cksum3 =
2b980 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 20 20 63 6f   *pCksum;.    co
2b990 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20  nst char *zTerm 
2b9a0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 26  = (const char*)&
2b9b0 70 50 72 65 76 2d 3e 70 5b 31 5d 3b 20 20 2f 2a  pPrev->p[1];  /*
2b9c0 20 74 65 72 6d 20 73 61 6e 73 20 70 72 65 66 69   term sans prefi
2b9d0 78 2d 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e  x-byte */.    in
2b9e0 74 20 6e 54 65 72 6d 20 3d 20 70 50 72 65 76 2d  t nTerm = pPrev-
2b9f0 3e 6e 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  >n-1;           
2ba00 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65 72   /* Size of zTer
2ba10 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  m in bytes */.  
2ba20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 28 70 50    int iIdx = (pP
2ba30 72 65 76 2d 3e 70 5b 30 5d 20 2d 20 46 54 53 35  rev->p[0] - FTS5
2ba40 5f 4d 41 49 4e 5f 50 52 45 46 49 58 29 3b 0a 20  _MAIN_PREFIX);. 
2ba50 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
2ba60 69 49 64 78 3d 3d 30 20 3f 20 30 20 3a 20 46 54  iIdx==0 ? 0 : FT
2ba70 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52  S5INDEX_QUERY_PR
2ba80 45 46 49 58 29 3b 0a 20 20 20 20 75 36 34 20 63  EFIX);.    u64 c
2ba90 6b 31 20 3d 20 30 3b 0a 20 20 20 20 75 36 34 20  k1 = 0;.    u64 
2baa0 63 6b 32 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ck2 = 0;..    /*
2bab0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
2bac0 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64  results returned
2bad0 20 66 6f 72 20 41 53 43 20 61 6e 64 20 44 45 53   for ASC and DES
2bae0 43 20 71 75 65 72 69 65 73 20 61 72 65 0a 20 20  C queries are.  
2baf0 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20 49    ** the same. I
2bb00 66 20 6e 6f 74 2c 20 63 61 6c 6c 20 74 68 69 73  f not, call this
2bb10 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f   corruption.  */
2bb20 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75  .    rc = fts5Qu
2bb30 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78  eryCksum(p, iIdx
2bb40 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
2bb50 66 6c 61 67 73 2c 20 26 63 6b 31 29 3b 0a 20 20  flags, &ck1);.  
2bb60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bb70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
2bb80 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49   f = flags|FTS5I
2bb90 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 3b  NDEX_QUERY_DESC;
2bba0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35  .      rc = fts5
2bbb0 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49  QueryCksum(p, iI
2bbc0 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  dx, zTerm, nTerm
2bbd0 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20  , f, &ck2);.    
2bbe0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2bbf0 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d  LITE_OK && ck1!=
2bc00 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f  ck2 ) rc = FTS5_
2bc10 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20 2f 2a  CORRUPT;..    /*
2bc20 20 49 66 20 74 68 69 73 20 69 73 20 61 20 70 72   If this is a pr
2bc30 65 66 69 78 20 71 75 65 72 79 2c 20 63 68 65 63  efix query, chec
2bc40 6b 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  k that the resul
2bc50 74 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  ts returned if t
2bc60 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  he.    ** the in
2bc70 64 65 78 20 69 73 20 64 69 73 61 62 6c 65 64 20  dex is disabled 
2bc80 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 49 6e  are the same. In
2bc90 20 62 6f 74 68 20 41 53 43 20 61 6e 64 20 44 45   both ASC and DE
2bca0 53 43 20 6f 72 64 65 72 2e 20 0a 20 20 20 20 2a  SC order. .    *
2bcb0 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 63 68  *.    ** This ch
2bcc0 65 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  eck may only be 
2bcd0 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74 68 65  performed if the
2bce0 20 68 61 73 68 20 74 61 62 6c 65 20 69 73 20 65   hash table is e
2bcf0 6d 70 74 79 2e 20 54 68 69 73 0a 20 20 20 20 2a  mpty. This.    *
2bd00 2a 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  * is because the
2bd10 20 68 61 73 68 20 74 61 62 6c 65 20 6f 6e 6c 79   hash table only
2bd20 20 73 75 70 70 6f 72 74 73 20 61 20 73 69 6e 67   supports a sing
2bd30 6c 65 20 73 63 61 6e 20 71 75 65 72 79 20 61 74  le scan query at
2bd40 0a 20 20 20 20 2a 2a 20 61 20 74 69 6d 65 2c 20  .    ** a time, 
2bd50 61 6e 64 20 74 68 65 20 6d 75 6c 74 69 2d 69 74  and the multi-it
2bd60 65 72 20 6c 6f 6f 70 20 66 72 6f 6d 20 77 68 69  er loop from whi
2bd70 63 68 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ch this function
2bd80 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a   is called.    *
2bd90 2a 20 69 73 20 61 6c 72 65 61 64 79 20 70 65 72  * is already per
2bda0 66 6f 72 6d 69 6e 67 20 73 75 63 68 20 61 20 73  forming such a s
2bdb0 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  can. */.    if( 
2bdc0 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d  p->nPendingData=
2bdd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
2bde0 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53 51  iIdx>0 && rc==SQ
2bdf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2be00 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73     int f = flags
2be10 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59  |FTS5INDEX_QUERY
2be20 5f 54 45 53 54 5f 4e 4f 49 44 58 3b 0a 20 20 20  _TEST_NOIDX;.   
2be30 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20       ck2 = 0;.  
2be40 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 51        rc = fts5Q
2be50 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64  ueryCksum(p, iId
2be60 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  x, zTerm, nTerm,
2be70 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20   f, &ck2);.     
2be80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2be90 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32  E_OK && ck1!=ck2
2bea0 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52   ) rc = FTS5_COR
2beb0 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RUPT;.      }.  
2bec0 20 20 20 20 69 66 28 20 69 49 64 78 3e 30 20 26      if( iIdx>0 &
2bed0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
2bee0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  ){.        int f
2bef0 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44   = flags|FTS5IND
2bf00 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f  EX_QUERY_TEST_NO
2bf10 49 44 58 7c 46 54 53 35 49 4e 44 45 58 5f 51 55  IDX|FTS5INDEX_QU
2bf20 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20 20 20  ERY_DESC;.      
2bf30 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20    ck2 = 0;.     
2bf40 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65 72     rc = fts5Quer
2bf50 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20  yCksum(p, iIdx, 
2bf60 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c  zTerm, nTerm, f,
2bf70 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20 20 20   &ck2);.        
2bf80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2bf90 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20  K && ck1!=ck2 ) 
2bfa0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2bfb0 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  T;.      }.    }
2bfc0 0a 0a 20 20 20 20 63 6b 73 75 6d 33 20 5e 3d 20  ..    cksum3 ^= 
2bfd0 63 6b 31 3b 0a 20 20 20 20 66 74 73 35 42 75 66  ck1;.    fts5Buf
2bfe0 66 65 72 53 65 74 28 26 72 63 2c 20 70 50 72 65  ferSet(&rc, pPre
2bff0 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75 38 2a  v, n, (const u8*
2c000 29 7a 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  )z);..    if( rc
2c010 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
2c020 6b 73 75 6d 33 21 3d 65 78 70 65 63 74 65 64 20  ksum3!=expected 
2c030 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 46 54  ){.      rc = FT
2c040 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2c050 7d 0a 20 20 20 20 2a 70 43 6b 73 75 6d 20 3d 20  }.    *pCksum = 
2c060 63 6b 73 75 6d 33 3b 0a 20 20 7d 0a 20 20 70 2d  cksum3;.  }.  p-
2c070 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a 20 0a 23 65  >rc = rc;.}. .#e
2c080 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73  lse.# define fts
2c090 35 54 65 73 74 44 6c 69 64 78 52 65 76 65 72 73  5TestDlidxRevers
2c0a0 65 28 78 2c 79 2c 7a 29 0a 23 20 64 65 66 69 6e  e(x,y,z).# defin
2c0b0 65 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 75  e fts5TestTerm(u
2c0c0 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64  ,v,w,x,y,z).#end
2c0d0 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  if../*.** Check 
2c0e0 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  that:.**.**   1)
2c0f0 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f 66 20 70   All leaves of p
2c100 53 65 67 20 62 65 74 77 65 65 6e 20 69 46 69 72  Seg between iFir
2c110 73 74 20 61 6e 64 20 69 4c 61 73 74 20 28 69 6e  st and iLast (in
2c120 63 6c 75 73 69 76 65 29 20 65 78 69 73 74 20 61  clusive) exist a
2c130 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61  nd.**      conta
2c140 69 6e 20 7a 65 72 6f 20 74 65 72 6d 73 2e 0a 2a  in zero terms..*
2c150 2a 20 20 20 32 29 20 41 6c 6c 20 6c 65 61 76 65  *   2) All leave
2c160 73 20 6f 66 20 70 53 65 67 20 62 65 74 77 65 65  s of pSeg betwee
2c170 6e 20 69 4e 6f 52 6f 77 69 64 20 61 6e 64 20 69  n iNoRowid and i
2c180 4c 61 73 74 20 28 69 6e 63 6c 75 73 69 76 65 29  Last (inclusive)
2c190 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20 20 20   exist and.**   
2c1a0 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20     contain zero 
2c1b0 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  rowids..*/.stati
2c1c0 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
2c1d0 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 45 6d  IntegrityCheckEm
2c1e0 70 74 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78  pty(.  Fts5Index
2c1f0 20 2a 70 2c 0a 20 20 46 74 73 35 53 74 72 75 63   *p,.  Fts5Struc
2c200 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
2c210 67 2c 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e  g,     /* Segmen
2c220 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65 72  t to check inter
2c230 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  nal consistency 
2c240 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c  */.  int iFirst,
2c250 0a 20 20 69 6e 74 20 69 4e 6f 52 6f 77 69 64 2c  .  int iNoRowid,
2c260 0a 20 20 69 6e 74 20 69 4c 61 73 74 0a 29 7b 0a  .  int iLast.){.
2c270 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 4e    int i;..  /* N
2c280 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
2c290 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65  e iter.nEmpty le
2c2a0 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  aves following t
2c2b0 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 0a  he current leaf.
2c2c0 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20 61    ** (a) exist a
2c2d0 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20 6e  nd (b) contain n
2c2e0 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 66 6f  o terms. */.  fo
2c2f0 72 28 69 3d 69 46 69 72 73 74 3b 20 70 2d 3e 72  r(i=iFirst; p->r
2c300 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2c310 69 3c 3d 69 4c 61 73 74 3b 20 69 2b 2b 29 7b 0a  i<=iLast; i++){.
2c320 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c      Fts5Data *pL
2c330 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65  eaf = fts5DataRe
2c340 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45  ad(p, FTS5_SEGME
2c350 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69  NT_ROWID(pSeg->i
2c360 53 65 67 69 64 2c 20 69 29 29 3b 0a 20 20 20 20  Segid, i));.    
2c370 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20  if( pLeaf ){.   
2c380 20 20 20 69 66 28 20 21 66 74 73 35 4c 65 61 66     if( !fts5Leaf
2c390 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 65 61 66  IsTermless(pLeaf
2c3a0 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  ) ) p->rc = FTS5
2c3b0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2c3c0 69 66 28 20 69 3e 3d 69 4e 6f 52 6f 77 69 64 20  if( i>=iNoRowid 
2c3d0 26 26 20 30 21 3d 66 74 73 35 4c 65 61 66 46 69  && 0!=fts5LeafFi
2c3e0 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61  rstRowidOff(pLea
2c3f0 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  f) ) p->rc = FTS
2c400 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  5_CORRUPT;.    }
2c410 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
2c420 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 7d  ease(pLeaf);.  }
2c430 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
2c440 66 74 73 35 49 6e 74 65 67 72 69 74 79 43 68 65  fts5IntegrityChe
2c450 63 6b 50 67 69 64 78 28 46 74 73 35 49 6e 64 65  ckPgidx(Fts5Inde
2c460 78 20 2a 70 2c 20 46 74 73 35 44 61 74 61 20 2a  x *p, Fts5Data *
2c470 70 4c 65 61 66 29 7b 0a 20 20 69 6e 74 20 69 54  pLeaf){.  int iT
2c480 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 69 6e  ermOff = 0;.  in
2c490 74 20 69 69 3b 0a 0a 20 20 46 74 73 35 42 75 66  t ii;..  Fts5Buf
2c4a0 66 65 72 20 62 75 66 31 20 3d 20 7b 30 2c 30 2c  fer buf1 = {0,0,
2c4b0 30 7d 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72  0};.  Fts5Buffer
2c4c0 20 62 75 66 32 20 3d 20 7b 30 2c 30 2c 30 7d 3b   buf2 = {0,0,0};
2c4d0 0a 0a 20 20 69 69 20 3d 20 70 4c 65 61 66 2d 3e  ..  ii = pLeaf->
2c4e0 73 7a 4c 65 61 66 3b 0a 20 20 77 68 69 6c 65 28  szLeaf;.  while(
2c4f0 20 69 69 3c 70 4c 65 61 66 2d 3e 6e 6e 20 26 26   ii<pLeaf->nn &&
2c500 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
2c510 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  K ){.    int res
2c520 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a  ;.    int iOff;.
2c530 20 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b 0a 0a      int nIncr;..
2c540 20 20 20 20 69 69 20 2b 3d 20 66 74 73 35 47 65      ii += fts5Ge
2c550 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66  tVarint32(&pLeaf
2c560 2d 3e 70 5b 69 69 5d 2c 20 6e 49 6e 63 72 29 3b  ->p[ii], nIncr);
2c570 0a 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d  .    iTermOff +=
2c580 20 6e 49 6e 63 72 3b 0a 20 20 20 20 69 4f 66 66   nIncr;.    iOff
2c590 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20 20   = iTermOff;..  
2c5a0 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61    if( iOff>=pLea
2c5b0 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
2c5c0 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
2c5d0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c  CORRUPT;.    }el
2c5e0 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66 3d  se if( iTermOff=
2c5f0 3d 6e 49 6e 63 72 20 29 7b 0a 20 20 20 20 20 20  =nIncr ){.      
2c600 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  int nByte;.     
2c610 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
2c620 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d  Varint32(&pLeaf-
2c630 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29  >p[iOff], nByte)
2c640 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 4f 66  ;.      if( (iOf
2c650 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66 2d 3e  f+nByte)>pLeaf->
2c660 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
2c670 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
2c680 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65  ORRUPT;.      }e
2c690 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73  lse{.        fts
2c6a0 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
2c6b0 63 2c 20 26 62 75 66 31 2c 20 6e 42 79 74 65 2c  c, &buf1, nByte,
2c6c0 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d   &pLeaf->p[iOff]
2c6d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2c6e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
2c6f0 6e 4b 65 65 70 2c 20 6e 42 79 74 65 3b 0a 20 20  nKeep, nByte;.  
2c700 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
2c710 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65  GetVarint32(&pLe
2c720 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b 65  af->p[iOff], nKe
2c730 65 70 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  ep);.      iOff 
2c740 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
2c750 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  32(&pLeaf->p[iOf
2c760 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  f], nByte);.    
2c770 20 20 69 66 28 20 6e 4b 65 65 70 3e 62 75 66 31    if( nKeep>buf1
2c780 2e 6e 20 7c 7c 20 28 69 4f 66 66 2b 6e 42 79 74  .n || (iOff+nByt
2c790 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  e)>pLeaf->szLeaf
2c7a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
2c7b0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2c7c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2c7d0 20 20 20 20 20 20 20 62 75 66 31 2e 6e 20 3d 20         buf1.n = 
2c7e0 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 20 20 66  nKeep;.        f
2c7f0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
2c800 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  lob(&p->rc, &buf
2c810 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65 61 66  1, nByte, &pLeaf
2c820 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20  ->p[iOff]);.    
2c830 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
2c840 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
2c850 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  ){.        res =
2c860 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61   fts5BufferCompa
2c870 72 65 28 26 62 75 66 31 2c 20 26 62 75 66 32 29  re(&buf1, &buf2)
2c880 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
2c890 73 3c 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 46  s<=0 ) p->rc = F
2c8a0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2c8b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
2c8c0 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
2c8d0 3e 72 63 2c 20 26 62 75 66 32 2c 20 62 75 66 31  >rc, &buf2, buf1
2c8e0 2e 6e 2c 20 62 75 66 31 2e 70 29 3b 0a 20 20 7d  .n, buf1.p);.  }
2c8f0 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ..  fts5BufferFr
2c900 65 65 28 26 62 75 66 31 29 3b 0a 20 20 66 74 73  ee(&buf1);.  fts
2c910 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66  5BufferFree(&buf
2c920 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  2);.}..static vo
2c930 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65  id fts5IndexInte
2c940 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65 6e  grityCheckSegmen
2c950 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
2c960 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
2c970 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
2c980 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
2c990 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
2c9a0 67 6d 65 6e 74 20 2a 70 53 65 67 20 20 20 20 20  gment *pSeg     
2c9b0 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 63   /* Segment to c
2c9c0 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f  heck internal co
2c9d0 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 29 7b 0a  nsistency */.){.
2c9e0 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
2c9f0 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
2ca00 69 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  ig;.  sqlite3_st
2ca10 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
2ca20 20 69 6e 74 20 72 63 32 3b 0a 20 20 69 6e 74 20   int rc2;.  int 
2ca30 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70  iIdxPrevLeaf = p
2ca40 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31  Seg->pgnoFirst-1
2ca50 3b 0a 20 20 69 6e 74 20 69 44 6c 69 64 78 50 72  ;.  int iDlidxPr
2ca60 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70  evLeaf = pSeg->p
2ca70 67 6e 6f 4c 61 73 74 3b 0a 0a 20 20 69 66 28 20  gnoLast;..  if( 
2ca80 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d  pSeg->pgnoFirst=
2ca90 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
2caa0 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65  fts5IndexPrepare
2cab0 53 74 6d 74 28 70 2c 20 26 70 53 74 6d 74 2c 20  Stmt(p, &pStmt, 
2cac0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2cad0 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73  .      "SELECT s
2cae0 65 67 69 64 2c 20 74 65 72 6d 2c 20 28 70 67 6e  egid, term, (pgn
2caf0 6f 3e 3e 31 29 2c 20 28 70 67 6e 6f 26 31 29 20  o>>1), (pgno&1) 
2cb00 46 52 4f 4d 20 25 51 2e 27 25 71 5f 69 64 78 27  FROM %Q.'%q_idx'
2cb10 20 57 48 45 52 45 20 73 65 67 69 64 3d 25 64 22   WHERE segid=%d"
2cb20 2c 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d  ,.      pConfig-
2cb30 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  >zDb, pConfig->z
2cb40 4e 61 6d 65 2c 20 70 53 65 67 2d 3e 69 53 65 67  Name, pSeg->iSeg
2cb50 69 64 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49  id.  ));..  /* I
2cb60 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
2cb70 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61 72  he b-tree hierar
2cb80 63 68 79 2e 20 20 2a 2f 0a 20 20 77 68 69 6c 65  chy.  */.  while
2cb90 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
2cba0 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
2cbb0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
2cbc0 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 69 36 34  Stmt) ){.    i64
2cbd0 20 69 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20   iRow;          
2cbe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2cbf0 77 69 64 20 66 6f 72 20 74 68 69 73 20 6c 65 61  wid for this lea
2cc00 66 20 2a 2f 0a 20 20 20 20 46 74 73 35 44 61 74  f */.    Fts5Dat
2cc10 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20  a *pLeaf;       
2cc20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66         /* Data f
2cc30 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a  or this leaf */.
2cc40 0a 20 20 20 20 69 6e 74 20 6e 49 64 78 54 65 72  .    int nIdxTer
2cc50 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  m = sqlite3_colu
2cc60 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
2cc70 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  1);.    const ch
2cc80 61 72 20 2a 7a 49 64 78 54 65 72 6d 20 3d 20 28  ar *zIdxTerm = (
2cc90 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
2cca0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
2ccb0 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 69  pStmt, 1);.    i
2ccc0 6e 74 20 69 49 64 78 4c 65 61 66 20 3d 20 73 71  nt iIdxLeaf = sq
2ccd0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2cce0 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20  (pStmt, 2);.    
2ccf0 69 6e 74 20 62 49 64 78 44 6c 69 64 78 20 3d 20  int bIdxDlidx = 
2cd00 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2cd10 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a 0a 20  nt(pStmt, 3);.. 
2cd20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 65 61     /* If the lea
2cd30 66 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 68 61  f in question ha
2cd40 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74  s already been t
2cd50 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68 65 20  rimmed from the 
2cd60 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20 20 2a 2a  segment, .    **
2cd70 20 69 67 6e 6f 72 65 20 74 68 69 73 20 62 2d 74   ignore this b-t
2cd80 72 65 65 20 65 6e 74 72 79 2e 20 4f 74 68 65 72  ree entry. Other
2cd90 77 69 73 65 2c 20 6c 6f 61 64 20 69 74 20 69 6e  wise, load it in
2cda0 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20  to memory. */.  
2cdb0 20 20 69 66 28 20 69 49 64 78 4c 65 61 66 3c 70    if( iIdxLeaf<p
2cdc0 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29  Seg->pgnoFirst )
2cdd0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2cde0 52 6f 77 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  Row = FTS5_SEGME
2cdf0 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69  NT_ROWID(pSeg->i
2ce00 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29  Segid, iIdxLeaf)
2ce10 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74  ;.    pLeaf = ft
2ce20 73 35 4c 65 61 66 52 65 61 64 28 70 2c 20 69 52  s5LeafRead(p, iR
2ce30 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  ow);.    if( pLe
2ce40 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a  af==0 ) break;..
2ce50 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
2ce60 74 20 74 68 65 20 6c 65 61 66 20 63 6f 6e 74 61  t the leaf conta
2ce70 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ins at least one
2ce80 20 74 65 72 6d 2c 20 61 6e 64 20 74 68 61 74 20   term, and that 
2ce90 69 74 20 69 73 20 65 71 75 61 6c 0a 20 20 20 20  it is equal.    
2cea0 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67 65 72 20  ** to or larger 
2ceb0 74 68 61 6e 20 74 68 65 20 73 70 6c 69 74 2d 6b  than the split-k
2cec0 65 79 20 69 6e 20 7a 49 64 78 54 65 72 6d 2e 20  ey in zIdxTerm. 
2ced0 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74   Also check that
2cee0 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 2a 2a   if there.    **
2cef0 20 69 73 20 61 6c 73 6f 20 61 20 72 6f 77 69 64   is also a rowid
2cf00 20 70 6f 69 6e 74 65 72 20 77 69 74 68 69 6e 20   pointer within 
2cf10 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 68 65  the leaf page he
2cf20 61 64 65 72 2c 20 69 74 20 70 6f 69 6e 74 73 20  ader, it points 
2cf30 74 6f 20 61 0a 20 20 20 20 2a 2a 20 6c 6f 63 61  to a.    ** loca
2cf40 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68 65 20  tion before the 
2cf50 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 69 66  term.  */.    if
2cf60 28 20 70 4c 65 61 66 2d 3e 6e 6e 3c 3d 70 4c 65  ( pLeaf->nn<=pLe
2cf70 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
2cf80 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
2cf90 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65  _CORRUPT;.    }e
2cfa0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
2cfb0 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
2cfc0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2cfd0 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d 20 6f   of first term o
2cfe0 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 20 20  n leaf */.      
2cff0 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b 20 20  int iRowidOff;  
2d000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2d010 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 72  ffset of first r
2d020 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a  owid on leaf */.
2d030 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b        int nTerm;
2d040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d050 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72    /* Size of ter
2d060 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62 79 74  m on leaf in byt
2d070 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  es */.      int 
2d080 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  res;            
2d090 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
2d0a0 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20 61 6e  rison of term an
2d0b0 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a 0a  d split-key */..
2d0c0 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73        iOff = fts
2d0d0 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66  5LeafFirstTermOf
2d0e0 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  f(pLeaf);.      
2d0f0 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35  iRowidOff = fts5
2d100 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
2d110 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  f(pLeaf);.      
2d120 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d 69  if( iRowidOff>=i
2d130 4f 66 66 20 7c 7c 20 69 4f 66 66 3e 3d 70 4c 65  Off || iOff>=pLe
2d140 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
2d150 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
2d160 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2d170 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2d180 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
2d190 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d  Varint32(&pLeaf-
2d1a0 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72 6d 29  >p[iOff], nTerm)
2d1b0 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  ;.        res = 
2d1c0 66 74 73 35 4d 65 6d 63 6d 70 28 26 70 4c 65 61  fts5Memcmp(&pLea
2d1d0 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 7a 49 64 78  f->p[iOff], zIdx
2d1e0 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c  Term, MIN(nTerm,
2d1f0 20 6e 49 64 78 54 65 72 6d 29 29 3b 0a 20 20 20   nIdxTerm));.   
2d200 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
2d210 29 20 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20  ) res = nTerm - 
2d220 6e 49 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20  nIdxTerm;.      
2d230 20 20 69 66 28 20 72 65 73 3c 30 20 29 20 70 2d    if( res<0 ) p-
2d240 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2d250 50 54 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  PT;.      }..   
2d260 20 20 20 66 74 73 35 49 6e 74 65 67 72 69 74 79     fts5Integrity
2d270 43 68 65 63 6b 50 67 69 64 78 28 70 2c 20 70 4c  CheckPgidx(p, pL
2d280 65 61 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eaf);.    }.    
2d290 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
2d2a0 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20  pLeaf);.    if( 
2d2b0 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a  p->rc ) break;..
2d2c0 20 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b      /* Now check
2d2d0 20 74 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e   that the iter.n
2d2e0 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c  Empty leaves fol
2d2f0 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72 65  lowing the curre
2d300 6e 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28  nt leaf.    ** (
2d310 61 29 20 65 78 69 73 74 20 61 6e 64 20 28 62 29  a) exist and (b)
2d320 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d   contain no term
2d330 73 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 49 6e  s. */.    fts5In
2d340 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63  dexIntegrityChec
2d350 6b 45 6d 70 74 79 28 0a 20 20 20 20 20 20 20 20  kEmpty(.        
2d360 70 2c 20 70 53 65 67 2c 20 69 49 64 78 50 72 65  p, pSeg, iIdxPre
2d370 76 4c 65 61 66 2b 31 2c 20 69 44 6c 69 64 78 50  vLeaf+1, iDlidxP
2d380 72 65 76 4c 65 61 66 2b 31 2c 20 69 49 64 78 4c  revLeaf+1, iIdxL
2d390 65 61 66 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20  eaf-1.    );.   
2d3a0 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65   if( p->rc ) bre
2d3b0 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ak;..    /* If t
2d3c0 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73  here is a doclis
2d3d0 74 2d 69 6e 64 65 78 2c 20 63 68 65 63 6b 20 74  t-index, check t
2d3e0 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 72 69 67  hat it looks rig
2d3f0 68 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62  ht. */.    if( b
2d400 49 64 78 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  IdxDlidx ){.    
2d410 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
2d420 2a 70 44 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a  *pDlidx = 0;  /*
2d430 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74   For iterating t
2d440 68 72 6f 75 67 68 20 64 6f 63 6c 69 73 74 20 69  hrough doclist i
2d450 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ndex */.      in
2d460 74 20 69 50 72 65 76 4c 65 61 66 20 3d 20 69 49  t iPrevLeaf = iI
2d470 64 78 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e  dxLeaf;.      in
2d480 74 20 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d  t iSegid = pSeg-
2d490 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69  >iSegid;.      i
2d4a0 6e 74 20 69 50 67 20 3d 20 30 3b 0a 20 20 20 20  nt iPg = 0;.    
2d4b0 20 20 69 36 34 20 69 4b 65 79 3b 0a 0a 20 20 20    i64 iKey;..   
2d4c0 20 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74     for(pDlidx=ft
2d4d0 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28  s5DlidxIterInit(
2d4e0 70 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69 49  p, 0, iSegid, iI
2d4f0 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  dxLeaf);.       
2d500 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
2d510 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d  Eof(p, pDlidx)==
2d520 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  0;.          fts
2d530 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70  5DlidxIterNext(p
2d540 2c 20 70 44 6c 69 64 78 29 0a 20 20 20 20 20 20  , pDlidx).      
2d550 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  ){..        /* C
2d560 68 65 63 6b 20 61 6e 79 20 72 6f 77 69 64 2d 6c  heck any rowid-l
2d570 65 73 73 20 70 61 67 65 73 20 74 68 61 74 20 6f  ess pages that o
2d580 63 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20  ccur before the 
2d590 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f  current leaf. */
2d5a0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 50 67  .        for(iPg
2d5b0 3d 69 50 72 65 76 4c 65 61 66 2b 31 3b 20 69 50  =iPrevLeaf+1; iP
2d5c0 67 3c 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  g<fts5DlidxIterP
2d5d0 67 6e 6f 28 70 44 6c 69 64 78 29 3b 20 69 50 67  gno(pDlidx); iPg
2d5e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
2d5f0 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  Key = FTS5_SEGME
2d600 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c  NT_ROWID(iSegid,
2d610 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20   iPg);.         
2d620 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
2d630 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a  aRead(p, iKey);.
2d640 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c            if( pL
2d650 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
2d660 20 20 20 69 66 28 20 66 74 73 35 4c 65 61 66 46     if( fts5LeafF
2d670 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65  irstRowidOff(pLe
2d680 61 66 29 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d  af)!=0 ) p->rc =
2d690 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2d6a0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44             fts5D
2d6b0 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
2d6c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2d6d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d6e0 20 69 50 72 65 76 4c 65 61 66 20 3d 20 66 74 73   iPrevLeaf = fts
2d6f0 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
2d700 44 6c 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20  Dlidx);..       
2d710 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
2d720 68 65 20 6c 65 61 66 20 70 61 67 65 20 69 6e 64  he leaf page ind
2d730 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74  icated by the it
2d740 65 72 61 74 6f 72 20 72 65 61 6c 6c 79 20 64 6f  erator really do
2d750 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  es.        ** co
2d760 6e 74 61 69 6e 20 74 68 65 20 72 6f 77 69 64 20  ntain the rowid 
2d770 73 75 67 67 65 73 74 65 64 20 62 79 20 74 68 65  suggested by the
2d780 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20   same. */.      
2d790 20 20 69 4b 65 79 20 3d 20 46 54 53 35 5f 53 45    iKey = FTS5_SE
2d7a0 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67  GMENT_ROWID(iSeg
2d7b0 69 64 2c 20 69 50 72 65 76 4c 65 61 66 29 3b 0a  id, iPrevLeaf);.
2d7c0 20 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20          pLeaf = 
2d7d0 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
2d7e0 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69  iKey);.        i
2d7f0 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  f( pLeaf ){.    
2d800 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
2d810 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
2d820 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35  iRowidOff = fts5
2d830 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
2d840 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  f(pLeaf);.      
2d850 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41      ASSERT_SZLEA
2d860 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20  F_OK(pLeaf);.   
2d870 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69         if( iRowi
2d880 64 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c  dOff>=pLeaf->szL
2d890 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
2d8a0 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
2d8b0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
2d8c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d8d0 20 20 20 20 20 20 66 74 73 35 47 65 74 56 61 72        fts5GetVar
2d8e0 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52  int(&pLeaf->p[iR
2d8f0 6f 77 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29  owidOff], (u64*)
2d900 26 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  &iRowid);.      
2d910 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64        if( iRowid
2d920 21 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 52  !=fts5DlidxIterR
2d930 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29 20 70  owid(pDlidx) ) p
2d940 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2d950 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  UPT;.          }
2d960 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44  .          fts5D
2d970 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
2d980 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2d990 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 44 6c 69     }..      iDli
2d9a0 64 78 50 72 65 76 4c 65 61 66 20 3d 20 69 50 67  dxPrevLeaf = iPg
2d9b0 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  ;.      fts5Dlid
2d9c0 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78  xIterFree(pDlidx
2d9d0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 54 65 73  );.      fts5Tes
2d9e0 74 44 6c 69 64 78 52 65 76 65 72 73 65 28 70 2c  tDlidxReverse(p,
2d9f0 20 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61   iSegid, iIdxLea
2da00 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f);.    }else{. 
2da10 20 20 20 20 20 69 44 6c 69 64 78 50 72 65 76 4c       iDlidxPrevL
2da20 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  eaf = pSeg->pgno
2da30 4c 61 73 74 3b 0a 20 20 20 20 20 20 2f 2a 20 54  Last;.      /* T
2da40 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 72 65  ODO: Check there
2da50 20 69 73 20 6e 6f 20 64 6f 63 6c 69 73 74 20 69   is no doclist i
2da60 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20  ndex */.    }.. 
2da70 20 20 20 69 49 64 78 50 72 65 76 4c 65 61 66 20     iIdxPrevLeaf 
2da80 3d 20 69 49 64 78 4c 65 61 66 3b 0a 20 20 7d 0a  = iIdxLeaf;.  }.
2da90 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  .  rc2 = sqlite3
2daa0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
2dab0 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
2dac0 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63  QLITE_OK ) p->rc
2dad0 20 3d 20 72 63 32 3b 0a 0a 20 20 2f 2a 20 50 61   = rc2;..  /* Pa
2dae0 67 65 20 69 74 65 72 2e 69 4c 65 61 66 20 6d 75  ge iter.iLeaf mu
2daf0 73 74 20 6e 6f 77 20 62 65 20 74 68 65 20 72 69  st now be the ri
2db00 67 68 74 6d 6f 73 74 20 6c 65 61 66 2d 70 61 67  ghtmost leaf-pag
2db10 65 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74  e in the segment
2db20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 69 66 28 20   */.#if 0.  if( 
2db30 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
2db40 20 26 26 20 69 74 65 72 2e 69 4c 65 61 66 21 3d   && iter.iLeaf!=
2db50 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29  pSeg->pgnoLast )
2db60 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54  {.    p->rc = FT
2db70 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a  S5_CORRUPT;.  }.
2db80 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
2db90 20 52 75 6e 20 69 6e 74 65 72 6e 61 6c 20 63 68   Run internal ch
2dba0 65 63 6b 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ecks to ensure t
2dbb0 68 61 74 20 74 68 65 20 46 54 53 20 69 6e 64 65  hat the FTS inde
2dbc0 78 20 28 61 29 20 69 73 20 69 6e 74 65 72 6e 61  x (a) is interna
2dbd0 6c 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65  lly .** consiste
2dbe0 6e 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61  nt and (b) conta
2dbf0 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ins entries for 
2dc00 77 68 69 63 68 20 74 68 65 20 58 4f 52 20 6f 66  which the XOR of
2dc10 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a   the checksums.*
2dc20 2a 20 61 73 20 63 61 6c 63 75 6c 61 74 65 64 20  * as calculated 
2dc30 62 79 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  by sqlite3Fts5In
2dc40 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 29 20  dexEntryCksum() 
2dc50 69 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20  is cksum..**.** 
2dc60 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
2dc70 52 52 55 50 54 20 69 66 20 61 6e 79 20 6f 66 20  RRUPT if any of 
2dc80 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 68 65  the internal che
2dc90 63 6b 73 20 66 61 69 6c 2c 20 6f 72 20 69 66 20  cks fail, or if 
2dca0 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20  the.** checksum 
2dcb0 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20  does not match. 
2dcc0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2dcd0 20 69 66 20 61 6c 6c 20 63 68 65 63 6b 73 20 70   if all checks p
2dce0 61 73 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 65  ass without.** e
2dcf0 72 72 6f 72 2c 20 6f 72 20 73 6f 6d 65 20 6f 74  rror, or some ot
2dd00 68 65 72 20 53 51 4c 69 74 65 20 65 72 72 6f 72  her SQLite error
2dd10 20 63 6f 64 65 20 69 66 20 61 6e 6f 74 68 65 72   code if another
2dd20 20 65 72 72 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d   error (e.g. OOM
2dd30 29 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  ).** occurs..*/.
2dd40 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
2dd50 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
2dd60 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ck(Fts5Index *p,
2dd70 20 75 36 34 20 63 6b 73 75 6d 29 7b 0a 20 20 69   u64 cksum){.  i
2dd80 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e  nt eDetail = p->
2dd90 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
2dda0 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d  ;.  u64 cksum2 =
2ddb0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2ddc0 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
2ddd0 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74  based on content
2dde0 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a  s of indexes */.
2ddf0 20 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73    Fts5Buffer pos
2de00 6c 69 73 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20  list = {0,0,0}; 
2de10 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64    /* Buffer used
2de20 20 74 6f 20 68 6f 6c 64 20 61 20 70 6f 73 6c 69   to hold a posli
2de30 73 74 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72  st */.  Fts5Iter
2de40 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20   *pIter;        
2de50 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2de60 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
2de70 67 68 20 65 6e 74 69 72 65 20 69 6e 64 65 78 20  gh entire index 
2de80 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
2de90 72 65 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20  re *pStruct;    
2dea0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74       /* Index st
2deb0 72 75 63 74 75 72 65 20 2a 2f 0a 0a 23 69 66 64  ructure */..#ifd
2dec0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2ded0 20 20 2f 2a 20 55 73 65 64 20 62 79 20 65 78 74    /* Used by ext
2dee0 72 61 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74  ra internal test
2def0 73 20 6f 6e 6c 79 20 72 75 6e 20 69 66 20 4e 44  s only run if ND
2df00 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
2df10 6e 65 64 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73  ned */.  u64 cks
2df20 75 6d 33 20 3d 20 30 3b 20 20 20 20 20 20 20 20  um3 = 0;        
2df30 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
2df40 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f  ksum based on co
2df50 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65  ntents of indexe
2df60 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  s */.  Fts5Buffe
2df70 72 20 74 65 72 6d 20 3d 20 7b 30 2c 30 2c 30 7d  r term = {0,0,0}
2df80 3b 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  ;      /* Buffer
2df90 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 6d 6f   used to hold mo
2dfa0 73 74 20 72 65 63 65 6e 74 20 74 65 72 6d 20 2a  st recent term *
2dfb0 2f 0a 23 65 6e 64 69 66 0a 20 20 63 6f 6e 73 74  /.#endif.  const
2dfc0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53   int flags = FTS
2dfd0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f  5INDEX_QUERY_NOO
2dfe0 55 54 50 55 54 3b 0a 20 20 0a 20 20 2f 2a 20 4c  UTPUT;.  .  /* L
2dff0 6f 61 64 20 74 68 65 20 46 54 53 20 69 6e 64 65  oad the FTS inde
2e000 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  x structure */. 
2e010 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53   pStruct = fts5S
2e020 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
2e030 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
2e040 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  t the internal n
2e050 6f 64 65 73 20 6f 66 20 65 61 63 68 20 73 65 67  odes of each seg
2e060 6d 65 6e 74 20 6d 61 74 63 68 20 74 68 65 20 6c  ment match the l
2e070 65 61 76 65 73 20 2a 2f 0a 20 20 69 66 28 20 70  eaves */.  if( p
2e080 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e  Struct ){.    in
2e090 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20  t iLvl, iSeg;.  
2e0a0 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
2e0b0 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
2e0c0 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
2e0d0 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
2e0e0 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65  Seg<pStruct->aLe
2e0f0 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20  vel[iLvl].nSeg; 
2e100 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
2e110 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
2e120 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70  gment *pSeg = &p
2e130 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
2e140 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b  Lvl].aSeg[iSeg];
2e150 0a 20 20 20 20 20 20 20 20 66 74 73 35 49 6e 64  .        fts5Ind
2e160 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  exIntegrityCheck
2e170 53 65 67 6d 65 6e 74 28 70 2c 20 70 53 65 67 29  Segment(p, pSeg)
2e180 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e190 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6b    }..  /* The ck
2e1a0 73 75 6d 20 61 72 67 75 6d 65 6e 74 20 70 61 73  sum argument pas
2e1b0 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
2e1c0 74 69 6f 6e 20 69 73 20 61 20 63 68 65 63 6b 73  tion is a checks
2e1d0 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 0a 20 20  um calculated.  
2e1e0 2a 2a 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20  ** based on all 
2e1f0 65 78 70 65 63 74 65 64 20 65 6e 74 72 69 65 73  expected entries
2e200 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65   in the FTS inde
2e210 78 20 28 69 6e 63 6c 75 64 69 6e 67 20 70 72 65  x (including pre
2e220 66 69 78 20 69 6e 64 65 78 0a 20 20 2a 2a 20 65  fix index.  ** e
2e230 6e 74 72 69 65 73 29 2e 20 54 68 69 73 20 62 6c  ntries). This bl
2e240 6f 63 6b 20 63 68 65 63 6b 73 20 74 68 61 74 20  ock checks that 
2e250 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75  a checksum calcu
2e260 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74  lated based on t
2e270 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 63  he.  ** actual c
2e280 6f 6e 74 65 6e 74 73 20 6f 66 20 46 54 53 20 69  ontents of FTS i
2e290 6e 64 65 78 20 69 73 20 69 64 65 6e 74 69 63 61  ndex is identica
2e2a0 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 77 6f  l..  **.  ** Two
2e2b0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
2e2c0 20 73 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 61   same checksum a
2e2d0 72 65 20 63 61 6c 63 75 6c 61 74 65 64 2e 20 54  re calculated. T
2e2e0 68 65 20 66 69 72 73 74 20 28 73 74 61 63 6b 0a  he first (stack.
2e2f0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 63 6b    ** variable ck
2e300 73 75 6d 32 29 20 62 61 73 65 64 20 6f 6e 20 65  sum2) based on e
2e310 6e 74 72 69 65 73 20 65 78 74 72 61 63 74 65 64  ntries extracted
2e320 20 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d 74   from the full-t
2e330 65 78 74 20 69 6e 64 65 78 0a 20 20 2a 2a 20 77  ext index.  ** w
2e340 68 69 6c 65 20 64 6f 69 6e 67 20 61 20 6c 69 6e  hile doing a lin
2e350 65 61 72 20 73 63 61 6e 20 6f 66 20 65 61 63 68  ear scan of each
2e360 20 69 6e 64 69 76 69 64 75 61 6c 20 69 6e 64 65   individual inde
2e370 78 20 69 6e 20 74 75 72 6e 2e 20 0a 20 20 2a 2a  x in turn. .  **
2e380 0a 20 20 2a 2a 20 41 73 20 65 61 63 68 20 74 65  .  ** As each te
2e390 72 6d 20 76 69 73 69 74 65 64 20 62 79 20 74 68  rm visited by th
2e3a0 65 20 6c 69 6e 65 61 72 20 73 63 61 6e 73 2c 20  e linear scans, 
2e3b0 61 20 73 65 70 61 72 61 74 65 20 71 75 65 72 79  a separate query
2e3c0 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 61   for the.  ** sa
2e3d0 6d 65 20 74 65 72 6d 20 69 73 20 70 65 72 66 6f  me term is perfo
2e3e0 72 6d 65 64 2e 20 63 6b 73 75 6d 33 20 69 73 20  rmed. cksum3 is 
2e3f0 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64  calculated based
2e400 20 6f 6e 20 74 68 65 20 65 6e 74 72 69 65 73 0a   on the entries.
2e410 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 62    ** extracted b
2e420 79 20 74 68 65 73 65 20 71 75 65 72 69 65 73 2e  y these queries.
2e430 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74 73 35  .  */.  for(fts5
2e440 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20  MultiIterNew(p, 
2e450 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73 2c 20  pStruct, flags, 
2e460 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20  0, 0, 0, -1, 0, 
2e470 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66  &pIter);.      f
2e480 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
2e490 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20  p, pIter)==0;.  
2e4a0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
2e4b0 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20  rNext(p, pIter, 
2e4c0 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 69  0, 0).  ){.    i
2e4d0 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
2e4e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2e4f0 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79  ze of term in by
2e500 74 65 73 20 2a 2f 0a 20 20 20 20 69 36 34 20 69  tes */.    i64 i
2e510 50 6f 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Pos = 0;        
2e520 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69         /* Positi
2e530 6f 6e 20 72 65 61 64 20 66 72 6f 6d 20 70 6f 73  on read from pos
2e540 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  list */.    int 
2e550 69 4f 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20  iOff = 0;       
2e560 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
2e570 74 20 77 69 74 68 69 6e 20 70 6f 73 6c 69 73 74  t within poslist
2e580 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77   */.    i64 iRow
2e590 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  id = fts5MultiIt
2e5a0 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a  erRowid(pIter);.
2e5b0 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63      char *z = (c
2e5c0 68 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74  har*)fts5MultiIt
2e5d0 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e  erTerm(pIter, &n
2e5e0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2e5f0 69 73 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d  is is a new term
2e600 2c 20 71 75 65 72 79 20 66 6f 72 20 69 74 2e 20  , query for it. 
2e610 55 70 64 61 74 65 20 63 6b 73 75 6d 33 20 77 69  Update cksum3 wi
2e620 74 68 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  th the results. 
2e630 2a 2f 0a 20 20 20 20 66 74 73 35 54 65 73 74 54  */.    fts5TestT
2e640 65 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20 7a 2c  erm(p, &term, z,
2e650 20 6e 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73   n, cksum2, &cks
2e660 75 6d 33 29 3b 0a 0a 20 20 20 20 69 66 28 20 65  um3);..    if( e
2e670 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
2e680 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AIL_NONE ){.    
2e690 20 20 69 66 28 20 30 3d 3d 66 74 73 35 4d 75 6c    if( 0==fts5Mul
2e6a0 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c  tiIterIsEmpty(p,
2e6b0 20 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20 20   pIter) ){.     
2e6c0 20 20 20 63 6b 73 75 6d 32 20 5e 3d 20 73 71 6c     cksum2 ^= sql
2e6d0 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74  ite3Fts5IndexEnt
2e6e0 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20  ryCksum(iRowid, 
2e6f0 30 2c 20 30 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b  0, 0, -1, z, n);
2e700 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2e710 73 65 7b 0a 20 20 20 20 20 20 70 6f 73 6c 69 73  se{.      poslis
2e720 74 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  t.n = 0;.      f
2e730 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
2e740 74 28 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65  t(p, &pIter->aSe
2e750 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  g[pIter->aFirst[
2e760 31 5d 2e 69 46 69 72 73 74 5d 2c 20 30 2c 20 26  1].iFirst], 0, &
2e770 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  poslist);.      
2e780 77 68 69 6c 65 28 20 30 3d 3d 73 71 6c 69 74 65  while( 0==sqlite
2e790 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74  3Fts5PoslistNext
2e7a0 36 34 28 70 6f 73 6c 69 73 74 2e 70 2c 20 70 6f  64(poslist.p, po
2e7b0 73 6c 69 73 74 2e 6e 2c 20 26 69 4f 66 66 2c 20  slist.n, &iOff, 
2e7c0 26 69 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20  &iPos) ){.      
2e7d0 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53    int iCol = FTS
2e7e0 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f  5_POS2COLUMN(iPo
2e7f0 73 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  s);.        int 
2e800 69 54 6f 6b 4f 66 66 20 3d 20 46 54 53 35 5f 50  iTokOff = FTS5_P
2e810 4f 53 32 4f 46 46 53 45 54 28 69 50 6f 73 29 3b  OS2OFFSET(iPos);
2e820 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20  .        cksum2 
2e830 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  ^= sqlite3Fts5In
2e840 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52  dexEntryCksum(iR
2e850 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 54 6f 6b  owid, iCol, iTok
2e860 4f 66 66 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a  Off, -1, z, n);.
2e870 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2e880 7d 0a 20 20 66 74 73 35 54 65 73 74 54 65 72 6d  }.  fts5TestTerm
2e890 28 70 2c 20 26 74 65 72 6d 2c 20 30 2c 20 30 2c  (p, &term, 0, 0,
2e8a0 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33   cksum2, &cksum3
2e8b0 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49  );..  fts5MultiI
2e8c0 74 65 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a  terFree(pIter);.
2e8d0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
2e8e0 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21  ITE_OK && cksum!
2e8f0 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20  =cksum2 ) p->rc 
2e900 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2e910 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
2e920 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
2e930 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2e940 44 45 42 55 47 0a 20 20 66 74 73 35 42 75 66 66  DEBUG.  fts5Buff
2e950 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 23  erFree(&term);.#
2e960 65 6e 64 69 66 0a 20 20 66 74 73 35 42 75 66 66  endif.  fts5Buff
2e970 65 72 46 72 65 65 28 26 70 6f 73 6c 69 73 74 29  erFree(&poslist)
2e980 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
2e990 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
2e9a0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
2e9b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e9c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e9d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e9e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
2e9f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ea00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ea10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ea20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ea30 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77  *******.** Below
2ea40 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74   this point is t
2ea50 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
2ea60 6e 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65  n of the fts5_de
2ea70 63 6f 64 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a  code() scalar.**
2ea80 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a   function only..
2ea90 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  */../*.** Decode
2eaa0 20 61 20 73 65 67 6d 65 6e 74 2d 64 61 74 61 20   a segment-data 
2eab0 72 6f 77 69 64 20 66 72 6f 6d 20 74 68 65 20 25  rowid from the %
2eac0 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54 68 69  _data table. Thi
2ead0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
2eae0 20 74 68 65 20 6f 70 70 6f 73 69 74 65 20 6f 66   the opposite of
2eaf0 20 6d 61 63 72 6f 20 46 54 53 35 5f 53 45 47 4d   macro FTS5_SEGM
2eb00 45 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a  ENT_ROWID()..*/.
2eb10 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2eb20 44 65 63 6f 64 65 52 6f 77 69 64 28 0a 20 20 69  DecodeRowid(.  i
2eb30 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20  64 iRowid,      
2eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2eb50 2a 20 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64  * Rowid from %_d
2eb60 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ata table */.  i
2eb70 6e 74 20 2a 70 69 53 65 67 69 64 2c 20 20 20 20  nt *piSegid,    
2eb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2eb90 2a 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74 20 69  * OUT: Segment i
2eba0 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6c  d */.  int *pbDl
2ebb0 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  idx,            
2ebc0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44         /* OUT: D
2ebd0 6c 69 64 78 20 66 6c 61 67 20 2a 2f 0a 20 20 69  lidx flag */.  i
2ebe0 6e 74 20 2a 70 69 48 65 69 67 68 74 2c 20 20 20  nt *piHeight,   
2ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ec00 2a 20 4f 55 54 3a 20 48 65 69 67 68 74 20 2a 2f  * OUT: Height */
2ec10 0a 20 20 69 6e 74 20 2a 70 69 50 67 6e 6f 20 20  .  int *piPgno  
2ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec30 20 20 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20     /* OUT: Page 
2ec40 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a  number */.){.  *
2ec50 70 69 50 67 6e 6f 20 3d 20 28 69 6e 74 29 28 69  piPgno = (int)(i
2ec60 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31  Rowid & (((i64)1
2ec70 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 50 41   << FTS5_DATA_PA
2ec80 47 45 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69  GE_B) - 1));.  i
2ec90 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44  Rowid >>= FTS5_D
2eca0 41 54 41 5f 50 41 47 45 5f 42 3b 0a 0a 20 20 2a  ATA_PAGE_B;..  *
2ecb0 70 69 48 65 69 67 68 74 20 3d 20 28 69 6e 74 29  piHeight = (int)
2ecc0 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34  (iRowid & (((i64
2ecd0 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f  )1 << FTS5_DATA_
2ece0 48 45 49 47 48 54 5f 42 29 20 2d 20 31 29 29 3b  HEIGHT_B) - 1));
2ecf0 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54  .  iRowid >>= FT
2ed00 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42  S5_DATA_HEIGHT_B
2ed10 3b 0a 0a 20 20 2a 70 62 44 6c 69 64 78 20 3d 20  ;..  *pbDlidx = 
2ed20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 30  (int)(iRowid & 0
2ed30 78 30 30 30 31 29 3b 0a 20 20 69 52 6f 77 69 64  x0001);.  iRowid
2ed40 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 44   >>= FTS5_DATA_D
2ed50 4c 49 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67 69  LI_B;..  *piSegi
2ed60 64 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64  d = (int)(iRowid
2ed70 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46   & (((i64)1 << F
2ed80 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d  TS5_DATA_ID_B) -
2ed90 20 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   1));.}..static 
2eda0 76 6f 69 64 20 66 74 73 35 44 65 62 75 67 52 6f  void fts5DebugRo
2edb0 77 69 64 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  wid(int *pRc, Ft
2edc0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
2edd0 69 36 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74  i64 iKey){.  int
2ede0 20 69 53 65 67 69 64 2c 20 69 48 65 69 67 68 74   iSegid, iHeight
2edf0 2c 20 69 50 67 6e 6f 2c 20 62 44 6c 69 64 78 3b  , iPgno, bDlidx;
2ee00 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
2ee10 63 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a 20 20  compenents */.  
2ee20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28  fts5DecodeRowid(
2ee30 69 4b 65 79 2c 20 26 69 53 65 67 69 64 2c 20 26  iKey, &iSegid, &
2ee40 62 44 6c 69 64 78 2c 20 26 69 48 65 69 67 68 74  bDlidx, &iHeight
2ee50 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69 66  , &iPgno);..  if
2ee60 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20  ( iSegid==0 ){. 
2ee70 20 20 20 69 66 28 20 69 4b 65 79 3d 3d 46 54 53     if( iKey==FTS
2ee80 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
2ee90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2eea0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2eeb0 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2eec0 66 2c 20 22 7b 61 76 65 72 61 67 65 73 7d 20 22  f, "{averages} "
2eed0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2eee0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2eef0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2ef00 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 73  f(pRc, pBuf, "{s
2ef10 74 72 75 63 74 75 72 65 7d 22 29 3b 0a 20 20 20  tructure}");.   
2ef20 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 7b 0a 20   }.  }.  else{. 
2ef30 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2ef40 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2ef50 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 25 73  (pRc, pBuf, "{%s
2ef60 73 65 67 69 64 3d 25 64 20 68 3d 25 64 20 70 67  segid=%d h=%d pg
2ef70 6e 6f 3d 25 64 7d 22 2c 0a 20 20 20 20 20 20 20  no=%d}",.       
2ef80 20 62 44 6c 69 64 78 20 3f 20 22 64 6c 69 64 78   bDlidx ? "dlidx
2ef90 20 22 20 3a 20 22 22 2c 20 69 53 65 67 69 64 2c   " : "", iSegid,
2efa0 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a   iHeight, iPgno.
2efb0 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74      );.  }.}..st
2efc0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
2efd0 62 75 67 53 74 72 75 63 74 75 72 65 28 0a 20 20  bugStructure(.  
2efe0 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20  int *pRc,       
2eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f000 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72  /* IN/OUT: error
2f010 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42   code */.  Fts5B
2f020 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 46  uffer *pBuf,.  F
2f030 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 0a  ts5Structure *p.
2f040 29 7b 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69  ){.  int iLvl, i
2f050 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seg;            
2f060 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20       /* Iterate 
2f070 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 2c 20  through levels, 
2f080 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 66  segments */..  f
2f090 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
2f0a0 70 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  p->nLevel; iLvl+
2f0b0 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75  +){.    Fts5Stru
2f0c0 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
2f0d0 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c   = &p->aLevel[iL
2f0e0 76 6c 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  vl];.    sqlite3
2f0f0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2f100 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2f110 2c 20 0a 20 20 20 20 20 20 20 20 22 20 7b 6c 76  , .        " {lv
2f120 6c 3d 25 64 20 6e 4d 65 72 67 65 3d 25 64 20 6e  l=%d nMerge=%d n
2f130 53 65 67 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70  Seg=%d", iLvl, p
2f140 4c 76 6c 2d 3e 6e 4d 65 72 67 65 2c 20 70 4c 76  Lvl->nMerge, pLv
2f150 6c 2d 3e 6e 53 65 67 0a 20 20 20 20 29 3b 0a 20  l->nSeg.    );. 
2f160 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
2f170 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20  Seg<pLvl->nSeg; 
2f180 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46  iSeg++){.      F
2f190 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
2f1a0 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76  ent *pSeg = &pLv
2f1b0 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20  l->aSeg[iSeg];. 
2f1c0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
2f1d0 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2f1e0 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20  tf(pRc, pBuf, " 
2f1f0 7b 69 64 3d 25 64 20 6c 65 61 76 65 73 3d 25 64  {id=%d leaves=%d
2f200 2e 2e 25 64 7d 22 2c 20 0a 20 20 20 20 20 20 20  ..%d}", .       
2f210 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c     pSeg->iSegid,
2f220 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
2f230 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  , pSeg->pgnoLast
2f240 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
2f250 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2f260 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2f270 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7d 22  f(pRc, pBuf, "}"
2f280 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2f290 54 68 69 73 20 69 73 20 70 61 72 74 20 6f 66 20  This is part of 
2f2a0 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28  the fts5_decode(
2f2b0 29 20 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e  ) debugging aid.
2f2c0 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73  .**.** Arguments
2f2d0 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e   pBlob/nBlob con
2f2e0 74 61 69 6e 20 61 20 73 65 72 69 61 6c 69 7a 65  tain a serialize
2f2f0 64 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  d Fts5Structure 
2f300 6f 62 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20  object. This.** 
2f310 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
2f320 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
2f330 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
2f340 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6f 62 6a   of the same obj
2f350 65 63 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75  ect.** to the bu
2f360 66 66 65 72 20 70 61 73 73 65 64 20 61 73 20 74  ffer passed as t
2f370 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2f380 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nt. .*/.static v
2f390 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 53 74  oid fts5DecodeSt
2f3a0 72 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a  ructure(.  int *
2f3b0 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  pRc,            
2f3c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
2f3d0 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65  /OUT: error code
2f3e0 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
2f3f0 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20   *pBuf,.  const 
2f400 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e  u8 *pBlob, int n
2f410 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Blob.){.  int rc
2f420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2f440 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  urn code */.  Ft
2f450 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 20 3d  s5Structure *p =
2f460 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2f470 20 44 65 63 6f 64 65 64 20 73 74 72 75 63 74 75   Decoded structu
2f480 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20  re object */..  
2f490 72 63 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  rc = fts5Structu
2f4a0 72 65 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20  reDecode(pBlob, 
2f4b0 6e 42 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20  nBlob, 0, &p);. 
2f4c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f4d0 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d  OK ){.    *pRc =
2f4e0 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
2f4f0 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 65 62 75  .  }..  fts5Debu
2f500 67 53 74 72 75 63 74 75 72 65 28 70 52 63 2c 20  gStructure(pRc, 
2f510 70 42 75 66 2c 20 70 29 3b 0a 20 20 66 74 73 35  pBuf, p);.  fts5
2f520 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
2f530 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  (p);.}../*.** Th
2f540 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  is is part of th
2f550 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20  e fts5_decode() 
2f560 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a  debugging aid..*
2f570 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70  *.** Arguments p
2f580 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61  Blob/nBlob conta
2f590 69 6e 20 61 6e 20 22 61 76 65 72 61 67 65 73 22  in an "averages"
2f5a0 20 72 65 63 6f 72 64 2e 20 54 68 69 73 20 66 75   record. This fu
2f5b0 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 70 70 65 6e  nction .** appen
2f5c0 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61  ds a human-reada
2f5d0 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
2f5e0 6f 6e 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20  on of record to 
2f5f0 74 68 65 20 62 75 66 66 65 72 20 70 61 73 73 65  the buffer passe
2f600 64 20 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63  d .** as the sec
2f610 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a  ond argument. .*
2f620 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
2f630 73 35 44 65 63 6f 64 65 41 76 65 72 61 67 65 73  s5DecodeAverages
2f640 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20  (.  int *pRc,   
2f650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f660 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65      /* IN/OUT: e
2f670 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46  rror code */.  F
2f680 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
2f690 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c  .  const u8 *pBl
2f6a0 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b  ob, int nBlob.){
2f6b0 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
2f6c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 61  const char *zSpa
2f6d0 63 65 20 3d 20 22 22 3b 0a 0a 20 20 77 68 69 6c  ce = "";..  whil
2f6e0 65 28 20 69 3c 6e 42 6c 6f 62 20 29 7b 0a 20 20  e( i<nBlob ){.  
2f6f0 20 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20 20    u64 iVal;.    
2f700 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  i += sqlite3Fts5
2f710 47 65 74 56 61 72 69 6e 74 28 26 70 42 6c 6f 62  GetVarint(&pBlob
2f720 5b 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20  [i], &iVal);.   
2f730 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2f740 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2f750 52 63 2c 20 70 42 75 66 2c 20 22 25 73 25 64 22  Rc, pBuf, "%s%d"
2f760 2c 20 7a 53 70 61 63 65 2c 20 28 69 6e 74 29 69  , zSpace, (int)i
2f770 56 61 6c 29 3b 0a 20 20 20 20 7a 53 70 61 63 65  Val);.    zSpace
2f780 20 3d 20 22 20 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = " ";.  }.}../
2f790 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28 61 2f 6e  *.** Buffer (a/n
2f7a0 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  ) is assumed to 
2f7b0 63 6f 6e 74 61 69 6e 20 61 20 6c 69 73 74 20 6f  contain a list o
2f7c0 66 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 72  f serialized var
2f7d0 69 6e 74 73 2e 20 52 65 61 64 0a 2a 2a 20 65 61  ints. Read.** ea
2f7e0 63 68 20 76 61 72 69 6e 74 20 61 6e 64 20 61 70  ch varint and ap
2f7f0 70 65 6e 64 20 69 74 73 20 73 74 72 69 6e 67 20  pend its string 
2f800 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 74  representation t
2f810 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 20 52  o buffer pBuf. R
2f820 65 74 75 72 6e 0a 2a 2a 20 61 66 74 65 72 20 65  eturn.** after e
2f830 69 74 68 65 72 20 74 68 65 20 69 6e 70 75 74 20  ither the input 
2f840 62 75 66 66 65 72 20 69 73 20 65 78 68 61 75 73  buffer is exhaus
2f850 74 65 64 20 6f 72 20 61 20 30 20 76 61 6c 75 65  ted or a 0 value
2f860 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   is read..**.** 
2f870 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
2f880 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2f890 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f  f bytes read fro
2f8a0 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66  m the input buff
2f8b0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2f8c0 74 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c  t fts5DecodePosl
2f8d0 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  ist(int *pRc, Ft
2f8e0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
2f8f0 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74  const u8 *a, int
2f900 20 6e 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20   n){.  int iOff 
2f910 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f  = 0;.  while( iO
2f920 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ff<n ){.    int 
2f930 69 56 61 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b  iVal;.    iOff +
2f940 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
2f950 32 28 26 61 5b 69 4f 66 66 5d 2c 20 69 56 61 6c  2(&a[iOff], iVal
2f960 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
2f970 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2f980 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2f990 22 20 25 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20  " %d", iVal);.  
2f9a0 7d 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b  }.  return iOff;
2f9b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74  .}../*.** The st
2f9c0 61 72 74 20 6f 66 20 62 75 66 66 65 72 20 28 61  art of buffer (a
2f9d0 2f 6e 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  /n) contains the
2f9e0 20 73 74 61 72 74 20 6f 66 20 61 20 64 6f 63 6c   start of a docl
2f9f0 69 73 74 2e 20 54 68 65 20 64 6f 63 6c 69 73 74  ist. The doclist
2fa00 0a 2a 2a 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  .** may or may n
2fa10 6f 74 20 66 69 6e 69 73 68 20 77 69 74 68 69 6e  ot finish within
2fa20 20 74 68 65 20 62 75 66 66 65 72 2e 20 54 68 69   the buffer. Thi
2fa30 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e  s function appen
2fa40 64 73 20 61 20 74 65 78 74 0a 2a 2a 20 72 65 70  ds a text.** rep
2fa50 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
2fa60 68 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  he part of the d
2fa70 6f 63 6c 69 73 74 20 74 68 61 74 20 69 73 20 70  oclist that is p
2fa80 72 65 73 65 6e 74 20 74 6f 20 62 75 66 66 65 72  resent to buffer
2fa90 0a 2a 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a  .** pBuf. .**.**
2faa0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
2fab0 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
2fac0 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72  of bytes read fr
2fad0 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66  om the input buf
2fae0 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  fer..*/.static i
2faf0 6e 74 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63  nt fts5DecodeDoc
2fb00 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46  list(int *pRc, F
2fb10 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
2fb20 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e   const u8 *a, in
2fb30 74 20 6e 29 7b 0a 20 20 69 36 34 20 69 44 6f 63  t n){.  i64 iDoc
2fb40 69 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  id = 0;.  int iO
2fb50 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e  ff = 0;..  if( n
2fb60 3e 30 20 29 7b 0a 20 20 20 20 69 4f 66 66 20 3d  >0 ){.    iOff =
2fb70 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
2fb80 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26  arint(a, (u64*)&
2fb90 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 73 71 6c  iDocid);.    sql
2fba0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2fbb0 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
2fbc0 70 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22  pBuf, " id=%lld"
2fbd0 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20  , iDocid);.  }. 
2fbe0 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29   while( iOff<n )
2fbf0 7b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a  {.    int nPos;.
2fc00 20 20 20 20 69 6e 74 20 62 44 65 6c 3b 0a 20 20      int bDel;.  
2fc10 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
2fc20 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b  tPoslistSize(&a[
2fc30 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62  iOff], &nPos, &b
2fc40 44 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Del);.    sqlite
2fc50 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2fc60 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2fc70 66 2c 20 22 20 6e 50 6f 73 3d 25 64 25 73 22 2c  f, " nPos=%d%s",
2fc80 20 6e 50 6f 73 2c 20 62 44 65 6c 3f 22 2a 22 3a   nPos, bDel?"*":
2fc90 22 22 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  "");.    iOff +=
2fca0 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69   fts5DecodePosli
2fcb0 73 74 28 70 52 63 2c 20 70 42 75 66 2c 20 26 61  st(pRc, pBuf, &a
2fcc0 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f  [iOff], MIN(n-iO
2fcd0 66 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20  ff, nPos));.    
2fce0 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20  if( iOff<n ){.  
2fcf0 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a      i64 iDelta;.
2fd00 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71        iOff += sq
2fd10 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
2fd20 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
2fd30 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
2fd40 20 20 20 69 44 6f 63 69 64 20 2b 3d 20 69 44 65     iDocid += iDe
2fd50 6c 74 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lta;.      sqlit
2fd60 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2fd70 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2fd80 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20  uf, " id=%lld", 
2fd90 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d 0a 20  iDocid);.    }. 
2fda0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 4f 66   }..  return iOf
2fdb0 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  f;.}../*.** This
2fdc0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 61 72   function is par
2fdd0 74 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65  t of the fts5_de
2fde0 63 6f 64 65 28 29 20 64 65 62 75 67 67 69 6e 67  code() debugging
2fdf0 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73   function. It is
2fe00 20 0a 2a 2a 20 6f 6e 6c 79 20 65 76 65 72 20 75   .** only ever u
2fe10 73 65 64 20 77 69 74 68 20 64 65 74 61 69 6c 3d  sed with detail=
2fe20 6e 6f 6e 65 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  none tables..**.
2fe30 2a 2a 20 42 75 66 66 65 72 20 28 70 44 61 74 61  ** Buffer (pData
2fe40 2f 6e 44 61 74 61 29 20 63 6f 6e 74 61 69 6e 73  /nData) contains
2fe50 20 61 20 64 6f 63 6c 69 73 74 20 69 6e 20 74 68   a doclist in th
2fe60 65 20 66 6f 72 6d 61 74 20 75 73 65 64 20 62 79  e format used by
2fe70 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 0a 2a 2a 20   detail=none.** 
2fe80 74 61 62 6c 65 73 2e 20 54 68 69 73 20 66 75 6e  tables. This fun
2fe90 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20  ction appends a 
2fea0 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 76  human-readable v
2feb0 65 72 73 69 6f 6e 20 6f 66 20 74 68 61 74 20 6c  ersion of that l
2fec0 69 73 74 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72  ist to.** buffer
2fed0 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   pBuf..**.** If 
2fee0 2a 70 52 63 20 69 73 20 6f 74 68 65 72 20 74 68  *pRc is other th
2fef0 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65  an SQLITE_OK whe
2ff00 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
2ff10 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
2ff20 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 49 66 20   a.** no-op. If 
2ff30 61 6e 20 4f 4f 4d 20 6f 72 20 6f 74 68 65 72 20  an OOM or other 
2ff40 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
2ff50 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
2ff60 6e 2c 20 2a 70 52 63 20 69 73 0a 2a 2a 20 73 65  n, *pRc is.** se
2ff70 74 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 65  t to an SQLite e
2ff80 72 72 6f 72 20 63 6f 64 65 20 62 65 66 6f 72 65  rror code before
2ff90 20 72 65 74 75 72 6e 69 6e 67 2e 20 54 68 65 20   returning. The 
2ffa0 66 69 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 62  final state of b
2ffb0 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 20 69 73  uffer.** pBuf is
2ffc0 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
2ffd0 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  is case..*/.stat
2ffe0 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f  ic void fts5Deco
2fff0 64 65 52 6f 77 69 64 4c 69 73 74 28 0a 20 20 69  deRowidList(.  i
30000 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20  nt *pRc,        
30010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30020 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20  * IN/OUT: Error 
30030 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  code */.  Fts5Bu
30040 66 66 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20  ffer *pBuf,     
30050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
30060 66 65 72 20 74 6f 20 61 70 70 65 6e 64 20 74 65  fer to append te
30070 78 74 20 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74  xt to */.  const
30080 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20   u8 *pData, int 
30090 6e 44 61 74 61 20 20 20 20 20 20 2f 2a 20 44 61  nData      /* Da
300a0 74 61 20 74 6f 20 64 65 63 6f 64 65 20 6c 69 73  ta to decode lis
300b0 74 2d 6f 66 2d 72 6f 77 69 64 73 20 66 72 6f 6d  t-of-rowids from
300c0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 20 3d   */.){.  int i =
300d0 20 30 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64   0;.  i64 iRowid
300e0 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
300f0 69 3c 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 63  i<nData ){.    c
30100 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 70 70 20  onst char *zApp 
30110 3d 20 22 22 3b 0a 20 20 20 20 75 36 34 20 69 56  = "";.    u64 iV
30120 61 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c  al;.    i += sql
30130 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
30140 74 28 26 70 44 61 74 61 5b 69 5d 2c 20 26 69 56  t(&pData[i], &iV
30150 61 6c 29 3b 0a 20 20 20 20 69 52 6f 77 69 64 20  al);.    iRowid 
30160 2b 3d 20 69 56 61 6c 3b 0a 0a 20 20 20 20 69 66  += iVal;..    if
30170 28 20 69 3c 6e 44 61 74 61 20 26 26 20 70 44 61  ( i<nData && pDa
30180 74 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b 0a 20  ta[i]==0x00 ){. 
30190 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
301a0 69 66 28 20 69 3c 6e 44 61 74 61 20 26 26 20 70  if( i<nData && p
301b0 44 61 74 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b  Data[i]==0x00 ){
301c0 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
301d0 20 20 20 20 20 20 7a 41 70 70 20 3d 20 22 2b 22        zApp = "+"
301e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
301f0 20 20 20 20 20 20 20 7a 41 70 70 20 3d 20 22 2a         zApp = "*
30200 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ";.      }.    }
30210 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ..    sqlite3Fts
30220 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
30230 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
30240 20 25 6c 6c 64 25 73 22 2c 20 69 52 6f 77 69 64   %lld%s", iRowid
30250 2c 20 7a 41 70 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  , zApp);.  }.}..
30260 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  /*.** The implem
30270 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72  entation of user
30280 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20  -defined scalar 
30290 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 64 65  function fts5_de
302a0 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  code()..*/.stati
302b0 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64  c void fts5Decod
302c0 65 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  eFunction(.  sql
302d0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
302e0 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tx,          /* 
302f0 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f  Function call co
30300 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ntext */.  int n
30310 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
30320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
30330 6d 62 65 72 20 6f 66 20 61 72 67 73 20 28 61 6c  mber of args (al
30340 77 61 79 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c  ways 2) */.  sql
30350 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56  ite3_value **apV
30360 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  al           /* 
30370 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  Function argumen
30380 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 69  ts */.){.  i64 i
30390 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  Rowid;          
303a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
303b0 77 69 64 20 66 6f 72 20 72 65 63 6f 72 64 20 62  wid for record b
303c0 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a  eing decoded */.
303d0 20 20 69 6e 74 20 69 53 65 67 69 64 2c 69 48 65    int iSegid,iHe
303e0 69 67 68 74 2c 69 50 67 6e 6f 2c 62 44 6c 69 64  ight,iPgno,bDlid
303f0 78 3b 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 6f  x;/* Rowid compo
30400 6e 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  nents */.  const
30410 20 75 38 20 2a 61 42 6c 6f 62 3b 20 69 6e 74 20   u8 *aBlob; int 
30420 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  n;         /* Re
30430 63 6f 72 64 20 74 6f 20 64 65 63 6f 64 65 20 2a  cord to decode *
30440 2f 0a 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20  /.  u8 *a = 0;. 
30450 20 46 74 73 35 42 75 66 66 65 72 20 73 3b 20 20   Fts5Buffer s;  
30460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30470 20 2f 2a 20 42 75 69 6c 64 20 75 70 20 74 65 78   /* Build up tex
30480 74 20 74 6f 20 72 65 74 75 72 6e 20 68 65 72 65  t to return here
30490 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
304a0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
304b0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
304c0 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
304d0 33 5f 69 6e 74 36 34 20 6e 53 70 61 63 65 20 3d  3_int64 nSpace =
304e0 20 30 3b 0a 20 20 69 6e 74 20 65 44 65 74 61 69   0;.  int eDetai
304f0 6c 4e 6f 6e 65 20 3d 20 28 73 71 6c 69 74 65 33  lNone = (sqlite3
30500 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29  _user_data(pCtx)
30510 21 3d 30 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  !=0);..  assert(
30520 20 6e 41 72 67 3d 3d 32 20 29 3b 0a 20 20 55 4e   nArg==2 );.  UN
30530 55 53 45 44 5f 50 41 52 41 4d 28 6e 41 72 67 29  USED_PARAM(nArg)
30540 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30  ;.  memset(&s, 0
30550 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
30560 66 65 72 29 29 3b 0a 20 20 69 52 6f 77 69 64 20  fer));.  iRowid 
30570 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
30580 69 6e 74 36 34 28 61 70 56 61 6c 5b 30 5d 29 3b  int64(apVal[0]);
30590 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f  ..  /* Make a co
305a0 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64  py of the second
305b0 20 61 72 67 75 6d 65 6e 74 20 28 61 20 62 6c 6f   argument (a blo
305c0 62 29 20 69 6e 20 61 42 6c 6f 62 5b 5d 2e 20 54  b) in aBlob[]. T
305d0 68 65 20 61 42 6c 6f 62 5b 5d 0a 20 20 2a 2a 20  he aBlob[].  ** 
305e0 63 6f 70 79 20 69 73 20 66 6f 6c 6c 6f 77 65 64  copy is followed
305f0 20 62 79 20 46 54 53 35 5f 44 41 54 41 5f 5a 45   by FTS5_DATA_ZE
30600 52 4f 5f 50 41 44 44 49 4e 47 20 30 78 30 30 20  RO_PADDING 0x00 
30610 62 79 74 65 73 2c 20 77 68 69 63 68 20 70 72 65  bytes, which pre
30620 76 65 6e 74 73 0a 20 20 2a 2a 20 62 75 66 66 65  vents.  ** buffe
30630 72 20 6f 76 65 72 72 65 61 64 73 20 65 76 65 6e  r overreads even
30640 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   if the record i
30650 73 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20  s corrupt.  */. 
30660 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
30670 75 65 5f 62 79 74 65 73 28 61 70 56 61 6c 5b 31  ue_bytes(apVal[1
30680 5d 29 3b 0a 20 20 61 42 6c 6f 62 20 3d 20 73 71  ]);.  aBlob = sq
30690 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
306a0 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 6e 53  (apVal[1]);.  nS
306b0 70 61 63 65 20 3d 20 6e 20 2b 20 46 54 53 35 5f  pace = n + FTS5_
306c0 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e  DATA_ZERO_PADDIN
306d0 47 3b 0a 20 20 61 20 3d 20 28 75 38 2a 29 73 71  G;.  a = (u8*)sq
306e0 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
306f0 65 72 6f 28 26 72 63 2c 20 6e 53 70 61 63 65 29  ero(&rc, nSpace)
30700 3b 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 20 67  ;.  if( a==0 ) g
30710 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a  oto decode_out;.
30720 20 20 69 66 28 20 6e 3e 30 20 29 20 6d 65 6d 63    if( n>0 ) memc
30730 70 79 28 61 2c 20 61 42 6c 6f 62 2c 20 6e 29 3b  py(a, aBlob, n);
30740 0a 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f  ..  fts5DecodeRo
30750 77 69 64 28 69 52 6f 77 69 64 2c 20 26 69 53 65  wid(iRowid, &iSe
30760 67 69 64 2c 20 26 62 44 6c 69 64 78 2c 20 26 69  gid, &bDlidx, &i
30770 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b  Height, &iPgno);
30780 0a 0a 20 20 66 74 73 35 44 65 62 75 67 52 6f 77  ..  fts5DebugRow
30790 69 64 28 26 72 63 2c 20 26 73 2c 20 69 52 6f 77  id(&rc, &s, iRow
307a0 69 64 29 3b 0a 20 20 69 66 28 20 62 44 6c 69 64  id);.  if( bDlid
307b0 78 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74  x ){.    Fts5Dat
307c0 61 20 64 6c 69 64 78 3b 0a 20 20 20 20 46 74 73  a dlidx;.    Fts
307d0 35 44 6c 69 64 78 4c 76 6c 20 6c 76 6c 3b 0a 0a  5DlidxLvl lvl;..
307e0 20 20 20 20 64 6c 69 64 78 2e 70 20 3d 20 61 3b      dlidx.p = a;
307f0 0a 20 20 20 20 64 6c 69 64 78 2e 6e 6e 20 3d 20  .    dlidx.nn = 
30800 6e 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  n;..    memset(&
30810 6c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  lvl, 0, sizeof(F
30820 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20  ts5DlidxLvl));. 
30830 20 20 20 6c 76 6c 2e 70 44 61 74 61 20 3d 20 26     lvl.pData = &
30840 64 6c 69 64 78 3b 0a 20 20 20 20 6c 76 6c 2e 69  dlidx;.    lvl.i
30850 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 6e 6f  LeafPgno = iPgno
30860 3b 0a 0a 20 20 20 20 66 6f 72 28 66 74 73 35 44  ;..    for(fts5D
30870 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c 76 6c  lidxLvlNext(&lvl
30880 29 3b 20 6c 76 6c 2e 62 45 6f 66 3d 3d 30 3b 20  ); lvl.bEof==0; 
30890 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74  fts5DlidxLvlNext
308a0 28 26 6c 76 6c 29 29 7b 0a 20 20 20 20 20 20 73  (&lvl)){.      s
308b0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
308c0 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63  AppendPrintf(&rc
308d0 2c 20 26 73 2c 20 0a 20 20 20 20 20 20 20 20 20  , &s, .         
308e0 20 22 20 25 64 28 25 6c 6c 64 29 22 2c 20 6c 76   " %d(%lld)", lv
308f0 6c 2e 69 4c 65 61 66 50 67 6e 6f 2c 20 6c 76 6c  l.iLeafPgno, lvl
30900 2e 69 52 6f 77 69 64 0a 20 20 20 20 20 20 29 3b  .iRowid.      );
30910 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
30920 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a  f( iSegid==0 ){.
30930 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 3d 3d      if( iRowid==
30940 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f  FTS5_AVERAGES_RO
30950 57 49 44 20 29 7b 0a 20 20 20 20 20 20 66 74 73  WID ){.      fts
30960 35 44 65 63 6f 64 65 41 76 65 72 61 67 65 73 28  5DecodeAverages(
30970 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a  &rc, &s, a, n);.
30980 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30990 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75 63   fts5DecodeStruc
309a0 74 75 72 65 28 26 72 63 2c 20 26 73 2c 20 61 2c  ture(&rc, &s, a,
309b0 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   n);.    }.  }el
309c0 73 65 20 69 66 28 20 65 44 65 74 61 69 6c 4e 6f  se if( eDetailNo
309d0 6e 65 20 29 7b 0a 20 20 20 20 46 74 73 35 42 75  ne ){.    Fts5Bu
309e0 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20  ffer term;      
309f0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
30a00 6e 74 20 74 65 72 6d 20 72 65 61 64 20 66 72 6f  nt term read fro
30a10 6d 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  m page */.    in
30a20 74 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 69 6e  t szLeaf;.    in
30a30 74 20 69 50 67 69 64 78 4f 66 66 20 3d 20 73 7a  t iPgidxOff = sz
30a40 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74 55 31  Leaf = fts5GetU1
30a50 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20 69 6e  6(&a[2]);.    in
30a60 74 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20  t iTermOff;.    
30a70 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20  int nKeep = 0;. 
30a80 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20     int iOff;..  
30a90 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20    memset(&term, 
30aa0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  0, sizeof(Fts5Bu
30ab0 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  ffer));..    /* 
30ac0 44 65 63 6f 64 65 20 61 6e 79 20 65 6e 74 72 69  Decode any entri
30ad0 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 62 65  es that occur be
30ae0 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 74  fore the first t
30af0 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  erm. */.    if( 
30b00 73 7a 4c 65 61 66 3c 6e 20 29 7b 0a 20 20 20 20  szLeaf<n ){.    
30b10 20 20 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66    iPgidxOff += f
30b20 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
30b30 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 69 54  a[iPgidxOff], iT
30b40 65 72 6d 4f 66 66 29 3b 0a 20 20 20 20 7d 65 6c  ermOff);.    }el
30b50 73 65 7b 0a 20 20 20 20 20 20 69 54 65 72 6d 4f  se{.      iTermO
30b60 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20  ff = szLeaf;.   
30b70 20 7d 0a 20 20 20 20 66 74 73 35 44 65 63 6f 64   }.    fts5Decod
30b80 65 52 6f 77 69 64 4c 69 73 74 28 26 72 63 2c 20  eRowidList(&rc, 
30b90 26 73 2c 20 26 61 5b 34 5d 2c 20 69 54 65 72 6d  &s, &a[4], iTerm
30ba0 4f 66 66 2d 34 29 3b 0a 0a 20 20 20 20 69 4f 66  Off-4);..    iOf
30bb0 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20  f = iTermOff;.  
30bc0 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 73 7a    while( iOff<sz
30bd0 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 6e  Leaf ){.      in
30be0 74 20 6e 41 70 70 65 6e 64 3b 0a 0a 20 20 20 20  t nAppend;..    
30bf0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 74 65    /* Read the te
30c00 72 6d 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  rm data for the 
30c10 6e 65 78 74 20 74 65 72 6d 2a 2f 0a 20 20 20 20  next term*/.    
30c20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
30c30 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
30c40 66 5d 2c 20 6e 41 70 70 65 6e 64 29 3b 0a 20 20  f], nAppend);.  
30c50 20 20 20 20 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65      term.n = nKe
30c60 65 70 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  ep;.      fts5Bu
30c70 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
30c80 72 63 2c 20 26 74 65 72 6d 2c 20 6e 41 70 70 65  rc, &term, nAppe
30c90 6e 64 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20  nd, &a[iOff]);. 
30ca0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
30cb0 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
30cc0 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 26 72  tf(.          &r
30cd0 63 2c 20 26 73 2c 20 22 20 74 65 72 6d 3d 25 2e  c, &s, " term=%.
30ce0 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c 20 28 63 6f  *s", term.n, (co
30cf0 6e 73 74 20 63 68 61 72 2a 29 74 65 72 6d 2e 70  nst char*)term.p
30d00 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
30d10 69 4f 66 66 20 2b 3d 20 6e 41 70 70 65 6e 64 3b  iOff += nAppend;
30d20 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72  ..      /* Figur
30d30 65 20 6f 75 74 20 77 68 65 72 65 20 74 68 65 20  e out where the 
30d40 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 69 73  doclist for this
30d50 20 74 65 72 6d 20 65 6e 64 73 20 2a 2f 0a 20 20   term ends */.  
30d60 20 20 20 20 69 66 28 20 69 50 67 69 64 78 4f 66      if( iPgidxOf
30d70 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69  f<n ){.        i
30d80 6e 74 20 6e 49 6e 63 72 3b 0a 20 20 20 20 20 20  nt nIncr;.      
30d90 20 20 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66    iPgidxOff += f
30da0 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
30db0 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 49  a[iPgidxOff], nI
30dc0 6e 63 72 29 3b 0a 20 20 20 20 20 20 20 20 69 54  ncr);.        iT
30dd0 65 72 6d 4f 66 66 20 2b 3d 20 6e 49 6e 63 72 3b  ermOff += nIncr;
30de0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
30df0 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20 3d        iTermOff =
30e00 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20 7d   szLeaf;.      }
30e10 0a 0a 20 20 20 20 20 20 66 74 73 35 44 65 63 6f  ..      fts5Deco
30e20 64 65 52 6f 77 69 64 4c 69 73 74 28 26 72 63 2c  deRowidList(&rc,
30e30 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 69   &s, &a[iOff], i
30e40 54 65 72 6d 4f 66 66 2d 69 4f 66 66 29 3b 0a 20  TermOff-iOff);. 
30e50 20 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72       iOff = iTer
30e60 6d 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20  mOff;.      if( 
30e70 69 4f 66 66 3c 73 7a 4c 65 61 66 20 29 7b 0a 20  iOff<szLeaf ){. 
30e80 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
30e90 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
30ea0 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b  a[iOff], nKeep);
30eb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
30ec0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
30ed0 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 7d 65 6c  ee(&term);.  }el
30ee0 73 65 7b 0a 20 20 20 20 46 74 73 35 42 75 66 66  se{.    Fts5Buff
30ef0 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20  er term;        
30f00 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
30f10 20 74 65 72 6d 20 72 65 61 64 20 66 72 6f 6d 20   term read from 
30f20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  page */.    int 
30f30 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  szLeaf;         
30f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
30f50 73 65 74 20 6f 66 20 70 67 69 64 78 20 69 6e 20  set of pgidx in 
30f60 61 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  a[] */.    int i
30f70 50 67 69 64 78 4f 66 66 3b 0a 20 20 20 20 69 6e  PgidxOff;.    in
30f80 74 20 69 50 67 69 64 78 50 72 65 76 20 3d 20 30  t iPgidxPrev = 0
30f90 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
30fa0 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20 72 65  revious value re
30fb0 61 64 20 66 72 6f 6d 20 70 67 69 64 78 20 2a 2f  ad from pgidx */
30fc0 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d 4f 66  .    int iTermOf
30fd0 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  f = 0;.    int i
30fe0 52 6f 77 69 64 4f 66 66 20 3d 20 30 3b 0a 20 20  RowidOff = 0;.  
30ff0 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
31000 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20  int nDoclist;.. 
31010 20 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c     memset(&term,
31020 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42   0, sizeof(Fts5B
31030 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 69 66  uffer));..    if
31040 28 20 6e 3c 34 20 29 7b 0a 20 20 20 20 20 20 73  ( n<4 ){.      s
31050 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
31060 53 65 74 28 26 72 63 2c 20 26 73 2c 20 37 2c 20  Set(&rc, &s, 7, 
31070 28 63 6f 6e 73 74 20 75 38 2a 29 22 63 6f 72 72  (const u8*)"corr
31080 75 70 74 22 29 3b 0a 20 20 20 20 20 20 67 6f 74  upt");.      got
31090 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20  o decode_out;.  
310a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
310b0 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 47  RowidOff = fts5G
310c0 65 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20  etU16(&a[0]);.  
310d0 20 20 20 20 69 50 67 69 64 78 4f 66 66 20 3d 20      iPgidxOff = 
310e0 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74  szLeaf = fts5Get
310f0 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20  U16(&a[2]);.    
31100 20 20 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c    if( iPgidxOff<
31110 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  n ){.        fts
31120 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
31130 69 50 67 69 64 78 4f 66 66 5d 2c 20 69 54 65 72  iPgidxOff], iTer
31140 6d 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d 65 6c  mOff);.      }el
31150 73 65 20 69 66 28 20 69 50 67 69 64 78 4f 66 66  se if( iPgidxOff
31160 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  >n ){.        rc
31170 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
31180 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
31190 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  code_out;.      
311a0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
311b0 44 65 63 6f 64 65 20 74 68 65 20 70 6f 73 69 74  Decode the posit
311c0 69 6f 6e 20 6c 69 73 74 20 74 61 69 6c 20 61 74  ion list tail at
311d0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
311e0 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 66  e page */.    if
311f0 28 20 69 52 6f 77 69 64 4f 66 66 21 3d 30 20 29  ( iRowidOff!=0 )
31200 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69  {.      iOff = i
31210 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 7d 65  RowidOff;.    }e
31220 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66  lse if( iTermOff
31230 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4f 66  !=0 ){.      iOf
31240 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20  f = iTermOff;.  
31250 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
31260 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20  Off = szLeaf;.  
31270 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4f 66 66    }.    if( iOff
31280 3e 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >n ){.      rc =
31290 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
312a0 20 20 20 20 20 67 6f 74 6f 20 64 65 63 6f 64 65       goto decode
312b0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
312c0 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73  fts5DecodePoslis
312d0 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 34 5d  t(&rc, &s, &a[4]
312e0 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a 20 20 20 20  , iOff-4);..    
312f0 2f 2a 20 44 65 63 6f 64 65 20 61 6e 79 20 6d 6f  /* Decode any mo
31300 72 65 20 64 6f 63 6c 69 73 74 20 64 61 74 61 20  re doclist data 
31310 74 68 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20  that appears on 
31320 74 68 65 20 70 61 67 65 20 62 65 66 6f 72 65 20  the page before 
31330 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74  the.    ** first
31340 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 6e 44   term. */.    nD
31350 6f 63 6c 69 73 74 20 3d 20 28 69 54 65 72 6d 4f  oclist = (iTermO
31360 66 66 20 3f 20 69 54 65 72 6d 4f 66 66 20 3a 20  ff ? iTermOff : 
31370 73 7a 4c 65 61 66 29 20 2d 20 69 4f 66 66 3b 0a  szLeaf) - iOff;.
31380 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 44 6f      fts5DecodeDo
31390 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26  clist(&rc, &s, &
313a0 61 5b 69 4f 66 66 5d 2c 20 6e 44 6f 63 6c 69 73  a[iOff], nDoclis
313b0 74 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  t);..    while( 
313c0 69 50 67 69 64 78 4f 66 66 3c 6e 20 26 26 20 72  iPgidxOff<n && r
313d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
313e0 20 20 20 20 20 20 69 6e 74 20 62 46 69 72 73 74        int bFirst
313f0 20 3d 20 28 69 50 67 69 64 78 4f 66 66 3d 3d 73   = (iPgidxOff==s
31400 7a 4c 65 61 66 29 3b 20 20 20 20 20 2f 2a 20 54  zLeaf);     /* T
31410 72 75 65 20 66 6f 72 20 66 69 72 73 74 20 74 65  rue for first te
31420 72 6d 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20  rm on page */.  
31430 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20      int nByte;  
31440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
31460 65 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  es of data */.  
31470 20 20 20 20 69 6e 74 20 69 45 6e 64 3b 0a 20 20      int iEnd;.  
31480 20 20 20 20 0a 20 20 20 20 20 20 69 50 67 69 64      .      iPgid
31490 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  xOff += fts5GetV
314a0 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64  arint32(&a[iPgid
314b0 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  xOff], nByte);. 
314c0 20 20 20 20 20 69 50 67 69 64 78 50 72 65 76 20       iPgidxPrev 
314d0 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  += nByte;.      
314e0 69 4f 66 66 20 3d 20 69 50 67 69 64 78 50 72 65  iOff = iPgidxPre
314f0 76 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 50  v;..      if( iP
31500 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  gidxOff<n ){.   
31510 20 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69       fts5GetVari
31520 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66  nt32(&a[iPgidxOf
31530 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  f], nByte);.    
31540 20 20 20 20 69 45 6e 64 20 3d 20 69 50 67 69 64      iEnd = iPgid
31550 78 50 72 65 76 20 2b 20 6e 42 79 74 65 3b 0a 20  xPrev + nByte;. 
31560 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
31570 20 20 20 20 69 45 6e 64 20 3d 20 73 7a 4c 65 61      iEnd = szLea
31580 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  f;.      }.     
31590 20 69 66 28 20 69 45 6e 64 3e 73 7a 4c 65 61 66   if( iEnd>szLeaf
315a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
315b0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
315c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
315d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
315e0 20 62 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20   bFirst==0 ){.  
315f0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
31600 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
31610 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a  [iOff], nByte);.
31620 20 20 20 20 20 20 20 20 69 66 28 20 6e 42 79 74          if( nByt
31630 65 3e 74 65 72 6d 2e 6e 20 29 7b 0a 20 20 20 20  e>term.n ){.    
31640 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f        rc = FTS5_
31650 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
31660 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
31670 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 72 6d    }.        term
31680 2e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  .n = nByte;.    
31690 20 20 7d 0a 20 20 20 20 20 20 69 4f 66 66 20 2b    }.      iOff +
316a0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
316b0 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74  2(&a[iOff], nByt
316c0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f  e);.      if( iO
316d0 66 66 2b 6e 42 79 74 65 3e 6e 20 29 7b 0a 20 20  ff+nByte>n ){.  
316e0 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f        rc = FTS5_
316f0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
31700 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
31710 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
31720 41 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20  AppendBlob(&rc, 
31730 26 74 65 72 6d 2c 20 6e 42 79 74 65 2c 20 26 61  &term, nByte, &a
31740 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 69  [iOff]);.      i
31750 4f 66 66 20 2b 3d 20 6e 42 79 74 65 3b 0a 0a 20  Off += nByte;.. 
31760 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
31770 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
31780 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 26 72  tf(.          &r
31790 63 2c 20 26 73 2c 20 22 20 74 65 72 6d 3d 25 2e  c, &s, " term=%.
317a0 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c 20 28 63 6f  *s", term.n, (co
317b0 6e 73 74 20 63 68 61 72 2a 29 74 65 72 6d 2e 70  nst char*)term.p
317c0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
317d0 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f  iOff += fts5Deco
317e0 64 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26  deDoclist(&rc, &
317f0 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 69 45 6e  s, &a[iOff], iEn
31800 64 2d 69 4f 66 66 29 3b 0a 20 20 20 20 7d 0a 0a  d-iOff);.    }..
31810 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
31820 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 7d 0a 20  ee(&term);.  }. 
31830 20 0a 20 64 65 63 6f 64 65 5f 6f 75 74 3a 0a 20   . decode_out:. 
31840 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29   sqlite3_free(a)
31850 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
31860 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
31870 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
31880 28 70 43 74 78 2c 20 28 63 6f 6e 73 74 20 63 68  (pCtx, (const ch
31890 61 72 2a 29 73 2e 70 2c 20 73 2e 6e 2c 20 53 51  ar*)s.p, s.n, SQ
318a0 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
318b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
318c0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
318d0 6f 72 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63  or_code(pCtx, rc
318e0 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66  );.  }.  fts5Buf
318f0 66 65 72 46 72 65 65 28 26 73 29 3b 0a 7d 0a 0a  ferFree(&s);.}..
31900 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  /*.** The implem
31910 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72  entation of user
31920 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20  -defined scalar 
31930 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 72 6f  function fts5_ro
31940 77 69 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  wid()..*/.static
31950 20 76 6f 69 64 20 66 74 73 35 52 6f 77 69 64 46   void fts5RowidF
31960 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
31970 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
31980 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75  ,          /* Fu
31990 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74  nction call cont
319a0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ext */.  int nAr
319b0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
319c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
319d0 65 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61  er of args (alwa
319e0 79 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74  ys 2) */.  sqlit
319f0 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
31a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
31a10 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
31a20 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
31a30 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20 69 66 28  har *zArg;.  if(
31a40 20 6e 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20   nArg==0 ){.    
31a50 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
31a60 72 72 6f 72 28 70 43 74 78 2c 20 22 73 68 6f 75  rror(pCtx, "shou
31a70 6c 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69  ld be: fts5_rowi
31a80 64 28 73 75 62 6a 65 63 74 2c 20 2e 2e 2e 2e 29  d(subject, ....)
31a90 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  ", -1);.  }else{
31aa0 0a 20 20 20 20 7a 41 72 67 20 3d 20 28 63 6f 6e  .    zArg = (con
31ab0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
31ac0 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
31ad0 6c 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 30  l[0]);.    if( 0
31ae0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
31af0 70 28 7a 41 72 67 2c 20 22 73 65 67 6d 65 6e 74  p(zArg, "segment
31b00 22 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  ") ){.      i64 
31b10 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 6e  iRowid;.      in
31b20 74 20 73 65 67 69 64 2c 20 70 67 6e 6f 3b 0a 20  t segid, pgno;. 
31b30 20 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 33       if( nArg!=3
31b40 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
31b50 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
31b60 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20 20  (pCtx, .        
31b70 20 20 20 20 22 73 68 6f 75 6c 64 20 62 65 3a 20      "should be: 
31b80 66 74 73 35 5f 72 6f 77 69 64 28 27 73 65 67 6d  fts5_rowid('segm
31b90 65 6e 74 27 2c 20 73 65 67 69 64 2c 20 70 67 6e  ent', segid, pgn
31ba0 6f 29 29 22 2c 20 2d 31 0a 20 20 20 20 20 20 20  o))", -1.       
31bb0 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
31bc0 0a 20 20 20 20 20 20 20 20 73 65 67 69 64 20 3d  .        segid =
31bd0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
31be0 6e 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20  nt(apVal[1]);.  
31bf0 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 73 71 6c        pgno = sql
31c00 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
31c10 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 20 20 20 20  pVal[2]);.      
31c20 20 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f    iRowid = FTS5_
31c30 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 73 65  SEGMENT_ROWID(se
31c40 67 69 64 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  gid, pgno);.    
31c50 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
31c60 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 69  lt_int64(pCtx, i
31c70 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a  Rowid);.      }.
31c80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31c90 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
31ca0 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20  error(pCtx, .   
31cb0 20 20 20 20 20 22 66 69 72 73 74 20 61 72 67 20       "first arg 
31cc0 74 6f 20 66 74 73 35 5f 72 6f 77 69 64 28 29 20  to fts5_rowid() 
31cd0 6d 75 73 74 20 62 65 20 27 73 65 67 6d 65 6e 74  must be 'segment
31ce0 27 22 20 2c 20 2d 31 0a 20 20 20 20 20 20 29 3b  '" , -1.      );
31cf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
31d00 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
31d10 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 72 65  ed as part of re
31d20 67 69 73 74 65 72 69 6e 67 20 74 68 65 20 46 54  gistering the FT
31d30 53 35 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 64  S5 module with d
31d40 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
31d50 63 74 69 6f 6e 20 64 62 2e 20 49 74 20 72 65 67  ction db. It reg
31d60 69 73 74 65 72 73 20 73 65 76 65 72 61 6c 20 75  isters several u
31d70 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c  ser-defined scal
31d80 61 72 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65  ar functions use
31d90 66 75 6c 0a 2a 2a 20 77 69 74 68 20 46 54 53 35  ful.** with FTS5
31da0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
31db0 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
31dc0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
31dd0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
31de0 2c 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  , some other.** 
31df0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
31e00 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  e is returned in
31e10 73 74 65 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stead..*/.int sq
31e20 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e  lite3Fts5IndexIn
31e30 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  it(sqlite3 *db){
31e40 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
31e50 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
31e60 69 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22  ion(.      db, "
31e70 66 74 73 35 5f 64 65 63 6f 64 65 22 2c 20 32 2c  fts5_decode", 2,
31e80 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
31e90 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74   fts5DecodeFunct
31ea0 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 0a  ion, 0, 0.  );..
31eb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31ec0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
31ed0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
31ee0 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 20  unction(.       
31ef0 20 64 62 2c 20 22 66 74 73 35 5f 64 65 63 6f 64   db, "fts5_decod
31f00 65 5f 6e 6f 6e 65 22 2c 20 32 2c 20 0a 20 20 20  e_none", 2, .   
31f10 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
31f20 2c 20 28 76 6f 69 64 2a 29 64 62 2c 20 66 74 73  , (void*)db, fts
31f30 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c  5DecodeFunction,
31f40 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d   0, 0.    );.  }
31f50 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
31f60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
31f70 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
31f80 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20  _function(.     
31f90 20 20 20 64 62 2c 20 22 66 74 73 35 5f 72 6f 77     db, "fts5_row
31fa0 69 64 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  id", -1, SQLITE_
31fb0 55 54 46 38 2c 20 30 2c 20 66 74 73 35 52 6f 77  UTF8, 0, fts5Row
31fc0 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  idFunction, 0, 0
31fd0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65  .    );.  }.  re
31fe0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 69 6e 74  turn rc;.}...int
31ff0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
32000 78 52 65 73 65 74 28 46 74 73 35 49 6e 64 65 78  xReset(Fts5Index
32010 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
32020 70 2d 3e 70 53 74 72 75 63 74 3d 3d 30 20 7c 7c  p->pStruct==0 ||
32030 20 70 2d 3e 69 53 74 72 75 63 74 56 65 72 73 69   p->iStructVersi
32040 6f 6e 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 66  on!=0 );.  if( f
32050 74 73 35 49 6e 64 65 78 44 61 74 61 56 65 72 73  ts5IndexDataVers
32060 69 6f 6e 28 70 29 21 3d 70 2d 3e 69 53 74 72 75  ion(p)!=p->iStru
32070 63 74 56 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20  ctVersion ){.   
32080 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e   fts5StructureIn
32090 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20 20 7d  validate(p);.  }
320a0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
320b0 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.